OMAP3 CPU
OMAP35x系列启动流程:(自己总结的)
第一步:配置CPU的启动方式(sys_boot);第二步:bootROM会从NAND 中读取x-loader,ECC校验通过以后,就跳转执行x-loader
第三步:x-loader接管,初始化PLL和DDR,由x-loader去读取u-boot,然后执行u-boot.
第四步:u-boot在SDRAM中运行,并引导Linux内核启动。
注:
bootROM是
CPU内部(112KB ROM)已经固化好的程序代码,属于TI公司,不开放。
x-loader烧写在启动设备中,开发板提供源代码。
u-boot因为较大,
CPU内部SRAM放不下,所以在DDR中运行,开发板提供源代码。
Linux开发板提供源代码。
TI
所有DSP,如OMAP,DM644x的ROM都是芯片出厂时掩膜掩好的。客户只能读,不能擦。ROM里存放BOOT代码,有些DSP的ROM会存放一些数学库函数等。
启动时omap35x会把0x4000 0000起的1M空间映射到0x0000 0000。
0x4000 0000起始的80k空间存放的是加解密使用的代码/数据。当然开头那几十个字节是arm的跳转向量表。其中reset会跳到bootrom(0x0001 4000或0x4001 4000起始的32k代码空间)中执行,其它向量会跳到sram的固定地址去执行。reset时只需要往sram的固定地址填上几个转跳指令就可以让其它向量的处理跳回bootrom的处理代码中执行。而对于uboot这样不使用mmu的bootloader只需要改变那几个地址的指令就可以跳到uboot自己的处理代码中。启用了
mmu的linux当然就不需要这样做了。
仿真器主要是芯片级调试,或者
DSP算法调试,跑了OS以后,仿真器就基本没有用了
可以通过
CCS来保存你想要的内容
主要用仿真器来荡内存,俺习惯把
printk的串口输出注释掉,把printk的buffer开的很大,所有debug信息都放在内存里。因为用串口调试,串口本身不仅在好多环境下不能用,而且还会引起不必要的麻烦。用只
print到内存的pintk,干干净净,俺放心
OMAP3
适合在ARM9、11处理能力不够的嵌入式场合,由于功耗比较小,便携应用是强项,也提供工业级版本,在工业医疗方面也可以应用。
OMAP3
不是单颗芯片,目前4颗是完全pin2pin兼容的,有分别带DSP和3D的芯片,具体如下:
omap3503 COTEX-A8 +
外设
omap3515 COTEX-A8 +
外设 + 3D加速
omap3525 COTEX-A8 +
外设 + DSP及视频硬件加速
omap3530 COTEX-A8 +
外设 + DSP及视频硬件加速 + 3D加速
同样一个硬件设计,可以覆盖不同等级的产品需求。
问:
BeagleBoard
采用x-loader+u-boot的方式来启动内核,我看了一下x-loader的代码,是u-boot的精简版,主要实现的功能是初始化硬件,然后根据启动方式从nand flash或mmc/sd拷贝u-boot代码到内存,运行之。
我的问题是:
u-boot
下面同样执行了硬件的初始化,u-boot也支持读取mmc/sd文件,那为何不直接使用u-boot来引导,而在前面添加一个x-loader呢?这其中有什么重要的原因吗?谢谢。
答:
U-BOOT
太大,塞不进 OMAP3的内部RAM。 所以 用x-load。
OMAP3
上电的时候,读取x-load 到 内部RAM,然后执行。
X-LOAD
初始化memory controller,把 u-boot 读进外部 RAM,然后跳到外部RAM 执行u-boot。
可以把
UBOOT直接通过CCS下载啊,然后运行。。。
记得下载
ELF的文件,不要下载.bin哦
问:
如果
nand flash启动的话,修改一下u-boot应该也能做到。问题是mmc/sd启动的时候,需要读取mmc/sd里面的东西,这里涉及到fat文件系统,这个光用汇编的话估计很难实现,所以才另外写一个精简版的u-boot(x-loader),不知道是否这个原因?
Xloader
的作用是把初始化代码
load到片内ram,做芯片和外设的初始化,xload非常小,只有几K大小,主要是初始化PLL,DDR,只有初始化了
DDR,才能把uboot下载到DDR里面执行
所以可以认为是如下几级启动过程:
1.
片内ROM -- 支持UART,USB,NAND,NOR,MMC1, MMC2,OneNAND等启动
2. xloader
,初始化PLL和DDR,下载UBOOT
3. uboot/eboot
启动
4. linux/wince kernel
启动
答:
xloader和文件系统没有关系,不管是nand,onenand还是mmc/sd,都是xloader,只不过在fat32里面必须更名称MLO才能识别。如果可以把
uboot精简到16K以内,不用xloader也可以,呵呵
uboot
也是可以把USB搞起来的,当然也可以用串口打印,或者串口下载uboot
理论上,也可以用
USB下载UBOOT和kernel调试,但是目前缺少一个调试工具,现成的是通过USB下载xloader或者mini-uboot到片内RAM:
http://groups.google.com/group/beagleboard/browse_thread/thread/2b9e99886bb7a747 xloader/uboot也可以用510/560仿真器+CCS跟踪调试
问:
1
、TI内部boot rom的源代码公开吗?
2
、请问哪里可以下载?
答:
Bootrom code
不对外开放
问:
OMAP3
图形处理关系?
答:
三个核是完全独立的,一般看到的
OS和控制,GUI等等都是直接在ARM上跑的
视频有两种方式,一种是直接用
ARM或NEON加速软解码,另一种是启动DSP以及视频硬加速做媒体加速,可以认为DSP只是协处理器,只是从memory到memory的算法处理,如何做,数据流如何走完全由ARM控制,比如可以直接解码放到最终显示的视频驱动buf (video0/1)
同样,
3D模块也是纯硬件加速,由ARM控制,一般是3D直接输出到OSD的buffer(graphic)
最终显示到屏上或者
DVI或者S-video,可以通过sysfs控制如何进行视频buf和OSDbuf的叠加或半透明效果。
基于
OMAP35x系列的是用TI的CODEC ENG软件框架,媒体处理的算法可以放在ARM也可以放在DSP,上层调用已经抽象化有限的一些接口,比如Ceate(), Control(), Process(), Delete(),如果用DSP加速,算法是在DSP的微码里面,通过这些控制命令接口来进行编解码处理等。
问:
OMAP35x的裸板测试程序在哪可以下载?
答:
SDK
开发包的board_utility里面有ITBOK(Is the board OK?)
集成在
uboot里面进行板级硬件测试
问:
NAND启动
答:
nand
启动,首先要看是不是在支持的boot deviceID里面(如下) 启动代码需要写在0-4个块 然后xloader需要加上8字节的头,用
signGP工具
还有值得注意的是
ECC,需要用硬件ECC
以及注意
xloader的load address之类的
如果还不行,恐怕需要用仿真器来调试了。。。
Table 26-32. Supported NAND Devices
Capacity Device ID Bus Width Page Size in KB
64Mb E6h 8 512
128Mb 33h 8 512
128Mb 73h 8 512
128Mb 43h 16 512
128Mb 53h 16 512
我大致说一下我这边的情况:
1
、flash用的是三星的片子:k9f1g08,id为0xf1,2k page,128Mbyte,在TI支持的列表里可以找到。
2
、启动代码写在0块0地址
3
、x-loader加上了8字节的头部(到sd卡上能正常启动)
4
、烧写的时候使用了nand ecc hw(使用硬件ECC)
5
、按照芯片datasheet的介绍,nand falsh片选接到cpu的CS0,nand flash忙引脚接到cpu的wait0,在
u-boot下操作没问题
满足以上条件,可以就是不能
nand boot~
现在我最大的怀疑是
ecc出了问题,可是我使用的是beagleboard提供的u-boot,flash驱动使用原来的,只是稍微修改一下flash的ID和位宽而已(beagle board使用的flash为16 bit,而我们使用的是8 bit),不知道从以上信息能否定位出问题的所在?(TI固化代码没有打印任何错误信息,不然就好办了^_^)
换成
8bit的nand,有几个地方需要修改:
xloader
中配置GPMC_CONFIG1,默认的是配置成16bit了,这里要修改成8bit
NAND
的option中把16bit的宏定义干掉
在
ECC的OOBINFO中,由于8bit nand只用一个字节表示是否是坏块,但是默认的uboot中配置成16 bit的两个字节,也就是ECC值要从第二个字节开始放,不是第三个字节
其他都用默认的代码,应该就可以了
记得烧录
xloader的时候要加上8字节的头,并且必须使用hwecc
我只看了在
8bit下ecc的结果,却没注意存放的位置.
我修改了
ecc存储位置,示波器观察片选,应该能确定部分代码被拷贝到内部ram,但是依然无法启动:(
貌似数据在一直拷贝
.
不知道是不是因为用了
cpld做转换造成的. 3.3的nand.
或者是
tmx的片子? 2.1版,原来我看的文档rom不支持mlc的nand,现在文档说也支持了。
另外一个比较容易忽略的地方是
GPMC的位宽,默认在xloader代码里面设成16bit的模式,如果用8bit的,需要注意修改GPMC的CONFIG1寄存器。
".......................................
貌似数据在一直拷贝. ",你指的是退出nand boot后(比如进入uart3 boot,可以看到串口打印40T)用示波器测试发现nand flash片选引脚一直有信号吗?
我们之前也存在这样的问题,后来证实是
hw ecc的存放位置不对所致(TI启动代码对于8 bit nand flash的hw ecc的存放位置和16 bit的nand flasht刚好错开了一位),另外注意一下u-boot下gpmc bank 0 的位宽要设置正确,good luck。
DJBean
,因为我只是测试是否能从nand启动,所以按我理解应该是omap的rom会把整个
x-load内容拷贝到sram运行,这样的话哪怕x-load代码错误(如GPMC),也是能启动x-load的,比如串口发送数据等,只是不能接着运行u-boot罢了,对么?
luofuchong
,我后来在nand启动失败后用560仿真器观察拷贝的地址和数据,发现如果x-load大于某个大小后的数据是错误的,如果代码小,比如4k这样内容是正确的,但是依然无法启动。
我现在的
ecc obb是这样的,您看对么?
eccbytes = 12,
.eccpos = {1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12},
.oobfree = {
{.offset = 13,
.length = 51 } }
为什么烧录
xloader必须使用hwecc ?我这样理解:
BOOTROM加载x-loader时用的是hwecc ,而x-loader load uboot时用的是swecc。
我现在的问题是,用工具把
x-loadr 烧写进nand flash后,串口什么信息也打印不出来,但GPMC_cs0引脚是有信号的。我用工具读出NF中的数据和我下载前对比了一下,完全相同。难道又是hwecc造成的?如果下载软件本身和hwecc有关系,那我就怀疑是我的下载工具有问题。。。。。。
我现在调的是
wince的bootloader,和linux的一样也是两级boot(x-load和eboot),TI提供了一个下载工具 EVMFlash,可以直接把
x-load download NAND Flash。我现在是下载成功了,从NF读出数据和下载之前的比较,是完全一样的,但不知为什么不执行程序。
USB
问题:
关于
USB的问题,默认是没有打开hot plug-in的,也就是如果上电的时候有USB hub,系统是可以检测到,如果上电时候没有插USB Hub,等系统起来以后再加上,有可能检测不到,方法是执行如下命令 (也可以放在rcS里面):
echo "S" >/proc/driver/musb_hdrc
这样就可以支持
USB Hub和USB设备的热插拔了
如
zqdsp所说,由于供电问题,你需要用带外部电源的usb hub
beagle
的USB OTG是不能直接接U盘等外设的,因为OTG接口的电源供电是由TWL4030直接给的,最大供电电流100ma。所以要挂鼠标、键盘、U盘等必须外接USB hub,并且这个HUB还必须是有源HUB,有外部的供电。
再建议大家,不要图便宜在市场上买些特便宜的有源
USB HUB。我当时在市场上前前后后共买了4个HUB,20的,30的,50的,100的。最后还是100的好用,其他的插上鼠标等都没反应。以上为个人经验,仅供参考。
大佬,是
USB虚拟串口设备,也就是USB作为串口的gadget
实际速度是
USB的速度,不是串口的速度
问:
关于
omap3530+tps65930开机流程.
我用的是
devkit8000板子
, 一接电源, 代码就跑起来了.
但做手持设备的应是按
power键2秒才上电开机的吧, 这应怎么实现啊??
答:
bootloader
中判断有没有GPIO按下去,计时启动,否则bootloader直接把电源管理芯片shutdown
请教各位高手
DevKit8000如何安装ubuntu-arm的步骤,debian也可以
按照
http://elinux.org/BeagleBoardHandheldsMojo http://elinux.org/BeagleBoardDebian
做了,载入内核到
boot kernel
后就被卡住不动了
请教各位高手问题出在哪里了,
uboot的arch_number也已经改成beagle的了。高手帮忙,或者给个操作步骤~~
我们的
OMAP3530板子调试出了一些问题,由于比较复杂,不知道能否提些建议或帮忙找相关人员回复一下,国内TI的FAE在说到这些具体问题时好像也不是很清楚:
1
)OMAP3530是否必须和TPS65930配合使用,如果去掉TPS65930,会有什么影响?
2
)我是按照瑞泰的MINI板做设计的,但是在焊接过程中发现
TPS65930制板出了问题,没法焊接,所以只有做弥补工作,主要包括电源、26M时钟、32.768K时钟的改动,现在通过JTAG调试,发现电源、两路时钟都可以了,芯片应该能工作了,但就是没有办法从SD卡启动,请问是SD卡的INS脚连到了
TPS65930的CARD DETECT脚但我没有办法焊接TPS65930导致的吗?如果是,能不能通过修改什么东西绕过它,还是只能改动OMAP3530的BOOT ROM?但BOOT ROM恐怕只有TI才能改了。
3
)如果2)中无法解决,我想从OMAP3530的串口3启动,不知怎样做?
4
)如果2)、3)仍无法解决,从OMAP3530的USB1、USB2能否启动?怎样启动?USB0在TPS65930上的,没有办法使用。
5
)如果以上都不行,那就只有重做印制板了?
从
UART3启动吧! 找TI的FAE要EVMFlash工具就可以搞定!但串口只能下bootloader
,内核或镜像从以太网下载吧。
ARM
与DSP协调:
DSP
完全可以访问McBSP, 同样的操作memory map的寄存器就好了
除了有些特殊说明的接口
, DSP都是可以访问的, 不过通用应用一般不建议这样使用, 因为由ARM管理外设和驱动更为标准和合适, 有些特殊应用, 也可以用DSP访问外设。
你说的 同样的操作
memory map的寄存器即可, 我对这个不大懂。是不是说DSP端和ARM端都是操作相同的McBSP寄存器?
我看
OMAP3530的data sheet 上的McBSP那一章,讲到McBSP的控制寄存器地址,比如:McBSP1 的基地址是 0x48074000,大小有4K Bytes ,那是不是ARM和DSP都是通过访问0x48074000处的寄存器来控制McBSP1的? 我浏览了data sheet,其它地方似乎是没有映射到McBSP1的寄存器的地址了。是不是DSP和ARM 共用那4G的地址空间? 对这种双核的地址空间分布感觉有点混乱,概念不清楚。
又阅读了下
memory mapping的章节,MPU和IVA2.2都有自己的4G的地址空间,这2个4G空间中,只有一小部分地址是有对应部分的,另外的则是完全不相干的。比如:在ARM侧的地址:0x5C00 0000 ~ 0x5CFF FFFF 对应的是 DSP端的:0x0000 0000 ~ 0x00F1 7FFFF , 这部分可以访问L1 Rom Ram, L2 Rom Ram 。 但是我就是没找到McBSP在DSP侧的寄存器地址。
我用仿真器试过了,带的
demo一个是在arm上跑的,一个是在dsp上跑的,应该是两个程序都可以使用相同的地址访问外设(我测试的是UART1,McBSP1的几个寄存器,读出来的寄存器的复位值与datasheet上的描述的一模一样),而且我在ARM侧跑的程序上做了修改后,然后再启动DSP侧的程序查看相关的内存和寄存器的值,跟我在ARM侧上修改的一致。所以dsp是可以直接访问外设的。
烧写
xloader和uboot到oamp3530的flash的方法?
在
u-boot中:
烧写
XLoader到NandFlash:
OMAP3 Miniboard # mw.b 80000000 ff 80000
OMAP3 Miniboard # mmcinit
OMAP3 Miniboard # fatload mmc 0:1 80000000 x-load.bin.ift
reading x-load.bin.ift
11412 bytes read
OMAP3 Miniboard # nandecc hw
OMAP3 Miniboard # nand erase 0 80000
NAND erase: device 0 offset 0x0, size 0x80000
Erasing at 0x60000 -- 100% complete.
OK
OMAP3 Miniboard # nand write 80000000 0 80000
NAND write: device 0 offset 0x0, size 0x80000
524288 bytes written: OK
烧写
U-Boot:
OMAP3 beagleboard.org # mmc init
OMAP3 beagleboard.org # fatload mmc 0:1 80000000 u-boot.bin
reading u-boot.bin
147424 bytes read
OMAP3 beagleboard.org # nand unlock
(Note - if you are using a more recent version of U-Boot, nand unlock is missing
simply skip this step. i.e. U-boot 2009.08)
device 0 whole chip
nand_unlock: start: 00000000, length: 268435456!
NAND flash successfully unlocked
OMAP3 beagleboard.org # nandecc sw
OMAP3 beagleboard.org # nand erase 80000 160000
NAND erase: device 0 offset 0x80000, size 0x160000
Erasing at 0x1c0000 -- 100% complete.
OK
OMAP3 beagleboard.org # nand write 80000000 80000 160000
NAND write: device 0 offset 0x80000, size 0x160000
1441792 bytes written: OK
OMAP3 beagleboard.org #
在
u-boot已经存在的状况下这是最佳方案。
兄弟遇没遇到这种情况:
omap里没有uboot,或者u-boot损坏,该怎样烧写
ICETEK-OMAP3530-MINI
任何时候都可以从sd卡启动,即从sd卡启动u-boot然后再烧写flash
串口启动需要先下载
xloader,然后在xloader里面下载