vxWorks7.0下基于zynq的boot启动程序

最近工作有点忙,好久没有更新内容,前段时间抽空做了vxWorks7.0下的基于zynq的boot程序,在此做个总结。

vxworks7.0支持三种不同的boot程序:第一种uboot,第二种vxworks6.9.x以上的bootloader,第三种bootapp,关于uboot的创建方法在前面的博文中已经提到过,bootloader6.9的话,因为我不在使用6.9的版本,所以在此也就不做介绍,今天我们来谈一谈vxworks7.0下bootapp的创建方法。

首先,创建VSB工程,在创建VSB工程时一定要选择up类型创建,具体的创建方法,做过vxworks7.0的都会,在这里就不多做介绍了。

其次创建VIP工程,使用-profile PROFILE_BOOTAPP属性创建VIP工程,在VIP工程中添加组件INCLUDE_STANDALONE_DTB,使用嵌入式的vxWorks,让设备树编译到vxWorks中去。切记不能包含组件INCLUDE_PATCH_STANDALONE_DTB

接着增加boot参数的存储配置,如果有独立的基于IO系统的eeprom专门用于存储boot参数,包含组件INCLUDE_BOOTAPP_NVRAM_SUPPORT,设置其属性值:

prj vip parameter set BOOTAPP_GENERIC_NVRAM_NAME \"/eeprom/0\"
prj vip parameter set BOOTAPP_GENERIC_NVRAM_OFFSET 0x0
prj vip parameter set BOOTAPP_GENERIC_NVRAM_SIZE 0x100

其中BOOTAPP_GENERIC_NVRAM_NAME必须是你devs看到的IO系统的flash设备名称。其他参数是flash设备的大小和偏移地址。

在这里我使用的是S25FL265S的QSPIflash,总大小为0x2000000,其中前0x800000为boot和设备的一些配置参数,其余的用于挂接文件系统,存放系统的启动镜像文件,所以在0x800000-0x10000位置存储boot参数,用于设备启动时参数的修改,修改bsp文件

void bootAppSaveBootLine
    (
    char *  buf,    /* source buffer to save */
    int     len     /* length of buffer to save */
    )
    {
#ifdef INCLUDE_BOOTAPP_NVRAM_SUPPORT
    if (bootAppNvSet == 0 || ERROR == bootAppNvSet (buf, len, 0))
        {
        bootAppPrintf("\nNOTE: Saving Bootline to NVRAM failed\n" ,0,0,0,0,0,0);
        }
#else
    if (sysNvRamSet (buf, len, 0) == OK)
       {
       	return;
       }
	bootAppPrintf("\nNOTE: Bootline obtained from DTB and needn't be written"
                  " back\n",0,0,0,0,0,0);
#endif /* INCLUDE_BOOTAPP_NVRAM_SUPPORT */
    }

增加boot启动时的参数获取函数sysNvRamSet(),同时在bootapp工程中增函数

STATUS sysNvRamSet
    (
    char *  string,         /* string to be copied into non-volatile RAM */
    int     strLen,         /* maximum number of bytes to copy           */
    int     offset          /* byte offset into non-volatile RAM         */
    )
{
	STATUS  retVal = ERROR;
	UINT8 * ppbuf[1];
	int     offsetRel = offset + NV_BOOT_OFFSET;
	VXB_DEV_ID pFlashId;
	SPI_FLASH_DEV *     pDrvCtrl    = NULL;

    bootAppPrintf ("enter to nvRam Flashwrite\n", 0, 0, 0, 0, 0, 0);
    if ((offsetRel < 0) || (strLen < 0) ||
        ((offsetRel + strLen) > NV_RAM_SIZE))
    {
        NVRAM_DBG_MSG ("[0x%x,0x%x] is out of range(0x%x)\n",
                       offsetRel, offsetRel + strLen - 1, NV_RAM_SIZE,
                       0, 0, 0);
        return (ERROR);
    }

    pFlashId = vxbDevAcquireByName(NV_RAM_FLASH_NAME,NV_RAM_FLASH_UNIT);
    if(pFlashId == NULL)
    {
    	NVRAM_DBG_MSG ("not find flash dev\n",0, 0 , 0, 0, 0, 0);
    	return (ERROR);
    }
    pDrvCtrl = vxbDevSoftcGet(pFlashId);
    if(!pDrvCtrl)
    {
    	NVRAM_DBG_MSG ("not find flash dev driver\n",0, 0 , 0, 0, 0, 0);
    	return (ERROR);
    }
    //从FLASH中读出参数,进行比较,如果没有变化,直接返回成功
    ppbuf[0] = (UINT8 *) pBlkBuf;
    NVRAM_DBG_MSG ("compare boot param\n",0, 0 , 0, 0, 0, 0);
	if((getFlashReadFun()(pDrvCtrl,offsetRel,strLen,ppbuf[0]) == OK )&& 
			(bcmp ((char *) (pBlkBuf), string, strLen) == 0))
		goto nvRamSetOk;

	NVRAM_DBG_MSG ("start erase boot sector[%d],secsum[%d]\n",offsetRel, 1 , 0, 0, 0, 0);
	if(getFlashSectorEraseFun()(pDrvCtrl,offsetRel,1)!= OK)
	{
		NVRAM_DBG_MSG ("flash erase sector[%08x]failed\n",offsetRel, 0 , 0, 0, 0, 0);
		return ERROR;
	}
    
    /* copy data to buffer and write to Flash */

   bcopy (string, (char *) (pBlkBuf), strLen);
   NVRAM_DBG_MSG ("start write boot param[%s]\n",ppbuf[0], 0 , 0, 0, 0, 0);
   if(getFlashWriteFun()(pDrvCtrl,offsetRel,strLen,ppbuf[0]) != OK)
   {
	   NVRAM_DBG_MSG ("flash erase sector[%08x] context[%s]..failed\n",offsetRel, ppbuf , 0, 0, 0, 0);
	  return ERROR; 
   }
 
nvRamSetOk:
    retVal = OK;
    
    return (retVal);
}

此函数用于设置boot参数到flash位置0x800000-0x10000除,boot参数大小为255,读取boot参数方法也一样,修改下列函数

void bootAppLoadBootLine (void)
    {
#ifdef INCLUDE_BOOTAPP_NVRAM_SUPPORT
    if (bootAppNvGet &&
        (bootAppNvGet ((char *)BOOT_LINE_ADRS, BOOT_LINE_SIZE, 0) == OK) &&
        (*((char *)(BOOT_LINE_ADRS)) != EOS) &&
        (*((char *)(BOOT_LINE_ADRS)) != (char) -1))
        {
        return;
        }
    bootAppPrintf("\nNOTE: load Bootline from NVRAM failed\n" ,0,0,0,0,0,0);
#endif /* INCLUDE_BOOTAPP_NVRAM_SUPPORT */

    if (sysNvRamGet ((char *)BOOT_LINE_ADRS, BOOT_LINE_SIZE, 0) == OK)
    {
    	return;
    }
    if (vxFdtBootargsGet ((char *)BOOT_LINE_ADRS, BOOT_LINE_SIZE) != OK)
        {
#ifndef _WRS_ARCH_IS_SIMULATOR
        strncpy ((char *)BOOT_LINE_ADRS, DEFAULT_BOOT_LINE, BOOT_LINE_SIZE);
#endif /* _WRS_ARCH_IS_SIMULATOR */
        }
    }

在bootapp中增加函数sysNvRamGet()实现

STATUS sysNvRamGet
    (
    char *  string,         /* where to copy non-volatile RAM    */
    int     strLen,         /* maximum number of bytes to copy   */
    int     offset          /* byte offset into non-volatile RAM */
    )
{
	STATUS  retVal = ERROR;
	UINT8 * ppbuf[1];
	int     offsetRel = offset + NV_BOOT_OFFSET; 
	VXB_DEV_ID pFlashId;
	SPI_FLASH_DEV *     pDrvCtrl    = NULL;
	
	bootAppPrintf ("enter to nvRam Flashread\n", 0, 0, 0, 0, 0, 0);
	
	if ((offsetRel < 0) || (strLen < 0) || ((offsetRel + strLen) > NV_RAM_SIZE))
	{
		NVRAM_DBG_MSG ("[0x%x,0x%x] is out of range(0x%x)\n",
						offsetRel, offsetRel + strLen - 1, NV_RAM_SIZE,
						0, 0, 0);
		return (ERROR);
	}
        
	pFlashId = vxbDevAcquireByName(NV_RAM_FLASH_NAME,NV_RAM_FLASH_UNIT);
	if(pFlashId == NULL)
	{
		NVRAM_DBG_MSG ("not find flash dev\n",0, 0 , 0, 0, 0, 0);
		return (ERROR);
	}
	pDrvCtrl = vxbDevSoftcGet(pFlashId);
	if(!pDrvCtrl)
	{
		NVRAM_DBG_MSG ("not find flash dev driver\n",0, 0 , 0, 0, 0, 0);
		return (ERROR);
	}

	if (strLen == 0)
	{
		string [strLen] = EOS;
		return OK;
	}

    ppbuf[0] = (UINT8 *) string;
	
	if(getFlashReadFun()(pDrvCtrl,offsetRel,strLen,ppbuf[0]) == OK)
		retVal = OK;
	
    return (retVal);
}

接下来修改bootapp的内核配置,增加组件

在内核配置中增加组件 INCLUDE_BOOT_FILESYSTEM,INCLUDE_TFFS_TL,INCLUDE_TFFS,INCLUDE_TL_FTL,INCLUDE_TFFS_MOUNT,INCLUDE_MTD_VXBFLASH

修改参数prj vip parameter setstring VXBFLASH_CFG_STR "$spiflash0#0:0x0,0x2000000,0x800000,rfa0",在此32Mflash预留8M用作BOOT和一些系统参数,修改完成后编译,生成vxWorks

生成BOOT.bin,

1、将上面生成的vxworks拷贝到指定文件夹,并重命名为bootapp.elf

2.启动xilinx的sdk,

打开create_boot_image工具

选择输出文件夹,然后点击add,线增加fsbl,然后增加系统bit文件,最后增加bootapp.elf,切记顺序不能出错。

生成BOOT.bin,烧录到flash中,选择从flash启动

至此文件i系统和网络启动正常。

vxWorks7.0系统镜像在启动时,可能从网口加载可以成功,但是从文件系统加载失败,解决办法如下:

打开workbeach4.0,打开工程目录,打开development shell,进入到vxWorks系统镜像目录

输入image-tag tag vxWorks,回车,让vxWorks7.0镜像打上标记,然后传进文件系统启动

启动时可能找不到网口,这时如果启动方式为文件系统启动,boot参数的other选项应该配置为gem0如下所示:

不过因为这种启动方式使用的是嵌入式的设备树,所以系统镜像比较大,这是这种启动方式的唯一缺点,可根据自己的需要选择相应的boot方式。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
VxWorks 7.0是一款嵌入式实时操作系统,在安装之前,我们需要准备以下几个步骤: 1. 下载VxWorks 7.0安装程序:可以从官方网站下载VxWorks 7.0的安装程序。 2. 解压安装程序:将下载的安装程序解压到一个合适的文件夹中,确保所有文件都能够正确解压。 3. 安装所需软件:在安装VxWorks 7.0之前,需要确保已经安装了以下软件和工具:Eclipse IDE(用于开发VxWorks的应用程序)、Tornado IDE(用于开发VxWorks的内核程序)、GNU工具(用于编译和链接应用程序和内核程序)。 4. 配置环境变量:将VxWorks相关文件夹的路径添加到系统的环境变量中,以确保系统能够正确识别VxWorks的命令和工具。 5. 启动安装程序:运行VxWorks 7.0的安装程序,并按照提示完成安装过程。在安装过程中,可以选择安装默认路径或者自定义路径。 6. 配置开发环境:安装完成后,需要配置VxWorks的开发环境。首先,打开Eclipse IDE或Tornado IDE,然后选择VxWorks 7.0的安装路径作为开发环境的根路径。接下来,根据需要配置其他相关的开发环境参数,例如编译器和链接器的路径。 7. 创建项目:在开发环境中,创建一个新的VxWorks项目或导入已有的项目。选择合适的目标硬件和软件平台,并配置项目的相关参数。 8. 开发应用程序:在创建或导入项目后,可以开始开发VxWorks的应用程序。使用Eclipse IDE或Tornado IDE提供的工具和功能,进行应用程序的编写、调试和测试。 9. 构建和烧录软件:完成开发和调试之后,可以使用GNU工具进行应用程序的编译和链接。最后,将编译生成的可执行文件烧录到目标硬件上运行。 以上就是VxWorks 7.0的安装教程,希望对你有所帮助。请注意在安装过程中遵循官方文档和指南,并根据具体的需求进行相应的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值