This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DM368 UBL文件描述符然问题



最近再搞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};

  • 其实楼主就是希望从SPI Boot吧,这儿有一个SPI UBL on DM365,368上也可以用的,你先试下这个是否可以运行起来。

    运行起来后还有个问题,就是主频会是365的(相当于降频),不过很容易修改,先跑下这个SPI UBL吧!

    http://e2e.ti.com/support/embedded/linux/f/354/t/69683.aspx

  • 伙计,非常感谢。我现在目的是写了一个简单的应用程序,将此程序当做UBL来运行,不用运行操作系统,效率也高,也没有那么麻烦。所以自己弄UBL,现在就卡在UBL描述符似乎不对,CPU不正确读取文件描述符,看了好多贴子,都是关于NAND的UBL,没有太大的参考价值头疼。

    你给我的链接资料我都有,非常感谢啦。

  • 这个好高端,实现后效率高,不过我比较奇怪的是,ubl的文件比较小,如果要跑应用,这么小的文件可以实现全部的功能吗

  • 嗨,朋友!我对DM368的使用其实很简单,不需要做大量的数据处理,只用到它的视频处理模块,DMA,EMIF等。实现图像采集及简单的处理,特殊应用,嘿嘿,所以应用代码量是可以控制在30KB以内的。朋友有资源能帮我解决一下这个问题么?谢谢了

  • 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描述符存
    放的页数一样。

  • 首先谢谢了,我怎么下载了这个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的什么地址呢?

  • UBL的源码在TI提供的DM36X的开发包里其实是有的,你可以找找,但不明白您为什么要在linux下来编译,据我所知UBL是需要用CCS来编译成.bin文件,UBL的源码很简单的,里面的通过宏设置可以编译成在不同存储器启动的UBL,但我试过SPI的UBL似乎有问题。根据编译选项的不同,UBL要放到不同的存储器里。编译出来的UBL在文件头要加上文件描述符(参考我之前的贴子),CPU启动后根据EMIF总线上的上下拉电阻确定从哪个存储器启动,选读取文件描述符,通过该描述符知道UBL主函数的入口及文件的大小,从而将UBL搬移到IPRAM里运行,这样UBL就正常启动了。关于烧写,我记着RBL启动后可以通过串口来烧,我是用仿真器烧的。

  • 先谢谢了,问题一个个说吧

    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会去哪里读取它呢?

  • 能否加下QQ交流下呢?我的QQ:541237941,拜托了

  • 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,再然后是内核。

  • 1. 我在linux环境下编译就是贴图上的错误BUG信息,交叉编译工具链也没有错啊,的确是arm2009-q1-203的版本,我们这边的人都不会使用CCS,不知道能否简单说明下呢?我也看了您在论坛里的其它帖子,其中有一篇就是说的用的CCS3.3编译的情况,但是那些东西我都不全的,比如那个Hex470.exe,请问这个东西是在哪里下载的呢?再次恳请能加下聊天工具QQ:541237941,不管哪种方式吧,只要能编译过,那就是好的方式

    2. 好的,那我就还使用这款摸索模摸索,AT系列应该是atmel公司的吧

    3. 嗯,这个确实在相关手册上看到了它的描述,也有具体的含义,但是比较困惑的是,你说的生成bin以后,这个bin文件是否就是问题1里的编译出的bin文件呢?另外这32字节怎么放在文件一开始呢?难道要打开bin文件对其进行编辑吗?

    4.这里所说的UBL是否是已经加入32字节信息(UBL描述符)的一个合体文件呢?

    5. OK!

  • 你好,关于这个UBL,我下载之后,首先是在linux环境下编译,但是提示错误;后来又用CCS5.2创建了工程,但是提示

    <Linking>

     "../ubl2bin.cmd", line 3: error #10022-D: invalid option:  -zero

     "../ubl2bin.cmd",line 4: error #10021-D: expecting filename, option, MEMORY,   

     or SECTIONS instead of "8"

     error #10008-D: cannot find file "inkerfill"

     error #24011-D: argument to option -f (value) is out of range

  •         不好意思,我最近太忙了,没来的及回答你的问题,不过使用SPI 方式做UBL确实很有挑战性,我之前也整了好长时间,包括找到TI的技术支持,他们也没有办法搞定,如果确定搞不定,还是改成nandflash的方式,比竟大家都用这个,网上的资料也很多。

    1:HEX470.exe是TI的一个官方工具,是可以将编译得到的.out调试文件转换成.bin文件,你可以在windowns命令行里使用,也可以CCS里的编译选项里添加,在编译的同时就可以生成.bin文件。

    3:如果你使用CCS,可以软件里把这32个字节放在生成的bin文件的一开始后编译,就可以得到UBL对就原bin,当然你可以在下载bin文件之前先往flash里写入32个字节,然后再下载bin,目前我用的是这种方式。

    4:对完整意义上的UBL是带有这32个字节的信息的。

  • 快要泪奔了,多谢伙伴给回信了,还以为你不会来了!我目前还在尝试,如果可以的话,一定分享出来!

    1. 不知道伙伴能否给出一个完整的命令呢?我昨天尝试了下在windows里安装了CCS,但是编译SDK4.02包里的UBL文件源码,只能输出.out文件,伙伴能否给出一个完整的windows命令行下的命令呢?看你在别的帖子里说有解决,但是并没有给出具体的命令是什么额。。。

    2. 由于CCS不熟悉,所以不打算采用这种编译环境了,我今儿也在想着使用你目前用的这种方式,只是不知道往flash里先写入这32字节,是怎么完成的呢?我刚才还在思考,除非是先把这32字节可以弄成一个.bin文件,先烧写进去,可是什么工具可以直接对这单纯的32字节进行编译且生成.bin文件呢?

    3. 最后确定一下,除去UBL的描述符需要改变外,UBL源码里真的需要移植吗?我们现在使用的UBL,是系统默认的NAND启动方式的UBL,能否直接用这个UBL呢?对于UBL源码我也看了,真的是觉得这玩意完全就是因为硬件的启动方式不同而加载不同的代码,怎么看都感觉没必要动。

    4. 伙伴能不能把你当时用的UBL和怎么生成那32字节的二进制代码的工具分享下呢?

    再次感谢,终于有同路人了!

  • hex470.exe $(Proj_dir)\Debug\UBL2BIN.cmd -o=$(Proj_dir)\Debug\xxxxxx.bin $(Proj_dir)\Debug\xxxxxx.out

    以上是编译方式,生成.out时会生成.bin。

    char SPIDescriptor[32] = {0x01,0xED,0xAC,0xA1,/*Magic number with 0x01 16bit*/
    0x20,0x00,0x00,0x00,/*Entry point address of UBL*/
    0x00,0x00,0x00,0x00,/*UBL size*/
    0x05, /*Prescaler*/
    0x00, /*Fast read with 0x01*/
    0x00,0x00, /*Default*/
    0x20,0x00,0x00,0x00,/*Start address of UBL*/
    0x20,0x00,0x00,0x00,/*Load address of UBL in IRAM*/
    0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00};

    这是我的文件描述符,从falsh的0地址烧录上述的文件描述符述,继续烧入.bin即可。

    希望能帮到你。

  • 我用的ubl2bin.cmd文件和你的内容看着是一样的,但是却报错,我也是刚接触CCS编译工具,现在我这有个CCS工程,但是编译的话,总是报错,这个CCS工程好像已经内含了SPI的UBL代码,不知道你能否尝试下给编译通过呢?目录是flash-utils-03.21.00.04\DM36x\CCS\UBL\下的UBL_SPI_MEM.pjt工程,拜托了

    flash-utils-03.21.00.04.tar.gz