遇到一个问题是与gpio的上拉失效有关。
先看一下我的问题描述和解决过程
关于反复重启1000整机设备,出现PXM板卡启动失败的现象
问题描述:
通过当时记录的串口信息,最开始的异常出现在sdk加载上,sdk加载失败后内核打印localbus的错误,设备重启后ubi挂载失败
/home下程序丢失
问题分析:
P1020 cpu中的localbus是e500核与外围控制器的通道,与ram,nand都有连接, nand控制器使用的总线是localbus分出的一部分,
在switch异常,PCIe挂载不上switch的时候,sdk加载可能造成localbus异常,导致nand写入异常数据
实验现象:
修改uboot,在switch复位附近添删打印或加减延时,不改变原有流程,可复现问题
问题复现后发现复位switch的gpio15为0,即switch处于一直复位状态
经过进一步验证,gpio15有概率无法拉高,即拉低之后拉高没有生效
初步判断gpio15的问题可能与拉低之后延时20ms时间不够长有关(因为在命令行中可手动拉高)
也可能与芯片相关,但其他gpio未发现有这个现象。
现象1.添加不必要的打印或延时,一旦出现switch复位后gpio15无法拉高(复位异常),无论断电或重启,仍然出现switch复位异常
现象2.添删不必要的打印或延时,如果switch复位后gpio15可以拉高(复位正常),无论断电或重启, switch复位正常
在正式版本v001r001上未复现出问题,判断与现象2相同,但在特殊情况下,如高低温环境或较多次重启有概率出现gpio15拉高没有生效的情况
正式版本中switch的复位过程:
配置gpio15输出->配置gpio15拉低->延时20ms->配置gpio15拉高
优化:
配置gpio15输出->配置gpio15拉低->延时20ms->配置gpio15拉高->配置gpio15输入
gpio15外部电路是拉高的,可以避免gpio15拉高失败造成switch一直复位
实际上,原因就在使用gpio拉低复位后,拉高没有生效,程序里确实正确的写了寄存器,实际上gpio还是低的
导致了后续的更严重的问题
这算是一个芯片的bug吧,通过配置成输入,外部加上拉规避。
另附实验中学到的知识点
1、gpio odr寄存器对gpio value的影响
配置gpio的odr
当odr为0 推挽
gpio可迅速上拉
当odr为 1 开漏
gpio可缓慢上拉,导致上拉完立刻打印的数据不准确
2、不管gpio配置成输入输出,data寄存器读出的数据与示波器相同(仅使用P1020芯片)