当前位置: 首页 > news >正文

Linux驱动操作地址(寄存器)的一些方式

Linux驱动操作地址(寄存器)的一些方式


文章目录

  • Linux驱动操作地址(寄存器)的一些方式
  • 1.对绝对地址赋值操作
  • 2. ioremap
    • 2.1 void __iomem *地址
    • 2.2 volatile unsigned int *地址
    • 2.3 struct+ioremap


1.对绝对地址赋值操作

对绝对地址0x100000赋值操作

*(unsigned int *0x100000=1234;

让程序跳转到绝对地址是0x100000去执行

*((void  (*) () )0x100000) ();

首先要将0x100000强制转换维函数指针,即:

(void  (*) () )0x100000

然后再调用它

*((void  (*) () )0x100000) ();

使用typedef可以更直观

typedef void(*) () voidFuncPtr;
*((voidFuncPtr)0x100000) ();

2. ioremap

2.1 void __iomem *地址

/* 寄存器物理地址 */
#define CCM_CCGR1_BASE              (0X020C406C)    
#define SW_MUX_GPIO1_IO03_BASE      (0X020E0068)
#define SW_PAD_GPIO1_IO03_BASE      (0X020E02F4)
#define GPIO1_DR_BASE               (0X0209C000)
#define GPIO1_GDIR_BASE             (0X0209C004)/* 映射后的寄存器虚拟地址指针 */
static void __iomem *IMX6U_CCM_CCGR1;
static void __iomem *SW_MUX_GPIO1_IO03;
static void __iomem *SW_PAD_GPIO1_IO03;
static void __iomem *GPIO1_DR;
static void __iomem *GPIO1_GDIR;
   /* 寄存器地址映射 */IMX6U_CCM_CCGR1 = ioremap(CCM_CCGR1_BASE, 4);SW_MUX_GPIO1_IO03 = ioremap(SW_MUX_GPIO1_IO03_BASE, 4);SW_PAD_GPIO1_IO03 = ioremap(SW_PAD_GPIO1_IO03_BASE, 4);GPIO1_DR = ioremap(GPIO1_DR_BASE, 4);GPIO1_GDIR = ioremap(GPIO1_GDIR_BASE, 4);
   int retvalue = 0;u32 val = 0;/*、使能GPIO1时钟 */val = readl(IMX6U_CCM_CCGR1);val &= ~(3 << 26);  /* 清楚以前的设置 */val |= (3 << 26);   /* 设置新值 */writel(val, IMX6U_CCM_CCGR1);/*设置GPIO1_IO03的复用功能,将其复用为*    GPIO1_IO03,最后设置IO属性。*/writel(5, SW_MUX_GPIO1_IO03);/*寄存器SW_PAD_GPIO1_IO03设置IO属性*bit 16:0 HYS关闭*bit [15:14]: 00 默认下拉*bit [13]: 0 kepper功能*bit [12]: 1 pull/keeper使能*bit [11]: 0 关闭开路输出*bit [7:6]: 10 速度100Mhz*bit [5:3]: 110 R0/6驱动能力*bit [0]: 0 低转换率*/writel(0x10B0, SW_PAD_GPIO1_IO03);/* 设置GPIO1_IO03为输出功能 */val = readl(GPIO1_GDIR);val &= ~(1 << 3);   /* 清除以前的设置 */val |= (1 << 3);    /* 设置为输出 */writel(val, GPIO1_GDIR);/* 默认关闭LED */val = readl(GPIO1_DR);val |= (1 << 3);    writel(val, GPIO1_DR);

2.2 volatile unsigned int *地址

static volatile unsigned int *CCM_CCGR1                       ;
static volatile unsigned int *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03;
static volatile unsigned int *GPIO1_GDIR                      ;
static volatile unsigned int *GPIO1_DR                        ;
CCM_CCGR1                               = ioremap(0x20C406C, 4);
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03        = ioremap(0x20E0068, 4);
GPIO1_GDIR                              = ioremap(0x0209C000 + 0x4, 4);
GPIO1_DR                                = ioremap(0x0209C000 + 0, 4);
/* GPIO1_IO03 */
/* a. 使能GPIO1* set CCM to enable GPIO1* CCM_CCGR1[CG13] 0x20C406C* bit[27:26] = 0b11*/
*CCM_CCGR1 |= (3<<26);/* b. 设置GPIO1_IO03用于GPIO* set IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03*      to configure GPIO1_IO03 as GPIO* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03  0x20E0068* bit[3:0] = 0b0101 alt5*/
val = *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03;
val &= ~(0xf);
val |= (5);
*IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = val;/* c. 设置GPIO1_IO03作为output引脚* set GPIO1_GDIR to configure GPIO1_IO03 as output* GPIO1_GDIR  0x0209C000 + 0x4* bit[3] = 0b1*/
*GPIO1_GDIR |= (1<<3);

2.3 struct+ioremap

struct iomux {volatile unsigned int unnames[23];volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00; /* offset 0x5c */volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO01;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO02;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO05;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO06;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO07;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO08;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA;volatile unsigned int IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B;
};struct imx6ull_gpio {volatile unsigned int dr;volatile unsigned int gdir;volatile unsigned int psr;volatile unsigned int icr1;volatile unsigned int icr2;volatile unsigned int imr;volatile unsigned int isr;volatile unsigned int edge_sel;
};/* enable GPIO4 */
static volatile unsigned int *CCM_CCGR3; /* enable GPIO5 */
static volatile unsigned int *CCM_CCGR1; /* set GPIO5_IO03 as GPIO */
static volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER1;/* set GPIO4_IO14 as GPIO */
static volatile unsigned int *IOMUXC_SW_MUX_CTL_PAD_NAND_CE1_B;static struct iomux *iomux;static struct imx6ull_gpio *gpio4;
static struct imx6ull_gpio *gpio5;
CCM_CCGR1 = ioremap(0x20C406C, 4);
CCM_CCGR3 = ioremap(0x20C4074, 4);
IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER1 = ioremap(0x229000C, 4);
IOMUXC_SW_MUX_CTL_PAD_NAND_CE1_B        = ioremap(0x20E01B0, 4);iomux = ioremap(0x20e0000, sizeof(struct iomux));
gpio4 = ioremap(0x020A8000, sizeof(struct imx6ull_gpio));
gpio5 = ioremap(0x20AC000, sizeof(struct imx6ull_gpio));
       if (which == 0){/* 1. enable GPIO5 * CG15, b[31:30] = 0b11*/*CCM_CCGR1 |= (3<<30);/* 2. set GPIO5_IO03 as GPIO * MUX_MODE, b[3:0] = 0b101*/*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = 5;/* 3. set GPIO5_IO03 as output * GPIO5 GDIR, b[3] = 0b1*/gpio5->gdir |= (1<<3);}else if(which == 1){/* 1. enable GPIO1 * CG13, b[27:26] = 0b11*/*CCM_CCGR1 |= (3<<26);/* 2. set GPIO1_IO03 as GPIO * MUX_MODE, b[3:0] = 0b101*/iomux->IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 5;/* 3. set GPIO1_IO03 as output * GPIO1 GDIR, b[3] = 0b1*/gpio1->gdir |= (1<<3);}else if(which == 2){/* 1. enable GPIO1 * CG13, b[27:26] = 0b11*/*CCM_CCGR1 |= (3<<26);/* 2. set GPIO1_IO05 as GPIO * MUX_MODE, b[3:0] = 0b101*/iomux->IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO05 = 5;/* 3. set GPIO1_IO05 as output * GPIO1 GDIR, b[5] = 0b1*/gpio1->gdir |= (1<<5);}else if(which == 3){/* 1. enable GPIO1 * CG13, b[27:26] = 0b11*/*CCM_CCGR1 |= (3<<26);/* 2. set GPIO1_IO06 as GPIO * MUX_MODE, b[3:0] = 0b101*/iomux->IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO06 = 5;/* 3. set GPIO1_IO06 as output * GPIO1 GDIR, b[6] = 0b1*/gpio1->gdir |= (1<<6);}if (which == 0){/* 1. enable GPIO5 * CG15, b[31:30] = 0b11*/*CCM_CCGR1 |= (3<<30);/* 2. set GPIO5_IO01 as GPIO * MUX_MODE, b[3:0] = 0b101*/*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER1 = 5;/* 3. set GPIO5_IO01 as input * GPIO5 GDIR, b[1] = 0b0*/gpio5->gdir &= ~(1<<1);}else if(which == 1){/* 1. enable GPIO4 * CG6, b[13:12] = 0b11*/*CCM_CCGR3 |= (3<<12);/* 2. set GPIO4_IO14 as GPIO * MUX_MODE, b[3:0] = 0b101*/IOMUXC_SW_MUX_CTL_PAD_NAND_CE1_B = 5;/* 3. set GPIO4_IO14 as input * GPIO4 GDIR, b[14] = 0b0*/gpio4->gdir &= ~(1<<14);}

相关文章:

Linux驱动操作地址(寄存器)的一些方式

Linux驱动操作地址(寄存器&#xff09;的一些方式 文章目录Linux驱动操作地址(寄存器&#xff09;的一些方式1.对绝对地址赋值操作2. ioremap2.1 void __iomem *地址2.2 volatile unsigned int *地址2.3 structioremap1.对绝对地址赋值操作 对绝对地址0x100000赋值操作 *&…...

Java日志框架介绍

Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Glc首创的&#xff0c;现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。 Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。 Commons Logging Apache基金会所属的项目&#xff0c;是…...

编程中遇到的计算机大小端概念

概念大小端&#xff08;Endian&#xff09;是指在一个多字节的数据中&#xff0c;字节的存储顺序的规定。通俗来说&#xff0c;就是指数据在计算机内部存储时的顺序问题。在计算机系统中&#xff0c;一个数据项可能占据多个存储单元。在这种情况下&#xff0c;这个数据项的存储…...

日志与可视化方案:从ELK到EFK,再到ClickHouse

EFK方案 从ELK谈起 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch&#xff0c;Logstash&#xff0c;Kibana。新增了一个FlieBeat&#xff0c;它是一个轻量级的日志收集处理工具&#xff0c;FlieBeat占用资源少&#xff0c;适用于在各个服务器上搜集…...

字符函数和字符串函数(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰来给大家介绍一个全新的知识点&#xff0c;就是字符函数和字符串函数啦&#xff0c;其实其中有些函数我之前已经学习过了&#xff0c;比如strlen、strcpy&#xff1b;也有一些之前不是很熟悉的函数&#xff0c;比如strstr、strtok…...

九龙证券|下周解禁市值超400亿元,3股解禁压力较大

下周3股解禁比例超50%。 百利电气昨日盘中直线拉升封板&#xff0c;至此&#xff0c;百利电气两连板&#xff0c;累计涨幅20.85%。 昨日晚间&#xff0c;百利电气发布股票交易反常动摇公告称&#xff0c;公司不触及“室温超导”相关业务&#xff0c;也未打开相关研发和投入。公…...

一个大型网站架构的演变历程

正序&#xff1a; Rome was not built in a day&#xff08;罗马不是一天建成的。&#xff09;一个成熟的大型网站从来都不是一蹴而就的&#xff0c;需要经过多次架构的调整和升级&#xff0c;我们熟知的大型网站比如京东、淘宝、亚马逊&#xff0c;它们每天都有巨大的用户访问…...

前端前沿web 3d可视化技术 ThreeJS学习全记录

前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能&#xff0c;但代码量大&#xff0c;难度大&#xff0c;需要掌握很多底层知识和数学知识 Threej…...

链表经典笔试题(LeetCode刷题)

本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳&#xff0c;希望对你有所帮助。 目录 一、移除链表元素 1.1 问题描述 1.2 思路一 1.2.1 分析 1.2.2 代码 1.3 思路二 1.3.1 分析 1.2.3 思路三 1.3 代码实现 1.3.1 思路1的代码 1.3.2 思路2的…...

SpringCloud五大组件

微服务SpringCloud整合技术组件基本流程&#xff1a; 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心&#xff0c;分为Eure…...

Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】

Echart&#xff1f; ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 遵循 Apache-2.0 开源协议&#xff0c;免费商用。 ECharts 兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xf…...

聊聊腾讯T13技术专家被开除

这两天腾讯的技术大佬stonehuang被曝离开腾讯&#xff0c;据他老婆在小红书上发的帖子称是遭遇了裁员&#xff0c;说实话刚看到这个消息我挺震惊的&#xff0c;stonehuang在中国大前端领域是排得上号的专家&#xff0c;同时他2005年就加入了腾讯&#xff0c;在qq空间的发展历程…...

c++ 常见宏、模板用法【1】

目录1、宏定义实现简单的断言2、可变参数模板3、变量模板4、宏定义实现范围内的for循环5、模板实现函数对象6、宏定义实现作用域限定7、类型萃取模板1、宏定义实现简单的断言 #define ASSERT(expr) \if(!(expr)) { \std::cout << "assertion failed: " <&l…...

【25】Verilog进阶 - 序列检测

VL25 输入序列连续的序列检测 本题并不难【中等】难度给高了 【做题关键】 (1)需要使用移位寄存器的思路。其实reg型是寄存器,也可以当做是移位寄存器,重要的是对其的处理,使用的是移位寄存器的思路 (2)注意新移入数据存放在低位 1 题目 + 代码 + TestBench 很简单,没…...

如何绕开运营商的 QoS 限制

运营商针对 UDP 进行限制&#xff0c;这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一&#xff0c;上了线很多问题&#xff0c;丢包&#xff0c;慢等的问题严重增加运维&#xff0c;运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则&#xff0c;只要换一个端口就可…...

C#基础教程22 异常处理

文章目录 C# 异常处理语法C# 中的异常类异常类 描述异常处理创建用户自定义异常C# 异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理…...

java八股文--java基础

java基础1.什么是面向对象&#xff0c;谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第四套解析(详细)

2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (4) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...

【Spark】spark使用jdbc连接带有kerberos认证的hive jdbc

背景 这个需求就是spark不通过spark-hive的方式访问hive数据&#xff0c;而是通过spark读取hive jdbc的方式访问hive数据&#xff0c;因为这个hive有kerberos认证&#xff0c;在网上也不是很容易搜索到这样的操作案例。不多bb&#xff0c;直接上教程。 准备工作 准备一个hiv…...

【Maven】项目中pom.xml坐标定义以及pom基本配置

目录 一、pom.xml坐标定义 二、pom 基本配置 一、pom.xml坐标定义 在 pom.xml 中定义坐标&#xff0c;内容包括&#xff1a;groupId、artifactId、version&#xff0c;详细内容如下&#xff1a; <!--项目名称&#xff0c;定义为组织名项目名&#xff0c;类似包名-->&l…...

2024 Q2全球AI搜索基准测试TOP3结果泄露:Perplexity在长尾专业查询中胜率68.4%,但ChatGPT在模糊意图理解上反超——你的团队该押注哪条技术路径?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;2024 Q2全球AI搜索基准测试TOP3结果深度解读 本季度由MLPerf与AI Index联合发布的AI搜索基准测试&#xff08;SearchBench v2.1&#xff09;覆盖了17个主流模型&#xff0c;在真实网页索引、多跳推理、…...

一键部署工具OneClickCopaw:从脚本化到容器化的自动化实践

1. 项目概述与核心价值最近在折腾一些自动化部署和配置管理的工作&#xff0c;发现一个挺有意思的项目&#xff0c;叫iwanglei1/OneClickCopaw。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你也经常需要在不同环境里快速复制一套开发或测试环境&#xff0c;…...

5分钟精通VinXiangQi:免费AI象棋助手的完整使用教程

5分钟精通VinXiangQi&#xff1a;免费AI象棋助手的完整使用教程 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi VinXiangQi是一款基于YOLOv5深度学习技术的…...

OpenAccess十年:EDA互操作性标准如何重塑芯片设计流程

1. 从愿景到现实&#xff1a;OpenAccess十年之路的深度复盘十年前&#xff0c;也就是2002年的12月&#xff0c;当Si2&#xff08;硅集成倡议组织&#xff09;首次向联盟成员发布OpenAccess 2.0时&#xff0c;恐怕没有多少人能预料到&#xff0c;这个源于半导体巨头内部需求的“…...

AI技能(SKILL)中文翻译项目:打破语言壁垒,赋能中文AI社区

1. 项目概述&#xff1a;一个为中文AI社区“破壁”的翻译工程如果你和我一样&#xff0c;在过去一年里深度使用过Claude、ChatGPT或者各类AI Agent平台&#xff0c;那你一定对“SKILL”这个概念不陌生。简单来说&#xff0c;SKILL就是AI的“技能包”&#xff0c;它把特定领域的…...

从DataOperation接口到QuickSort实现:探究适配器模式在算法整合中的应用

1. 适配器模式&#xff1a;解决接口不兼容的桥梁 想象一下你从国外带回来一个三脚插头的电器&#xff0c;但家里的插座都是两孔的。这时候你会怎么做&#xff1f;大多数人会选择买一个转换插头。在编程世界里&#xff0c;适配器模式就是这个万能的"转换插头"。 最近我…...

AI驱动的网络安全:深度学习与LLM在威胁检测与教育中的应用

1. 项目概述&#xff1a;AI赋能的网络安全新范式在网络安全领域&#xff0c;我们正面临着一个日益严峻的悖论&#xff1a;一方面&#xff0c;攻击手段正变得前所未有的复杂和自动化&#xff1b;另一方面&#xff0c;74%的安全事件仍然源于人为因素。这种技术与人的双重挑战催生…...

[已解决]Vscode插件Keil Assistant连接Keil后出现的头文件路径无法寻找问题

问题详情 按照网络上的教程按照并且配置好vscode的Keil Assistant插件后&#xff0c;成功打开了Keil工程并且编译成功。但是头文件无法跳转&#xff0c;以及出现红色波浪线报错。 解决方法 在.vscode\c_cpp_properties.json中添加以下两行路径&#xff1a; "includePath&q…...

[具身智能-679]:ROS2功能包 - 命令行与系统工具概述与使用示例

这是 ROS2 开发每天必用 的工具&#xff0c;全部通过终端命令操作&#xff0c;用于调试、查看、控制、记录整个 ROS2 系统。我按最常用顺序给你整理&#xff0c;每条命令都能直接复制运行。一、核心工具组&#xff1a;ros2cli所有命令都以 ros2 开头&#xff0c;是 ROS2 的总控…...

C++ 时间戳实战:从GetTickCount64到std::chrono的跨平台精度选择

1. 为什么我们需要精确的时间戳&#xff1f; 在开发高性能应用时&#xff0c;时间戳的精度往往决定了程序的可靠性。想象一下&#xff0c;你在开发一个在线游戏服务器&#xff0c;玩家A声称自己先击中了玩家B&#xff0c;但服务器记录的两次命中时间差只有几毫秒。如果使用秒级…...