硬件访问技术
来源:互联网 发布:淘宝双十一广告视频 编辑:程序博客网 时间:2024/05/17 06:07
1:硬件访问实质:
驱动程序控制设备,是通过访问设备内的寄存器来达到控制目的。所以问题就是如何访问这些寄存器。
2:地址映射
在linux中,无论是内核程序还是应用程序,使用的地址都是是虚拟地址,所以应该首先将物理地址映射成虚拟地址。
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 pfn; /* 物理地址所在的页帧号 */
unsigned long length; /* 映射长度 */
unsigned int type; /* 映射的设备类型 */
};
pfn: 利用__phys_to_pfn(物理地址)可以计算出物理地址所在的物理页帧号
这个结构体在
cpu.c文件中。
static struct map_desc s3c_iodesc[]:
map_desc类型的数组。就是在这个数组中添加新的映射结构。
同样在这个cpu.c文件中还有这个函数
void __init s3c64xx_init_io(struct map_desc *mach_desc, int size),
这个函数就通过map_desc来完成映射。
3:寄存器读写
在完成地址映射后,就可以读写寄存器了,linux提供了以下一系列函数来实现读写寄存器:
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(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)
驱动程序控制设备,是通过访问设备内的寄存器来达到控制目的。所以问题就是如何访问这些寄存器。
2:地址映射
在linux中,无论是内核程序还是应用程序,使用的地址都是是虚拟地址,所以应该首先将物理地址映射成虚拟地址。
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 pfn; /* 物理地址所在的页帧号 */
unsigned long length; /* 映射长度 */
unsigned int type; /* 映射的设备类型 */
};
pfn: 利用__phys_to_pfn(物理地址)可以计算出物理地址所在的物理页帧号
这个结构体在
cpu.c文件中。
static struct map_desc s3c_iodesc[]:
map_desc类型的数组。就是在这个数组中添加新的映射结构。
同样在这个cpu.c文件中还有这个函数
void __init s3c64xx_init_io(struct map_desc *mach_desc, int size),
这个函数就通过map_desc来完成映射。
3:寄存器读写
在完成地址映射后,就可以读写寄存器了,linux提供了以下一系列函数来实现读写寄存器:
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(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)
0 0
- 硬件访问技术
- 硬件访问技术
- linux硬件访问技术
- 硬件访问技术
- ARM内核驱动-硬件访问技术
- 硬件访问
- 硬件访问
- 硬件访问
- 访问硬件
- 硬件访问
- 硬件访问
- 9.Linux驱动开发前奏(2)-硬件访问技术
- Linux 驱动开发前奏---驱动开发概述、硬件访问技术
- 硬件技术
- 应用程序访问底层硬件
- 访问Android硬件
- Linux硬件设备访问
- 实现硬件访问服务
- 接收一个十六进制的数值字符串,输出该数值的十进制字符串。
- 水晶报表点滴
- 在阅读源代码或设计文档时,看到惊艳的技巧
- HBase学习笔记(二)———《安装教程》
- 杭电绝对值排序
- 硬件访问技术
- 六、struts2的标签的学习
- 【Arduino学习笔记】手把手教你使用ESP8266----②调试篇
- java.lang.IllegalArgumentException: Document base E:\Eclipse\workspace\.metadata\.plugins\org.eclips
- OC 类的继承
- zoj1003
- Routing Information Protocol
- Android实现数据存储技术
- 字符设备控制技术