嵌入式linux鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架

本文档详细介绍了LED驱动程序框架,包括回顾字符设备驱动程序、LED驱动接口设计、驱动分层实现、代码编写及测试过程。通过抽象led_operations结构体和file_operations结构体,实现了对不同板子的LED驱动支持。测试程序展示了如何通过驱动控制LED的亮灭。课后作业提出了实现读取LED状态功能的挑战。
摘要由CSDN通过智能技术生成

1. LED驱动程序框架

注意:如果做实验安装驱动时提示version magic不匹配,请看本文档最后的“常见问题”。

1.1 回顾字符设备驱动程序框架

在这里插入图片描述

1.确定主设备号
2.定义自己的file_operations结构体
3.实现对应的drv_open/drv_read/drv_write等函数,填入file_operations结构体
4.把file_operations结构体告诉内核:register_chrdev
5.谁来注册驱动程序啊?得有一个入口函数,安装驱动程序时,就会调用这个入口函数。
6.有入口函数就应该有出口函数,出口函数调用unregister_chrdev
7.其他完善:提供设备信息,自动创建设备结点:class_create,device_create

1.2 对于LED驱动,我们想要什么样的接口?

在这里插入图片描述

1.3 LED驱动要怎么写,才能支持多个板子?分层。

  1. 把驱动拆分为通用的框架(leddrv.c)、具体的硬件操作(board_X.c):

在这里插入图片描述

  1. 以面向对象的思想,改进代码: 抽象出一个结构体:

在这里插入图片描述

每个单板相关的board_X.c实现自己的led_operations结构体,供上层的leddrv.c调用:

在这里插入图片描述

1.4 写代码

使用GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart

05_嵌入式Linux驱动开发基础知识source02_led_drv01_led_drv_template

1.4.1 驱动程序

驱动程序分为上下两层:leddrv.cboard_demo.c
leddrv.c负责注册file_operations结构体,它的open/write成员会调用board_demo.c中提供的硬件led_opr中的对应函数。

1.4.1.1 把LED的操作抽象出一个led_operations结构体

首先看看led_opr.h,它定义了一个led_operations结构体,把LED的操作抽象为这个结构体:

01 #ifndef _LED_OPR_H
02 #define _LED_OPR_H
03
04 struct led_operations {
05      int (*init) (int which); /* 初始化LED, which-哪个LED */
06      int (*ctl) (int which, char status); /* 控制LED, which-哪个LED, status:1-亮,0-灭 */
07 };
08
09 struct led_operations *get_board_led_opr(void);
10
11
12 #endif
13

看到上面定义的头文件,可以立马把对应的board_demo.c的框架给写出来,内部的具体功能根据情况再自己定义,头文件部分依旧是两个原则,一个是根据linux内核代码中别人类似的驱动程序去编写头文件,还有一种

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值