
alloc_chrdev_region()proc/devices新增条目alloc_chrdev_region()函数不会新创建生成新的文件而是会在/proc/devices文件中添加新的条目244表示自动分配的主设备号后续跟着的是alloc_chrdev_region()函数的入参#defineLED_DEVICE_NAMEled-proc/devcies// /proc/devices file, devid namealloc_chrdev_region(led.devid,led.minor,1,LED_DEVICE_NAME);class_create()/sys/class/classNameclass_create()函数创建一个设备类将会在/sys/class/路径下生成与入参类名一致的文件如示例中创建生成的/sys/class/led-class文件#defineLED_CLASS_NAMEled-class// /sys/class/led-class/led-devclass_create(THIS_MODULE,LED_CLASS_NAME);device_create()/dev/devName、/sys/class/className/devNamedevice_create()函数创建一个class下的设备#defineLED_DEV_NAMEled-dev// /dev/led-devdevice_create(led.led_class,NULL,led.devid,NULL,LED_DEV_NAME);modprobe moduleName/sys/module/moduleNamemodprobe leddriver.ko命令执行后在/sys/module路径下生成相应模块的文件夹/sys/module/moduleNameplatform_driver_register()/sys/module/moduleName/drivers/pdrv-driver-name使用platform_driver_register()完成platform_driver在platform总线的注册注册完成后在/sys/module/moduleName/drivers文件中添加相应的驱动名称即pdrv-driver-name。staticconststructof_device_idled_of_match[]{{.compatiblezhy,leds,},{},};staticstructplatform_driverled_driver{.probeled_probe,.removeled_remove,.driver{.nameled_paltform_driver,.of_match_tableled_of_match,},};platform_driver_register(led_driver);gpio_request()/sys/bus/platform/drivers/gpioLable使用gpio_request()完成gpio子系统的注册函数执行之后在/sys/bus/platform/drivers路径下添加相应的gpio lable文件夹gpio_request(led.gpio,led-gpio);platform_device_register()/sys/devices/platform/deviceName.deviceId使用platform_device_register()完成platform_device在platform总线的注册完成注册后将会在/sys/devices/platform路径下相应的设备文件夹如果只有一个该设备可以赋值xxx_device.id -1那么生成的设备文件夹的名称即为xxxxxx为struct platform_device xxx_device实例的结构体成员name即xxx_device-name如果不止一个该设备可以赋值xxx_device.id num那么生成的设备文件夹的名称即为xxx.num。// struct resource为设备的寄存器信息structresourcexxx_resource[]{[0]{.startSTART_PHYSICAL_ADDR0,// 起始地址以及终止地址均是实际的物理地址.endEND_PHYSICAL_ADDR0,// 地址以字节为单位.flagsIORESOURCE_MEM,},[1]{.startSTART_PHYSICAL_ADDR1,.endEND_PHYSICAL_ADDR1,.flagsIORESOURCE_MEM,},};structplatform_devicexxx_device{.namexxx,// 用于sysfs文件的创建以及与驱动的匹配.id-1,// 如果只有一个设备赋值为-1若有多个设备应设置不同的值此时该值也将用于sysfs文件的创建.resourcexxx_resource,.num_resourcesizeof(xxx_resource)/sizeof(structresource),.dev{.releasexxx_release,// 一般情况下不需要自定义}};staticint__initxxx_device_init(void){returnplatform_device_register(xxx_device);}module_init(xxx_device_init);设备树/sys/firmware/devicetree/base/sys/devices/和/sys/bus设备树中所有节点的信息都会按层次结构存放在/sys/firmware/devicetree/base文件夹下/proc/device-tree符号链接也是指向该路径。/sys/devices/和/sys/bus路径下也会根据设备树生成相应的文件这些都是注册过platform_device的如果使用platform总线的话platform device侧的代码一般就不需要再开发了led_classdev_register()/sys/devices/soc0/led/leds/led classdev nameled_classdev_register()负责完成led类设备的注册其完成后会创建生成/sys/devices/soc0/led/leds/led classdev name文件夹在该文件夹下可以通过想brightness、trigger等文件写入相应的值实现对led相应的控制。led-cdev.nameled--1;led-cdev.brightnessLED_OFF;led-cdev.max_brightnessLED_FULL;led-cdev.brightness_setled_brightness_set;led-cdev.brightness_set_blockingled_brightness_set_blocking;led_classdev_register(pdev-dev,led-cdev);如果对你有帮助欢迎点赞收藏有相关问题也可以评论讨论