在BeagleBoard上运行QNX系统(一)

时间:2024-03-21 11:19:34

折腾了好几天,终于成功在BeagleBoard上运行QNX系统,如果说在BeagleBoard上运行Android费了一些手脚的话,在BeagleBoard上运行QNX可以说是费尽周折。秉承本博客的主旨,将折腾过程记录下来,供各位同学参考,以后可以少绕一些弯子。

为了在BeagleBoard上运行QNX系统,我参考了一些书和网上的资料,同时将制作Android系统的sh文件打开仔细读了一下,得出的主要思路如下:

1. 首先要将启动的SD卡进行分区和格式化,让其中一个分区成为启动分区。

2. BeagleBoard提供了MLO和u-boot.bin文件,将他们拷贝到SD卡的启动分区后,BeagleBoard启动时会启动MLO程序,然后MLO程序会调用u-boot.bin。其中u-boot.bin可以用来装载QNX系统镜像。

3. 需要去QNX官网上下载BeagleBoard的QNX BSP文件,导入到QNX Momentics环境中,用于生成QNX的系统镜像文件(英文资料说的是OS Image)

4. 将生成的QNX系统镜像文件拷贝到SD卡启动分区中,u-boot.bin启动后会装载QNX系统镜像。

有了基本思路就开始开干,第一步是对SD卡进行分区和格式化。

为了保持之前的WinCE系统和Android系统,我另外找了一个2G的卡,又是几十块钱出去了。。。。

网上有一些资料关于如何格式化SD卡的,有Windows操作系统的方法,也有Linux系统的方法。反正我的Ubuntu已经安装好了,而且Linux系统上的方法说的详细一点,就采用了Linux系统上的方法。

我做SD卡的过程主要是参考了foundry27的一篇文章,链接是:

http://community.qnx.com/sf/wiki/do/viewPage/projects.bsp/wiki/AM_OMAP_boot_resources

将SD卡装如读卡器,将读卡器插入PC上,从VMWare菜单上设置在Ubuntu虚拟机上使用USB设备。

于是在我的Ubuntu上就可以看到自动mount出来的SD卡内容了。

关掉自动显示的SD卡内容窗口(主要是担心一会umount SD卡的时候会出问题)

启动Ubuntu的terminal窗口,开始在命令行界面下格式化SD卡。

a)通过df命令查看SD卡的设备名,df的输出里有类似/dev/sdb1 .... /media/的一行,表示SD卡的设备名是sdb,下面统一使用sdx作为SD卡的设备名,如果你的情况有所不同,请作相应调整,如将umount /dev/sdx1 调整成umount /dev/sdb1

b) 通过umount命令释放sbd: umount /dev/sdx1

c) 通过以下命令清除sdb的内容,如果遇到权限问题,请使用sudo,或者直接设置root的密码后su 到root上执行:

dd if=/dev/zero of=/dev/sdx bs=1M count=1


d)启动fdisk:

fdisk /dev/sdx

c) 在fdisk界面下先通过命令p查看一下情况,如果c)步骤完成的话,显示出来的应该只用磁盘信息,没有分区信息。在我参考的文档中建议通过磁盘信息计算一下分区时分多少柱面,计算方法是字节总量除以255再除以63再除以512,我自己用的是2G的卡,计算结果和他的相同,就按他的结果(239)做了。

Command (m for help): p
Disk /dev/sdx: 1973 MB, 1973420032 bytes


d)通过x命令进入高级模式:

Command (m for help): x


e)通过h命令设置head数量,通过s命令设置setor数量,通过c命令设置cylinder数量,这里的cylinder(柱面)使用的值就是上面算出来的值。其中的255,63就是上一步的除数。

Expert command (m for help): h
Number of heads (1-256, default 4): 255

Expert command (m for help): s
Number of sectors (1-63, default 62): 63
Warning: setting sector offset for DOS compatiblity

Expert command (m for help): c
Number of cylinders (1-1048576, default 1011): 239

f)通过r命令回到普通模式,使用n命令创建分区:

Expert command (m for help): r

Command (m for help): n

Command action

e extended

p primary partition (1-4) p

Partition number (1-4): 1

First cylinder (1-15, default 1): 1

Last cylinder or +size or +sizeM or +sizeK (1-15, default 15): 15

g)让分区成为启动分区:

Command (m for help): a Partition number (1-4): 1

h)通过t命令设置分区为FAT32格式的分区:

Command (m for help): t

Selected partition 1 Hex code (type L to list codes): c

Changed system type of partition 1 to c (W95 FAT32 (LBA))

i)通过p命令确认分区情况:
Command (m for help): p

Disk /dev/sdx: 1973 MB, 1973420032 bytes 255 heads, 63 sectors/track, 239 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0xa2b8daf8 Device Boot Start End Blocks Id System /dev/sdx1 * 1 15 120456 c W95 FAT32 (LBA)

j)通过w命令写入分区信息:
Command (m for help): w

The partition table has been altered! Calling ioctl() t re-read partition table.


k)通过mkfs.vfat命令格式化分区:
# mkfs.vfat -F 32 /dev/sdx1 mkfs.vfat 3.0.3 (18 May 2009)

好的,通过一连串的命令后SD卡已经格式化完成了,下一步是将MLO和u-boot.bin拷贝到SD卡中。我上次做Android系统的时候我的Ubuntu上已经有MLO文件和u-boot.bin文件了,所以决定将Android上使用过的MLO和u-boot.bin拷贝进去。 当时主要的想法是这两个文件已经验证是可用的,使用它们可以保证不出其他问题,后来发生的事情证明我犯了一个严重错误。这里正确的做法应该是去QNX官网上通过指定的链接下载MLO和u-boot.bin文件,那个版本才是对的。

我继续记录我错误的做法,虽然是错误的,但是还是成功启动QNX了。


将刚格式化得分区mount进来,拷贝MLO程序和u-boot.bin程序,注意一定要第一个拷贝MLO程序,保证它在0磁道上,BeagleBoard才能启动它:
mount /dev/sdx1 /mnt
cp MLO /mnt cp u-boot.bin /mnt
umount /dev/sdx1


拷贝了MLO文件和u-boot.bin文件后需要做QNX的系统影像文件了。
到QNX官网下载BSP文件,页面链接如下:
http://community.qnx.com/sf/wiki/do/viewPage/projects.bsp/wiki/Bspdown_ti_omap_3730_beagle
注意这个页面就有MLO和u-boot.bin的链接,一块将他们下载下来,后面可以使用

下载的文件是:
2011_July_19th_QNX_650_BEAGLEBOARD_XM_BSP.zip
解压以后在images目录可以找到已经做好的QNX系统影像文件bsp-TI-beagleboard-xm.ifs
将这个bsp-TI-beagleboard-xm.ifs拷贝到刚才格式化的SD卡中(可以直接在windows系统里拷贝,刚才的SD卡分区时FAT32分区,当SD卡插入windows系统是可以认到)

按我的思路,应该可以启动了,将SD卡插入BeagleBoard中,插上5V电源,启动后SD卡旁边的灯长亮,液晶屏没有任何显示。

查了一轮资料,主要是参考的是文档《QNX 6.5.0 and 6.4.1 BSPs for BeagleBoard-xM》,里面提到启动过程需要通过串口发送启动命令才行。

所以我还需要将BeagleBoard和PC通过串口线连接起来,可恶的是我的手提电脑没有串口,于是联系ChipSee买了一个串口转USB的连接器,大家也可以自己去买,但是ChipSee这个他们测试过,应该保险一些。

连接器到货后里面是一个连接线和一个光盘,光盘里有启动程序,安装启动程序后系统将它对应到了com7上。

QNX Momentics环境里有串口显示窗口,选择Windows -> show view -> terminal -> terminal可以显示串口显示窗口。
串口配置如下:
Baud: 115200

Bits: 8

Stop bits: 1

Parity: none

Flow control: none

将串口线插到beagleBoard上,另一头连接USB转串口的连接器上,连接器的U口插入PC上。
BeagleBoard通电启动,从串口显示窗口会出现uboot的启动文字。
uboot启动后在串口显示窗口输入如下命令启动beagleBoard:

fatload mmc 0 0x80100000 bsp-TI-beagleboard-xm.ifs;
go 80100000

成功启动!!!! 提醒各位同学,这里的配置过程有些问题的,有关正确的做法大家请关注我后面的博文。
最后上图,辛苦的结果:
在BeagleBoard上运行QNX系统(一)