在BeagleBoard上运行QNX系统(二)

 

在BeagelBoard上成功运行QNX系统后,本以为可以很快开始进一步的学习,没想到遇到麻烦的问题。又经过几天的努力才把问题弄清楚,下面继续记录折腾过程。

 

第一次成功地在BeagleBoard上运行QNX系统后首先注意到的问题是QNX系统不能够自动启动,需要在串口上运行装载ifs文件的命令才能启动。针对这个问题,需要研究一下u-boot如何自动装载系统影像文件。

 

发现的第二个问题更严重一些,就是QNX系统在BeagleBoard上启动后不能成功启动网络接口,无法获取网络地址。如之前的博文提到,QNX Momentics是同过qconn ip进行调试的,如果目标板上不能获取IP地址,就无法进行其它程序的调试。

 

 

对于第一个问题的相关解决方案有三个,都是从网上找到的。

其中一个解决方案是再u-boot启动后可以通过u-boot命令设置配置信息,然后保存配置信息,再次启动时u-boot会使用所保存的配置信息。

还有一个解决方案是u-boot会从一个叫uEnv.txt的文件中读取配置信息,可以在uEnv.txt文件中加入装载信息

另一个解决方案提到u-boot会运行boot.scr文件,可以在boot.scr文件中加入装载命令。

 

第一个解决方案很快被证实无效,该方案主要是在u-boot启动后使用setenv命令设置配置信息,然后通过saveenv命令保存配置信息。我测试发现运行到saveenv时BeagleBoard就死机了。后来查资料发现BeagleBoard上没有NAND Flash,运行命令saveenv会导致BeagleBoard挂起。

 

第二个解决方案是从QNX网站上找的:

http://community.qnx.com/sf/go/projects.bsp/discussion.bsp.topc20393

做法是在SD卡的启动分区里新建一个uEnv.txt文件,文件中加入下面代码:

nandboot=echo Booting QNX ...;fatload mmc 0 0x80100000 bsp-TI-omap3730-Beagle-xm.ifs;go 0x80100000
我测试了一下,测试失败,我的BeagleBoard上的u-boot启动后并没有从uEnv.txt上读取信息。

 

 

第二个解决方案是做一个boot.scr文件处理,刚开始我很天真地认为用个文本编辑器修改一下Android版本的boot.scr就可以了,测试失败。后来发现boot.scr是通过mkimage命令生成的,下面链接有说明。

http://groups.google.com/group/beagleboard/browse_thread/thread/e97fb9895c09a98c

基本做法就是在Linux(我还是使用Ubuntu)上使用mkimage命令把一个文本文件转换成目标系统的boot.scr文件,文本文件中可以加入希望执行的命令。

我将生成的boot.scr文件放入SD卡启动分区中,u-boot启动时确实运行了boot.scr中的命令,但是报错,说我的ifs文件是“Invalid FAT entry”,就是说我的ifs文件格式不对。

 

 

 

对第一个问题再也没有办法后开始想办法处理第二个问题,有关网络接口的问题。

在网上找了一轮以后发现BeagleBoard Rev C版缺省状态下是不对USB HUB加电的,需要修改BSP,网上专门有一篇文章讲述,为了同学们方便,将原文转载如下:

My solution to enable USB Hub which is disabled at boot time in Rev-C board
---------------------------------------------------------------------------
Using Momentics IDE 4.7.0 with the QNX BSP imported as described in "QNX 6.5.0 and 6.4.1 BSPs for BeagleBoard-xM Quick Start Guide" Issue 1 February, 2011


1. Edit the file: /bsp-TI-omap3730-Beagle-xm-src/src/hardware/devb/mmcsd/arm/beagle.le.v7/sim_bs.c
2. Add  the function (see below) beagle_USB_rev_c_turn_on() to this file, just after the definition of function twl4030_i2c_write(…)
3. You need to call this new function at an appropriate time. So go to the function bs_init(…) and add the new function as shown here:

   . . .
   . . .
    EXISTING CODE...
    // use GPIO_DEBEN1 reg to enable debouncing on GPIO0 for the beagle
    if (twl4030_i2c_write(beagle->fd, 0x49, 0xa7, 0x00))
    {
        slogf(_SLOGC_SIM_MMC, _SLOG_ERROR, "BEAGLE MMCSD: unable to enable debouncing");
        return MMC_FAILURE;
    }
   ADD NEW CODE AS BELOW...
    // Turn on Beagleboard Revision-C USB Hub
    if ( beagle_USB_rev_c_turn_on(beagle->fd) == MMC_FAILURE )
{  slogf(_SLOGC_SIM_MMC, _SLOG_ERROR, "OMAP3 MMCSD: fail on beagle_USB_rev_c_turn_on() for USB Hub");
   return MMC_FAILURE;
}
   . . .
   . . .
4. Rebuild the BSP as per the instructions in the Quick Start Guide
5. Copy the .ifs file to your SD card as usual.
6. Boot up. A green LED, D14, indicates that power is applied to the HUB circuitry.
------------------------------------------

/* 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;
}
--------------------------------------------------------------------------

这里提到的主要工作就是修改文件/bsp-TI-omap3730-Beagle-xm-src/src/hardware/devb/mmcsd/arm/beagle.le.v7/sim_bs.c
然后重新编译QNX系统。

同学们照着样例修改就可以,过程中需要仔细一点。主要要做的是增加一个beagle_USB_rev_c_turn_on方法,该方法的实现在该段说明的最后部分,注意方法前还有几个#define不要漏掉了。 增加了beagle_USB_rev_c_turn_on方法后就在bs_init方法中增加对方法beagle_USB_rev_c_turn_on的调用。

 

重新编译后在bsp-TI-omap3730-Beagle-xm-src项目的images目录中生成了文件ifs-omap3730-beagle.bin。

我将这个文件拷贝到SD卡的启动分区中,启动BeagleBoard,准备通过下面的uboot命令启动QNX:

fatload mmc 0 0x80100000 ifs-omap3730-beagle.bin;go 0x80100000

 

没想到uboot又报Invalid FAT entry错误。(这时我要接近崩溃了。。。。)

 

峰回路转也就是在这里,有资料说老版本的uboot会有“Invalid FAT entry”的问题,这时想到我的MLO和u-boot.bin是从Android系统里拷贝的,可能会是老版本。

于是老老实实从QNX官网指定的地方下载了MLO和U-BOOT.BIN,方便大家,链接如下:

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

 

重新格式化SD卡(为什么要重新格式化SD卡?因为资料提到MLO必须是第一个拷贝到SD卡启动分区的)。

将新下载的MLO和U-BOOT.BIN拷贝到SD卡启动分区上,顺便将uEnv.txt文件也拷贝上去了,修改了一下uEnv.txt,指定启动ifs-omap3730-beagle.bin文件。

 

上电后相当激动呀!!!!!!!

QNX系统自动启动,不需要串口输入uboot命令(解决了第一个问题)

QNX系统成功获取IP地址(解决了第二个问题)

还意外地发现QNX系统还启动了一个OpenGL样例

 

最后上图:

在BeagleBoard上运行QNX系统(二)_第1张图片

你可能感兴趣的:(在BeagleBoard上运行QNX系统(二))