2440U-BOOT 移植nand之外部分,笔记。
刚才看到有人发了《U-BOOT移植手册》,正好是我没写的部分。大家先看那个。比较入门。
总是匆匆的。还没移植完整U-BOOT,又要去准备学习STM32,我的计划总是半途改变。虽然没有NAND,现在这样也可以做个总结了。否则就忘记了。
我移植的版本是2009-11版,但是到现在已经不再是最新了。
我是一个懒人,从2年前就准备移植一下。上次是因为jlink不支持在Linux下调试而终结,其实,这些都不难,关键是一条主线。不要走错误路线。这次的路线,依旧是一条主线,一个懒人的主线。
我选择了一个OPENJTAG,这是一个Linux下的仿真器,虽然速度不快,虽然eclipse总有些小错误,我还是很喜欢它,至少不用点灯大-法了。
移植的芯片是2440,我以为是兼容2410的,其实我错了。这个让我浪费了几天时间。下面我先总结一下方法。一般有2中方法,一种是主动移植,第二种是被动移植。
对于主动移植,就是对比2410版和2440芯片手册的区别,还有pcb的区别。然后修改寄存器声明文件。然后运行至ok。
对于被动移植,那就是,搞一个环境,不改动任何,然后仿真,直到跑飞为止,然后分析如何出错的。
我采用的第二种,开始移植到时候,连芯片手册都没读。当然对U-BOOT的了解也不深,然后直到跑飞。。。。。。
先搞定start.S,由于是内存仿真,所以,网上说注释掉底层初始化,但是我不知道为什么,于是我先注释掉,把start.S仿真的直到熟悉,然后再看看底层初始化为什么要注释掉。
创建属于2440的环境。比如说smdk2440文件夹,configs下的smdk2440.h。这些都是按照网上复制的。然后修改makefile让其被编译。然后就会出现错误。这里就找找是不是被#ifdefine 或着#if defined()给注释掉了。直到编译成功。这样,和2410兼容的东西都被包含过来了。
随着以前的**,1,把中断初始化给更新了。2440比2410要多机构中断。这里我就不写了。网上一大堆。首次调试我就看看直接运行2410的代码会如何。结果发现跑飞了,初始化中断后ok了。(但是芯片复位后,中断是关闭的,所以看出内存仿真时,中断不是关闭的)。
2.测试一下底层初始化为什么要被注释。
原因是这样的start.S是从0地址开始编译的。底层初始化配置内存的时候就从nor地址读取的,而不是当前调试的文件,导致配置错误,在配置sdram的时候跑飞。而其他文件是基于内存地址编译的,这样一个b start_armboot就可以跳到内存空间。这就是所谓的分散加载。
3.还需要改底层初始化的sdram初始化。这里网上比较多了,就搜个值填上吧。都是鸟语,慢慢算也能算出来。 |