驱动实现——驱动框架

92 阅读2分钟

4月「掘金·日新计划」第20天

2.2、attribute路线(驱动框架)

image.png 只在sys/class的具体类下面,创建文件,操作文件

2.2.1、驱动框架概念

  1. 每一类都有成熟,标准的,典型的驱动框架 内核工程师做一部分,驱动做一部分 功能相同的封装出来,不同的驱动工程师做

    1. 例如led驱动 drivers/leds目录下

      1. 内核工程师做的 led-class.c led-core.c
      2. 驱动需要做的 leds-xxx.c
    2. 不用驱动框架做驱动 drivers/char/leds/x210-led.c

  2. misc驱动框架

    1. 杂项设备(蜂鸣器,adc) /sys/class/misc misc类,驱动框架,典型的字符设备 内核实现:类的创建,misc.c 驱动实现:驱动注册
    2. cat /proc/misc
  3. 资源使用前必须申请,例如中断号,内存

  4. 特定接口,数据结构是驱动的直接体现

2.2.2、安装卸载驱动

  1. 安装,有2种

    1. module_init
    2. subsys_initcall
    3. 区别就是,内核执行顺序不同,一个是6,一个是4 内核启动时要调用的所有函数归类,然后每个类按照一定的次序去调用执行。这些分类名就叫.initcalln.init。n的值从1到8。内核开发者在编写内核代码时只要将函数设置合适的级别,这些函数就会被链接的时候放入特定的段,内核启动时再按照段顺序去依次执行各个段即可
  2. 卸载,和上面一样module_exit

2.2.3、注册注销驱动(在sys类下创建文件接口)

  1. 结构体struct led_classdev

    name:类名myled
    max_bringhtness:最大数
    brightness:读
    brightness_set:写方法,这个函数控制硬件
    
  2. 注册

    1. led_classdev_register,参数:NULL,classdev结构体指针
  3. 注销

    1. led_classdev_unregister,参数:classdev结构体指针

2.2.4、使用

  1. 代码在gpiolib库部分

  2. 目录/sys/class/leds/出现xxx

  3. 加权限777

  4. cat,echo操作文件(相当于操作硬件)

    1. cat执行了 brightness_show方法 最终执行brightness执行的函数

    2. echo执行 brightness_store方法

      echo 1 > xxx

      brightness_set函数