硬件访问技术

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值