为了让同学们更好地了解在BeagleBoard上运行QNX系统的方法,我将前几天的工作总结了一下。
需要完成的主要步骤如下:
1. BeagleBoard的准备:
首先是准备好BeagleBoard和周边的设备。
我个人使用的是BeagleBoard XM Rev C,然后再加Chipsee 的BeagleBoard XM 扩展板。如果同学们使用的是BeagleBoard XM Rev B或之前的版本,基本步骤都差不多,就是USB HUB加电那一步跳过。如果同学们没有购买BeagleBoard XM 扩展板,需要通过HDMI线将BeagleBoard连接到一个支持HDMI的显示器上。
我使用的周边设备有:5V电源,串口转USB线一条,网线一条。没使用HDMI线,因为BeagleBoard XM 扩展板支持QNX屏幕显示功能,不需要通过HDMI输出到屏幕上。我在运行QNX系统之前先运行了测试SD卡上的由ChipSee做好的WinCE系统,确认电源,串口输出和网络接口都没有问题。
2. 准备SD卡
准备一张2G或者4G的SD卡,将这个SD卡清空,然后在上面创建一个FAT32格式的分区,设置成启动分区。
我自己是在Ubuntu上完成以上工作的,具体步骤如下:
2.1. 清空SD卡:
dd if=/dev/zero of=/dev/sdx bs=1M count=1
2.2. 启动fdisk应用在SD卡上创建分区:
fdisk /dev/sdx
Command (m for help): x
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
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
2.3. 设置分区为启动分区:
Command (m for help): a Partition number (1-4): 1
2.4. 设置分区为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))
2.5. 将分区信息写入SD卡
Command (m for help): w
The partition table has been altered!
2.6. 格式化SD卡的启动分区:
# mkfs.vfat -F 32 /dev/sdx1 mkfs.vfat 3.0.3
对于以上步骤如果有不清楚地地方请参考一下链接:
http://community.qnx.com/sf/wiki/do/viewPage/projects.bsp/wiki/AM_OMAP_boot_resources
3. 准备MLO和U-BOOT.BIN
在QNX官网指定的地址下载MLO程序和U-Boot.bin程序,链接地址如下:
http://community.qnx.com/sf/wiki/do/viewPage/projects.bsp/wiki/Bspdown_ti_omap_3730_beagle
打开页面后找到下面这段文字,点击MLO链接和U-BOOT.BIN链接下载MLO和U-BOOT.BIN
Bootloader modules
Click on the links to download MLO and U-BOOT.BIN
下载MLO和U-BOOT.BIN后,将这两个文件拷贝到Linux系统(我使用的是Ubuntu)上。
在Linux上mount刚才格式化好的SD启动分区。
然后将MLO文件和U-BOOT.BIN拷贝到SD卡的启动分区上,注意一定要先拷贝MLO文件。
到这一步以后可以进行阶段性测试:
将准备好的SD卡插入BeagleBoard的SD卡槽中。
连接PC 和 BeagleBoard的串口(我是使用的串口转USB线)。
上电启动BeagleBoard。
如果以上步骤没有问题的话,串口监控窗口应该出现uboot启动的信息,类似于:
Texas Instruments X-Loader 1.5.0 (Mar 27 2011 - 17:37:56)
Beagle xM
Reading boot sector
Loading u-boot.bin from mmc
........
OMAP3 beagleboard.org #
如果对于串口调试窗口配置有问题,可以参考下文第5步有关QNX Momentics Terminal窗口配置部分
如果这一步测试失败,应该检查之前的步骤,看是否在格式化SD卡或者是拷贝文件时出现问题。
4.准备QNX的系统影像文件
从以下链接下载QNX for BeagleBoard的BSP文件http://community.qnx.com/sf/wiki/do/viewPage/projects.bsp/wiki/Bspdown_ti_omap_3730_beagle
启动QNX Momentics开发环境,按以下步骤导入BSP文件:
选择 File - Import
展开QNX .
选择 QNX Source Package and BSP 并点击Next.
在Select a method to import source package 对话框选择Import from local archive file,然后找到刚才下载的BSP文件.
选择需要导入的BSP .
点击 Next.
选择一个 working set,缺省有填好working set,可以不做修改
点击 Finish.
导入后选择项目“bsp-TI-omap3730-Beagle-xm-src”,点击右键,选择“Build Project”,然后在images目录下可以找到新生成的文件ifs-omap3730-beagle.bin,注意文件的修改日期,如果文件的修改日期不是你操作是的当前时间,应该编译不成功,需要检查QNX Momentics的problem窗口。
制作了QNX系统影像文件后,将ifs-omap3730-beagle.bin文件拷贝到SD卡启动分区中。
5. 准备串口调试窗口
在QNX Momentics中选择“windows -> show view -> others”然后选择“Terminal -> terminal”。
在出现的“Terminal”窗口点击“setting”图标,将connection type选为serial (就是串口的意思)
其它参数按以下信息配置:
Baud: 115200
Bits: 8
Stop bits: 1
Parity: none
Flow control: none
6. 测试手动启动QNX系统
确认ifs-omap3730-beagle.bin文件已经拷贝到SD卡的启动分区中,将SD卡插入BeagleBoard,连接BeagleBoard和PC的串口,在QNX Momentics的terminal窗口点击“connect”图标。
给BeagleBoard上电启动,在QNX Momentics的terminal窗口应该可以看见uboot启动的信息,在出现uboot提示符:OMAP3 beagleboard.org # 后在terminal窗口输入如下命令装载QNX系统:
fatload mmc 0 0x80100000 ifs-omap3730-beagle.bin; go 80100000
BeagleBoard会加载QNX系统,最后显示QNX桌面和一组转动的齿轮。
7. 配置自动启动QNX系统
新建一个uEnv.txt文档,写入以下信息:
nandboot=echo Booting QNX ...;fatload mmc 0 0x80100000 ifs-omap3730-beagle.bin;go 0x80100000
保存后将这个uEnv.txt拷贝到SD卡的启动分区中。
8. 修改QNX BSP文件使它支持网络接口。
通过以上方法启动QNX系统后,它不能识别BeagleBoard的网络接口,原因是BeagleBoard XM Rev C 在启动时不给USB HUB加电。
这个需要通过修改BSP文件进行调整。
在QNX Momentics环境中找到以下文件并打开:
/bsp-TI-omap3730-Beagle-xm-src/src/hardware/devb/mmcsd/arm/beagle.le.v7/sim_bs.c
在twl4030_i2c_write方法后加入一个beagle_USB_rev_c_turn_on() 方法
方法代码如下:
/* USB Hub Enable Definitions */
/* I2C Addressing */
#define ADDRESS_GROUP_ID3 0x4A
#define LEDEN_PHYSICAL_ADDRESS 0xEE
/* LEDEN Register bit definitions */
#define LEDAON 0x01 /* LEDA Enable */
#define LEDAPWM 0x10 /* LEDA PWM Enable */
/* Parameter: i2c_fd - file handle to i2c */
static int beagle_USB_rev_c_turn_on(int i2c_fd)
{
uint8_t i2c_val;
/* printf("\n\rTurn on USB Hub\n\r"); */
/* get the existing register value that includes Hub control bits */
if ( twl4030_i2c_read( i2c_fd, ADDRESS_GROUP_ID3,LEDEN_PHYSICAL_ADDRESS, &i2c_val) == -1)
return MMC_FAILURE;
/* printf("\n\rExisting Reg value = %d\n\r", i2c_val ); */
/* Set the appropriate bits to enable the Hub */
if ( twl4030_i2c_write( i2c_fd, ADDRESS_GROUP_ID3,LEDEN_PHYSICAL_ADDRESS,i2c_val |LEDAON |LEDAPWM ) == -1)
return MMC_FAILURE;
/* Let's check the updated register value */
/* twl4030_i2c_read(beagle->fd, 0x4A,0xEE, &i2c_val); */
/* printf("\n\r New Reg value = %d\n\r", i2c_val ); */
return MMC_SUCCESS;
}
然后修改function bs_init(…) 方法,加入beagle_USB_rev_c_turn_on方法的调用:
//原来的代码...
. . .
<wbr><wbr> . . .<br><wbr><wbr><wbr> EXISTING CODE...<br><wbr><wbr><wbr> // use GPIO_DEBEN1 reg to enable debouncing on GPIO0 for the beagle<br><wbr><wbr><wbr> if (twl4030_i2c_write(beagle->fd, 0x49, 0xa7, 0x00))<br><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> slogf(_SLOGC_SIM_MMC, _SLOG_ERROR, "BEAGLE MMCSD: unable to enable debouncing");<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return MMC_FAILURE;<br><wbr><wbr><wbr> }<br><wbr><wbr> ADD NEW CODE AS BELOW...<br><wbr><wbr><wbr> // Turn on Beagleboard Revision-C USB Hub<br><wbr><wbr><wbr> if ( beagle_USB_rev_c_turn_on(beagle->fd) == MMC_FAILURE )<br> {<wbr> slogf(_SLOGC_SIM_MMC, _SLOG_ERROR, "OMAP3 MMCSD: fail on beagle_USB_rev_c_turn_on() for USB Hub");<br><wbr><wbr> return MMC_FAILURE;<br> }<br><wbr><wbr> . . .<br><wbr><wbr> . . .<br><br> 修改后保存文件,重新编译项目,将新生成的ifs-omap3730-beagle.bin文件拷贝到SD卡启动分区中。 <br> 在BeagleBoard上插入网线,网线另一端插入一个支持DHCP的路由器,给BeagleBoard上电启动,可以看到板上D14灯会亮,系统认到网卡,获取到IP地址。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>