⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msd_fn_scsi.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -