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

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

下面介绍两种通过设备树驱动 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自营商城与多商户入驻商城功能与开发流程_OctShop

如今互联网以及电子商务的大趋势下&#xff0c;很多企业或商家都意识到自营商城的重要性。当然&#xff0c;要搭建一个属于自己的自营商城并非简单。需要综合考虑众多的因素&#xff0c;如&#xff1a;用户体验、商品管理、在线支付、功能需求、市场分析等等多个方面。如果是自…

dell服务器 R740xd安装windows server 2019过程记录

公司有两台dell服务器型号是R740xd&#xff0c;增加了存储&#xff0c;更新系统到windows server 2019标准版。 查找了网上的系统安装方式&#xff0c;都没有实践成功&#xff0c;做一下工作记录&#xff0c;给大家做参考。 网络搜索到的两种方式&#xff0c;进行安装 &#x…

全都没有问题(二点五)

java 接口默认方法冲突等问题 基础基础基础 子接口覆盖父接口的默认方法 package com.book;interface AA{public abstract void print();public default void ID(){System.out.println("AA");} } interface BB extends AA{ //接口BB继承AAOverridepublic default…

C#线程的定义和使用方法

引言 在C#编程语言中&#xff0c;线程是一种并发执行的机制&#xff0c;允许程序同时执行多个任务。线程的使用使得我们能够利用计算机的多核处理器&#xff0c;实现程序的并行执行&#xff0c;提高系统的性能和响应能力。本文将详细介绍C#中线程的定义和使用方法&#xff0c;涵…

学习体系结构 - AArch64 虚拟化

学习体系结构 - AArch64 虚拟化 Learn the architecture - AArch64 virtualization Version 1.0 借助 Deepl 翻译文档 个人对文档补充的一部分解释&#xff0c; 仅供学习参考 前 3 章为了解内容&#xff0c;引入虚拟化 第 4-7 章为虚拟化比较核心的内容 第 4 章为第二阶段地址…

windows安装、基本使用vim

标题&#xff1a;windows安装、基本使用vim 1.下载并安装GVIM 百度网盘链接 提取码&#xff1a;2apr 进入安装界面&#xff0c;如下&#xff0c;勾选 其它都是默认即可 参考&#xff1b; 2.在powershell中使用vim 参考blog&#xff1a;window10安装vim编辑器 安装好后&…

机器人制作开源方案 | “校园卫士”-智能巡检机器人

作者&#xff1a;程训聪、柳贺凯、赵坤峰、叶智超、高仁伟 单位&#xff1a;黑龙江科技大学 指导老师&#xff1a;邵文冕、李杨 1. 摘要 针对校园巡检需求设计机器人本体结构&#xff0c;借助Arduino作为控制核心的巡检机器人控制系统构建方法研究了巡检机器人在校园环境下的…

数据结构:图解手撕B-树以及B树的优化和索引

文章目录 为什么需要引入B-树&#xff1f;B树是什么&#xff1f;B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树&#xff1f; 回忆一下前面的搜索结构&#xff0c;有哈希&#xff0c;红黑树&#xff0c;二分…等很多的搜索结构&a…

Maven仓库上传jar和mvn命令汇总

目录 导入远程仓库 命令结构 命令解释 项目pom 输入执行 本地仓库导入 命令格式 命令解释 Maven命令汇总 mvn 参数 mvn常用命令 web项目相关命令 导入远程仓库 命令结构 mvn deploy:deploy-file -Dfilejar包完整名称 -DgroupIdpom文件中引用的groupId名 -Dartifa…

使用 Node.js 删除文件 - 完整步骤教程

引言 在 Node.js 中处理文件尤其是移除文件&#xff0c;对于维护高效应用程序至关重要。储存和秩序当道的今天&#xff0c;删除不必要或冗余的文件能力显得尤为关键。本文深入探讨你会想要使用这个强大功能的时刻和原因&#xff0c;并通过各种案例展示了这个概念&#xff0c;同…

JavaScript基础(数组+正则表达+字符串)

目录 1.数组 1.1创建数组 1.2字面量创建数组 1.3length函数 1.4遍历数组1 1.5遍历数组2语法糖 1.6增删改查 1push 2pop 3unshift("x",x) 4shift() 5数组的截取 slice() splice() 6concat 7reverse 2.内置对象 2.1data 2.2Math对象 2.3字符串 1c…

2023年12月20日历史上的今天大事件早读

1722年12月20日 康熙皇帝驾崩 1803年12月20日 法国正式将新奥尔良移交给美国 1860年12月20日 南卡罗来纳州宣布脱离美国 1917年12月20日 全俄肃反委员会成立 1928年12月20日 国民党与英国签订中英关税条约 1939年12月20日 德“施佩伯爵”号遭英舰围困自沉 1945年12月20日…

Poi实现复杂Excel导出,理解POI操作Excel思路!!!

前言 对于简单excel报表导出&#xff0c;有很多简单的工具如easypoi&#xff0c;而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景&#xff0c;而我们实际生产中面临的都是客户自定以的一个负责报表导出&#xff0c;这是利用…

搭建 ElasticSearch 集群环境

安装基础环境 我们用虚拟机创建出3台机器&#xff0c;查看centos版本为7.9 [roots1 ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (AltArch)下载相关命令 yum -y install vim* yum -y install net-tools yum -y install lsof yum -y install wget yum -y ins…

对GPU进行压力测试

GPU压力测试工具安装指导&#xff08;RHEL8.2&#xff09; - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/443165016 1、下载gpu-burn工具 下载地址&#xff1a;https://github.com/wilicc/gpu-burn 2、上传到系统后安装 # unzip gpu-burn-master.zip # cd gpu-burn-mas…

关于MQ,你了解多少?(干货分享之二)

导语 本文梳理笔者 MQ 知识&#xff0c;从消息中间件的基础知识讲起&#xff0c;在有了基础知识后&#xff0c;对市面上各主流的消息中间件进行详细的解析&#xff0c;包括 RabbitMQ、RocketMQ、Kafka、Pulsar&#xff0c;最后再横向对比这几款主流的消息中间件。本篇是系列文…

Maven——如何快速生成bean的get、set方法,Lombok依赖引入和使用!!!

Lombok依赖引入和使用 1、项目pom.xml文件引入如下依赖&#xff1a;2、引入之后还要在idea中安装对应lombok插件:file–>plugins–>搜索框搜索lombok安装3、重启之后&#xff0c;便可以在实体类bean中使用提供注解快速生成对应的方法了 总结 本文介绍如何快速生成实体bea…

基于YOLOv5的姿态估计

一、基于YOLOV5的姿态估计与实现 相关论文&#xff1a; YOLO-Pose: Enhancing YOLO for Multi Person Pose Estimation Using Object Keypoint Similarity Loss 相关源码 edgeai-yolov5-yolo-pose 二、数据集 The dataset needs to be prepared in YOLO format so that the…

Sanic:Python中的高性能异步Web框架详解

概要 在众多Python Web框架中&#xff0c;Sanic以其高性能和易用性脱颖而出。它是一个异步Web框架&#xff0c;允许使用Python 3.6的新异步/等待语法编写代码&#xff0c;使得创建快速的HTTP响应成为可能。本文将深入探讨Sanic框架的核心特性、基本用法、路由管理、中间件处理…