linux下uboot kernel操作cpu寄存器
大多数的内核里面都有会对GPIO的操作,而且内核里面对GPIO进行配置也很方便,要什么功能就配置成什么就可以了。
还有一些寄存器是内核没有配置到的,但是我们要操作怎么办,内核里面也定义了相关的接口函数。
在u-boot中操作某个寄存器:
- reg = readl(IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1);
- reg &= ~IOMUXC_REG_GPR1_ACTCS0_MASK;
- writel(reg, IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1);
其中IOMUXC_BASE_ADDR是物理地址,跟踪代码发现writel操作如下:
#define writel(v,a) __arch_putl(v,a)
#define __arch_putl(v,a) (*(volatile unsigned int *)(a) = (v))
所以在uboot里面配置寄存相当于是给物理地址直接赋值,volatile的意思是提醒编译器需要存储或读取这个变量的时候,都会直接从变量地址中读取数据
而在内核中,上面的写法是无法运行的,会提示虚拟地址错误。在内核中通常是通过虚拟地址来给物理地址赋值,所以需要将物理地址转换成虚拟地址
- reg = __raw_readl(ioremap(IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1,4));
- reg &= ~IOMUXC_REG_GPR1_ACTCS0_MASK;
- reg &= ~IOMUXC_REG_GPR1_ADDRS0_MASK;
- reg |= ((CS0_NORFLASH_SIZE | IOMUXC_REG_GPR1_ACTCS0));
- __raw_writel(reg, ioremap(IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1,4));
这里的ioremap是将物理地址IOMUXC_BASE_ADDR转换得到对应的虚拟地址,4表示4个字节,即32位的地址。
u-boot下读写gpio:
与读写寄存器类似,u-boot下读写GPIO口是直接给GPIO赋值:
- mxc_request_iomux(MX53_PIN_GPIO_8, IOMUX_CONFIG_ALT1);
- mxc_iomux_set_pad(MX53_PIN_GPIO_8, 0x1E4);
- reg = readl(GPIO1_BASE_ADDR + 0x0);
- <span style="white-space:pre"> </span>reg |= 0x100;
- writel(reg, GPIO1_BASE_ADDR + 0x0);
- // Set pin direction as output
- reg = readl(GPIO1_BASE_ADDR + 0x4);
- reg |= 0x100;
- writel(reg, GPIO1_BASE_ADDR + 0x4);
GPIO_8 是GPIO1_8,前面两个配置GPIO_8的功能。
查看datasheet可以看到GPIO1的地址配置
53F8_4000 GPIO data register (GPIO-1_DR) 32 R/W 0000_0000h
53F8_4004 GPIO direction register (GPIO-1_GDIR) 32 R/W 0000_0000h
53F8_4008 GPIO pad status register (GPIO-1_PSR) 32 R 0000_0000h
53F8_400C GPIO interrupt configuration register1 (GPIO-1_ICR1) 32 R/W 0000_0000h
53F8_4010 GPIO interrupt configuration register2 (GPIO-1_ICR2) 32 R/W 0000_0000h
53F8_4014 GPIO interrupt mask register (GPIO-1_IMR) 32 R/W 0000_0000h
53F8_4018 GPIO interrupt status register (GPIO-1_ISR) 32 w1c 0000_0000h
53F8_401C GPIO edge select register (GPIO-1_EDGE_SEL) 32 R/W 0000_0000h
可以看到它的数据寄存器的偏移地址是0x0,输入输出寄存器的偏移地址是0x4。而reg |= 0x100;是GPIO_8的所在的偏移,即(0x1 << 8)。
读取一个gpio的值,只需要读取它的状态寄存器就可以了,
reg = readl( GPIO1_BASE_ADDR + 0x08 );
if(reg & (0x1 << 8))
printf("it is high\n");
else
printf("it is low\n");
linux下uboot kernel操作cpu寄存器的更多相关文章
- linux下通过sysfs操作GPIO
linux下通过sysfs操作GPIO 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是 ...
- Linux下读写芯片的I2C寄存器
要想在Linux下读写芯片的I2C寄存器,一般需要在Linux编写一份该芯片的I2C驱动,关于Linux下如何编写I2C驱动,前一篇文章<手把手教你写Linux I2C设备驱动>已经做了初 ...
- 性能测试分析过程(三)linux下查看最消耗CPU/内存的进程
linux下查看最消耗CPU 内存的进程 1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10 ...
- Linux下查看内核、CPU、内存及各组件版本的命令和方法
Linux下查看内核.CPU.内存及各组件版本的命令和方法 Linux查看内核版本: uname -a more /etc/*release ...
- linux下的shell操作mysql
(1)MySQL的启动 重启了一次服务器后,使用> mysql -u root -p登陆是出现下面的错误: ERROR 2002 (HY000): Can't connect to local ...
- Linux下分析某个进程CPU占用率高的原因
Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...
- linux下的文本操作之 文本查找——grep
摘要:你有没有这样的应用场景:调试一个程序,出现debug的提示信息,现在你需要定位是哪个文件包含了这个debug信息,也就是说,你需要在一个目录下的多个文件(可能包含子目录)中查找某个字符串的位置: ...
- Linux下常用的操作
Linux下常用的操作 文件定位 locate filename 有些版本的linux会出现 -bash: locate: command not found错误,不要慌,安装一下mlocate包就好 ...
- Linux下mysql相关操作
Linux下mysql相关操作 1.创建MySQL mysql -u root -p create user 'username'@'%' identified by 'password'; %可以选 ...
随机推荐
- XWIKI的搭建
原文地址:https://my.oschina.net/gywbest/blog/780569 一 应用背景描述 在平时的运维工作中,把常规工作进行文档整理非常重要,无论是平时工作处理或是工作交接,实 ...
- 洛谷 P1171 售货员的难题
P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...
- 千千万万的IT开发project师路在何方
已经找不到该文章的最初出处了,有找到的人请告诉我.谢谢~~ 千千万万的IT开发project师路在何方 2007-06-25 21:41 恭喜,你选择开发project师作为自已的职业! 悲哀.你选择 ...
- iOS学习9_事件分发&响应链
iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...
- Sqoop Import原理和详细流程讲解
Sqoop Import原理 Sqoop Import详细流程讲解 Sqoop在import时,需要指定split-by参数.Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域 ...
- excel操作小技巧
excel拼接sql语句时,时间格式问题 问题:若直接插入时间的单元格 :="insert into t_entity_car (create_time,name,age) value (' ...
- 【Linux下禁用rm命令之建立回收站】
第一步 创建回收站目录 # 根据自己的习惯,找个位置创建一个用作回收文件的目录 # 我们这里将在root目录下面创建一个名为".trash"的隐藏文件 [root@fedora ~ ...
- CCF模拟题 相反数
相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数). 输入格式 第一行包含一个 ...
- 洛谷——P2446 [SDOI2010]大陆争霸
https://www.luogu.org/problem/show?pid=2446#sub 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别 ...
- android側滑菜单-DrawerLayout的基本使用
眼下主流App开发中,部分是以側滑菜单为主布局架构,曾经做android側滑菜单时.大多选择使用github上的第三方开源框架SildingMenu,可是这个框架还是稍显笨重.好消息是google已经 ...