上一章我们谈了谈qspi驱动程序的挂接流程,下面再谈谈qspi文件系统的挂接及驱动调试,我们知道qspi驱动最终为三个函数实现:
1、vxbSpiFlashRead,2、vxbSpiFlashWrite,3、vxbSpiFlashErase,分别对应flash读,写和扇区擦除命令,对于zedboard开发板而言,编写测试代码测试驱动程序,代码如下
void s25Fl256sReadDataTest(int secAddr)
{
UINT8 cmd = SPI_RDSR_CMD;
VXB_DEV_ID pFlash;
SPI_FLASH_DEV *pDrvCtrl;
UINT8 tmpBuf[256];
int i = 0;
memset(tmpBuf, 0,sizeof(tmpBuf));
pFlash = findVxbDevNodetId(&vxbRoot,SPI_FLASH_NAME);
pDrvCtrl = (SPI_FLASH_DEV *)vxbDevSoftcGet(pFlash);
spiFlashDataRead(pDrvCtrl,secAddr,sizeof(tmpBuf),tmpBuf);
for(i = 0; i < sizeof(tmpBuf);i++)
{
if(i%16 == 0)
printf("\n");
printf("%02x ",tmpBuf[i]);
}
}
写flash测试代码:
void s25Fl256sWriteDataTest(int secAddr)
{
UINT8 cmd = SPI_RDSR_CMD;
UINT8 jedecId[2];
VXB_DEV_ID pFlash;
SPI_FLASH_DEV *pDrvCtrl;
UINT8 tmpBuf[256];
/*页大小为256个字节,按页大小写测试*/
int i = 0;
for(i = 0; i < sizeof(tmpBuf);i++)
tmpBuf[i] = i;
memset(jedecId, 0,sizeof(jedecId));
pFlash = findVxbDevNodetId(&vxbRoot,SPI_FLASH_NAME);
pDrvCtrl = (SPI_FLASH_DEV *)vxbDevSoftcGet(pFlash);
spiFlashDataWrite(pDrvCtrl,secAddr,sizeof(tmpBuf),tmpBuf);
}
flash扇区擦除代码
void s25Fl256sSectorEraseTest(int startAddr,int numOfErasableBlocks)
{
VXB_DEV_ID pFlash;
SPI_FLASH_DEV *pDrvCtrl;
pFlash = findVxbDevNodetId(&vxbRoot,SPI_FLASH_NAME);
pDrvCtrl = (SPI_FLASH_DEV *)vxbDevSoftcGet(pFlash);
if(spiFlashSectorErase(pDrvCtrl,startAddr,numOfErasableBlocks)==ERROR)
printf("sector erase failed.......\n");
}
经测试发现flash可以正常芯片擦除,正常写,但是读数据总是少几个字节,而且不能扇区擦除,需要更改为3字节地址读写,设备树配置如下:
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>;
};
};
这样就可以正常擦除扇区了,但是读数据总时少几个字节,查看代码需要修改spiAttach函数,
pDrvCtrl->readCmd = SPI_FAST_READ_CMD;
pDrvCtrl->readNbits = 1;
pDrvCtrl->readDummy = 8;
if ((pDrvCtrl->hd.chipNum == 1) ||
((pDrvCtrl->hd.mode & SPI_PARALLEL) != 0))
{
switch (pDrvCtrl->hd.dataLines)
{
case 2:
if (pDrvCtrl->hd.mode & SPI_READ_11X)
{
pDrvCtrl->readCmd = SPI_DUALIO_RD_CMD;
pDrvCtrl->readDummy = 4;
}
else
{
pDrvCtrl->readCmd = SPI_DUALIO_HPRD_CMD;
pDrvCtrl->readDummy = 8;
}
pDrvCtrl->readNbits = 2;
break;
case 4:
if (pDrvCtrl->hd.mode & SPI_READ_11X)
{
pDrvCtrl->readCmd = SPI_QUADIO_RD_CMD;
pDrvCtrl->readDummy = 2;
}
else
{
pDrvCtrl->readDummy = 6;
pDrvCtrl->readCmd = SPI_QUADIO_HPRD_CMD;
}
pDrvCtrl->readNbits = 4;
break;
default:
break;
}
}
更改 pDrvCtrl->readDummy = 6;
测试发现可以正常读写,扇区擦除了,然后挂接文件系统,sysTffsFormat 0 usrTffsConfig 0,0,"/tffs0"
然后DEVS查看设备,/tffs0出现在设备列表中,最后格式化成你自己想用的文件系统
至此,qspi文件系统挂接正常,文件传输正常