![嵌入式Linux设备驱动程序开发指南(原书第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/453/40381453/b_40381453.jpg)
4.8 实验4-2:“class字符设备”模块
在这个内核模块实验中,你将使用之前开发的helloworld_imx_char_driver
。但是这次设备节点的创建将由设备文件系统负责而不是手动创建。
在当前驱动代码中添加一个条目到/sys/class/
目录。/sys/class/
目录将设备驱动按类别分组。
当支持特定主设备编号的驱动通过register_chrdev_region()
函数注册到内核时,并没有指定任何关于驱动类型的信息。因此也不会在/sys/class/
目录下创建新的条目。/sys/class
目录下的条目对于在/dev
目录下创建设备节点的设备文件系统来说是必需的。在/sys
目录下,驱动有一个类别名,而每一个设备都有一个设备名。
驱动使用下面的内核API创建/销毁类别:
![086-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/086-02.jpg?sign=1738860249-lzCGnD9tcGNWeZa7PmHnojwwGlHDf4Go-0-432e7b265a791e4c39ad32f18dd34d9e)
驱动使用下面的内核API创建设备节点:
![086-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/086-03.jpg?sign=1738860249-GbXg6UtswxCRpLilSiBoLyImaPM2pdIY-0-9bb4a4da24f2dbfc86e3e8cf96a9011d)
当前驱动和之前开发的helloworld_imx_char_driver
驱动的主要区别描述如下:
1. 包含下面的头文件以创建类别和设备文件:
![087-01](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/087-01.jpg?sign=1738860249-1o2Tq2QZG0hMagK9BvlNDsUb9M5VR8kQ-0-be44969e38929eff864c8e4624fa8572)
2. 你的驱动将包含一个类别名和一个设备名;hello_class
用作类别名,mydev
作为设备名。这将导致设备文件出现在文件系统的/sys/class/hello_class/mydev
位置。为设备和类别名添加如下定义:
![087-02](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/087-02.jpg?sign=1738860249-V7atiUt5VXvpoLaFwn6HYxXwfR55arWA-0-8b2294d807ef4264bcc67b5682543d97)
3. hello_init()
函数比helloworld_imx_char_driver
驱动中的实现要更长一些。因为现在我们使用alloc_chrdev_region()
函数自动地给设备分配一个主设备号。同时我们需要注册设备类别并创建设备节点。
![087-03](https://epubservercos.yuewen.com/D1DB85/20966230701867406/epubprivate/OEBPS/Images/087-03.jpg?sign=1738860249-BQZ2AL6r3pCu6pOH5fYUTN7wqCaHdJfv-0-5282ec259b974bfbdd953abb32b11bd0)
在接下来的代码清单4-4中查看针对i.MX7D处理器的“class字符设备”驱动源代码(helloworld_imx_class_driver.c
)。
注意:针对SAMA5D2(helloworld_sam_class_driver.c
)和BCM2837(helloworld_rpi_class_driver.c
)的驱动源代码可以从本书的GitHub仓库下载。