📄 msd_fn_scsi.c
字号:
#include "DrvOTGMain.h"
#include "msAPI_MSDCtrl.h"
#include "drvcreader.h"
#include "msAPI_Fat.h"
#include "drvNAND.h"
//#include "command.h"
//#include "uart.h"
#if ENABLE_NOR_DEBUG
#include "drvspiflash.h"
#endif
#ifdef SUPPORT_NAND_DISK
//#include "..\..\Kernel\Ceramal\Driver\NAND\drvNAND.h"
extern __u8 nand_disk_read(void *chan,
__u32 buf,
__u32 len,
__u32 block_num);
extern __u8 nand_disk_write(void *chan,
__u32 buf,
__u32 len,
__u32 block_num);
extern void MDrv_NAND_ReadNANDInfo(__u8 *pu8Buf);
extern bool MDrv_NAND_EraseBlock(__u32 u32Row);
extern void MDrv_NAND_ReadPHYPage(__u32 u32Row,__u32 pBuf,__u16 u16Len);
extern bool MDrv_NAND_WritePHYPage(__u32 u32Row,__u32 pBuf,__u16 u16Len,__u8 u8Ecc);
extern void MDrv_NAND_WriteRDD(__u8 xdata *pBuf,__u8 u8Len);
extern void MDrv_NAND_Eject_Insert(__u8 u8CMD);
extern __u32 MDrv_NAND_GetCapacity(void);
#if ENABLE_NOR_DEBUG
extern __u32 MDrv_Nor_FS_Capacity(void);
extern NC_NOR_STATUS MDrv_NOR_CheckReady(void);
#endif
extern NC_NAND_STATUS MDrv_NAND_CheckReady(void);
extern void MDrv_NAND_ForceWriteBack(void);
#endif
__u8 otgFSenseKey ;
__u8 otgFASC ;
__u8 otgFASCQ ;
__s32 otgfun_residue ;
__u32 otgactualXfer_len ;
__u8 otgdataXfer_dir = 0x00;
__u8 SelfsendChange=0;
extern __u8 gu8LunMapping[TOTAL_LUN];
__u8 CheckDevice( MSDFN_BOT_CBW_STRU *cbw,MSDFN_BOT_CSW_STRU *csw)
{
//static __u8 OldCardStatus=STS_CR_NOMEDIA;
BYTE Status;
//==========================================================================
// Derej 2008/01/25 modify for multi LUN CardReader mode
//==========================================================================
//printf("CHK LUN:0x%bX\r\n",cbw->max_lun);
//printf("Mapping=0x%bX\r\n",gu8LunMapping[cbw->max_lun]);
switch(gu8LunMapping[cbw->max_lun])
{
#if ENABLE_SD_MS_XD_MULTISLOT
case(eSD_MS_XD):
Status = MDrv_CReader_CheckReady(eSD_MS_XD);
if(Status == STS_CR_SD_MS_XD_CARDCHG)
{
csw->status = MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_UNIT_ATTENTION;
otgFASC = ADDKEY_MEDIA_CHANGE;
otgFASCQ=0;
//OldCardStatus=Status;
//printf("SDMSXD MEDIA CHG\r\n");
return (1); // Device not ready
}
if(Status==STS_CR_CARD_NOTREADY)
{
csw->status =MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_NOT_READY;
otgFASC = ADDKEY_MEDIUM_NOT_PRESENT;
otgFASCQ=0;
//OldCardStatus=Status;
return 1;
}
csw->status =MSDFN_BOT_COMMAND_PASSED;
otgFSenseKey = KEY_NO_SENSE;
otgFASC = 0;
otgFASCQ=0;
//OldCardStatus=Status;
break;
#else
#if ENABLE_SD_MMC
case(eSDMMC):
break;
#endif
#if (ENABLE_MS||ENABLE_MSPRO)
case(eMSMSP):
break;
#endif
#if (ENABLE_SM||ENABLE_XD)
case(eSMXD):
break;
#endif
#endif
#if ENABLE_CF
case(eCF):
Status = MDrv_CReader_CheckReady(eCF);
if(Status == STS_CR_CF_CARDCHG)
{
csw->status = MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_UNIT_ATTENTION;
otgFASC = ADDKEY_MEDIA_CHANGE;
otgFASCQ=0;
//OldCardStatus=Status;
//printf("CF MEDIA CHG\r\n");
return (1); // Device not ready
}
if(Status==STS_CR_CARD_NOTREADY)
{
csw->status =MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_NOT_READY;
otgFASC = ADDKEY_MEDIUM_NOT_PRESENT;
otgFASCQ=0;
//OldCardStatus=Status;
return 1;
}
csw->status =MSDFN_BOT_COMMAND_PASSED;
otgFSenseKey = KEY_NO_SENSE;
otgFASC = 0;
otgFASCQ=0;
//OldCardStatus=Status;
break;
//OldCardStatus=Status;
break;
#endif
#if ENABLE_NAND
case(eNAND):
switch(MDrv_NAND_CheckReady())
{
case NC_STS_NOT_READY:
csw->status =MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_NOT_READY;
otgFASC = ADDKEY_MEDIUM_NOT_PRESENT;
otgFASCQ=0;
return (1);
break;
case NC_STS_READY:
csw->status =MSDFN_BOT_COMMAND_PASSED;
otgFSenseKey = KEY_NO_SENSE;
otgFASC = 0;
otgFASCQ=0;
break;
case NC_STS_MEDIA_CHANGE:
csw->status =MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_UNIT_ATTENTION;
otgFASC = ADDKEY_MEDIA_CHANGE;
otgFASCQ=0;
return (1);
break;
}
break;
#endif
#if ENABLE_NOR_DEBUG
case(eNOR):
switch(MDrv_NOR_CheckReady())
{
case NOR_STS_NOT_READY:
csw->status =MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_NOT_READY;
otgFASC = ADDKEY_MEDIUM_NOT_PRESENT;
otgFASCQ=0;
return (1);
break;
case NOR_STS_READY:
csw->status =MSDFN_BOT_COMMAND_PASSED;
otgFSenseKey = KEY_NO_SENSE;
otgFASC = 0;
otgFASCQ=0;
break;
case NOR_STS_MEDIA_CHANGE:
csw->status =MSDFN_BOT_COMMAND_FAILED;
otgFSenseKey = KEY_UNIT_ATTENTION;
otgFASC = ADDKEY_MEDIA_CHANGE;
otgFASCQ=0;
return (1);
break;
}
break;
#endif
}
return (0);
//==========================================================================
}
void Return_CSW_to_Host(MSDFN_BOT_CBW_STRU cbw,__u8 MSDFN_COMMAND)
{
MSDFN_BOT_CSW_STRU csw;
csw.signature = MSDFN_BOT_CSW_SIGNATURE;
csw.tag = cbw.tag;
//csw.residue = cbw.dxfer_length;
csw.residue = otgfun_residue;
csw.status = MSDFN_COMMAND;
USB_MSDFN_Encode_CSW(csw,(__u8 *)usbCSW_Addr);
SDRAM2USB_Bulk((__u32)usbCSW_Addr,MSDFN_BOT_CSW_LENGTH);
}
void MSDFNCMDloop(void)
{
MSDFN_BOT_CBW_STRU cbw;
MSDFN_BOT_CSW_STRU csw;
__s8 status = USB_ST_STALL;
__u8 ep;
if (usbMassCmdRevFlag==1)
{
ep = usb_Ret_Blt_EP_Object(EP_RX); //EP_TX
usbDRC_Index_Select(usbEP[ep].BltEP);
usbMassCmdRevFlag=0;
if (usbEP[ep].BytesProcessed == MSDFN_BOT_CBW_LENGTH)
{
USB_MSDFN_Decode_CBW((__u8 *)usbCBW_Addr, &cbw);
//printf("\r\n receive command :%bx \n", cbw.cmd_bytes[0]);
if ((cbw.signature == MSDFN_BOT_CBW_SIGNATURE) && !(cbw.max_lun & MSDFN_BOT_LUN_MASK) &&
(cbw.max_lun <= DviceMassmax_Lun))
otgfun_residue = cbw.dxfer_length;
else
{
//printf("\r\n CBW Signature Mismatch=%x",(__u16)(cbw.signature>>16));
//printf(" %x",(__u16)(cbw.signature));
printf("\r\n CBW Signature Mismatch",0);
if (cbw.dxfer_length!=0)
{
if (cbw.dir_flag &0x80)
USB_Endpoint_Bulk_In_Stall();
else
USB_Endpoint_Bulk_Out_Stall();
}
//USB_Endpoint_Bulk_In_Stall();
Return_CSW_to_Host(cbw,(__u8) MSDFN_BOT_PHASE_ERROR);
usbSet_ClrRXMode1();
return;
}
}
else
{
printf("\r\n CBW data length Mismatch",0);
if (cbw.dxfer_length!=0)
{
if (cbw.dir_flag &0x80)
USB_Endpoint_Bulk_In_Stall();
else
USB_Endpoint_Bulk_Out_Stall();
}
//USB_Endpoint_Bulk_In_Stall();
Return_CSW_to_Host(cbw,(__u8) MSDFN_BOT_PHASE_ERROR);
usbSet_ClrRXMode1();
return;
}
// parse SCSI command
if (cbw.cmd_bytes[0]== SCSI_FN_REQUEST_SENSE )
{
status = FnReqSen_Command(cbw);
}
else if (cbw.cmd_bytes[0]== SCSI_FN_INQUIRY )
{
status = FnInquiry_Command(cbw);
}
#ifdef SUPPORT_NAND_DISK
//else if ((cbw.cmd_bytes[0] == SCSI_NAND_READNANDINFO) && (cbw.max_lun==NAND_MODE))
else if ((cbw.cmd_bytes[0] == SCSI_NAND_READNANDINFO) && (gu8LunMapping[cbw.max_lun]==eNAND))
{
status = FnNAND_READNANDINFO_Command(&cbw);
}
else if ((cbw.cmd_bytes[0] == SCSI_NAND_ERASEBLOCK ) && (gu8LunMapping[cbw.max_lun]==eNAND))
{
status = FnNAND_ERASEBLOCK_Command(&cbw);
}
else if ((cbw.cmd_bytes[0] == SCSI_NAND_READPHYPAGE ) && (gu8LunMapping[cbw.max_lun]==eNAND))
{
status = FnNAND_READPHYPAGE_Command(&cbw);
}
else if ((cbw.cmd_bytes[0] == SCSI_NAND_WRITEPHYPAGE ) && (gu8LunMapping[cbw.max_lun]==eNAND))
{
status = FnNAND_WRITEPHYPAGE_Command(&cbw);
}
else if ((cbw.cmd_bytes[0] == SCSI_NAND_WRITERDD ) && (gu8LunMapping[cbw.max_lun]==eNAND))
{
status = FnNAND_WRITERDD_Command(&cbw);
}
else if ((cbw.cmd_bytes[0] == SCSI_NAND_EJECT_INSERT ) && (gu8LunMapping[cbw.max_lun]==eNAND))
{
status = FnNAND_EJECT_INSERT_Command(&cbw);
}
#endif
else if (CheckDevice(&cbw,&csw) == 1) //_DEVICE_READY)
{
//device is not ready....
//printf("\r\n Device not ready",0);
if (cbw.dxfer_length!=0)
{
if (cbw.dir_flag &0x80) //data in
USB_Endpoint_Bulk_In_Stall();
else
USB_Endpoint_Bulk_Out_Stall();
}
//EAL=0;
//printf("\r\n Device not ready\n");
//EAL=1;
Return_CSW_to_Host(cbw,(__u8)MSDFN_BOT_COMMAND_FAILED);
usbSet_ClrRXMode1();
return;
}
else if (cbw.cmd_bytes[0] == SCSI_FN_READ_CAPACITY )
{
//status = FnRdCap_Command(cbw,GetSDCapa(),SCSI_BLOCK_SIZE);
switch(gu8LunMapping[cbw.max_lun])
{
#if ENABLE_SD_MS_XD_MULTISLOT
case(eSD_MS_XD):
_u8DriveNo = Dev_CARD;
status = FnRdCap_Command(cbw,msAPI_MSD_ReadCapacity(),SCSI_BLOCK_SIZE); //for test use
break;
#else
#if ENABLE_SD_MMC
case(eSDMMC):
break;
#endif
#if (ENABLE_MS||ENABLE_MSPRO)
case(eMSMSP):
break;
#endif
#if (ENABLE_SM||ENABLE_XD)
case(eSMXD):
break;
#endif
#endif
#if ENABLE_CF
case(eCF):
_u8DriveNo = Dev_CF;
status = FnRdCap_Command(cbw,msAPI_MSD_ReadCapacity(),SCSI_BLOCK_SIZE); //for test use
break;
#endif
#if ENABLE_NAND
case(eNAND):
status = FnRdCap_Command(cbw,MDrv_NAND_GetCapacity(),SCSI_BLOCK_SIZE);
break;
#endif
#if ENABLE_NOR_DEBUG
case(eNOR):
status = FnRdCap_Command(cbw,(MDrv_Nor_FS_Capacity()/0x200),SCSI_BLOCK_SIZE);
break;
#endif
}
/*
if(cbw.max_lun==CARD_MODE)
status = FnRdCap_Command(cbw,msAPI_MSD_ReadCapacity(),SCSI_BLOCK_SIZE); //for test use
#ifdef SUPPORT_NAND_DISK
if(gu8LunMapping[cbw.max_lun]==eNAND)
status = FnRdCap_Command(cbw,MDrv_NAND_GetCapacity(),SCSI_BLOCK_SIZE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -