页次: 1
自己的坑,自己给坑填了。
本来想不懂脑子的使用代码,但发现spl跳转到rtthread后就是不行。没有办法,硬着头皮看了下arm9架构相关知识,最后发现代码基本都是对的,虽然有瑕疵,但能够使用。于是将注意力转向硬件驱动。最后终于发现是人品问题,具体经历我写出来供大家参考:
解释下楼主在对rtthread官方版本gcc_start.S文件的改造,在代码最开始定义了16个字节来表示固件信息:
1) 第1个4字节是跳转命令,机器码为0xea000002, 汇编的意思就是b reset, 跳转到reset函数执行。0x2是偏移地址,计算方法是:(目标地址-当前PC地址 -8)/4。其中目标地址是16,当前PC是0,偏移地址就是0x2了。XBOOT的作战的第一条指令直接定义为0xea000016,也是一样的道理。
2) 第2个4字节是幻数;
3) 第3个4字节是固定为0
4) 第4个4字节是固件长度,其中image_size定义在.lds文件中。
现在描述关于人品的大坑:
因为直接运行到SDRAM是没有问题的,只是spl拷贝到SDRAM不能成功。因此我一直怀疑是跳转或者是拷贝问题,毕竟这么多年的开发经验,直觉还是靠谱的:
1. 经过查找ARM9的指令集,觉得楼主的指针跳转应用程序,虽然没有处理相关堆栈,但对于现在的应用是没有问题的。于是将目标怀疑为拷贝问题。
2. 利用sunxi-fel工具读出flash应用程序固件文件(前1K字节),对比了下,与下载固件是一样的。
这下就懵逼了,为啥其他网友都可以,而我的板子就不行。于是就有了在本网站的发帖询问。。。。。。
昨天我突然想到,要不要看下SDRAM的拷贝数据是否OK,spi_flash驱动读出应用固件的第1个字节错误,本来是0x02, 读出来是0x03。找到问题就好办:
1. 拷贝完成后,程序强制修改0x80000000的首个4字节为0xea000002,然后跳转,正常了。。。
2. MCU开机可以自动加载spl到SRAM中,说明SPI FLASH是正确的,应该是驱动问题。结果发现楼主修改了SPI 的CLK频率,改回原来的频率,一切OK。。。
我查看了我购买的荔枝派焊接的NOR FLASH丝印,虽然不是原理图标注的那个厂家型号。但是按照W25Q128的手册来看,QSPI的CLK最大70MHz,普通SPI的CLK最大33M。因此还得把SPI的频率降低才行,才保证不会出错。
那现在就有个问题,为何其他网友的不改SPI的CLK频率也行,我的板子就不行呢????所以只能归结为人品问题了。。。。。。。
页次: 1