基于VxWorks7.0的S25FL256s与zynq驱动及文件系统挂接

       好久没有更新博客,只因最近工作比较忙,今天抽点时间写一下在zedboard平台上挂接文件系统,块设备为S25FL256s,共计32M的flash,flash划分为两部分,0x0---0x1000000,前16M用于存储系统uboot和系统的相关参数,0x1000000---0x2000000为truetffs文件系统,其配置如下:

第一步:在VIP里面增加组件DRV_QSPI_FDT_ZYNQ7K,DRV_SPI_FLASH,INCLUDE_TFFS,INCLUDE_TL_FTL,INCLUDE_TFFS_MOUNT,INCLUDE_TFFS_STUB_VXBFLASH,INCLUDE_MTD_VXBFLASH

第二步:flash预留配置,VXBFLASH_CFG_STR "$spflspilash0#0:0x0,0x1000000,0x100000,rfa0"

第三步:调试驱动,由于zynq系列只能支持3字节地址操作,最大支持16M大小flash操作,而本次系统设计的flash为32M flash,如果要四字节操作,必须使用bank寄存器,首先在设备树配置如下:

  qspi0: qspi@e000d000 
            {
	            #address-cells = <1>;
	            #size-cells = <0>;
	            compatible = "xlnx,zynq7k-qspi";
	            reg = <0xE000D000 0x100>,
	                  <0xF8000000 0x800>;
	            interrupts = <51>; 
	            interrupt-parent = <&intc>;
	           spiflash@0
		        {
			        compatible = "spflspilash";
			        reg = <0>;
			        data-lines = <4>;
			        chip-number = <1>;
			        addr-mode = <1>;
			        spi-max-frequency = <100000000>;
		        };
            };

 addr-mode=1,为三字节地址操作模式,必须修改bank寄存器,所以相关的驱动必须做修改,我在前期调试时,也是由于没有注意到这点,导致flash写0地址时0x1000000地址也被修改,如下时代码:

STATUS spiFlashDataWrite
    (
    SPI_FLASH_DEV * pDrvCtrl,
    UINT32          startAddr,
    UINT32          dataLen,
    UINT8 *         dataBuf
    )
    {
    UINT32  bytesToWrite;
    UINT32  writeCmdLen;
    UINT8   writeCmdOpcode;
    UINT32  windowSize;
    UINT8 * pBuf;
    UINT32  optAddr;
    UINT32  addrDiv;
    STATUS  rc      = OK;
    UINT8   status  = 0;
    UINT8   value = 0;
    
    if ((pDrvCtrl->hd.mode & SPI_PARALLEL) != 0)
        {
        addrDiv = pDrvCtrl->hd.chipNum;
        }
    else
        {
        addrDiv = 1;
        }

    writeCmdLen     = pDrvCtrl->addrWidth + 1;
    writeCmdOpcode  = SPI_PP_CMD;
    pBuf            = pDrvCtrl->pWrBuf;

    if ((pDrvCtrl->specialInfo != NULL) &&
        (pDrvCtrl->specialInfo->flag & SPI_MASTER_TRANS_LIMIT))
        {
        windowSize = pDrvCtrl->specialInfo->windowSize;
        }
    else
        {
        windowSize = 0;
        }
    //驱动中增加对大于32Mflash的支持,因为zynq不支持大于16Mfalsh的命令,如果大于16M,需要使用bank寄存器,朱红博于2020年10月19日
      if(pDrvCtrl->addrMode == 1)
      {
      	value |= startAddr >>24;
      	spiFlashWriteReg(pDrvCtrl,SPI_WBNK_CMD,value);
      }
    if (spiFlashWaitReady (pDrvCtrl) != OK)
        {
        return ERROR;
        }

    /* clear the Write Enable Latch (WEL) bit to 0 */

    if (spiFlashReadSR(pDrvCtrl, &status) == OK)
        {
        if ((status & SR_WEL) != 0)
            {
            status &= (UINT8)(~(SR_WEL));
            if (spiFlashWriteReg (pDrvCtrl, SPI_WRSR_CMD, status) != OK)
                {
                return ERROR;
                }
            }
        }
    else
        {
        return ERROR;
        }

    /* data must be written in "page Size" chunks */

    do
        {
        optAddr = startAddr / addrDiv;

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VxWorks 7.0是一种实时操作系统,用于嵌入式系统开发。移植VxWorks 7.0系统需要进行以下几个步骤。 首先,了解目标硬件平台的特性和要求。了解处理器类型、主频、内存大小等硬件相关信息,以便进行正确的系统移植。 其次,准备适用于目标硬件平台的系统镜像文件。根据硬件平台的要求,选择适当的编译器和工具链,并设置好相关的环境变量。使用VxWorks 7.0提供的交叉编译工具,将操作系统的源代码编译成可执行的二进制文件。 然后,根据目标硬件平台的启动方式,进行系统启动的配置。配置引导程序、启动参数以及设备驱动等相关设置,确保系统能够正确地加载和运行。 接下来,进行硬件驱动的移植。根据硬件平台的特性,移植或编写相应的设备驱动程序,以便操作系统可以正确地与外设进行通信。这包括控制设备的初始化、读写操作以及中断处理等。 最后,进行系统测试和调试。在完成移植后,需要进行全面的功能测试和性能测试,确保系统在目标硬件平台上运行稳定且符合预期的性能要求。在测试和调试过程中,需要使用调试工具和技术,以便定位和解决各种问题。 总之,VxWorks 7.0系统移植是一个需要具备嵌入式系统开发和硬件知识的复杂任务。通过深入了解目标硬件平台的特性和要求,并进行适当的配置、编译和测试工作,可以成功地进行系统移植,并确保系统在新的硬件平台上正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值