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

📄 msscsi.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "DrvOTGMain.h"
//#include "uart.h"

static code const char msScsi_dummy_constant=0;
#if (ENABLE_OTG_HOST == ENABLE)

__u8 volatile usbSenseKey = 0x00;
__u8 volatile usbASC = 0x00;
__u8 volatile usbASCQ = 0x00;
__u32 volatile MaxBlockSize=MSD_DRIVE_SECTOR_SIZE;
/* artemis mark 1204
void USB_SCSI_Prepare_10Byte_CMD(MSD_CB  *cmd_blk, SCSI_CLT_T  scsi_clt_P,__u8  *cmd_P);
void USB_SCSI_Prepare_6Byte_CMD(MSD_CB *cmd_blk, SCSI_CLT_T  scsi_clt_P, __u8  *cmd_P);
void USB_SCSI_Fill_CMD(SCSI_CLT_T *scsi_clt_P, __u8 lun,__u16 count,__u32 sector,__u8 cmd,void *buf_P,__s32 dir);

void USB_SCSI_Prepare_10Byte_CMD(MSD_CB  *cmd_blk, SCSI_CLT_T  scsi_clt_P,__u8  *cmd_P)
{
    if (scsi_clt_P.reading)
    {
        cmd_P[0]           = SCSI_CMD_READ10;
        cmd_blk->direction = USB_DATA_DIR_IN;
    }
    else
    {
        cmd_P[0]           = SCSI_CMD_WRITE10;
        cmd_blk->direction = USB_DATA_DIR_OUT;
    }

    cmd_P[1] = (scsi_clt_P.lun<<5);
    cmd_P[2] = (__u8) (scsi_clt_P.sector >> 24);
    cmd_P[3] = (__u8) (scsi_clt_P.sector >> 16);
    cmd_P[4] = (__u8) (scsi_clt_P.sector >> 8);
    cmd_P[5] = (__u8) (scsi_clt_P.sector);


    cmd_P[6] = 0x00;

    cmd_P[7] = (__u8) (scsi_clt_P.count >> 8);
    cmd_P[8] = (__u8) (scsi_clt_P.count);

    cmd_P[9] = 0x00;

    cmd_blk->cmd_P      = cmd_P;

    cmd_blk->cmd_length = SCSI_CMD_LENGTH10;

    cmd_blk->data_buf_P = scsi_clt_P.buf_P;

    cmd_blk->buf_length = scsi_clt_P.count * MSD_DRIVE_SECTOR_SIZE;

    return;
}

void USB_SCSI_Prepare_6Byte_CMD(MSD_CB *cmd_blk, SCSI_CLT_T  scsi_clt_P, __u8  *cmd_P)
{
    cmd_P[0] = scsi_clt_P.cmd;
    cmd_P[1] = (scsi_clt_P.lun<<5);
    cmd_P[2] = 0x00;
    cmd_P[3] = 0x00;
    cmd_P[4] = (__u8)scsi_clt_P.count;
    cmd_P[5] = 0x00;

    /* Fill the command block */
/* artemis mark 1204
    cmd_blk->cmd_P      = cmd_P;
    cmd_blk->cmd_length = SCSI_CMD_LENGTH06;
    cmd_blk->data_buf_P = scsi_clt_P.buf_P;
    cmd_blk->buf_length = cmd_P[4];
    cmd_blk->direction  = USB_DATA_DIR_IN;

    return;
}


void USB_SCSI_Fill_CMD(SCSI_CLT_T *scsi_clt_P, __u8 lun,__u16 count,__u32 sector,__u8 cmd,void *buf_P,__s32 dir)
{
    scsi_clt_P->lun  = lun;
    scsi_clt_P->count    = count;
    scsi_clt_P->sector   = sector;
    scsi_clt_P->buf_P    = buf_P;
    scsi_clt_P->cmd      = cmd;
    scsi_clt_P->reading  = dir;
    return;
}
artemis mark 1204*/

//artemis add at 03/09/2007
void Init_MassStorage(void)
{
 __u8 LunIndex, RMB,DeviceType,temp=1;
 __u32 blknum,blksize;

 for(LunIndex=0;LunIndex<=HostMassmax_Lun;LunIndex++)
 {
     if(!Inquiry_Command(LunIndex, &RMB, &DeviceType))
	 {
	  //printf("\r\n LunIndex1=%x",LunIndex);
 	  goto Init_Done;
	 }
     //printf("\r\n Type=%x",DeviceType);
 }

 HostMassValid_Lun=0;
 // Start to init every LUN
 for(LunIndex=0;LunIndex<=HostMassmax_Lun;LunIndex++)
 {
     //printf("\r\n LunIndex2=%x",LunIndex);

	 /*
	 ReqSen_Command(LunIndex);
     printf("\r\nsenseKey=%x",usbSenseKey);
	 if(usbSenseKey!=0x0)
	 {
	   //printf("\r\nsenseKey=%x",usbSenseKey);
	   continue;
	 }*/

     if(TestRdy_Command(LunIndex)==USB_FAILURE)
 	 {
	   if(TestRdy_Command(LunIndex)==USB_FAILURE)
	    continue;
	 }

     if(!Inquiry_Command(LunIndex, &RMB, &DeviceType))
	   continue;

	 if(RdCap_Command(LunIndex,&blknum,&blksize)!=USB_SUCCESS)
	   continue;
     else
       MaxBlockSize=blksize;

	 if(EPConfig&0x01)
	 {
	   ReqSen_Command(LunIndex);
	   EPConfig=EPConfig &0xFE;
       RdCap_Command(LunIndex,&blknum,&blksize);
       MaxBlockSize=blksize;
 	 }

     HostMassValid_Lun=HostMassValid_Lun|(temp<<LunIndex);
	 //printf("\r\n HostMassValid_Lun=%x",HostMassValid_Lun);
 }


Init_Done:;

}
//end add

void Det_MassStorage(void)
{
   __u8 LunIndex,RMB,DeviceType,temp=1;
   HostMassValid_Lun=0;
   for(LunIndex=0;LunIndex<=HostMassmax_Lun;LunIndex++)
   {
     //printf("\r\n LunIndex1=%x",LunIndex);
     Inquiry_Command(LunIndex, &RMB, &DeviceType);
	 //printf("\r\n Dtype1=%x", DeviceType);
	 if(DeviceType==0x5)
	 {
	  Valid_lun_Mask=Valid_lun_Mask|(temp<<LunIndex);
	  continue;
	 }
     if(TestRdy_Command(LunIndex)==USB_FAILURE)
	 {
	   //printf("\r\n test1=%x", LunIndex);
	   HostMassValid_Lun=HostMassValid_Lun & (~(temp<<LunIndex));
	 }
	 else
	 {
	  //printf("\r\n test2=%x", LunIndex);
	  HostMassValid_Lun=HostMassValid_Lun|(temp<<LunIndex) & (~Valid_lun_Mask) ;
	 }
   }
   HostMassValid_Lun=0;
   for(LunIndex=0;LunIndex<=HostMassmax_Lun;LunIndex++)
   {
     //printf("\r\n LunIndex2=%x",LunIndex);
     Inquiry_Command(LunIndex, &RMB, &DeviceType);
	 //printf("\r\n Dtype2=%x", DeviceType);
	 if(DeviceType==0x5)
	 {
	  Valid_lun_Mask=Valid_lun_Mask|(temp<<LunIndex);
	  continue;
	 }
     if(TestRdy_Command(LunIndex)==USB_FAILURE)
	 {
	   //printf("\r\n test1=%x", LunIndex);
	   HostMassValid_Lun=HostMassValid_Lun & (~(temp<<LunIndex));
	 }
	 else
	 {
	  //printf("\r\n test2=%x", LunIndex);
	  HostMassValid_Lun=HostMassValid_Lun|(temp<<LunIndex) & (~Valid_lun_Mask);
	 }
   }
}

__s8 RdCap_Command(__u8 lun,__u32 *noblock,__u32 *blocksize)
{
    //SCSI_CLT_T scsi_clt_P;
    MSD_CB cmd_blk;
    __s8 status;
    __u8 * ptr;
#ifdef Artemis_DEBUG2
    printf("\r\n RdCap", 0);
#endif
#if 0
	  for(i=0;i<MSD_BOT_CBW_CB_LENGTH;i++)
	     otgCBWCB[i]=0;
#else
    usbMem_Set((void *)usbCBWCB_Addr,0,MSD_BOT_CBW_CB_LENGTH);
#endif
    //USB_SCSI_Fill_CMD(&scsi_clt_P, lun, SCSI_CMD_RDCPC_DATA_LEN, 0, SCSI_CMD_READ_CPC, otgMass_Data_Buffer_Addr, USB_DATA_DIR_IN);

   /*Fill the CBWCB*/
    *((__u8 *)usbCBWCB_Addr+0) = SCSI_CMD_READ_CPC;
    *((__u8 *)usbCBWCB_Addr+1) = lun<<5;
    *((__u8 *)usbCBWCB_Addr+2) = 0x00;
    *((__u8 *)usbCBWCB_Addr+3) = 0x00;
    *((__u8 *)usbCBWCB_Addr+4) = SCSI_CMD_RDCPC_DATA_LEN;//0x00;
    *((__u8 *)usbCBWCB_Addr+5) = 0x00;

    /* Fill the command block */
    cmd_blk.data_buf_P = usbMass_Data_Buffer_Addr;
    cmd_blk.buf_length = SCSI_CMD_RDCPC_DATA_LEN;
    cmd_blk.direction  = USB_DATA_DIR_IN;
    cmd_blk.cmd_length = SCSI_CMD_LENGTH06;
    cmd_blk.lun=lun;
    cmd_blk.signature=MSD_BOT_CBW_SIGNATURE;
    cmd_blk.tag=MSD_BOT_CBW_TAG;


//    USB_SCSI_Prepare_6Byte_CMD(&cmd_blk, scsi_clt_P,otgCBWCB);
    status=usbMSD_BOT_Transport(cmd_blk);
    if (status == USB_SUCCESS)
    {

       ptr=(__u8 *)noblock;

	*ptr    =*((__u8 *)usbMass_Data_Buffer_Addr+0);
	*(ptr+1)=*((__u8 *)usbMass_Data_Buffer_Addr+1);
	*(ptr+2)=*((__u8 *)usbMass_Data_Buffer_Addr+2);
	*(ptr+3)=*((__u8 *)usbMass_Data_Buffer_Addr+3);

       ptr=(__u8 *)blocksize;

	*ptr    =*((__u8 *)usbMass_Data_Buffer_Addr+4);
	*(ptr+1)=*((__u8 *)usbMass_Data_Buffer_Addr+5);
	*(ptr+2)=*((__u8 *)usbMass_Data_Buffer_Addr+6);
	*(ptr+3)=*((__u8 *)usbMass_Data_Buffer_Addr+7);

    }

    return status;
}

__s8 TestRdy_Command(__u8 lun)
{
    //SCSI_CLT_T scsi_clt_P;
    MSD_CB cmd_blk;
    __s8 status;
#ifdef Artemis_DEBUG7
    printf("\r\n TestRdy",0);
#endif
#if 0
	  for(i=0;i<MSD_BOT_CBW_CB_LENGTH;i++)
	     otgCBWCB[i]=0;
#else
    usbMem_Set((void *)usbCBWCB_Addr,0,MSD_BOT_CBW_CB_LENGTH);
#endif

    /*Fill the CBWCB*/
    *((__u8 *)usbCBWCB_Addr+0) = SCSI_CMD_TSTUNTRDY;
    *((__u8 *)usbCBWCB_Addr+1) = lun<<5;
    *((__u8 *)usbCBWCB_Addr+2) = 0x00;
    *((__u8 *)usbCBWCB_Addr+3) = 0x00;
    *((__u8 *)usbCBWCB_Addr+4) = 0x00;
    *((__u8 *)usbCBWCB_Addr+5) = 0x00;

    /* Fill the command block */
    cmd_blk.data_buf_P = NULL;
    cmd_blk.buf_length = 0;
    cmd_blk.direction  = USB_DATA_DIR_OUT;
    cmd_blk.cmd_length = SCSI_CMD_LENGTH06;
    cmd_blk.lun=lun;
    cmd_blk.signature=MSD_BOT_CBW_SIGNATURE;
    cmd_blk.tag=MSD_BOT_CBW_TAG;

    //USB_SCSI_Fill_CMD(&scsi_clt_P, lun, 0, 0, SCSI_CMD_TSTUNTRDY, NULL,USB_DATA_DIR_IN);
    //USB_SCSI_Prepare_6Byte_CMD(&cmd_blk, scsi_clt_P,(__u8 *)otgCBWCB_Addr);
    status=usbMSD_BOT_Transport(cmd_blk);
    return status;
}

__s8 Inquiry_Command(__u8 lun, __u8 *RMB, __u8 *DeviceType)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -