# led_dev_led_trigger **Repository Path**: lxzstudy/led_dev_led_trigger ## Basic Information - **Project Name**: led_dev_led_trigger - **Description**: led class dev与led trigger实现 - **Primary Language**: C - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2024-03-17 - **Last Updated**: 2024-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 在前面两章,我们介绍了led子系统的软件框架与数据结构,本章我们实现一个led设备驱动、ledtrigger,用于led子系统的驱动开发练习,本章的主要内容如下: 一、led设备驱动开发流程 二、led trigger驱动开发流程 三、本次练习所涉及的开发内容说明 四、led-gpio驱动开发说明 五、led-trigger-pwm-gpio驱动开发说明 六、验证说明 一、led设备驱动开发流程 针对led设备驱动,主要完成如下几步即可: 1. 初始化并设置一个struct led_classdev 类型的变量; 2. 调用led_classdev_register完成led device的注册 二、led trigger驱动开发流程 针对led触发器,主要完成如下几步即可: 1. 定义并设置struct led_trigger 类型的变量; 2. 调用led_trigger_register完成led trigger的注册即可。 三、本次练习所涉及的开发内容说明 1. 需要熟悉platform device、platform driver使用; 2. 借助上一专栏(gpio子系统分析专栏)实现的virt gpio chip驱动,作为虚拟gpio设备; 3. 实现一个基于gpio控制的led设备,该设备可完成一个gpio led device的注册,并提供亮度设置接口; 4. 实现一个基于gpio-led的led trigger,该led trigger实现的功能是输出pwm波形(主要是借助virt gpio实现) 四、led-gpio驱动开发说明 相关数据结构说明 struct led_gpio_data为该gpio-led设备的数据结构: 1. 其内部包含led_classdev类型的变量led_dev,用于实现led设备的注册; 2. 包含gpio的值; 3. 该gpio是否为低有效 struct led_gpio_platform_data主要用于gpio-led对应的platform device设备向platform driver传递参数,参数包含gpio的值、gpio是否低有效,默认gpio值、默认选择的led-trigger名称等内容。 代码实现说明 1. 在platform driver的probe函数中,完成struct led_gpio_data类型变量的创建,对应gpio的申请及设置为输出模式,并完成struct led_classdev类型变量的设置(主要设置函数brightness_set、默认选择的led-trigger的名称等内容,接着调用led_classdev_register完成注册即可),如下是代码实现 led-trigger-pwm-gpio驱动开发说明 本trigger实现的功能是根据gpio值输出pwm波形(这个是借助led子系统的闪烁功能实现通过gpio进行pwm波形的输出验证,也可以理解成就是led周期闪烁,唯一的不同是使用高精度定时器实现微秒级亮灭罢了,此处主要是为了验证led-trigger功能) 相关数据结构 主要是数据结构struct gpio_pwm_trig_data,包含如下内容: 1. 定义一个高精度定时器timer,该定时器实现周期亮灭功能; 2. 定义delay_on指示led亮的时间; 3. 定义delay_off指示led灭的时间 代码设计 led_trigger的active函数 在该函数中,完成如下功能: 1. 完成struct gpio_pwm_trig_data类型变量内存的申请; 2. 完成delay_on、delay_off对应设备属性的创建 3. 完成高精度定时器的初始化,该定时器的超时函数主要完成亮灭的设置及下一个超时时间的设置(仅在用户设置delay_on、delay_off均不为0时,方可启动定时器)。如下是该接口的定义 led_trigger_deactive函数 该函数完成active函数申请内存的释放,定时器的关闭、设备属性的删除等内容。 编译说明: 执行make &&make install命令即可,生成的ko文件存储在images 六、验证说明 下面说明验证步骤: 1. insmod virt_gpio_dev.ko、insmod virt_gpio.ko,完成虚拟gpio chip的注册; 2. insmod led_gpio.ko 、insmod ledtrigger-gpio-pwm.ko完成led device、led trigger的注册; 3. insmod virt_gpio_led.ko 完成led-gpio对应platform device的注册 完成以上三步,在/sys/class/leds/virt_led_pwm下面就可以设置该led的trigger,此处我们设置为gpiopwm echo gpiopwm >trigger 然后设置亮灭时间(单位是微秒,此处我们设置亮灭各1秒) echo 1000000 >delay_on echo 1000000 >delay_off 然后进入目录/sys/devices/platform/virt_gpio_dev,查看文件vgpio_out,如下所示即实现了周期设置gpio的值。 本次测试代码已在ubuntu16.04上,完成验证。代码链接稍后给出。 本篇文章主要介绍如何实现led device、led trigger驱动开发,希望对大家有所帮助。