驱动:9.2 ioremap
2020-06-19 14:56
85 查看
将特殊功能寄存器物理地址进行映射
通过映射之后的虚拟地址访问特殊功能寄存器
统一编址:将内存和外设(特殊功能寄存器) 使用同一套地址编号去编址,称作统一编址 ARM处理器 访问内存 ldr/str 访问外设 ldr/str 独立编址:将内存和外设(特殊功能寄存器) 各自使用一套独立的编号去编址,称作独立编址 X86处理器 访问内存 mov 访问外设 in / out linux内核中将使用统一编址的外设称为I/O内存 独立编址的外设称为I/O端口 Linux内核中访问特殊功能寄存器(外设)的步骤: 1)申请I/O内存 request_mem_region(start,n,name) start,要申请的I/O内存起始地址 n, 要连续申请的字节数 name,名称 2)映射I/O内存 void __iomem *ioremap(phys_addr_t start, unsigned long n) start,要映射的起始物理地址 n, 要连续映射的字节数 返回值,映射后的起始虚拟地址 例如:start=0xc001c00 n=0x100 返回值=0xf0000000 意味着: 虚拟地址 物理地址 0xf0000000 0xc001c000 3)访问I/O内存 方法一: *((volatile unsigned int *)0xf0000000) = var; var = *(volatile unsigned int *)0xf0000000; 方法二: #define readl(addr) __le32_to_cpu(__raw_readl(addr)) readl(addr); // l,long #define writel(b,addr) __raw_writel(__cpu_to_le32(b),addr) writel(val,addr); 4)取消映射 void iounmap(void __iomem *addr) addr,ioremap时返回的起始虚拟地址 5)释放I/O内存 #define release_mem_region(start,n) __release_region(&iomem_resource, (start), (n)) release_mem_region(start,n) start,要释放的起始物理地址 n,要连续释放的字节数 注意:步骤1)、5)是可选的 练习:希望安装内核模块时LED1亮 卸载内核模块时LED1灭 通过直接访问特殊功能寄存器实现,而不用GPIO库函数 cpu datasheet: GPIOCALTFN0 0xc001c020 [25:24] 01 GPIOCOUTENB 0xc001c004 [12] 1,输出模式 GPIOCOUT 0xc001c000 [12] 0/1 输出低/高电平
相关文章推荐
- 6-10 简单实现x的n次方 (10分)
- 前端js下载后端文件的两种方式总结
- 常见js和java交互
- 用JAVA来实现杨辉三角
- js获取某月或本月最后一天以及C#获取某月或本月最后一天的日期
- UI设计入门:五种基本APP界面类型【萧蕊冰】
- easyui 中的datagrid列数太多导致加载速度慢的处理方法
- 初识Java
- IDEA使用@Resource和@Autowired时出现错误的解决方法
- java调用AcmeCADConverter软件实现图片转换
- append()函数||C++学习中遇到的问题,求大佬
- 微信小程序视频自动全屏
- 类型名称后面的括号是否与new有所不同? - Do the parentheses after the type name make a difference with new?
- 软件测试——基础知识
- linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境
- 微信小程序之后端处理
- SSM配置文件
- Windows DOS常用命令
- Python进行ssh操作
- Jupyter Notebook(IPython Notebook)基础