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驱动操作地址(寄存器)的一些方式 文章目录Linux驱动操作地址(寄存器)的一些方式1.对绝对地址赋值操作2. ioremap2.1 void __iomem *地址2.2 volatile unsigned int *地址2.3 structioremap1.对绝对地址赋值操作 对绝对地址0x100000赋值操作 *&…...
Java日志框架介绍
Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Glc首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。 Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。 Commons Logging Apache基金会所属的项目,是…...
编程中遇到的计算机大小端概念
概念大小端(Endian)是指在一个多字节的数据中,字节的存储顺序的规定。通俗来说,就是指数据在计算机内部存储时的顺序问题。在计算机系统中,一个数据项可能占据多个存储单元。在这种情况下,这个数据项的存储…...
日志与可视化方案:从ELK到EFK,再到ClickHouse
EFK方案 从ELK谈起 ELK是三个开源软件的缩写,分别表示:Elasticsearch,Logstash,Kibana。新增了一个FlieBeat,它是一个轻量级的日志收集处理工具,FlieBeat占用资源少,适用于在各个服务器上搜集…...
字符函数和字符串函数(上)——“C”
各位CSDN的uu们你们好呀,今天小雅兰来给大家介绍一个全新的知识点,就是字符函数和字符串函数啦,其实其中有些函数我之前已经学习过了,比如strlen、strcpy;也有一些之前不是很熟悉的函数,比如strstr、strtok…...
九龙证券|下周解禁市值超400亿元,3股解禁压力较大
下周3股解禁比例超50%。 百利电气昨日盘中直线拉升封板,至此,百利电气两连板,累计涨幅20.85%。 昨日晚间,百利电气发布股票交易反常动摇公告称,公司不触及“室温超导”相关业务,也未打开相关研发和投入。公…...
一个大型网站架构的演变历程
正序: Rome was not built in a day(罗马不是一天建成的。)一个成熟的大型网站从来都不是一蹴而就的,需要经过多次架构的调整和升级,我们熟知的大型网站比如京东、淘宝、亚马逊,它们每天都有巨大的用户访问…...
前端前沿web 3d可视化技术 ThreeJS学习全记录
前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能,但代码量大,难度大,需要掌握很多底层知识和数学知识 Threej…...
链表经典笔试题(LeetCode刷题)
本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳,希望对你有所帮助。 目录 一、移除链表元素 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整合技术组件基本流程: 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心,分为Eure…...
Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】
Echart? ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 ECharts 遵循 Apache-2.0 开源协议,免费商用。 ECharts 兼容当前绝大部分浏览器(IE8/9/10/11,Chrome…...
聊聊腾讯T13技术专家被开除
这两天腾讯的技术大佬stonehuang被曝离开腾讯,据他老婆在小红书上发的帖子称是遭遇了裁员,说实话刚看到这个消息我挺震惊的,stonehuang在中国大前端领域是排得上号的专家,同时他2005年就加入了腾讯,在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 进行限制,这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一,上了线很多问题,丢包,慢等的问题严重增加运维,运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则,只要换一个端口就可…...
C#基础教程22 异常处理
文章目录 C# 异常处理语法C# 中的异常类异常类 描述异常处理创建用户自定义异常C# 异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理…...
java八股文--java基础
java基础1.什么是面向对象,谈谈对面向对象的理解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数据,而是通过spark读取hive jdbc的方式访问hive数据,因为这个hive有kerberos认证,在网上也不是很容易搜索到这样的操作案例。不多bb,直接上教程。 准备工作 准备一个hiv…...
【Maven】项目中pom.xml坐标定义以及pom基本配置
目录 一、pom.xml坐标定义 二、pom 基本配置 一、pom.xml坐标定义 在 pom.xml 中定义坐标,内容包括:groupId、artifactId、version,详细内容如下: <!--项目名称,定义为组织名项目名,类似包名-->&l…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
