关于驱动的概述
- Linux驱动包含三种:字符设备驱动、块设备驱动、网络设备驱动。块设备驱动主要包括存储类设备的驱动,比如RAM,SD卡等;网络设备驱动主要包括网络相关设备的驱动,比如以太网等;剩下的都属于字符设备驱动,比如IIC.UART,AD等。我们开发Linux驱动主要是字符设备驱动的开发。
- linux把led,蜂鸣器,IIC,LCD等等设备,都看成了文件。
- 对于文件来讲,不管是什么设备,对它的操作无非是读和写。
- 对于文件的操作一般有五个函数:
open() 打开
read() 读取
write() 写入
ioctl() IO控制
close() 关闭 - 做驱动,尤其是字符类驱动,就是做好open() write() ioctrl()等几个函数的,然后等着上层去调用就可以了。
- 在linux文件系统里面,肯定有个目录叫做/dev,这个目录里的所有文件是设备文件,而不是普通文件。也就是说所有的设备,只要是做好了驱动,都要在这个目录里生成一个文件。比如对led操作,那就要用open这个函数打开设备文件/dev/leds。
- 设备文件里面包含两个信息,主设备号和次设备号。主设备号用来区分不同类的设备,比如LED,串口,网络等。次设备号区分同类设备里的不同的硬件,比如迅为的板子有四个串口,这四个串口主设备号相同,次设备号却不相同。
- 设备号怎么和硬件对应起来呢?
做驱动,其实就是做那几个函数而已,比如open,read等,但是做完那几个函数以后必须注册到系统!注册以后linux才能找到它,上层才能找到它并调用他。 - 怎么注册?
Linux为了解决这个问题,专门做了一个函数,就是为注册而生的,register_chrdev()
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
这个函数的第一个参数就是major ,也就是刚才说的主设备号!
第二个参数就是 name, 也就是设备文件的名字!
第三个是个结构file_operations,这个里面就是函数指针,实际就是我们做的那5个函数存在里面!我们先写 open, read,write, close 那几个函数,然后把这几个函数,放到一个结构里面,也就是file_operations。最后通过函数register_chrdev(),把我们做的那几个函数和设备文件以及设备号关联起来就可以了。 - 主设备号自己指定明知要保证和别的设备不一样就可以了。
- 驱动介于文件系统和底层硬件之间,是嵌入到内核中的程序。
- 上层是文件系统和应用,中间是Linux内核和下层是硬件。
Linux设备驱动附着在Linux内核上。
– 对上:Linux设备驱动要给上层提供调用的接口;
– 对中:Linux设备驱动要注册到Linux内核中(或者挂载在总线);
– 对下:操作硬件(GPIO,中断IO、PWM,I2C,SPI等等)
– 以上三个,Linux内核均提供了接口函数。