~听说驱动这东西研究深了会发现一种架构的美
Linux把所有的设备都看成文件(如LED、蜂鸣器、I2C、LCD、触摸屏等等设备)
文件是什么?
很简单,就是存在于我们文件管理器目录里的数据集合
为什么Linux要把所有的设备看成文件呢?
因为对于文件只有两个操作:读和写。
对于设备,无论是led还是网络也无非是对它读和写。
对于文件的操作一般就有几个函数?
open() //打开文件
read() //读取文件内容
write() //写入文件内容
ioctl() //管理文件
close() //关闭文件
目前理解:做驱动,尤其是字符类驱动这块的,就是做好open(),write(),ioctrl()等几个函数,然后等着上层去调用!
我们写的驱动函数怎么挂接到Linux系统上呢?
下面需要我们明白一个概念:设备文件(或者叫做设备节点):设备文件是连接上层应用和底层驱动的桥梁。
Linux文件系统里面,肯定有个目录叫做/dev(里面的所有文件是设备文件,不是普通文件)设备文件里面什么也没有,但包含两个信息:主设备号和次设备号。
主设备号:用来区分不同类的设备,比如LED,串口,网络等。。。
次设备号:用来区分同类设备里的不同的硬件,比如板子有四个串口,这四个串口主设备号相同,此设备号却不相同。
也就是说所有的设备,只要做好了驱动,都要在这个目录里生成一个文件(例如我们要对led操作,就要用open这个函数打开设备文件/dev/leds),即必须注册到系统,注册以后Linux才能找到它。
如何将写好的驱动函数注册进系统呢?
Linux为解决这个问题,专门做了一个函数,就是为注册而生的(register——chrdev())
这个注册函数具体定义如下:
Int register_chrdev(unsigned int major,const char name,struct file_operationsfops);
Major:主设备号
name:设备文件名字
file_operations:函数指针,实际我们做的5个驱动函数就是存在里面的。(驱动函数就是直接操作硬件的程序)
系统如何通过设备号对应硬件:
当我们调用系统open时,找到要找的文件、设备号,再根据设备号就可以找到对应封装号的驱动函数了,再通过调用驱动函数就可以对硬件进行操作了。