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

📄 msd_fn_scsi.c

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