R3300L按reset键无法进入USB Burning模式的问题分析
阅读原文时间:2023年07月15日阅读:1

最开始并没有注意到这个问题, 因为从设备拿到手, 用USB Burning Tool刷入潜龙版的安卓4.4.2, 再到运行EmuELEC, Armbian, 再到给Kernel 5.3的Armbian编译RTL8189FTV的驱动, 都还算顺利. 因为Kernel 5.3也差不多搞定了, 开始打安卓的主意, 想看看能不能跑7.x版本的安卓. 固件包下了几个, 要开始刷的时候出了状况, 发现按着reset键再也无法进入USB Burning Mode了.

几经调查, 试了另外两台一样已经刷过的R3300L, 百度上查类似的案例, 发现其他人也存在这种情况. 而且网友们提供的处理方法(4R19接地)完全无效.

于是开始研究UBOOT

这个设备跑过的系统不外乎潜龙的安卓4.4.2, 以及各种版本的EmuELEC, 各种版本的Armbian, 通过查资料, 发现Linux下面的fw_printenv和fw_setenv命令可以查看及修改UBOOT下的配置. EmuELEC下可以直接运行, 但是在高版本的Armbian下, 仅有可执行文件, 缺/etc/fw_env.config, 于是又查资料找到了对应S905L的config.

通过分析UBOOT的配置, 可以确认EmuELEC和Armbian都会对UBOOT配置进行修改, 但是它们的修改只是在bootcmd里加东西, 加上从sdcard和usb启动的方法, 不应该会影响到组合键.

于是将其中一台焊上了TTL线座, 翻出来以前买的PL2303的USB串口线. 连的过程也是各种摸石头过河. 首先是TX和RX的连线, 尝试几次后确定是PL2303的TX和RX分别接盒子的RX, TX. 然后是VCC线, 每次一连接, 盒子就上电启动了, 根本没法主动观察启动过程, 于是把VCC和GND拔掉, 这下不会自己启动了, 但是启动后看到的全是方块状乱码, 最终是VCC不连, 只连GND, 才算又不自己启动, 又能显示正常.

观察UBOOT的启动日志发现, 按不按reset键, 连不连HDMI, 启动日志基本完全一样.

其中一行"Hit any key to stop autoboot:  0"给我造成了很大困惑, 因为不管怎么敲Enter键, 都不会进入UBOOT命令行, 我怀疑是因为这个0, 导致无法停下来. 查阅资料, 发现有个配置项bootdelay, 于是从0改成了5, 发现根本不起作用, UBOOT还是一路狂飙不停下来, 又查资料, 发现还有用Ctrl+C的, 再试依然无效. 再查资料, 发现还有用空格键的, 这个起作用了, 只要拍空格键, 就能进入UBOOT

继续查资料, 发现还有个配置项叫 upgrade_key , 这个值是 "if gpio input GPIOH_6; then echo detect upgrade key; sleep 3; run update;fi;" 在日志中有这么一行"gpio: pin GPIOH_6 (gpio 55) value is 1", 凭借着曾经做过一些电路的经验感觉这个不对. 如果reset键输入是GPIOH_6, 那么在按下的时候肯定处于接地状态, 不可能是高电平, 所以这行日志对应的就是upgrade_key当中 gpio input GPIOH_6 这行执行的结果, 并没有检测到reset键按下的状态, 所以可以说是GPIOH_6这个写错了.

要找正确的gpio pin该怎么办呢? 又查资料, 发现 gpio status -a 这个命令可以显示所有的gpio状态, 这就好办了, 在reset键未按下和按下两个状态下, 分别执行一下这个命令, 把输出的结果对比一下就出来了, 得到的正确pin是GPIOAO_2, 在按下前是GPIOAO_2: input: 1 [ ], 在按下之后变成了 GPIOAO_2: input: 0 [ ]

再通过fw_setenv将正确的值设上

fw_setenv upgrade_key "if gpio input GPIOAO_2; then echo detect upgrade key; sleep 3; run update;fi;"

.按住reset重启, 就可以观察到usb burn的状态了.

解决这个问题断断续续花了我大概三天时间, 从周五到周日, 可能对于对于专业选手很简单, 但对于我很多是新事物, 要慢慢摸索.