ARM内核驱动-硬件访问技术
来源:互联网 发布:java integer.valueof 编辑:程序博客网 时间:2024/05/16 01:52
linux系统中,硬件访问实质就是对寄存器的访问,或者说是对外部ram的访问。
1、硬件访问的实质
驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的,因此我们讨论如何访问硬件,就成了如何访问这些寄存器了。
2、地址映射
在linux系统中,无论是内核程序还是应用程序,都只有使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者RAM地址则是物理地址,无法直接使用,因此,我们读写寄存器的第一步就是将它的物理地址映射为虚拟地址。
2.1动态映射
所谓的动态映射,是指在驱动程序中采用ioremap函数将物理地址映射为虚拟地址。
原型:void * ioremap(physaddr, size)
参数:
Physaddr:待映射的物理地址
Size:映射的区域长度
返回值:映射后的虚拟地址
2.2、静态映射
所谓静态映射,是指linux系统根据用户事先指定的映射关系,在内核启动时,自动地将物理地址映射为虚拟地址。
在静态映射中,用户是通过map_desc结构来指明物理地址与虚拟地址的映射关系。
struct map_desc
{
unsigned long virtual; //映射后的虚拟地址
unsigned long pfn; //物理地址所在的页帧号
unsigned long length; // 映射长度
unsigned int type; //映射的设备类型
};
pfn:利用_phys_to_pfn(物理地址)可以计算出物理地址所在的物理页帧号(除以2^12(4k),因为一个页有4k)。
3、寄存器的读写
在完成地址映射后,就可以读写寄存器了,linux内核提供了一系列函数,来读写寄存器。
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(address)
unsigned readl(address)
void iowrite8(u8 value, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)
void writeb(unsigned value, address)
void writew(unsigned value, address)
void writel(unsigned value, address)
- ARM内核驱动-硬件访问技术
- Linux 驱动开发前奏---驱动开发概述、硬件访问技术
- 9.Linux驱动开发前奏(2)-硬件访问技术
- linux内核 驱动 硬件
- 硬件访问技术
- 硬件访问技术
- linux硬件访问技术
- 硬件访问技术
- ARM,linux内核,驱动
- linux内核驱动学习(七)----驱动分类 | 学习方法 | 硬件访问
- Linux2.6.32驱动笔记(1)驱动开发概述及硬件访问技术
- Linux 设备驱动--- 硬件访问
- 为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程
- ARM软件访问硬件的核心理论
- jtag访问arm内核寄存器
- ARM内核驱动-字符驱动编程模型
- ARM内核驱动—驱动程序大揭密-字符设备控制技术
- ARM硬件支持java技术Jazelle DBX
- java编程规范之java命名规范
- 只是这么多年的淡忘,我对杏花还是定格在儿时的印象
- coco笔记:算术运算函数
- Hadoop数据类型
- jplogic v1.0案例开发之人员信息管理(一)
- ARM内核驱动-硬件访问技术
- Trail: RMI
- 如何选择工业相机
- Yii框架开发商城(四)
- 【算法-排序之二】快速排序
- Android中实现带渐显左右按钮的左右滑动效果
- malloc与free
- mysql-5.6.16安装脚本
- 总结:Apache/Tomcat/JBOSS/Jetty/Nginx区别 .