最近要再在h2 uboot上操作GPIOL口,想着这是闭着眼睛都能实现的操作,最后白白耗了一天.
问题表现为裸机条件下GPIOL地址0x1f02c00,怎么都写不进去,表现为值写进去但读出来还是0x07777777,怎么可能操作GPIOL口?
首先uboot使用md 0x1f02c00命令无效,然后自己强制写 *(volatile u32*)0x1f02c00还是无效.
MMU问题?自己用mmu映射一下0x1f02c00出来然后再写,还是无效.
关闭MMU,关闭cache,还是无效.
进入fel,xfel write32 0x01f02c00还是无效
进入fel,sunxi-fel.exe writel 0x01f02c00还是无效
有点蒙,看来写不进不是mmu的问题,肯定是GPIOL时钟没开,翻手册满心欢喜找到 BUS_CLK_GATING_REG2 位PIO_GATING,但发现这时钟一直开着的.
为什么linux能操作GPIOL而裸机就不行呢?不死心,hexdump对比CCU地址0x01C20000下一片寄存器,然并卵.
无奈翻dts,用关键字1f02c00搜索,好家伙终于炸出r_ccu: clock@1f01400来,手册找一找1f01400,发现根本没有,但出来一个R_PRCM.
放狗搜一搜R_PRCM,原来手册没公开,但是老外根据SDK整理了出来
https://linux-sunxi.org/PRCM
最后结论就是操作GPIOL之前要:
*(volatile u32*)0x01f01428 |= 1;
短短一句话耗了一天,希望后面的朋友不要踩坑.
离线