RK3568驱动指南|第七期-设备树-第60章 实例分析:GPIO

news2024/9/25 13:26:34

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第七期_设备树_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第60章 实例分析:GPIO

60.1 GPIO相关属性

60.1.1 RK ft5x06设备树节点

下面展示的是iTOP-RK3568开发板SDK源码中的ft5x06设备树,其中蓝色字体部分就是关于gpio相关的描述,包括了interrupts、 interrupt-controller、#interrupt-cells、interrupt-parent四种常见属性:

gpio0: gpio@fdd60000 {
    compatible = "rockchip,gpio-bank";
    reg = <0x0 0xfdd60000 0x0 0x100>;
    interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&pmucru PCLK_GPI00>, <&pmucru DBCLK_GPI00>;
    gpio-controller;
    #gpio-cells = <2>;
    gpio-ranges = <&pinctrl 0 0 32>;
    interrupt-controller;
    #interrupt-cells = <2>;
};

ft5x06: ft5x06@38 { 
    status = "disabled";
    compatible = "edt,edt-ft5306";
    reg = <0x38>;
    touch-gpio = <&gpio0 RK_PB5 IRQ_TYPE_EDGE_RISING>;
    interrupt-parent = <&gpio0>;
    interrupts = <RK_PB5 IRQ_TYPE_LEVEL_LOW>;
    reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
    touchscreen-size-x = <800>;
    touchscreen-size-y = <1280>;
    touch_type = <1>;
};

其中gpio0节点是在内核源码的“/arch/arm64/boot/dts/rockchip/rk3568.dtsi”设备树的3549-3560行定义的,而ft5x06: ft5x06@38触摸芯片节点是在内核源码的“/arch/arm64/boot/dts/rockchip/topeet_rk3568_lcds.dtsi”设备树的301-313行定义的。接下来将会对设备树常见的四个gpio属性进行介绍。

60.1.2 gpio-controller 

gpio-controller属性用于标识一个设备节点作为GPIO控制器。GPIO控制器是负责管理和控制GPIO引脚的硬件模块或驱动程序。

gpio-controller属性通常作为设备节点的一个属性出现,位于设备节点的属性列表中。

当一个设备节点被标识为GPIO控制器时,它通常会定义一组GPIO引脚,并提供相关的GPIO控制和配置功能。其他设备节点可以使用该GPIO控制器来控制和管理其GPIO引脚。

通过使用gpio-controller属性,设备树可以明确标识出GPIO控制器设备节点,使系统可以正确识别和管理GPIO引脚的配置和控制。

60.1.3 #gpio-cells

#gpio-cells属性用于指定GPIO引脚描述符的编码方式。GPIO引脚描述符是用于标识和配置GPIO引脚的一组值,例如引脚编号、引脚属性等。

#gpio-cells属性的属性值是一个整数,表示用于编码GPIO引脚描述符的单元数。通常,这个值为2。

在第一小节的示例中有1个gpio引脚描述属性,由于#gpio-cells属性被设置为了2,所以每个引脚描述属性中会有两个整数,具体内容如下所示:

ft5x06: ft5x06@38 { 
    .....
    reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
    .....
};

RK_PB6、GPIO_ACTIVE_LOW都属于恒定义,会在下面的小节进行讲解。

通过使用#gpio-cells属性,设备树可以指定GPIO引脚描述符的编码方式,使系统能够正确识别和解析GPIO引脚的配置和控制。

60.1.4 gpio-ranges

gpio-ranges属性是设备树中一个用于描述GPIO范围映射的属性。它通常用于描述具有大量GPIO引脚的GPIO控制器,以简化GPIO引脚的编码和访问。

在设备树中,GPIO控制器的每个引脚都有一个本地编号,用于在控制器内部进行引脚寻址。然而,这些本地编号并不一定与外部引脚的物理编号或其他系统中使用的编号一致。为了解决这个问题,可以使用gpio-ranges属性将本地编号映射到实际的引脚编号。

gpio-ranges属性是一个包含一系列整数值的列表,每个整数值对应于设备树中的一个GPIO控制器。列表中的每个整数值按照特定的顺序提供以下信息:

(1)外部引脚编号的起始值。

(2)GPIO控制器内部本地编号的起始值。

(3)引脚范围的大小(引脚数量)。

在第一小节的示例中gpio-ranges属性的值为<&pinctrl 0 0 32>,其中<&pinctrl>表示引用了名为pinctrl的引脚控制器节点,0 0 32表示外部引脚从0开始,控制器本地编号从0开始,共映射了32个引脚。

这样,gpio-ranges属性将GPIO控制器的本地编号直接映射到外部引脚编号,使得GPIO引脚的编码和访问更加简洁和直观。

60.1.5 gpio引脚描述属性

第一小节的设备树中关于gpio引脚描述属性相关内容如下所示:

ft5x06: ft5x06@38 { 
    .....
    reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
    .....
};

gpio引脚描述属性个数由#gpio-cells所决定,因为gpio0节点中的#gpio-cells属性设置为了2,所以上面设备树gpio引脚描述属性个数也为2。

其中RK_PB6 定义在内核源码目录下的“include/dt-bindings/pinctrl/rockchip.h”头文件中,定义了RK引脚名和gpio编号的宏定义,如下图(图 60-1)所示:

图 60-1

GPIO_ACTIVE_LOW定义在源码目录下的“include/dt-bindings/gpio/gpio.h”中,表示设置为低电平,同理GPIO_ACTIVE_HIGH就表示将这个GPIO设置为高电平,但这里只是对设备的描述,具体的设置还是要跟驱动相匹配。

60.1.6其他属性

本小节将根据下面的设备树示例讲解一下gpio的其他重要属性,设备树具体内容如下所示:

gpio-controller@00000000 {
    compatible = "foo";
    reg = <0x00000000 0x1000>;
    gpio-controller;
    #gpio-cells = <2>;
    ngpios = <18>;
    gpio-reserved-ranges = <0 4>, <12 2>;
    gpio-line-names = "MMC-CD", "MMC-WP",
                      "voD eth", "RST eth", "LED R",
                      "LED G", "LED B", "col A",
                      "col B", "col C", "col D",
                      "NMI button", "Row A", "Row B",
                      "Row C", "Row D", "poweroff",
                      "reset";
};

第6行的ngpios 属性指定了 GPIO 控制器所支持的 GPIO 引脚数量。它表示该设备上可用的 GPIO 引脚的总数。在这个例子中,ngpios` 的值为 18,意味着该 GPIO 控制器支持 18 个 GPIO 引脚。

第7行的gpio-reserved-ranges属性定义了保留的GPIO范围。每个范围由两个整数值表示,用尖括号括起来。保留的GPIO范围意味着这些GPIO引脚不可用或已被其他设备或功能保留。在这个例子中,有两个保留范围:<0 4>和<12 2>。<0 4>表示从第0个引脚开始的连续4个引脚被保留,而<12 2>表示从第12个引脚开始的连续2个引脚被保留。
第8行的gpio-line-names 属性定义了GPIO引脚的名称,以逗号分隔。每个名称对应一个 GPIO 引脚。这些名称用于标识和识别每个GPIO引脚的作用或连接的设备。在这个例子中,gpio-line-names属性列出了多个GPIO引脚的名称,如 "MMC-CD"、"MMC-WP"、"voD eth" 等等。通过这些名称,可以清楚地了解每个GPIO引脚的功能或用途。

60.2 中断实例编写

在上一个小节中对设备树中断要用到的属性进行了讲解,而在本小节将会编写一个在RK3568上LED灯的中断设备树。

首先确定LED的引脚编号,LED原理图如下图(图 60-2)所示:

图 60-2

从上面的原理图可以得到LED灯的引脚网络标号为Working_LEDEN_H_GPIO0_B7,对应的引脚为GPIO0_B7。

然后来查看内核源码目录下的“drivers/drivers/leds/leds-gpio.c”文件,这是led的驱动文件,然后找到compatible匹配值相关的部分,如下(图 60-3)所示:

图 60-3

可以看到compatible匹配值为gpio-leds。

最后在内核源码目录下的“include/dt-bindings/pinctrl/rockchip.h”头文件中,定义了RK引脚名和gpio编号的宏定义,如下图(图 60-4)所示:

图 60-4

在源码目录下的“include/dt-bindings/gpio/gpio.h”文件中定义了引脚极性设置宏定义,如下图(图 60-5)所示:

图 60-5

其中GPIO_ACTIVE_HIGH表示将该引脚设置为高电平,GPIO_ACTIVE_LOW表示将该引脚设置为低电平。

至此,我们关于编写LED设备树的前置内容就查找完成了,接下来进行设备树的编写。

编写完成的设备树如下所示:

/dts-v1/;

#include "dt-bindings/pinctrl/rockchip.h"
#include "dt-bindings/gpio/gpio.h"
/{
	model = "This is my devicetree!";

	led led@1 {
		compatible = "gpio-leds";
		gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>
	};
};

第1行: 设备树文件的头部,指定了使用的设备树语法版本。

第3行:用于定义 Rockchip 平台的引脚控制器相关的绑定。

第4行:用于定义中断控制器相关的绑定。

第5行:表示设备树的根节点开始。

第6行:指定了设备树的模型名称,描述为 "This is my devicetree!"。

第9行:指定了设备节点的兼容性字符串,表示该设备与 "gpio-leds" 兼容。

第10行:指定了该 LED 设备所使用的 GPIO 引脚。&gpio0 是引脚控制器的引用,RK_PB7 是引脚的编号或标识,GPIO_ACTIVE_HIGH 表示该 GPIO 引脚的活动电平是高电平。

至此,关于led的设备树就讲解完成了。

60.3 其他SOC设备树对比

而无论使用的是瑞芯微SOC还是恩智浦、三星的SOC,在设备树关于gpio相关的描述都是类似的,关于在恩智浦和三星源码中的ft5x06设备树如下所示(关于gpio相关的属性已经标记为了蓝色):

恩智浦

gpio1: gpio@0209c000 {
    compatible = "fsl,inx6ul-gpio", "fsl,imx35-gpio";
    reg = <0x0209c000 0x4000>;
    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;

    edt-ft5x06@38 {
        compatible = "edt,edt-ft5306", "edt,edt-ft5x06", "edt,edt-ft5406";
        pinctrl-names = "default";
        pinctrl-0 = <&ts_int_pin &ts_reset_pin>;
        reg = <0x38>;
        interrupt-parent = <&gpio1>;
        interrupts = <9 0>;
        reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
        irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
        status = "disabled";
    };
};

三星

gpio_c: gpioc {
    compatible = "gpio-controller";
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;
};

ft5x06: ft5x06038 {
    compatible = "edt,edt-ft5406";
    reg = <0x38>;
    pinctrl-names = "default";

    #if defined(RGB_1024x600) || defined(RGB_800x480)
    pinctrl-0 = <&tsc2007_irq>;
    interrupt-parent = <&gpio_c>;
    interrupts = <26 IRQ_TYPE_EDGE_FALLING>;
    #endif

    #if defined(LvDs_800×1280) || defined(LvDS_1024x768)
    pinctrl-0 = <&gt911_irq>;
    interrupt-parent = <&gpio_b>;
    interrupts = <29 IRQ_TYPE_EDGE_FALLING>;
    #endif
 reset-gpios = <&gpio_e 30 0>;
};

对比之后会发现,不同厂商对于gpio的配置都是类似的,只是里面的参数有些许区别,如果大家在之后遇到了其他平台,只需要稍加区分即可。


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

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

相关文章

2023软件测试面试问题全在这,刷完即就业

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

大热电视剧《好事成双》里的IT故事:用户数据泄露事件引出的美女黑客

在大热电视连续剧《好事成双》中&#xff0c;卫明为了与冯凯竞争方舟公司副总裁职位&#xff0c;不惜将冯凯泄露方舟公司用户数据的黑料向媒体爆料&#xff0c;这个新闻迅速上了热搜。 卫明报料的材料都是他从方舟公司的系统中获取和保存的。以卫明的精明而论&#xff0c;按理他…

Python 配置pyqt5开发环境

1.下载需要的pyqt包 这里是所依赖的包(包含了一些项目中其它的包),可以将下面的包复制到requirement.txt&#xff0c;最后使用pip打包安装这些库&#xff0c;具体方法可以参考Python环境离线下载安装。 altgraph0.17.4 click7.1.2 numpy1.24.4 opencv-python4.2.0.34 packagi…

C/C++整数的个数 2020年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C整数的个数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C整数的个数 2020年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定k&#xff08;1 < k < 100&#xff09;个…

Day10配置文件日志多线程

配置文件 在企业开发过程中&#xff0c;我们习惯把一些需要灵活配置的数据放在一些文本文件中&#xff0c;而不是在Java代码写死 我们把这种存放程序配置信息的文件&#xff0c;统称为配置文件 properties 是一个Map集合&#xff08;键值对集合&#xff09;&#xff0c;但是我…

C语言之数组详解

目录 一维数组的定义和使用 二维数组的定义和使用 字符数组和字符串 练习题 练习一 练习二 练习三 一维数组的定义和使用 当涉及到一系列相同类型的数据时&#xff0c;C语言中的一维数组是一种非常有用的数据结构。以下是关于C语言一维数组的定义和使用的详细说明&…

威联通NAS进阶玩法之使用Docker搭建个人博客教程

Hello大家好&#xff0c;本篇教程主要教大家在威联通的NAS上搭建属于自己的个人博客网站&#xff0c;首先介绍一下我使用的机器&#xff0c;四盘位威联通TS-464C2&#xff0c;搭载四核四线程的N5095处理器&#xff0c;支持4K60帧的输出以及PCIE3.0,可玩性还是非常高的。废话不多…

网工内推 | 应届、大专可投,IE认证优先,有年终奖、带薪年假

01 伟众信息 招聘岗位&#xff1a;网络工程师&#xff08;应届生&#xff09; 职责描述&#xff1a; 1、网络架构及信息安全规划、设计&#xff1b; 2、制定撰写项目方案、投标文件技术方案、行业技术文档等&#xff1b; 3、路由交换、网络安全设备等网络设备安装、调试及后…

css 雷达扫描图

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 雷达扫描</title><style>* {margin: 0;padding: 0;}body {background: #000000;height: 100vh;display: flex;align-items…

论文解读:《DataPype:用于计算机辅助药物设计的全自动统一软件平台》

论文解读&#xff1a;《DataPype: A Fully Automated Unified Software Platform for Computer-Aided Drug Design》 1.文章概述2.背景2.方法2.1 DataPype概述2.2 数据2.3 分子和蛋白质数据的处理2.3.1 配体处理2.3.2 蛋白质加工 2.4 CADD方法2.5 基准研究2.5.1 单个 CADD 制备…

Swoole 4.8版本的安装

1、从github拉取安装包 Release v4.8.13 swoole/swoole-src GitHub 2、解压压缩包 tar -zxvf ./v4.8.13.tar.gzcd ./swoole-src-4.8.13 3、执行安装命令 phpize && \ ./configure && \ make && sudo make install 4、检查swoole模块是否安装完成…

第一章 函数 极限 连续(未完更新中)

了解 一、函数的性质 理解 一、函数 1、函数概念 ⚠️定义域和对应规则是同一函数的判断 2、复合函数 简单的说就是内层函数的值域与外层函数的定义域有交集 3、反函数 3.1、yx^3为反函数&#xff0c;yx^2不是 3.2、单调函数是反函数的充分非必要条件&#xff08;单调函数…

Python爬虫(二十四)_selenium案例:执行javascript脚本

本章叫介绍如何使用selenium在浏览器中使用js脚本&#xff0c;更多内容请参考&#xff1a;Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver webdri…

经典链表试题(二)

文章目录 一、移除链表元素1、题目介绍2、思路讲解3、代码实现 二、反转链表1、题目介绍2、思路讲解3、代码实现 三、相交链表1、题目介绍2、思路讲解3、代码实现 四、链表的中间结点1、题目介绍2、思路讲解3、代码实现 五、设计循环队列1、题目介绍2、思路讲解3、代码实现 六、…

酸纯化APU系统在阳极氧化酸回收中的应用

阳极氧化是一种涉及对金属(通常是铝)表面进行电化学处理的工艺&#xff0c;作为一种表面处理中常见且主要的技术&#xff0c;阳极氧化可增强其耐腐蚀性、硬度和耐磨性&#xff0c;从而提高铝合金的使用寿命和美观度。 常见的表面处理方法——阳极氧化 阳极氧化是以铝或铝合金制…

超简洁ubuntu linux 安装 cp2k

文章目录 打开下载网址解压接下来的步骤讲解 将解压的包移到对应路径下最后运行 打开下载网址 需要从github下载&#xff1a;下载网址 两个都可以从windows下先下载&#xff0c;再复制到linux中&#xff0c; 如果不能复制&#xff0c;右键这两个&#xff0c;复制链接&#xf…

C++数据结构X篇_19_排序基本概念及冒泡排序(重点是核心代码,冒泡是稳定的排序)

文章目录 1. 排序基本概念2. 冒泡排序2.1 核心代码2.2 冒泡排序代码2.3 查看冒泡排序的时间消耗2.4 冒泡排序改进版减小时间消耗 1. 排序基本概念 现实生活中排序很重要&#xff0c;例如:淘宝按条件搜索的结果展示等。 概念 排序是计算机内经常进行的一种操作&#xff0c;其目…

【Python二级-练习(详细版)】

python江湖 1、求长方形面积题目描述&#xff1a;代码如下&#xff1a; 2、随机密码验证题目描述&#xff1a;代码如下&#xff1a; 3、信息分配表&#xff08;字典&#xff09;题目描述&#xff1a;代码如下&#xff1a; 4、全模式分词&#xff08;jieba)题目描述&#xff1a;…

2023年腾讯云双11活动云服务器价格表

2023年腾讯云双11活动已经拉开了序幕&#xff0c;腾讯云推出了一系列的优惠活动&#xff0c;下面给大家分享腾讯云双11活动云服务器价格表&#xff0c;对于有需要购买云服务器的用户来说&#xff0c;无疑是一份非常有价值的参考。 一、腾讯云双十一活动入口 活动入口&#xff…

Python:实现日历功能

背景 日常生活中&#xff0c;每天都要用到日历&#xff0c;日历成为我们生活中的必需品&#xff0c;那么如何制作日历呢&#xff0c;其实方法有很多&#xff0c;可以直接在excel中制作&#xff0c;也可以手画等等。 学习过编程的朋友&#xff0c;能否想到用Python编写一…