📄 msscsi.c
字号:
//SCSI_CLT_T scsi_clt_P;
MSD_CB cmd_blk;
__s8 status;
#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
#ifdef Artemis_DEBUG2
printf("\r\n inquiry",0);
#endif
/*Fill the CBWCB*/
*((__u8 *)usbCBWCB_Addr+0) = SCSI_CMD_INQUIRY;
*((__u8 *)usbCBWCB_Addr+1) = lun<<5;
*((__u8 *)usbCBWCB_Addr+2) = 0x00;
*((__u8 *)usbCBWCB_Addr+3) = 0x00;
*((__u8 *)usbCBWCB_Addr+4) = SCSI_CMD_INQ_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_INQ_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_Fill_CMD(&scsi_clt_P, lun, SCSI_CMD_INQ_DATA_LEN, 0, SCSI_CMD_INQUIRY, otgMass_Data_Buffer_Addr, USB_DATA_DIR_IN);
//USB_SCSI_Prepare_6Byte_CMD(&cmd_blk, scsi_clt_P,(__u8 *)otgCBWCB_Addr);
status=usbMSD_BOT_Transport(cmd_blk);
if(status == USB_SUCCESS)
{
if((*((__u8 *)usbMass_Data_Buffer_Addr) & 0x1F) == 0x00)
status = YES;
else
status = NO;
//printf("\r\n byte1=%x", *((__u8 *)usbMass_Data_Buffer_Addr+1));
//printf("\r\n byte0=%x", *((__u8 *)usbMass_Data_Buffer_Addr));
*RMB=*((__u8 *)usbMass_Data_Buffer_Addr+1)&0x80;
*DeviceType=(*((__u8 *)usbMass_Data_Buffer_Addr) & 0x1F);
}
else if(status == USB_FAILURE)
status = NO;
#ifdef Artemis_DEBUG
//printf("\r\n Einquiry=%x",status);
#endif
return status;
}
__s8 ReqSen_Command(__u8 lun)
{
//SCSI_CLT_T scsi_clt_P;
MSD_CB cmd_blk;
__s8 status;
#ifdef Artemis_DEBUG2
printf("\r\n ReqSen",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_REQSNS;
*((__u8 *)usbCBWCB_Addr+1) = lun<<5;
*((__u8 *)usbCBWCB_Addr+2) = 0x00;
*((__u8 *)usbCBWCB_Addr+3) = 0x00;
*((__u8 *)usbCBWCB_Addr+4) = SCSI_CMD_REQ_SENSE_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_REQ_SENSE_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_Fill_CMD(&scsi_clt_P, lun, SCSI_CMD_REQ_SENSE_LEN, 0, SCSI_CMD_REQSNS,otgMass_Data_Buffer_Addr, USB_DATA_DIR_IN);
// USB_SCSI_Prepare_6Byte_CMD(&cmd_blk, scsi_clt_P,(__u8 *)otgCBWCB_Addr);
status=usbMSD_BOT_Transport(cmd_blk);
if(status == USB_SUCCESS)
{
usbSenseKey = *((__u8 *)usbMass_Data_Buffer_Addr+2);
usbASC= *((__u8 *)usbMass_Data_Buffer_Addr+12);
usbASCQ = *((__u8 *)usbMass_Data_Buffer_Addr+13);
}
return status;
}
__s8 Rd10_Command(__u8 lun,__u16 count,__u32 sector)
{
//SCSI_CLT_T scsi_clt_P;
MSD_CB cmd_blk;
__s8 status;
#ifdef Artemis_DEBUG5
printf("\r\n Rd10",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_READ10;
*((__u8 *)usbCBWCB_Addr+1) = lun<<5;
*((__u8 *)usbCBWCB_Addr+2) = sector >> 24;
*((__u8 *)usbCBWCB_Addr+3) = sector >> 16;
*((__u8 *)usbCBWCB_Addr+4) = sector >> 8;
*((__u8 *)usbCBWCB_Addr+5) = sector;
*((__u8 *)usbCBWCB_Addr+6) = 0x00;
*((__u8 *)usbCBWCB_Addr+7) = count >> 8;
*((__u8 *)usbCBWCB_Addr+8) = count;
*((__u8 *)usbCBWCB_Addr+9) = 0x00;
/* Fill the command block */
cmd_blk.data_buf_P = usbMass_Data_Buffer_Addr;
cmd_blk.buf_length = ((__u32)count) * MaxBlockSize; //MSD_DRIVE_SECTOR_SIZE;
cmd_blk.direction = USB_DATA_DIR_IN;
cmd_blk.cmd_length = SCSI_CMD_LENGTH10;
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, count, sector, SCSI_CMD_READ10, otgMass_Data_Buffer_Addr, USB_DATA_DIR_IN);
//USB_SCSI_Prepare_10Byte_CMD(&cmd_blk, scsi_clt_P,(__u8 *)otgCBWCB_Addr);
status=usbMSD_BOT_Transport(cmd_blk);
#ifdef Artemis_DEBUG
printf("\r\n ExRd10",0);
#endif
return status;
}
__s8 Wt10_Command(__u8 lun,__u16 count,__u32 sector)
{
//SCSI_CLT_T scsi_clt_P;
MSD_CB cmd_blk;
__s8 status;
#ifdef Artemis_DEBUG5
printf("\r\n Wt10",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_WRITE10;
*((__u8 *)usbCBWCB_Addr+1) = lun<<5;
*((__u8 *)usbCBWCB_Addr+2) = sector >> 24;
*((__u8 *)usbCBWCB_Addr+3) = sector >> 16;
*((__u8 *)usbCBWCB_Addr+4) = sector >> 8;
*((__u8 *)usbCBWCB_Addr+5) = sector;
*((__u8 *)usbCBWCB_Addr+6) = 0x00;
*((__u8 *)usbCBWCB_Addr+7) = count >> 8;
*((__u8 *)usbCBWCB_Addr+8) = count;
*((__u8 *)usbCBWCB_Addr+9) = 0x00;
/* Fill the command block */
cmd_blk.data_buf_P = usbMass_Data_Buffer_Addr;
cmd_blk.buf_length = ((__u32)count) * MaxBlockSize; //MSD_DRIVE_SECTOR_SIZE;
cmd_blk.direction = USB_DATA_DIR_OUT;
cmd_blk.cmd_length = SCSI_CMD_LENGTH10;
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, count, sector, SCSI_CMD_WRITE10, otgMass_Data_Buffer_Addr, USB_DATA_DIR_OUT);
//USB_SCSI_Prepare_10Byte_CMD(&cmd_blk, scsi_clt_P,(__u8 *)otgCBWCB_Addr);
status=usbMSD_BOT_Transport(cmd_blk);
#ifdef Artemis_DEBUG
printf("\r\n ExWt10",0);
#endif
return status;
}
__s8 RdFmtCap_Command(__u8 lun,__u32 *noblock,__u32 *blocksize)
{
//SCSI_CLT_T scsi_clt_P;
MSD_CB cmd_blk;
__s8 status;
__u8 dcount;
__u32 numblock,blksize;
blocksize=0;
#ifdef Artemis_DEBUG2
printf("\r\n RdFmtCap",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_READ_FMT_CPC;
*((__u8 *)usbCBWCB_Addr+1) = lun<<5;
*((__u8 *)usbCBWCB_Addr+2) = 0x0;
*((__u8 *)usbCBWCB_Addr+3) = 0x0;
*((__u8 *)usbCBWCB_Addr+4) = 0x0;
*((__u8 *)usbCBWCB_Addr+5) = 0x0;
*((__u8 *)usbCBWCB_Addr+6) = 0x00;
*((__u8 *)usbCBWCB_Addr+7) = 0x0;
*((__u8 *)usbCBWCB_Addr+8) = 0x0;
*((__u8 *)usbCBWCB_Addr+9) = 0x00;
/* Fill the command block */
cmd_blk.data_buf_P = usbMass_Data_Buffer_Addr;
cmd_blk.buf_length =SCSI_CMD_RDFMTCPC_DATA_LEN;
cmd_blk.direction = USB_DATA_DIR_IN;
cmd_blk.cmd_length = SCSI_CMD_LENGTH10;
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, SCSI_CMD_RDFMTCPC_DATA_LEN, 0, SCSI_CMD_READ_FMT_CPC, otgMass_Data_Buffer_Addr, USB_DATA_DIR_IN);
//USB_SCSI_Prepare_10Byte_CMD(&cmd_blk, scsi_clt_P,(__u8 *)otgCBWCB_Addr);
//USB_SCSI_Prepare_6Byte_CMD(&cmd_blk, scsi_clt_P,otgCBWCB); //?
status=usbMSD_BOT_Transport(cmd_blk);
if (status == USB_SUCCESS)
{
dcount=*((__u8 *)usbMass_Data_Buffer_Addr+3);
*((__u8 *)&numblock+3)=*((__u8 *)usbMass_Data_Buffer_Addr+4);
*((__u8 *)&numblock+2)=*((__u8 *)usbMass_Data_Buffer_Addr+5);
*((__u8 *)&numblock+1)=*((__u8 *)usbMass_Data_Buffer_Addr+6);
*((__u8 *)&numblock+0)=*((__u8 *)usbMass_Data_Buffer_Addr+7);
*((__u8 *)&blksize+2)=*((__u8 *)usbMass_Data_Buffer_Addr+9);
*((__u8 *)&blksize+1)=*((__u8 *)usbMass_Data_Buffer_Addr+10);
*((__u8 *)&blksize+0)=*((__u8 *)usbMass_Data_Buffer_Addr+11);
noblock=&numblock;
blocksize=&blksize;
}
return status;
}
__s8 Removal_Command(__u8 lun)
{
//SCSI_CLT_T scsi_clt_P;
MSD_CB cmd_blk;
__s8 status;
#ifdef Artemis_DEBUG4
printf("\r\n Removal",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_REMOVAL;
*((__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;
}
#endif //#if (ENABLE_OTG_HOST == ENABLE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -