编译DM36X的UBL,

原创:http://blog.sina.com.cn/u/2312748742

一、DM36X 的UBL编译
第一步:
1、先下载dvsdk_dm368-evm_4_02_00_06_setuplinux(DVSDK)
和arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2(交叉编译工具链)
2、先解压 tar -xjvf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,
3、安装后要设环境变量。export PATH=$PATH:/work/kylin....
4、解压DVSDK并安装。
第二步:
DM36x下有CCS、Common,GNU三个文件夹:
CCS文件夹:
这里边的程序需要在TI CCS下编译,通过仿真器和JTAG在DM36X的板子上调试和烧写NAND FLASH或NOR FLASH,有烧写Writer的应用程序,用CCS打开工程文件,会连接到dvsdk_dm368_4_02_00_06\psp\flash-utils\Common\ drivers里。
Common文件夹:Common里有核心的文件device.c和device_nand.c。device.c是最重要的文件,这里初始化很多系统的东西,见DEVICE_init():
1、屏蔽所有中断;
2、清除中断标志;
3、DEVICE_PSCInit(),Power and Sleep Controller;
4、主芯片管脚复用的设置DEVICE_pinmuxControl(),DM36X的管脚复用很多,很复杂,一共5个PINMUX寄存器需配置;
5、DEVICE_PLL1Init(),PPL1配置,见SPRUSG5A.pdf的35页开始的介绍,使用不同的频率的DM36X,这些值都不同,不过TI已经提供参数参考,我们的DM365核心板是:ARM297_DDR243_OSC24,DM368核心板是:ARM432_DDR340_OSC24;
6、DEVICE_PLL2Init(),PPL2的配置,使用同上,不同频率的值不同;
7、DEVICE_DDR2Init()的配置,市场上不同的DDR2内存芯片需要不同的参数配置,就在这个函数内。
8、DEVICE_EMIFInit(),这个针对NAND FLASH接口或NOR FLASH接口的访问时序配置;
9、DEVICE_UART0Init()的配置,这个就是我们调试DM36X串口的设置,我们使用UART0来调试LINUX,这里配置不好,后面的开发不用调试了。
10、DEVICE_TIMER0Init()定时器TIMER0的设置;
11、DEVICE_I2C0Init()的设置;
GNU的文件夹:
这个就是在LINUX环境下编译UBL的环境,修改dvsdk_dm368_4_02_00_06\psp\flash-utils\DM36x\GNU\ubl下的makefile,把
#$(MAKE) -C build TYPE=nor注释掉,只保留$(MAKE) -C build TYPE=nand,然后是make clean和 make生产ubl_DM36x_nand.bin的文件;
如果出现:device.c:(.text+0x2ec): undefined reference to `__aeabi_uidiv'和device.c:(.text+0x2e8): undefined reference to `__aeabi_uidivmod'的BUG,就是DDR_Get_Val()函数里边的除法和求余的语句和你的编译器不配置造成的。
result = ((parm * freq) / 10000) - 1;和if(((parm * freq) % 10000)),我们对参数的求值直接:
    tRFC = xxx; //DDR_Get_Val(DDR_T_RFC, DDR_FREQ);
    tRP = xxx; //DDR_Get_Val(DDR_T_RP, DDR_FREQ);
    tRCD = xxx; //DDR_Get_Val(DDR_T_RCD, DDR_FREQ);
    tWR = xxx; //DDR_Get_Val(DDR_T_WR, DDR_FREQ);
    tRAS = xxx; //DDR_Get_Val(DDR_T_RAS, DDR_FREQ);
    tRC = xxx; //DDR_Get_Val(DDR_T_RC, DDR_FREQ);
    tRRD = xxx; //DDR_Get_Val(DDR_T_RRD, DDR_FREQ);
    tWTR = xxx; //DDR_Get_Val(DDR_T_WTR, DDR_FREQ);
解决方法不要用DDR_Get_Val函数了。改成如下
 #define BOOL(x) (x==0?0:1)
#define DDR_Get_Val(x, y) ((((x * y) / 10000) - 1) + BOOL((x * y) % 10000))
注意:DM368的UBL一般不需要移植的,已经烧写到ROM中了只要哦好UBOOT及kernel的移植就可以了
参考http://blog.csdn.net/olei_oleitao/article/details/7919307;在此感谢他的无私奉献!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值