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)
- Linux 驱动开发前奏---驱动开发概述、硬件访问技术
- 9.Linux驱动开发前奏(2)-硬件访问技术
- 9.Linux驱动开发前奏(1)-驱动开发概述
- linux驱动开发前奏
- linux驱动开发前奏
- Linux驱动开发前奏
- Linux2.6.32驱动笔记(1)驱动开发概述及硬件访问技术
- 嵌入式学习-驱动开发前奏-lesson4-驱动分类和硬件访问相关
- 设备驱动开发前奏
- Linux驱动开发概述
- Linux 驱动开发概述
- Linux驱动开发概述
- Linux驱动开发概述
- Linux设备驱动开发概述
- Linux设备驱动开发概述
- linux设备驱动开发概述
- Linux设备驱动开发概述
- 嵌入式学习-驱动开发前奏-lesson3-linux内核链表
- lintcode--最长连续序列
- 如何利用MySQL语句将自增重置为1
- C语言中数组与指针区别精解
- Java内存分配
- Oracle11g RAC集群启动关闭
- Linux 驱动开发前奏---驱动开发概述、硬件访问技术
- 2018国家公务员考试行测备考:比例思想巧解工程问题
- datagrid的列如何取得相关联表的值
- 如何理解指针和数组char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][]
- 灵活的使用try catch
- php主要输出方式的区别
- 五.初始化与清理——Java编程思想第4版学习笔记
- Effective C++第七章-模板和泛型编程之typename与嵌套从属名称
- erlang笔记1