DSP

gpio上拉失效问题

2019-07-13 19:08发布

遇到一个问题是与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的影响 配置gpioodr
odr推挽   gpio可迅速上拉 odr 1 开漏   gpio可缓慢上拉,导致上拉完立刻打印的数据不准确   2、不管gpio配置成输入输出,data寄存器读出的数据与示波器相同(仅使用P1020芯片)