📄 msscsi.c
字号:
#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 + -