📄 msd_fn_scsi.c
字号:
otgfun_residue = cbw.dxfer_length-otgactualXfer_len;
//printf("\r\n residue=%lx \n",otgfun_residue);
//printf("xferlen=%lx \n",cbw.dxfer_length);
//databuf=(unsigned char*)usbMass_Data_Buffer_Addr;//UsbDeviceDataBuf;
databuf=BASEADR_SDRAM_USB_DEV_BUF;//0x200000;
//--------------add data read from device here-------------------------------------------
//cut them into a lot of 4K buffers
//printf("\r\n tmpactXfer1=%x", (__u16)(tmpactXfer>>16));
//printf(",%x",(__u16)(tmpactXfer));
while (tmpactXfer)/*While Looping_Free:<Exit counter added>*/
{
if (tmpactXfer>USB_BUFSIZE)
{
XferSize=USB_BUFSIZE;
}
else
{
XferSize=tmpactXfer;
}
switch(gu8LunMapping[cbw.max_lun])
{
#if ENABLE_SD_MS_XD_MULTISLOT
case(eSD_MS_XD):
_u8DriveNo = Dev_CARD;
CRSts=msAPI_MassStorage_Read(block_num, XferSize/0x200, databuf);
break;
#else
#endif
#if ENABLE_CF
case(eCF):
_u8DriveNo = Dev_CF;
CRSts=msAPI_MassStorage_Read(block_num, XferSize/0x200, databuf);
break;
#endif
#if ENABLE_NAND
case(eNAND):
CRSts=nand_disk_read(NULL,databuf,XferSize/0x200,block_num);//read NAND data
break;
#endif
#if ENABLE_NOR_DEBUG
case(eNOR):
CRSts=MDrv_Nor_FS_Read(block_num, XferSize/0x200, databuf);
break;
#endif
}
/*
if (cbw.max_lun==CARD_MODE)
{
//printf("\r\n Read from SD Start",0);
//CRSts=msAPI_MSD_Read(NULL, block_num, XferSize/0x200, (__u16)databuf+USB_TTX_FIX_XDATA_ADDR);
CRSts=msAPI_MassStorage_Read(block_num, XferSize/0x200, databuf);
//printf("\r\n Read from SD End",0);
}
#ifdef SUPPORT_NAND_DISK
if (cbw.max_lun==NAND_MODE)
{
CRSts=nand_disk_read(NULL,databuf,XferSize/0x200,block_num);//read NAND data
}
#endif
*/
//printf("\r\n TX_DMA Start=%x",(__u16)(XferSize>>16));
//printf(",%x",(__u16)(XferSize));
GetPartHeaderTransfer=1;
//status=SDRAM2USB_Bulk((__u16)databuf+USB_TTX_FIX_XDATA_ADDR,XferSize);
status=SDRAM2USB_Bulk(databuf,XferSize);
GetPartHeaderTransfer=0;
if(!usbConnectFlag)
return status;
//status=SDRAM2USB_Bulk((__u32)databuf,XferSize); //transfer data by xdata memory
//printf("\r\n TX_DMA End",0);
block_num+=XferSize/0x200;
tmpactXfer-=XferSize;
//printf("\r\n tmpactXfer2=%x", (__u16)(tmpactXfer>>16));
//printf(",%x",(__u16)(tmpactXfer));
}
//if (CRSts!=0)
//printf("\r\n RD10_CRSts:%bx ",CRSts);
#ifdef SUPPORT_NAND_DISK
if (cbw.max_lun==NAND_MODE)
{
if (CRSts!=0)
status=USB_ST_NORESPONSE;
}
#endif
return status;
}
extern void MDrv_Timer_Delayms(U32 u32DelayTime);
__u8 FnWt10_Command(MSDFN_BOT_CBW_STRU cbw)
{
__s8 status=0,CRSts=0;
__u16 nblocks;
__u32 block_num,XferSize,tmpactXfer;
//unsigned char *databuf;
__u32 databuf;
if (cbw.cmd_bytes[0] & 0x20)
{
*((__u8 *)&block_num+0)=cbw.cmd_bytes[2];
*((__u8 *)&block_num+1)=cbw.cmd_bytes[3];
*((__u8 *)&block_num+2)=cbw.cmd_bytes[4];
*((__u8 *)&block_num+3)=cbw.cmd_bytes[5];
*((__u8 *)&nblocks+0)=cbw.cmd_bytes[7];
*((__u8 *)&nblocks+1)=cbw.cmd_bytes[8];
}
//printf("\r\n write command",0);
otgactualXfer_len = (__u32)nblocks * SCSI_BLOCK_SIZE;
tmpactXfer = otgactualXfer_len; //wayne add
otgdataXfer_dir = DATA_OUT;
if (cbw.dxfer_length < otgactualXfer_len)
otgfun_residue = -1;
else
otgfun_residue = cbw.dxfer_length-otgactualXfer_len;
//databuf= (unsigned char*)usbMass_Data_Buffer_Addr;//UsbDeviceDataBuf;
databuf=BASEADR_SDRAM_USB_DEV_BUF;//0x200000;
//printf("\r\n Tlen=%lx",tmpactXfer);
while (tmpactXfer)/*While Looping_Free:<Exit counter added>*/
{
if (tmpactXfer>USB_BUFSIZE)
XferSize=USB_BUFSIZE;
else
XferSize=tmpactXfer;
//printf("\r\n RX_DMA Start=%lx",XferSize);
GetPartHeaderTransfer=1;
//status = USB2SDRAM_Bulk_MassStorage((__u16)databuf+USB_TTX_FIX_XDATA_ADDR,XferSize);
status = USB2SDRAM_Bulk_MassStorage(databuf,XferSize);
GetPartHeaderTransfer=0;
//printf("\r\n RX_DMA End",0);
//printf("\r\n BulkOut_status:%x ",statuse);
//printf(" ,XferSize:%x",XferSiz);
switch(gu8LunMapping[cbw.max_lun])
{
#if ENABLE_SD_MS_XD_MULTISLOT
case(eSD_MS_XD):
_u8DriveNo = Dev_CARD;
CRSts=msAPI_MassStorage_Write(NULL,block_num, XferSize/0x200, databuf);
break;
#else
#endif
#if ENABLE_CF
case(eCF):
_u8DriveNo = Dev_CF;
CRSts=msAPI_MassStorage_Write(NULL,block_num, XferSize/0x200, databuf);
break;
#endif
#if ENABLE_NAND
case(eNAND):
CRSts = nand_disk_write(NULL,databuf,XferSize/0x200,block_num);//write data to NAND
break;
#endif
#if ENABLE_NOR_DEBUG
case(eNOR):
CRSts = MDrv_Nor_FS_Write(block_num, XferSize/0x200, databuf);
break;
#endif
}
/*
if (cbw.max_lun==CARD_MODE)
{
//printf("\r\n Write to SD Start",0);
//msAPI_MassStorage_Write(NULL,block_num, XferSize/0x200, (__u16)databuf+USB_TTX_FIX_XDATA_ADDR);
msAPI_MassStorage_Write(NULL,block_num, XferSize/0x200, databuf);
//printf("\r\n Write to SD End",0);
}
#ifdef SUPPORT_NAND_DISK
if(cbw.max_lun==NAND_MODE)
{
CRSts = nand_disk_write(NULL,databuf,XferSize/0x200,block_num);//write data to NAND
}
#endif
*/
block_num+=XferSize/0x200;
tmpactXfer-=XferSize;
// TEMP DEBUG CODE FOR usb HANG
//MDrv_Timer_Delayms(1);
}
//if (CRSts!=0)
//printf("\r\n WD10_CRSts:%x ",CRSts);
#ifdef SUPPORT_NAND_DISK
if(cbw.max_lun==NAND_MODE)
{
if (CRSts!=0)
status=USB_ST_NORESPONSE;
}
#endif
return status;
}
//#endif
#ifdef SUPPORT_NAND_DISK
__u8 FnNAND_READNANDINFO_Command(MSDFN_BOT_CBW_STRU *cbw)
{
__u8 status;
__u16 XferSize;
__u8 NAND_INFO[6] =
{
0x00,
0x00,
0x00,
0x00,
0x00,
0x00
};
*((__u8 *)&XferSize+0)=cbw->cmd_bytes[8];
*((__u8 *)&XferSize+1)=cbw->cmd_bytes[9];
//--------------add data read from device here-------------------------------------------
//cut them into a lot of 4K buffers
if (gu8LunMapping[cbw->max_lun]==eNAND)
{
MDrv_NAND_ReadNANDInfo(NAND_INFO);//read NAND data
}
status=SDRAM2USB_Bulk((__u32)&NAND_INFO,XferSize); //wayne added
//printf("RDNANDINFO:%bx \n",status);
return status;
}
__u8 FnNAND_ERASEBLOCK_Command(MSDFN_BOT_CBW_STRU *cbw)
{
__u8 status = USB_ST_STALL;
__u32 Flash_Row_Address=0;
__u16 XferSize;
*(((__u8 *)&Flash_Row_Address)+0)=0x00;
*(((__u8 *)&Flash_Row_Address)+1)=cbw->cmd_bytes[1];
*(((__u8 *)&Flash_Row_Address)+2)=cbw->cmd_bytes[2];
*(((__u8 *)&Flash_Row_Address)+3)=cbw->cmd_bytes[3];
*((__u8 *)&XferSize+0)=cbw->cmd_bytes[8];
*((__u8 *)&XferSize+1)=cbw->cmd_bytes[9];
if (MDrv_NAND_EraseBlock(Flash_Row_Address)== true)
status = USB_ST_NOERROR;
return status;
}
__u8 FnNAND_READPHYPAGE_Command(MSDFN_BOT_CBW_STRU *cbw)
{
__u8 status;
__u16 XferSize=0;
__u16 rem=0;
__u32 PhySecAddress;
__u32 databuf;
status = USB_ST_STALL;
*((__u8 *)&PhySecAddress+0)=cbw->cmd_bytes[2];
*((__u8 *)&PhySecAddress+1)=cbw->cmd_bytes[3];
*((__u8 *)&PhySecAddress+2)=cbw->cmd_bytes[4];
*((__u8 *)&PhySecAddress+3)=cbw->cmd_bytes[5];
*((__u8 *)&XferSize+0)=cbw->cmd_bytes[8];
*((__u8 *)&XferSize+1)=cbw->cmd_bytes[9];
//printf("RDNAND XferADDR:%lx \n",PhySecAddress);
//printf("RDNAND XferSize:%x \n",XferSize);
databuf=BASEADR_SDRAM_USB_DEV_BUF;
//--------------add data read from device here-------------------------------------------
//cut them into a lot of 4K buffers
if (gu8LunMapping[cbw->max_lun]==eNAND)
{
MDrv_NAND_ReadPHYPage(PhySecAddress,databuf,XferSize);//read NAND data
}
rem=XferSize % usbEP[1].MaxEPSize;
XferSize=XferSize-rem;
if (XferSize>0)
{
GetPartHeaderTransfer=1;
status=SDRAM2USB_Bulk(databuf,XferSize);
GetPartHeaderTransfer=0;
}
//printf("RDNAND complete1:%bx \n",status);
if (status!=USB_ST_NOERROR)
return status;
if (rem>0)
{
usbSDRAM2SDRAM((databuf+XferSize),(__u32)USB_TTX_FIX_XDATA_ADDR+(__u16)usbMass_Data_Buffer_Addr,rem);
SDRAM2USB_Bulk((__u16)usbMass_Data_Buffer_Addr,rem);
}
return status;
}
__u8 FnNAND_WRITEPHYPAGE_Command(MSDFN_BOT_CBW_STRU *cbw)
{
__u8 status;
__u16 XferSize=0;
__u32 PhySecAddress;
__u32 databuf;
status = USB_ST_STALL;
*((__u8 *)&PhySecAddress+0)=cbw->cmd_bytes[2];
*((__u8 *)&PhySecAddress+1)=cbw->cmd_bytes[3];
*((__u8 *)&PhySecAddress+2)=cbw->cmd_bytes[4];
*((__u8 *)&PhySecAddress+3)=cbw->cmd_bytes[5];
*((__u8 *)&XferSize+0)=cbw->cmd_bytes[8];
*((__u8 *)&XferSize+1)=cbw->cmd_bytes[9];
//printf("WRNAND XferADDR:%lx \n",PhySecAddress);
//printf("WRNAND XferSize:%x \n",XferSize);
databuf=BASEADR_SDRAM_USB_DEV_BUF;
GetPartHeaderTransfer=1;
status=USB2SDRAM_Bulk_MassStorage(databuf,XferSize);
GetPartHeaderTransfer=0;
if (gu8LunMapping[cbw->max_lun]==eNAND)
{
MDrv_NAND_WritePHYPage(PhySecAddress,databuf,XferSize,cbw->cmd_bytes[7]);//write NAND data
}
return status;
}
__u8 FnNAND_WRITERDD_Command(MSDFN_BOT_CBW_STRU *cbw)
{
__u8 status;
__u16 XferSize=0;
__u32 databuf;
*((__u8 *)&XferSize+0)=cbw->cmd_bytes[8];
*((__u8 *)&XferSize+1)=cbw->cmd_bytes[9];
databuf=(__u16)usbMass_Data_Buffer_Addr;
usbSet_ClrRXMode1();
status=USB2SDRAM_Bulk(databuf,XferSize);
if (gu8LunMapping[cbw->max_lun]==eNAND)
{
MDrv_NAND_WriteRDD((__u8 xdata *)databuf,XferSize);//write NAND RDD data
}
return 0;//status;
}
__u8 FnNAND_EJECT_INSERT_Command(MSDFN_BOT_CBW_STRU *cbw)
{
__u8 status = USB_ST_NOERROR;
__u16 XferSize=0;
*((__u8 *)&XferSize+0)=cbw->cmd_bytes[8];
*((__u8 *)&XferSize+1)=cbw->cmd_bytes[9];
if (gu8LunMapping[cbw->max_lun]==eNAND)
{
MDrv_NAND_Eject_Insert(cbw->cmd_bytes[1]);//write NAND RDD data
}
return status;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -