Linux 驱动开发前奏---驱动开发概述、硬件访问技术

来源:互联网 发布:华语乐坛唱功最好知乎 编辑:程序博客网 时间:2024/05/16 01:34

驱动的分类

这里写图片描述

字符设备
字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现 open , close , read 和 write 系统调用。例:串口,LED,按键。

块设备
在大部分的Unix系统中,块设备定义为:以块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据。
而Linux则允许块设备传送任意数目的字节。因此,在Linux系统中,块和字符设备的区别仅仅是驱动的与内核的接口不同 。常见的块设备包括硬盘,flash,SD卡……

网络接口
网络接口可以是一个硬件设备,如网卡;但也可以是一个纯粹的软件设备,比如回环接口(lo)。一个网络接口负责发送和接收数据报文。

总线分类法
USB设备,PCI设备,平台总线设备等等。

驱动程序开发的步骤

1、分析驱动程序范例,总结出该类型驱动程序的模型。

2、制作驱动程序模型的思维导图。

3、编写代码,得到驱动程序框架,添加硬件操作代码。

4、移植到Linux系统中,对驱动程序进行测试。

硬件访问技术

硬件访问实质:
驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的,因此我们讨论如何访问硬件,本质就是如何访问这些寄存器。

地址映射:
在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者RAM地址则是物理地址,无法直接使用,因此,我们读写寄存器的第1步就是将将它的物理地址映射为虚拟地址。映射方式包括:动态映射和静态映射。

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

//原型:void * ioremap(physaddr, size)//参数://Physaddr:待映射的物理地址//Size: 映射的区域长度//返回值:映射后的虚拟地址

静态映射:
所谓静态映射,是指Linux系统根据用户事先指定的映射关系,在内核启动时,自动地将物理地址映射为虚拟地址。
在静态映射中,用户是通过map_desc结构来指明物理地址与虚拟地址的映射关系。

struct map_desc {    unsigned long virtual; /* 映射后的虚拟地址 */    unsigned long pfn; /* 物理地址所在的页帧号 */    unsigned long length; /* 映射长度 */    unsigned int type; /* 映射的设备类型 */};

pfn:利用 _ phys_ to_ pfn(物理地址)可以计算出物理地址所在的物理页帧号。

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

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)
原创粉丝点击