一:简单字符设备驱动开发一般分为下述几个步骤:
第一步:
先调用module_init注册加载与module_exit卸载驱动模块的函数。
编写出驱动模块入口(加载)函数与驱动模块出口(卸载)函数。
调用MODULE_LICENSE函数实现驱动许可证。
第二步:
实现register_chrdev_region|alloc_chrdev_region注册设备号。
实现unregister_chrdev_region注销设备号。
第三步:
cdev_init&cdev_add注册字符设备。
cdev_del注销字符设备。
第四步:
实现file_operations设备操作集合及open、release、write、read、ioctl等操作函数。
第五步:
使用ioremap将物理地址映射为虚拟地址。
使用iounmap将虚拟地址给卸载掉。
配置寄存器的虚拟地址(LED初始化)。
第六步:
在write函数编写控制寄存器(LED)程序。
编写LED判断状态点灯函数。
第七步:
使用class_create创建一个类。
使用class_destroy摧毁一个类。
第八步:
使用device_create创建设备。
使用device_destroy摧毁设备(先摧毁设备后再去摧毁其内部定义的类参数)。
二:LED子系统驱动控制
linux内核为各种硬件进行分类,然后针对各类硬件实现一套比较标准的驱动框架,其中每类硬件共有属性那一部分由内核开发者负责实现和维护,然后给驱动开发者留出接口用来完成具体硬件的特定操作部分。更加简化了驱动开发者的编码工作。
相关的源代码位于drivers/leds/目录内
启动内核后可以在/sys/class/目录下看到leds类,这也就是驱动框架中内核开发者完成的那一部分,之前是需要驱动开发者自己创建的,现在对于驱动开发者来说就只需要调用相关的接口创建设备即可。使用了驱动框架后可以不需要编写应用程序就可以测试led是否能正常被点亮与熄灭,这些都可以在sysfs文件系统中完成。在装载驱动后可以在/sys/class/leds/目录下看到对应的led设备目录。
