欢迎光临散文网 会员登陆 & 注册

基于led驱动框架实现led驱动

2023-01-19 15:12 作者:秋名山西  | 我要投稿

驱动共三种形式

1、file_operation形式,在/dev下生成设备文件,属于内核开放接口,操作设备文件操作硬件

2、attribute形式,在sys/class下生成属性文件,通过属性操作硬件

3、platform形式,在sys/devices/platform下生成文件,属于平台类设备,也是直接操作设备文件实现对硬件的操作

led驱动框架属于attribute方法实现驱动,将整个驱动分为两层,第一层是内核开发人员编写的led驱动抽象层,封装了led驱动的共同特性,例如字符设备的注册与注销,led框架类的结构体。

第二层则是驱动开发工程师需要去实现的,填充led_classdev结构体,由于show和store是需要操作硬件的方法,而其方法本身属于led驱动抽象层,不能直接操作具体硬件,因此只能通过指针的方式与具体硬件的操作方法进行挂接,最终完成对硬件的操作。对于led驱动,执行对硬件操作的指针是brightness_set,并且show方法并不是真的实现了对gpio口的值的读取,而是直接使用输入的赋值给brightness。

还有值得一说的是,在linux中,gpio也被看做一种资源,内核开发者是用来gpiolib作为资源管理器进行管理。因此在驱动程序中应当尽量避免直接操作相关资源,避免出现多个驱动获得同一资源的bug出现。

使用gpiolib完成gpio设置的流程如下:

(1)使用gpio_request()/gpio_request_array()申请gpio资源

(2)使用gpio_direction_output()/gpio_direction_input()设置gpio为输出或者输入模式

(3)设置gpio_set_value()设置gpio的电平状态,或者调用gpio_get_value获取gpio值


综上,使用led驱动框架编写驱动的流程如下:

(1)在模块的初始化函数xxx_init中调用led框架开发的注册接口led_classdev_register注册led驱动模块,并在此初始化函数中完成相关资源的申请。初始化led框架所开发给驱动开发者的结构体struct led_classdev(可根据需要填充相关项)。

(2)编写相关的硬件操作函数,调用gpio_set_value完成gpio值的设置

基于led驱动框架实现led驱动的评论 (共 条)

分享到微博请遵守国家法律