驱动本质是:通过读写/sys/class/leds/xxx内的文件,触发led_classdev(设备体)内的函数,从而实现操作硬件。
-
/sys/class/leds/xxx内的文件创建过程
led_classdev_register这个函数其实就是去创建一个属于leds这个类的一个设备。 -
首先填充设备体,这个设备体就是我们定义的一个led_classdev类型结构体,它里面集成了所有的操作和参数,其实就相当普通字符设备驱动中的cdev及其内部的file_operations。只不过led_classdev针对的是属于“leds”类的设备,而cdev针对的是普通字符设备。由于 led_classdev_register内部并不会对这个结构体指针实例化,所以我们定义的时候还是定义结构体比较好
static struct led_classdev mydev;
-
然后利用led_classdev_register注册这个设备体。led_classdev_register 就是框架给我们提供的接口,其第一个参数是父设备,第二个参数是指向led_classdev类型结构体的指针。经过了这一步 在/sys/class/leds/ 下就会自动出现一个目录,这个目录就是我们的设备文件目录。 对于我们这,/sys/class/leds/ 下就会出现特定led名字的目录,进入这个目录就会发现里面有各种文件、文件夹,下图就是leds属性
抽空继续总结。。。