一、测试环境
近期在回复客户疑问时,遇到在 ap1 侧基于 sysfs 接口访问 GPIO,log 提示 value 为 1,而实际引脚电平不能拉高的问题。使用G9H参考板复现问题并调整配置后,使得电平变化符合预期。
下面结合文档《SemiDrive_9 系列_IO&PinCtrl_使用手册》进行说明。
硬件:SemiDrive G9H ref A02 图一
软件:G9 PTG 5.0
软件环境搭建以及 G9H Ref A02 操作方法参考:《SD_G9_Quick_Start_Rev2.4.pdf》
图一 G9H 参考板
二、处理过程
1. 问题描述:
客户用 SDconfigTool 更改了管脚的配置,重新生成新的配置工程,后/target/refence_g9q/port_cfg.h、/projects/default/system_config.bin、/projects/default/g9q_default.zprj 这 3 个文件考到 Buildsystem 工程里。然后编译新的工程,给 gpio119 echo 成 out、1 后,value 是 1 了,但是电平信号没有拉高。
提示客户在safety侧使用 get_pin_info 检查引脚配置。如图:
图二 检查引脚配置
这里不难发现 GPIO controller: GPIO5,而 linux 使用的控制器为 controller: GPIO4,需要使用 SDconfigTool 修正 controller 到对应配置。然后在 linux 内基于 sysfs 接口访问GPIO,通过设备文件使操作特定引脚的电平。
2. 操作过程
2.1 GPIO 以及 Domain 资源说明
典型的 包括 ap1、ap2、safety、secure 以及 mp 等。controller 和 core 的对应关系如下:
- GPIO_SAFETY = PIN_CONTROLLER1
- GPIO_SECURE = PIN_CONTROLLER2
- GPIO_MP = PIN_CONTROLLER3
- GPIO_AP1 = PIN_CONTROLLER4
- GPIO_AP2 = PIN_CONTROLLER5
2.2 配置启动流程
safety domain 在系统启动过程会读取 system_config.bin 的配置信息并将其写入到寄存器中 生效。当 Linux 内核运行起来后之前的配置信息已经生效,所以内核初始化过程中主要就是解析 DTS 中设置的 GPIO 信息并进行初始化设置,之后根据各个进程需求在驱动中得到调用。
2.3 SDconfigTool 配置
第一部分是 PinCtrl,其中关注点:功能复用为 GPIO 功能;
第二部分是 General PAD Config,其中主要关注点: 参照 2.1 配置,GPIO Controller:GPIO 控制器选择 4,
图三 SDconfigTool
2.3 DTS相关说明
.dtsi 配置:初始化各项信息,处于 disabled 状态,如图:
图四 默认dtsi配置
gpio4 下面有五个 port,每个 port 有 32 个 gpio,即 Linux GPIO 号为 0-159 依次对应从 4a 到 4e 五个组。
2.4 相关信息入口
内核启动过程中,针对 GPIO 部分在 sysfs 和 debugfs 下设置了相关的信息节点,通过这些节点可以验证 和了解当前平台中关于 GPIO 部分的内容。
2.4.1 基于 sysfs 接口访问 GPIO,属性说明:
- 针对 GPIO 类,可以看到有五个 gpiochip,即五个组,名字是 gpiochip%d , %d 用的是对应组的 起始 gpio 编号。
- 一个 export 和一个 unexport 节点,此处用于导出和取消导出对应的 GPIO。
图五 sysfs 接口
图六 调试命令一
2.4.2 debugfs下 GPIO 节点
debugfs下相关的节点则可以看到关于 GPIO 总体的信息。
一共有五个 gpiochip,每个占用 32 个 GPIO,号码从 0 到 159。 各个组中已经申请了的 GPIO 信息,包括 GPIO 号、名字、输入输出以及高低、是否用作了中断 等。
图七 调试命令二
2.5 测试对照
以上两种调试都配合万用表进行了引脚测量(如图),结果显示符合预期。
图八 引脚原理图
三、参考文献
- 《SemiDrive_9 系列_IO&PinCtrl_使用手册》
- 《SemiDrive_Linux_BSP_User_Manual_Rev1.1》
欢迎在博文下方留言评论,我们会及时回复您的问题。
如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com 作者:老哥三五瓶
更多资讯,请扫码关注我们!