4月「掘金·日新计划」第20天
2.2、attribute路线(驱动框架)
只在sys/class的具体类下面,创建文件,操作文件
2.2.1、驱动框架概念
-
每一类都有成熟,标准的,典型的驱动框架 内核工程师做一部分,驱动做一部分 功能相同的封装出来,不同的驱动工程师做
-
例如led驱动 drivers/leds目录下
- 内核工程师做的 led-class.c led-core.c
- 驱动需要做的 leds-xxx.c
-
不用驱动框架做驱动 drivers/char/leds/x210-led.c
-
-
misc驱动框架
- 杂项设备(蜂鸣器,adc) /sys/class/misc misc类,驱动框架,典型的字符设备 内核实现:类的创建,misc.c 驱动实现:驱动注册
- cat /proc/misc
-
资源使用前必须申请,例如中断号,内存
-
特定接口,数据结构是驱动的直接体现
2.2.2、安装卸载驱动
-
安装,有2种
- module_init
- subsys_initcall
- 区别就是,内核执行顺序不同,一个是6,一个是4 内核启动时要调用的所有函数归类,然后每个类按照一定的次序去调用执行。这些分类名就叫.initcalln.init。n的值从1到8。内核开发者在编写内核代码时只要将函数设置合适的级别,这些函数就会被链接的时候放入特定的段,内核启动时再按照段顺序去依次执行各个段即可
-
卸载,和上面一样module_exit
2.2.3、注册注销驱动(在sys类下创建文件接口)
-
结构体struct led_classdev
name:类名myled max_bringhtness:最大数 brightness:读 brightness_set:写方法,这个函数控制硬件 -
注册
- led_classdev_register,参数:NULL,classdev结构体指针
-
注销
- led_classdev_unregister,参数:classdev结构体指针
2.2.4、使用
-
代码在gpiolib库部分
-
目录/sys/class/leds/出现xxx
-
加权限777
-
cat,echo操作文件(相当于操作硬件)
-
cat执行了 brightness_show方法 最终执行brightness执行的函数
-
echo执行 brightness_store方法
echo 1 > xxx
brightness_set函数
-