300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 编译DM36X的UBL

编译DM36X的UBL

时间:2020-01-26 09:03:01

相关推荐

编译DM36X的UBL

原创:/u/2312748742

一、DM36X 的UBL编译

第一步:

1、先下载dvsdk_dm368-evm_4_02_00_06_setuplinux(DVSDK)

和arm-q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2(交叉编译工具链)

2、先解压 tar -xjvf arm-q1-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的移植就可以了

参考/olei_oleitao/article/details/7919307;在此感谢他的无私奉献!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
DM365的UBL源码分析

DM365的UBL源码分析

2019-02-22

DM36X UBL UBoot

DM36X UBL UBoot

2023-07-17

dm365 ubl splash logo

dm365 ubl splash logo

2020-09-26

DM365的UBL源码分析(二)

DM365的UBL源码分析(二)

2019-07-01