最近再搞DM368 SPI的UBL启动,没有可以参考的资料,发现有一个问题,请大家看看
RBL在启动时要从SPI EEPROM读取幻数,来判断SPI EEPROM是按16bit地址操作,还是按24bit操作;
先说说测得的时序,板子上电后,CPU通过SPI发起读操作,以24bit的方式读取了0地址的4字节内容(测得一个CS低电平时8X8脉冲);
由读到的第一个字节来判断,以16bit地址操作,还是按24bit操作(我用的是16bit操作的SPI EEPROM),那么问题就来了。
如果描述符的前4个字节是0xA1ACED01
那么我们看看SPI在24bit寻址时的时序如上
但是512Kbit以下的EEPROM都是16bit的寻址,那16bit寻址时序如下
这样的话,CPU如何正确获得0xA1ACED01中的0x01这个字节呢,按24bit寻址时,CPU会把0xED当做第一个字节,这是怎么回事儿呢??
目前我的测试,CPU从0地址读4个字节,再从0地址读20个节字,然后再重复,始终不会去读后面描述符的内容,也不会读UBL的.bin文件,头晕死了!!!
我的困惑是:
CPU到底又没有把描述符的第一个字节正确读取?
文件描述符到底哪里错了,导致CPU一致重新读取?
我的文件描述符如
{0x01,0xED,0xAC,0xA1,
0x4C,0x5B,0x00,0x00,
0x00,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x20,0x00,0x00,0x00,
0x20,0x00,0x00,0x00};
kooking:
其实楼主就是希望从SPI Boot吧,这儿有一个SPI UBL on DM365,368上也可以用的,你先试下这个是否可以运行起来。
运行起来后还有个问题,就是主频会是365的(相当于降频),不过很容易修改,先跑下这个SPI UBL吧!
http://e2e.ti.com/support/embedded/linux/f/354/t/69683.aspx
Yan Li1:
回复 kooking:
伙计,非常感谢。我现在目的是写了一个简单的应用程序,将此程序当做UBL来运行,不用运行操作系统,效率也高,也没有那么麻烦。所以自己弄UBL,现在就卡在UBL描述符似乎不对,CPU不正确读取文件描述符,看了好多贴子,都是关于NAND的UBL,没有太大的参考价值头疼。
你给我的链接资料我都有,非常感谢啦。
kooking:
回复 Yan Li1:
这个好高端,实现后效率高,不过我比较奇怪的是,ubl的文件比较小,如果要跑应用,这么小的文件可以实现全部的功能吗
Yan Li1:
回复 kooking:
嗨,朋友!我对DM368的使用其实很简单,不需要做大量的数据处理,只用到它的视频处理模块,DMA,EMIF等。实现图像采集及简单的处理,特殊应用,嘿嘿,所以应用代码量是可以控制在30KB以内的。朋友有资源能帮我解决一下这个问题么?谢谢了
kooking:
回复 Yan Li1:
http://www.ti.com.cn/cn/lit/an/zhca125/zhca125.pdf
这个文档中提到的这几点,你应该也关注到了吧,理论上30k以内正常工作了。没有这际这么使用过,关注中,期待专家的指点~~
对于 UBL的描述符有几点注意事项:1. 入口地址必须在 0x0020到0x781C之间2. 存放UBL的页必须是连续的页,可以分布在多个块内,总共大小必须小于30KB。3. UBL的起始块号(block number)可以是和存放 UBL描述符的块号一样。4. 如果UBL的起始块号是和存放UBL描述符的块号一样,那 UBL的起始页数一定不可以和UBL描述符存放的页数一样。
user3779978:
回复 kooking:
首先谢谢了,我怎么下载了这个UBL源文件,编译之后报错呢?
[niguanghui@localhost GNU]$ pwd /home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU
[niguanghui@localhost GNU]$ make make -C bc all
make[1]: Entering directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/bc' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/bc' make -C genecc all
make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/genecc' make -C sft all
make[1]: Entering directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sft' make -C build TYPE=nand
make[2]: Entering directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sft/build' make[2]: Nothing to be done for `all'. make[2]: Leaving directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sft/build' make -C build TYPE=nor make[2]: Entering directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sft/build' make[2]: Nothing to be done for `all'. make[2]: Leaving directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sft/build'
make[1]: Leaving directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sft' make -C sfh all
make[1]: Entering directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sfh'
make[1]: gmcs:命令未找到
make[1]: *** [../sfh_DM36x.exe] 错误 127
make[1]: Leaving directory `/home/niguanghui/dvsdk_dm368_4_02_00_06/psp/flash-utils/DM36x/GNU/sfh'
make: *** [all] 错误 2
[niguanghui@localhost GNU]$
另外说的运行,是要烧写到SPI flash里面吗?你们用的什么办法烧写的呢?烧写到spi flash的什么地址呢?
Yan Li1:
回复 user3779978:
UBL的源码在TI提供的DM36X的开发包里其实是有的,你可以找找,但不明白您为什么要在linux下来编译,据我所知UBL是需要用CCS来编译成.bin文件,UBL的源码很简单的,里面的通过宏设置可以编译成在不同存储器启动的UBL,但我试过SPI的UBL似乎有问题。根据编译选项的不同,UBL要放到不同的存储器里。编译出来的UBL在文件头要加上文件描述符(参考我之前的贴子),CPU启动后根据EMIF总线上的上下拉电阻确定从哪个存储器启动,选读取文件描述符,通过该描述符知道UBL主函数的入口及文件的大小,从而将UBL搬移到IPRAM里运行,这样UBL就正常启动了。关于烧写,我记着RBL启动后可以通过串口来烧,我是用仿真器烧的。
user3779978:
回复 Yan Li1:
先谢谢了,问题一个个说吧
1. 关于UBL的源码编译问题,我是刚到的这边的公司,公司的工程师之前都是在LINUX下编译的,所以我继承了他们的做法,不同的是他们之前的UBL版本确实是可以在LINUX下编译过的,但是我现在用1.50版本的UBL却不行
2. 关于SPI的UBL,我们现在确实是需要这个UBL的,SD卡启动的和NAND启动的,我们现在都可以,因为客户要求把PCB板弄的太小了,放不下NAND和SD卡了,所以现在就使用SPI的flash了,我们的型号是华邦的W25Q128,不知道这个有没有型号约束呢?看手册上说是类似于EEPROM的SPI flash芯片,其实最初我想到的是atmel公司的AT25芯片,但是我接手之前公司已经采购了W25Q128芯片了,我也只好壮着胆子搞了。不知道能否探讨下关于SPI的UBL的问题?
3。 您说要参考您之前的帖子,编译出的UBL要加上文件描述符,不知道这个文件描述符是否是所说的UBL描述符呢?对于这个东西我也比较迷惑,这个UBL描述符是单独生成的吗?还是说是在UBL自动分离的呢?您的那篇帖子能否给个链接呢?
4. 关于烧写,应该是烧写UBL和uboot吧,只要这两个能起来,那后边的内核,文件系统烧写应该就不是问题了,不太明白的是UBL的烧写地址应该怎么确定呢?RBL会去哪里读取它呢?
user3779978:
回复 Yan Li1:
能否加下QQ交流下呢?我的QQ:541237941,拜托了
Yan Li1:
回复 user3779978:
1:linux编译应该是可以,但是我觉着CCS可能更简单一些;
2:SPI Flash应该不会有什么约束,我用的是AT系列的;
3:UBL的符述符是要你自己写的,一共是32个字节,你找找TI的资料里有关于这32个字节具体含义的描述,在你生成bin后,把这32个字节放在文件一开始;
4:RBL的作用就是从EMIF总线的上读到UBL存储的位置信息,比如如果是SPI,那就从SPI读取32字节后,再将UBL拷贝到内部RAM里运行,所以UBL是从SPI Flash的0地址存放就可以;
5:UBL启动才会加载UBOOT,再然后是内核。