打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DM36X 的UBL移植
DM36X 的UBL移植
关于UBL的移植,本人打算单独写一篇文章的,但是UBL和UBOOT太紧密了,是TI davinci芯片的特点,所以放到一起讲。我们重点放在NAND BOOT的移植,这个UBL的版本是V1.50,在dvsdk_dm368_4_02_00_06\psp\flash-utils\DM36x和flash-utils\Common目录下,Common目录里有非常多东西,包括UBL的驱动源码、工具、脚本等等。我们主要关注arch,drivers,src,ubl。UBL的main()函数在dvsdk_dm368_4_02_00_06\psp\flash-utils\Common\ubl\src\ubl.c里,这几个文件夹打开看看就明白什么意思了,这里不罗嗦。
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()函数求值,这样就可以编译通过了。后来发觉TI的http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/100/p/115574/425950.aspx里也有人这人解决,呵呵,没想到本人的解决办法和一个网友一样的。本人记得调试三星2440 UBOOT的时候,有人点到过,这里本人忘记在什么地方改了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DM365的UBL源码分析
M6446的Bootloader分析
DM368 NAND Flash启动揭秘
高通平台创建设备文件节点
PHY Linux 驱动
LED驱动(原创)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服