大部分讲linux内核驱动的书对于驱动在应用层的接口的描述,要么过于简单一个字符驱动+open、read、write、ioctl搞定,要么只讲内核不讲应用层接口。但这是错误的在讲驱动时要描述好应用层接口同时告诉读者调试方法。本文尝试对常见驱动的应用层接口做汇总和描述。
1、wifi设备驱动
这类设备底层非常复杂比如USB设备+wifi驱动+TCP/IP 网络协议层、SDIO设备+wifi驱动+TCP/IP 网络协议层等。Linux的网络设备驱动+wifi驱动是非常复杂的,包含了一系列框架和数据结构等,下面两幅图大概描述了这两者的关系。但是作为非芯片厂和非内核大牛贡献者,基本不需要参与。wifi设备在应用层的接口很简单都是移植wap_supplicant、iwlist 和 iwconfig,然后用它们管理名称为“wlanx”的设备。网络设备包括wifi设备都是通过proc伪文件系统接口。4G网卡什么的也是类似的,在应用层就是个eth文件。
2、有线网卡驱动
有线网卡驱动目前流行的是SOC内部MAC+PHY芯片。驱动也比较复杂,但应用层很简单也不用什么工具集了,直接创建socket就可以了。如果是多张网卡的情况则要用其他办法有同行发过很多文章可以去看看。
3、GPIO与sysfs
GPIO在应用层一般与sysfs绑定,这个用的是属性文件方式,比如改输入输出方向、写值等等。
4、input设备
input设备是一大类非常常用的设备,几乎所有的输入型设备都可以被包装成input设备。input设备在应用层的难点是事件解析,一般要建一个表解析event事件。触摸屏一般用tslib工具配合,移植时要配置input设备的设备名。
5、显示设备
显示设备在应用层就是个fb文件,fb一般也与tslib配合,然后Qt调用tslib文件,一般QWS_DISPLAY和QWS_MOUSE_PROTO这两个配置最重要。移植和配置好后触摸屏和显示屏的坐标就一一对应了,Qt随便放个ui加个按钮事件信号槽都能起作用了。
6、串口与tty
串口驱动经常包裹一层tty,于是在应用层看到的全是tty设备。tty设备除了set_port_attr属性设置函数其他就是普通的open、read、write。
7、sd、tf与mmc驱动
mmc放在sysfs系统中的,一般开机在kernel阶段就初始化好一切,然后就像用PC的硬盘一样read、write即可。当然也有按地址写标志位的操作,但其实是一样的。
U盘会被识别为一个sda设备,直接挂载到根文件系统某个目录即可操作。
8、声卡和alsa框架
声卡的驱动框架alsa把应用层也包含进去了。应用层有个alsa-lib库文件,一般还要移植aplay、mplayer等音频软件。然后app可以直接调用音频软件。
9、摄像头与V4L2
一般的操作如下,说真的着本质上不就是open、read、write、ioctl吗?
10、VPU、IPU、GPU
这些在应用层一定是要一定的库支持的,这些库依赖IC供应商提供。不具有大的普遍性,就不赘言了。