您的位置:首页 > 运维架构 > Linux

linux硬件访问技术

2015-12-14 16:32 453 查看

1.硬件访问实质

驱动控制设备,主要通过访问设备内的寄存器;来达到控制目的的,因此我们讨论如何访问硬件,就成了如何访问这些寄存器了。

2.访问流程:包括地址映射和读写寄存器

地址映射:linux系统中,无论是内核程序还是用户程序都只能使用虚拟地址,而芯片手册所给的寄存器或者RAM地址则是物理地址,无法直接使用,因此,我们读写寄存器的第一步就是将他的物理地址映射虚拟地址。

动态映射:

所谓动态映射,是指在驱动程序中采用ioremap()函数将物理地址映射为虚拟地址。

原型:void * ioremap(physaddr,size)

参数:physaddr:待映射物理地址,size:映射的区域长度

返回值:映射后的虚拟地址。

静态映射:

所谓静态映射,是指linux系统根据用户实现指定的映射关系,在内核启动时,自动的将物理地址映射为虚拟地址。

映射关系:

在静态映射中,用户是通过map_desc结构来指明物理地址和虚拟地址的映射关系。

struct map_desc{ 

 unsigned long virtual;//映射后的虚拟地址 

 unsigned long pfn;//物理地址所在的页帧号 

 unsigned long length;//映射长度 

 unsigned long type;//映射的设备类型 

}


pnf:利用
__phys_to_pfn
(物理地址)可以计算出物理地址所在的物理页帧号

3.寄存器的读写:

在完成地址映射后,就可以读写寄存器了,linux内核提供了一系列函数来读写寄存器。

[code]unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(address)
unsigned readl(address)

unsigned iowrite8(u8 value ,void *addr)
unsigned iowrite16(u16 value ,void *addr)
unsigned iowrite32(u32 value ,void *addr)
unsigned writeb(unsigned value ,address)
unsigned writew(unsigned value ,address )
unsigned writel(unsigned value ,address )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: