设备驱动开发前奏

来源:互联网 发布:淘宝用了优惠券退款吗 编辑:程序博客网 时间:2024/04/29 19:09

1.linux驱动分类

字符设备、块设备、网络设备
字符设备是一种按字节来访问的设备,字符驱动负责驱动字符设备。最小访问和写入的数据量为字节,通过文件方式完成对字符设备的访问。
块设备以块(通常是512字节或者512字节的倍数)为最小传输单位的设备,块设备不接受字节处理数据
网络接口设备可以是硬件设备:eth0;也可以是纯粹的软件设备(L0+loop),网络接口负责发送和接收数据。
总线分类法
USB总线,PCI总线,平台总线设备。

2.驱动学习方法3步

1.驱动程序模型

2.硬件操作实现

3.驱动程序测试

2.1.1分析范例代码
2.1.2制作思维导图
2.1.3自己编写代码
2.1.4驱动程序框架代码
2.1.5填充裸机驱动

3.硬件访问技术

3.1.访问流程

3.2.地址映射

3.3.寄存器的读写

3.1访问流程

驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制的目的,因此我们讨论如何访问硬件,就成了如何访问这些寄存器,所以就可分为地址映射和读写寄存器。

3.2地址映射

裸机访问地址为物理地址,动态映射是指在驱动程序中采用ioremap函数将物理地址映射为虚拟地址
void *ioremap(physaddr,size)
参数:
physaddr:待映射的物理地址
size:映射的区域长度
返回值:映射后的虚拟地址
静态映射:是指linux系统根据用户事先指定的映射关系,在启动内核自动将物理地址映射为虚拟地址
在静态映射中,用户是通过map_desc结构来指明物理地址与虚拟地址的映射关系。
1.事先指定映射关系
struct map_desc{
unsigned long virture;//虚拟地址
unsigned long pfn;//物理地址
unsigned long length;//映射长度
unsigned int type;//映射的设备类型
};
pfn:利用__phys_to_pfn(物理地址)可以计算出物理地址所在的物理页帧号。
内核启动,在什么地方完成映射

寄存器

完成地址映射,就可以寄存器读写
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)

0 0