Linux内核
1、Linux内核:driver 驱动程序
cdev_add将函数添加到链表中,嵌套了一个结构体file_operations(初始化结构体:cdev_init)
硬件
2、驱动如何去操作(硬件设备)应用函数中的接口?
1)
1 2 3 4 5 6 7 8 9
| 应用函数:int ioctl(int d,int request,...) 功能:控制设备 参数:d 文件描述符 Request 命令码 … 实现数据的传递
|
2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| define _IO(type,nr) #define _IOR(type,nr,size) #define _IOW(type,nr,size) #define _IOWR(type,nr,size) type幻数,任意的数 nr 编号,从0开始 size 传输数据的大小 返回值: 成功 0 失败 -1
|
3)驱动
1 2 3 4 5
| Long test_ioctl(struct file *filep ,unsigned int cmd,unsigned long arg){ //实现对设备的控制 }
|
4)硬件控制
物理地址————-à虚拟地址
A、
1 2 3 4 5 6 7 8 9 10 11
| 函数原型:void *ioremap(unsigned long offset,unsigned long size) 功能:物理地址转换为虚拟地址 参数:offset 物理地址 size 范围 返回值:成功 虚拟地址 失败 NULL
|
B、
1 2 3 4 5
| 函数原型:void iounmap(volatile void_iomemd *adr) 参数adr 虚拟地址 返回值:成功 寄存器值
|
C、
1 2 3 4 5 6 7
| 函数原型;void write(u32 b,volatile void_iomemd *addr ) 功能:将修改之后的寄存器的值,写到寄存器 参数: b 修改之后的值 addr 寄存器所在的地址
|