1、问题描述
环境:所采用的处理器:Xilinx的Zynq MPSOC—XCZU3EG,操作系统是嵌入式Linux。
在项目调试中发现:硬件看门狗芯片的喂狗信号使用了MPSOC的MIO41,而SD卡(SD1口,ff170000.mmc)的管脚中也使用到了MIO41,从而导致了:要么SD卡不能使用,要么不能喂狗系统反复重启。
这个问题并不难解决,合理的解决方法是:在kernel的devicetree中,重新分配MIO41管脚,避免冲突。
然而,devicetree中与管脚定义、分配的内容很多,如何修改呢?本文将解决的过程记录如下,期望对遇到类似的问题的人能有所帮助。
2、解决过程
1、查阅MPSOC的芯片手册《ug1085-zynq-ultrascale-trm.pdf》p789页“MIO Table at a glance”,可以看到MIO41有多个功能复用;
2、在内核驱动中增加打印代码,待pinctrl初始化完成后,将管脚的复用信息打印出。添加的printk代码在:drivers/pinctrl/pinctrl-zynqmp.c::zynqmp_pinctrl_group_add_pin()
与MIO41相关的输出是如下形式:
[ 1.224792] ...After:grp_name: ethernet1_0_grp, pin:41
[ 1.224799] ...After:grp_name: sdio0_1_grp, pin:41
[ 1.224806] ...After:grp_name: sdio1_0_grp, pin:41
[ 1.224813] ...After:grp_name: gpio0_41_grp, pin:41
[ 1.224821] ...After:grp_name: can1_10_grp, pin:41
[ 1.224827] ...After:grp_name: i2c1_10_grp, pin:41
[ 1.224834] ...After:grp_name: pjtag0_3_grp, pin:41
[ 1.224841] ...After:grp_name: spi0_ss_9_grp, pin:41
[ 1.224848] ...After:grp_name: ttc3_wav_5_grp, pin:41
[ 1.224855] ...After:grp_name: uart1_10_grp, pin:41
[ 1.224862] ...After:grp_name: trace0_1_grp, pin:41
[ 1.224869] ...After:grp_name: sdio0_5_grp, pin:41
[ 1.224876] ...After:grp_name: sdio0_17_grp, pin:41
[ 1.224883] ...After:grp_name: sdio1_1_grp, pin:41
[ 1.224890