Linux驱动开发前奏
一、驱动开发概述
1.驱动分类, 常规分类
字符设备:一种 以字节为最小访问单位的设备,通常支持open,close,read,write系统调用。
块设备:大部分Unix系统中,以 块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据。
网络设备:可以是一个硬件设备,如网卡;也可以是一个纯粹的软件设备,比如回环接口(lo)。一个网络接口负责发送和接受数据报文。
2.总线分类法
USB设备
PCI设备
平台总线设备
二、驱动学习方法
1.驱动模型
分析范例程序、制作思维导图、自己编写代码、驱动程序框架
2.硬件操作
复习裸机驱动
将裸机中的硬件操作移植到Linux驱动中
三、硬件访问技术
1.1 硬件访问实质
在Linux系统中, 无论是内核程序还是应用程序, 都只能使用虚拟地址,而芯片手册中给出的硬件 寄存器地址或者RAM地址则是物理地址,无法直 接使用,因此,我们读写寄存器的第1步就是将 将它的物理地址映射为虚拟地址。
2.1 动态映射
所谓动态映射,是指在 驱动程序中采用 ioremap函 数将物理地址映射为虚拟地址。
2.2 静态映射
所谓静态映射,是指Linux系统根据用户 事先指定的 映射关系,在内核启动时, 自动 地将物理地址映射 为虚拟地址。
1. 如何事先指定映射关系? 填充结构,告诉内核map_desc数组中
阅读(30) | 评论(0) | 转发(0) |
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
一、驱动开发概述
1.驱动分类, 常规分类
字符设备:一种 以字节为最小访问单位的设备,通常支持open,close,read,write系统调用。
块设备:大部分Unix系统中,以 块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据。
网络设备:可以是一个硬件设备,如网卡;也可以是一个纯粹的软件设备,比如回环接口(lo)。一个网络接口负责发送和接受数据报文。
2.总线分类法
USB设备
PCI设备
平台总线设备
二、驱动学习方法
1.驱动模型
分析范例程序、制作思维导图、自己编写代码、驱动程序框架
2.硬件操作
复习裸机驱动
将裸机中的硬件操作移植到Linux驱动中
三、硬件访问技术
1.1 硬件访问实质
驱动程序控制设备,主要是通过访问设备内的寄存器来达到
控制目的,因此我们讨论如何访问硬件,就成了如何访问这
些寄存器了。
2. 地址映射
在Linux系统中, 无论是内核程序还是应用程序, 都只能使用虚拟地址,而芯片手册中给出的硬件 寄存器地址或者RAM地址则是物理地址,无法直 接使用,因此,我们读写寄存器的第1步就是将 将它的物理地址映射为虚拟地址。
2.1 动态映射
所谓动态映射,是指在 驱动程序中采用 ioremap函 数将物理地址映射为虚拟地址。
原型:
void * ioremap(physaddr, size)
参数:
Physaddr:待映射的物理地址
Size: 映射的区域长度
返回值:映射后的虚拟地址
2.2 静态映射
所谓静态映射,是指Linux系统根据用户 事先指定的 映射关系,在内核启动时, 自动 地将物理地址映射 为虚拟地址。
1. 如何事先指定映射关系? 填充结构,告诉内核map_desc数组中
2. 内核启动时,在什么地方完成自动映射? lotable_init();
2.3 映射关系
在静态映射中,用户是通过 map_desc结构来指明 物理地址与虚拟地址的映射关系。
2.3 映射关系
在静态映射中,用户是通过 map_desc结构来指明 物理地址与虚拟地址的映射关系。
struct map_desc {
unsigned long
virtual; /* 映射后的虚拟地址 */
unsigned long
pfn; /* 物理地址所在的页帧号 */
unsigned long length; /* 映射长度 */
unsigned int type; /* 映射的设备类型 */
};
pfn: 利用__phys_to_pfn(物理地址)可以计算出物
理地址所在的物理页帧号。
3.寄存器读写
在完成地址映射后,就可以读写寄存器了,Linux内核 提供了一系列函数,来读写寄存器。
3.寄存器读写
在完成地址映射后,就可以读写寄存器了,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)
给主人留下些什么吧!~~
评论热议