命令玩起了捉迷藏
调试一款高通AR7240的AP,仿照高通AP91的代码,一通改,很顺利的u-boot就搞定了,正当自己感慨这种“搬砖式”调试已经日趋娴熟的时候,忽然发现reset命令没有了。。。。
执行reset命令,一直报找不到该命令的错误:
敲help命令,reset命令明明就在呀:
真是“你见与不见,我都在这里,但是不给你用。”一头雾水。。。。。
reset命令是MIPS CPU通用命令,代码与具体的板子型号完全无关,而新添的代码只有在board目录和configs目录有修改,况且这边的改动也不会影响到其他地方的代码。
于是仿照reset命令,复制他的命令注册代码,自己在其他地方做了一个treset命令:
执行treset命令是可以正常重启的,由此可以断定肯定不是reset命令相关的代码不适用于当前这块板子。
观察了下help命令输出,记得在其他板子上,一般都是?(help)这个命令排第一个,而现在是reset命令在第一个,应该也是一种不正常的表现。
于是我干脆把reset命令的注册代码注释掉,这个时候排第一个的命令变成了bootm,运行下bootm命令,同样是跟reset类似,报找不到:
真是妖孽呀!!!
连续做了两次relocate
在没法得到更进一步线索的情况下,只好开始代码跟踪调试了:
执行命令,会报“Unknown command xxx - try ‘help’”是因为在run_command中对命令解析时会进行一个find_cmd的判断,而在find_cmd中需要满足输入命令与当前全局变量中的命令名全部或部分相符。
命令相关的信息都存储在u_boot_cmd_start开始到u_boot_cmd_end结束的这部分区间内。
再看help命令的输出过程,同样也是去u_boot_cmd_start-u_boot_cmd_end这段区间获取命令信息,然后对各个命令名称按照组成字母的ASCII码大小进行递增排序,所以正常情况下都是“?”这个命令排第一。而现在比较奇怪的就是排第一的变成了reset或是bootm这种,显然不应该在“?”前面。
综上,导致这些奇怪现象的嫌疑犯按理说就是u_boot_cmd_start-u_boot_cmd_end这段区间了。
仔细跟了下代码,并对cmd命令的一些域做了调试输出,发现与命令相关的全局变量,在board_init_f的时候还是正常的,
但是到了board_init_r的时候不对了:
在board_init_f的最后,
cmdtp-cmd bootm, cmdtp-cmd len 5, cmdtp addr 0x800322e8, name