RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解

这篇具有很好参考价值的文章主要介绍了RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、RK3588设备树结构

firefly的官方说明文档RK3588gpio系统说明

function {
	group {
			rockchip,pin = <bank gpio func &ref>;
		};
};

其中,bank是所属的组,Core-3588J 有 5 组 GPIO bank:GPIO0-GPIO4,每组又以 A0-A7, B0-B7, C0-C7, D0-D7 作为编号区分。
首先,对于firefly的rk3588j的开发板,其设备树有几个比较重要的文件,
分别是/kernel/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi
/kernel/arch/arm64/boot/dts/rockchip/rk3588s.dtsi
kernel/arch/arm64/boot/dts/rockchip/rk3588-firefly-itx-3588j.dtsi
/kernel/arch/arm64/boot/dts/rockchip/rk3588.dtsi
Tips:如果有些外设描述没有找到,可以先编译一下,会生成一个总的dts在当前目录下,例如3588的临时文件名字是:.rk3588-firefly-itx-3588j.dtb.dts.tmp,这是一个隐藏文件,里面包含了所有的将会进行编译的设备树信息。
这个几个文件将其外围设备基本描述完全了,另外还有一些可能位于/kernel/arch/arm64/boot/dts/rockchip/rk3588-diff.dtsi内,
第一个文件rk3588s-pinctrl.dtsi,该文件枚举了3588所有的iomux实例(3588s和3588是firefly的两款开发板,频脚基本一致,所有有些3588会引用3588s的设备树文件);例如rk3588s-pinctrl.dtsi文件中关于uart6的设备树描述:
RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解,rk3588,单片机,嵌入式硬件

上图是串口6的一个设备树,

rockchip,pins =
				/* uart6_rx_m1 */
				<1 RK_PA0 10 &pcfg_pull_up>,

该描述就是说明使用的引脚是GPIO1_A0;
可以看到4个引脚rx/tx/rtsn/ctsn。另外多了一个rx/tx是串口6的复用,这里是将串口6的所有可以的复用全部罗列出来,其他的外设也是类似,最终实际用的哪一路复用在文件rk3588-firefly-itx-3588j.dtsi中确定,还是串口6,在该文件中的描述为:
RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解,rk3588,单片机,嵌入式硬件

二、RK3588 GPIO口上拉下拉失败

在调试中发现有些gpio口无法正确的实现上下拉,其原因在于该io口被其他外设复用使能。解决方法就是将该外设disabled。
使用如下指令查看引脚的复用情况:

cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins

上下拉设置方法:

:/ # ls /sys/class/gpio/
export     gpiochip128  gpiochip32   gpiochip64  unexport
gpiochip0  gpiochip200  gpiochip509  gpiochip96
:/ # echo 56 > /sys/class/gpio/export
:/ # ls /sys/class/gpio/
export  gpiochip0    gpiochip200  gpiochip509  gpiochip96
gpio56  gpiochip128  gpiochip32   gpiochip64   unexport
:/ # ls /sys/class/gpio/gpio56
active_low  device  direction  edge  power  subsystem  uevent  value
:/ # cat /sys/class/gpio/gpio56/direction
in
:/ # cat /sys/class/gpio/gpio56/value
0

以GPIO3_D4为例,该IO口在原开发板上被用作了HDMI1的rx引脚,其设备树描述位于rk3588-firefly-itx-3588j.dtsi文件中,如下:
RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解,rk3588,单片机,嵌入式硬件
hdmim1_rx是一个设备使用gpio引脚的描述,在文件rk3588.dtsi中被引用,如下:
RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解,rk3588,单片机,嵌入式硬件
但是我们发现其实,该外设在此文件中的状态是disabled,其实,一般而言,每个厂家的芯片可能对应很多开发板,有些开发板没有这个功能,有些开发板有这个功能,因此,在公共文件中一般都会把该芯片支持的共有外设都失能,然后在开发板对应的文件中再使能,这里就是如此。
打开文件rk3588-firefly-itx-3588j.dtsi找到hdmirx_ctrler,可以看到
RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解,rk3588,单片机,嵌入式硬件
我们只需要将okay改成disabled即可。

还有一些gpio,通过指令:

cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins

RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解,rk3588,单片机,嵌入式硬件

可以看到本身就是用作gpio的,但是在linux通用的gpio管理中,并不能被导出.例如下面的提示:

root@firefly:/sys/class/gpio# echo 119 > export
-bash: echo: write error: Device or resource busy

这是因为被其他外设复用成gpio了,不再归属到linux通用gpio管理器。
例如,rk3588的usbdp_phy0节点。设备树如下:

&usbdp_phy0 {
	orientation-switch;
	svid = <0xff01>;
	sbu1-dc-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
	sbu2-dc-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;

	port {
		#address-cells = <1>;
		#size-cells = <0>;
		usbdp_phy0_orientation_switch: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&usbc0_orien_sw>;
		};

		usbdp_phy0_dp_altmode_mux: endpoint@1 {
			reg = <1>;
			remote-endpoint = <&dp_altmode_mux>;
		};
	};
};

其中的:

sbu1-dc-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
sbu2-dc-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;

就是将GPIO4_A6和GPIO4_A7作为sbu1和sbu2。
那么此时查看复用的话,其实就会显示用作了gpio,但是却不能导出到通用的gpio管理器里面。如果需要使用类似的io口就需要将使用的设备禁用掉。

三、RK3588频脚计算方式

与一般的计算方式没有区别:

GPIO pin脚计算公式:pin = bank * 32 + number

GPIO 小组编号计算公式:number = group * 8 + X

以下,摘自官网:

下面演示GPIO1_D0 pin脚计算方法:

bank = 1;      //GPIO1_D0 => 1, bank ∈ [0,4]

group = 3;      //GPIO1_D0 => 3, group ∈ {(A=0), (B=1), (C=2), (D=3)}

X = 0;       //GPIO1_D0 => 0, X ∈ [0,7]

number = group * 8 + X = 3 * 8 + 0 = 24

pin = bank*32 + number= 1 * 32 + 24 = 56;

GPIO1_D0 对应的设备树属性描述为:<&gpio1 24 GPIO_ACTIVE_HIGH>,由kernel-5.10/include/dt-bindings/pinctrl/rockchip.h的宏定义可知,也可以将GPIO1_D0描述为<&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>

另外提供个简单的计算小程序源码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    while(1){
    char gpio_group;
    int bank;
    int X;
    int group;
    printf("++++++++++++++++++++++++++++++++++++++++++++\n");
    printf("bank number eg.GPIO1_D2,bank is 1\n");
    printf("group number eg.GPIO1_D2,group is 'D'\n");
    printf("code number eg.GPIO1_D2,code is 2\n");
    printf("++++++++++++++++++++++++++++++++++++++++++++\n");

    printf("Input Example:1,d,2\n");
    scanf("%d,%c,%d", &bank,&gpio_group,&X);
    switch (gpio_group)
    {
    case 'a':
    case 'A'/* constant-expression */:
        /* code */
        group = 0;
        break;
    case 'b':
    case 'B':
        group = 1;
        break;
    case 'c':
    case 'C':
        group = 2;
        break;
    case 'd':
    case 'D':
        group = 3;
        break;
    default:
        printf("group number error!\n");
        return 1;
        break;
    };
    int number = group * 8 + X ;
    int pin = bank*32 + number;
    printf("GPIO pin is %d\n", pin);
    system("pause");}
    return 0;
}

只需要输入bank,code和序号即可,例如计算GPIO1_D0 ,输入1,D,0
回车:
RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解,rk3588,单片机,嵌入式硬件
引脚为56号。

最后:虽然由于每家芯片的驱动不同,设备树的书写格式可能有所不同,但是基本的设备树格式都是一样的。大道至简,殊途同归。文章来源地址https://www.toymoban.com/news/detail-737621.html

到了这里,关于RK3588 设备树pinctrl gpio子系统解析,解决GPIO无法正确拉高拉低的问题,RK3588设备树详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568驱动指南|第十二篇 GPIO子系统-第128章 GPIO入门实验

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

    2024年01月21日
    浏览(40)
  • HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-GPIO

    轻量系统设备通常需要进行外设控制,例如温湿度数据的采集、灯开关的控制,因此在完成内核开发后,需要进行设备驱动的开发。 主要Hi3861芯片介绍如何运用 IoT 硬件子系统进行轻量系统设备的驱动开发。 在轻量系统的联接模组中,智能家居远程控制能力的实现,最终是通

    2024年02月21日
    浏览(44)
  • 【Linux】Pinctrl子系统简介

    我们工作开发中非常常用的就是GPIO,在Linux开发中,是有必要去熟悉并理解的。在Linux内核中也有提供相应的子系统pinctrl子系统, 本文从大的面上去了解它 。 参考学习:Linux笔记老师课程(Pinctrl子系统) https://live.csdn.net/v/219059?spm=1001.2014.3001.5501 https://xuesong.blog.csdn.net/arti

    2024年02月07日
    浏览(45)
  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(48)
  • 【Linux驱动开发】010 pinctrl子系统

    上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。   Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于

    2024年02月14日
    浏览(41)
  • gpio 子系统

    Linux的GPIO子系统驱动框架的组成部分 Linux的GPIO子系统驱动框架由三个主要部分组成: GPIO控制器驱动程序、平台驱动程序和GPIO字符设备驱动程序 。 GPIO控制器驱动程序 GPIO控制器驱动程序是与硬件相关的代码,用于处理GPIO控制器与系统总线之间的通信。该部分代码通常由芯片

    2024年02月10日
    浏览(44)
  • 9.GPIO子系统

    目录 GPIO1节点 内核设备树新增rgb_led节点(使用gpio子系统) 常用的对外接口 头文件 of_find_node_by_path()函数 of_get_named_gpio()函数 gpio_request()函数 gpio_free()函数 gpio_direction_output()函数 gpio_direction_input()函数 gpio_get_value()函数 gpio_set_value()函数 GPIO子系统实验:IO引脚高低电平控制 修

    2024年02月11日
    浏览(38)
  • Linux驱动开发:gpio子系统

    目录 1、GPIO配置流程 2、GPIO子系统API 2.1 of_find_node_by_path 2.2 of_get_named_gpio 2.3 gpio_request 与 gpiod_get 与 gpiod_get_index 2.4 gpio_direction_input 与 gpiod_direction_input 2.5 gpio_direction_output 与 gpiod_direction_output 2.6 gpio_get_value 与 gpiod_get_value 2.7 gpio_set_value 与 gpiod_set_value 2.8  gpiod_get_from

    2024年02月12日
    浏览(44)
  • 驱动开发作业3——GPIO子系统

    作业1:在内核模块中启用定时器,定时1s,让LED1以1s为周期实现流水灯  myled.c(驱动文件)    作业2:基于GPIO子系统完成LED灯驱动的注册,并利用应用程序测试  chrdevled.c(驱动文件) test.c(测试文件)

    2024年02月16日
    浏览(32)
  • 【Linux驱动开发】011 gpio子系统

    前面我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。   Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包