硬件访问技术

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)

你可能感兴趣的:(嵌入式,linux开发)