【Linux 驱动】Linux设备树(四)—— 设备树驱动LED

news2025/3/5 12:22:52

有了设备树以后,我们可以将寄存器信息保存到设备树,即便是更换了一个设备,我们也无需修改驱动文件,只需要修改设备树文件并重新编译。

下面介绍两种通过设备树驱动 LED 的最简单的方式,这两种方式的主要是设备树中 reg 属性的写法不同,这也就影响到调用的API也会有所不同。

一、方法1

1、添加设备树节点

下面是在设备树的根节点下添加节点,节点路径为 /alientek-led。

alientek-led {
	compatible = "alientek-led";
	#address-cells = <1>;
	#size-cells = <1>;
	status = "okay";
	reg = <
		0x20C406C 0x04			/* CCM_CCGR1_BASE */
		0x20E0068 0x04			/* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03_BASE */
		0x20E02F4 0x04			/* IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03_BASE */
		0x209C004 0x04			/* GPIO1_GDIR_BASE */
		0x209C000 0x04			/* GPIO1_DR_BASE */
	>;
};

2、驱动获取设备树节点

在读取设备树属性之前需要先获取到设备树节点,在上一节中已经介绍了获取设备树节点的API,详情可参考: 操作设备树节点 API

struct chrdev_led_t{
	// ...

	struct device_node* dtsNode;	/* 设备树节点 */
};	
static struct chrdev_led_t chrdev_led;

// 获取设备树节点
chrdev_led.dtsNode = of_find_node_by_path("/alientek-led"); 
if(chrdev_led.dtsNode == NULL)
{	
    printk("node cannot be found!\n");
    return -1;
}

3、驱动读取设备树 reg 属性

如果 reg 属性采用的是当前写法,需要搭配 ioremap 函数使用。详情可参考: 操作设备树节点 API

ret = of_property_read_u32_array(chrdev_led.dtsNode, "reg", regData, 10);
if (ret < 0)
{
	printk("reg property read failed!\n");
	return -1;
}
/* 建立物理地址和虚拟地址的映射 */
CCM_CCGR1 = ioremap(regData[0], regData[1]);
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = ioremap(regData[2], regData[3]);
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 = ioremap(regData[4], regData[5]);
GPIO1_GDIR = ioremap(regData[6], regData[7]);
GPIO1_DR = ioremap(regData[8], regData[9]);

后续外设初始化内容可以参考: 寄存器驱动 LED

二、方法2

1、添加设备树节点

下面是在设备树的根节点下添加节点,节点路径为 /alientek-led。

alientek-led {
	compatible = "alientek-led";
	#address-cells = <1>;
	#size-cells = <1>;
	status = "okay";
	reg = <0x20C406C 0x04>,
		  <0x20E0068 0x04>,
		  <0x20E02F4 0x04>,
		  <0x209C004 0x04>,
		  <0x209C000 0x04>;
};

2、驱动获取设备树节点

获取设备树节点的方式同方法一。

3、驱动读取设备树 reg 属性

如果 reg 属性采用的是当前写法,需要搭配 of_iomap 函数使用。 详情可参考: 操作设备树节点 API

/* 建立物理地址和虚拟地址的映射 */
CCM_CCGR1 = of_iomap(chrdev_led.dtsNode, 0);
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = of_iomap(chrdev_led.dtsNode, 1);
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 = of_iomap(chrdev_led.dtsNode, 2);
GPIO1_GDIR = of_iomap(chrdev_led.dtsNode, 3);
GPIO1_DR = of_iomap(chrdev_led.dtsNode, 4);

 后续外设初始化内容可以参考: 寄存器驱动 LED

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

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

相关文章

轻量Http客户端工具VSCode和IDEA

文章目录 前言Visual Studio Code 的插件 REST Client编写第一个案例进阶&#xff0c;设置变量进阶&#xff0c;设置Token 前言 作为一个WEB工程师&#xff0c;在日常的使用过程中&#xff0c;HTTP请求是必不可少的。我们采用的HTTP工具有如下&#xff1a; Postman Insomnia Ap…

从零实现一套低代码(保姆级教程) --- 【4】实现右侧属性面板

摘要 继画布区的实现之后&#xff0c;来到本系列的第四篇文章&#xff0c;如果你没有看过之前的文章&#xff0c;可以建议先看一下第一篇文章&#xff0c;里面介绍了要实现的项目&#xff0c;是否是你要学习的内容&#xff0c;再决定是否要学习这一些列的文章。 从零实现一套低…

雄雄的小课堂微信机器人流程图

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 最近改造了下微信机器人&#xff0c;新版本还未上线&#xff0c;预计下周一&#xff08;12.25&#xff09;左右能上线第一版。 下面是改造之后的流程图 大家可以看看&#xff0c;有疑问可…

【万能技巧】IP知识速通与小技巧~

本文目录 前言一、网络代理IP简介二、IPIDEA 优势2.1 多种类型IP代理2.2 海量纯净代理池2.3 稳定高效数据收集架构 三、IP实操小Tips3.1 查看本地网络IP3.2 使用浏览器IP3.3 使用IPIDEA进行爬虫实操 前言 各位友友&#xff0c;大家好&#xff0c;马上就到2024年了&#xff0c;…

MyBatis 关联查询

目录 一、一对一查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a; 2、创建account和user实体类 3、创建AccountMapper 接口 4、创建并配置AccountMapper.xml 5、测试 二、一对多查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a;…

充电桩负载测试的影响是什么

充电桩负载测试是评估充电桩性能和稳定性的重要环节&#xff0c;其影响主要体现在以下几个方面&#xff1a; 1. 安全性&#xff1a;充电桩负载测试可以检测充电桩在高负载情况下的电气安全性能&#xff0c;如电压、电流、温度等参数是否在正常范围内。如果充电桩在高负载下出现…

【圣诞】极安云科赠书活动第①期:CTF实战:从入门到提升

【圣诞】极安云科赠书活动第①期&#xff1a;CTF实战:从入门到提升 9787111724834 9787121376955 9787302556275 ISBN编号&#xff1a;9787111724834 书名&#xff1a;CTF实战:从入门到提升 定&#xff1a;99.00元 开本&#xff1a;184&#xff4d;&#xff4d;260&#xff…

Android:安卓学习笔记之OkHttp原理的简单理解和使用

Android OkHttp使用原理的简单理解和使用 OkHttp 0、前言1、请求与响应流程 1.1 请求的封装1.2 请求的发送1.3 请求的调度1.4 请求的处理2、拦截器 2.1 RetryAndFollowUpInterceptor2.2 BridgeInterceptor2.3 CacheInterceptor 2.3.1、HTTP缓存原理2.3.2、强制缓存2.3.3、协商…

Linux网络编程(一):网络基础(下)

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 网络编程 1. 协议的概念 1.1 什么是协议 从应用的角度出发&#xff0c;协议可理解为 “规则”&#xff0c;是数据传输和数据解释的规则 假设&#xff0c;A、B双方欲传输文件&#xff0c;规定&#xff1a; 第一次&#xff…

云闪付支付:一种新型的移动支付方式

随着科技的发展&#xff0c;我们的生活方式也在不断地改变。其中&#xff0c;移动支付已经成为我们生活中不可或缺的一部分。而在这个领域中&#xff0c;云闪付支付无疑是一种新型的、高效便捷的支付方式。那么&#xff0c;云闪付支付究竟是什么&#xff0c;它又有哪些特点呢&a…

2023年12月23日 十二生肖 今日运势

小运播报&#xff1a;2023年12月23日&#xff0c;星期六&#xff0c;农历十一月十一 &#xff08;癸卯年甲子月乙卯日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;狗、猪、羊 需要注意&#xff1a;鼠、龙、鸡 喜神方位&#xff1a;西北方 财神方位&#xff…

Java 虚拟机中的内存结构

1 内存结构 1.1 程序计数器 1.1.1 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条 jvm 指令的执行地址 特点&#xff1a; 是线程私有的&#xff08;每个线程独有自己的一份&#xff09;不会存在内存溢出 1.1.2 作…

c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

设计模式:循序渐进走入工厂模式

文章目录 前言一、引入二、简单工厂模式1.实现2.优缺点3.扩展 三、工厂方法模式1.实现2.优缺点 四、抽象工厂模式1.实现2.优缺点3.使用场景 五、模式扩展六、JDK源码解析总结 前言 软件设计模式之工厂模式。 一、引入 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类…

java八股jvm

JVM虚拟机篇-01-JVM介绍、运行流程_哔哩哔哩_bilibili 1.PC程序计数器 2.堆 3.虚拟机栈 4.方法区/永久代/元空间 5.直接内存 JVM虚拟机篇-06-JVM组成-你听过直接内存吗_哔哩哔哩_bilibili 6.双亲委派 从下往上找&#xff0c;有同名类优先使用上级加载器的&#xff0c;不用自…

工作实践篇 Flink(一:flink提交jar)

一&#xff1a;参数 flink 模式 – standalone 二&#xff1a;步骤 1. 将本地测试好的代码进行本地运行。确保没问题&#xff0c;进行打包。 2. 找到打好的jar包&#xff0c;将jar包上传到对应的服务器。 3. 执行flink命令&#xff0c;跑代码。 /opt/flink/flink-1.13.6/bi…

Java中中文字典排序/多音字处理

Pinyin4j是一个Java库&#xff0c;用于将汉字转换为拼音。它是由中国清华大学的Tsinghua University和中国科学院计算技术研究所的研究人员开发的。Pinyin4j可以用于Java应用程序中&#xff0c;以便在需要时将汉字转换为拼音。例如&#xff0c;它可以用于中文输入法、文本编辑器…

Http---HTTP 请求报文

1. HTTP 请求报文介绍 HTTP最常见的请求报文有两种: GET 方式的请求报文POST 方式的请求报文 说明: GET: 获取web服务器数据POST: 向web服务器提交数据 2. HTTP GET 请求报文分析 HTTP GET 请求报文效果图: GET 请求报文说明: ---- 请求行 ---- GET / HTTP/1.1 # GET请…

慢调用链诊断利器-ARMS 代码热点

作者&#xff1a;铖朴、义泊 可观测技术背景 从最早的 Google 发表的一篇名为《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》的论文开始&#xff0c;到后来以&#xff1a;Metrics&#xff08;指标&#xff09;、Tracing&#xff08;链路追踪&#xf…

Android开发——添加图片

1、首先选择一张需要的图片&#xff0c;通过左侧的Resource Manage选择“”并选择Import Drawables 选择一张图片 并调整以下两个内容 这两个内容的作用借用谷歌官方的Android开发教程的内容&#xff1a; *Android 设备具有不同的屏幕尺寸&#xff08;手机、平板电脑和电视等…