在前面两章,我们介绍了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驱动开发,希望对大家有所帮助。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。