以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、概述
设备文件的创建,主要涉及class_create()函数、device_create()函数。
class_create()函数用于自动创建 /sys/class/目录下的xxx目录。
device_create()函数用于自动创建 /dev/目录下的xxx文件。
二、sys文件系统简介
(1)sys文件系统的设计思想
将内核的一些信息,以文件的形式列在sys目录下,如下所示。
root@ubuntu:/sys# ls block bus class dev devices firmware fs hypervisor kernel module power root@ubuntu:/sys# cd block/ root@ubuntu:/sys/block# ls loop0 loop2 loop4 loop6 ram0 ram10 ram12 ram14 ram2 ram4 ram6 ram8 sda sr1 loop1 loop3 loop5 loop7 ram1 ram11 ram13 ram15 ram3 ram5 ram7 ram9 sr0 root@ubuntu:/sys/block# cd ../bus/ root@ubuntu:/sys/bus# ls ac97 cpu hid mdio_bus platform sdio virtio acpi eisa i2c mmc pnp serio workqueue clockevents event_source isa pci rapidio spi xen clocksource gameport machinecheck pci_express scsi usb xen-backend root@ubuntu:/sys/bus# cd ../class/ root@ubuntu:/sys/class# ls ata_device bsg firmware leds powercap rfkill spi_host vtconsole ata_link devfreq gpio mdio_bus power_supply rtc spi_master watchdog ata_port dma graphics mem ppdev scsi_device spi_transport backlight dmi hidraw misc ppp scsi_disk thermal bdi drm hwmon mmc_host printer scsi_generic tty block enclosure i2c-adapter net pwm scsi_host vc bluetooth extcon input pci_bus regulator sound virtio-ports root@ubuntu:/sys/class#
应用层通过读写该目录下的文件,可以和内核进行一些信息交互。
(2)设备类的概念
内核将设备或者说驱动进行分类,比如和声音有关的、和时钟有关的等等,不同的类别的内容放在不同的/sys/class/xxx目录下,如上所示。xxx是由class_creat()函数创建的。
(3)/sys/class/xxx/ 目录中的文件的作用
目录下有dev,event,power,subsystem等文件。
通过这些文件,可以在应用层得知内核的一些数据结构与状态,这也是sys文件系统的意义。
例如cat dev,得知dev中内容是设备号;例如event是内核给udev传递的信息的地方。
(4)题外话
1)proc文件系统的功能类似于sys文件系统的功能,比如通过cat /proc/devices可以查看已经注册的块设备和字符设备的主设备号和设备名称。早期一般是通过/proc文件系统来获知系统信息的,后来因为没有统一规划,导致/proc文件系统杂乱,于是内核维护者开发了sys文件系统,进行了统一规划。
(2)/dev/xxx是设备文件,和/proc/devices,或者/sys/class/xxx/dev,有什么关系吗?
见字符设备驱动基础3——使用register_chrdev()函数注册字符设备中的描述。“proc目录是一个虚拟文件系统,可以为linux用户空间和内核空间提供交互;它只存在于内存中,而不占实际的flash或硬盘空间。/proc/devices/里的设备是加载驱动程序时生成的,而/dev/下的设备是通过创建设备节点生成的,用户通过此设备节点来访问内核里的驱动。”
二、函数追踪
(1)class_create()函数
class_create
__class_create
__class_register
kset_register
kobject_uevent:内核发送uevent给应用层
(2)device_create()函数
device_create
device_create_vargs
kobject_set_name_vargs:设置设备的名字
device_register:注册设备
device_add
kobject_add
device_create_file:这些函数都是用来创建/sys/class/xxx/中的内容的
device_create_sys_dev_entry
devtmpfs_create_node
device_add_class_symlinks
device_add_attrs
device_pm_add
kobject_uevent