Linuxcorel

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 寄存器所在的地址