📄 u_atapicmd.c
字号:
}
return ret;
}
/*****************************************************************************
*
* Mode Select
*
* OK:NG:
* bulk_total_tran_cnt
* mode_data_cnt Mode Data
* mode_work Mode Data
* wk_cnt
* wk_data ATA
* wk_ptr
*****************************************************************************/
int ModeSelParaCheck(void)
{
int ret = RC_OK; /* */
/* */
wk_cnt = bulk_total_tran_cnt;
if (wk_cnt < 8) {
/* */
SetSenseKey_051A00(); /* Parameter List Length Error */
ret = RC_NG;
} else {
/* */
wk_cnt -= 8;
wk_ptr = wk_data + 8;
while (wk_cnt > 0) {
/* */
MSelFindPage(wk_ptr[0]);
if (mode_data_cnt == 0) {
/* */
SetSenseKey_052600();
ret = RC_NG;
break;
} else if (wk_cnt < mode_data_cnt) {
/* */
SetSenseKey_051A00(); /* Parameter List Length Error */
ret = RC_NG;
break;
} else {
/* Changeable */
if (IsMSelRcvParaInvalid() == RC_NG) {
/* */
SetSenseKey_052600();
ret = RC_NG;
break;
}
}
/* */
wk_cnt -= mode_data_cnt;
wk_ptr += mode_data_cnt;
}
}
if (ret == RC_OK) {
/* */
SetSenseKey_000000();
}
return ret;
}
/*****************************************************************************
*
* Mode Select
* page
*
* mode_pages Mode Data
* mode_data_cnt Mode Data
* mode_data_addr Mode Data
* mode_chg_addr Mode DataChangeable Page Data
*
*****************************************************************************/
void MSelFindPage(BYTE page)
{
int i;
mode_data_addr = (BYTE *)&mode_data[0]; /* Mode Page */
mode_data_cnt = 0; /* */
for (i = 0;i < MODE_PAGE_CNT;i++) { /* */
if (mode_data_addr[0] == page) {
/* */
/* */
mode_data_cnt = mode_data_addr[1] + 2;
/* Changeable */
mode_chg_addr = mode_data_addr + MODE_PAGES_LEN;
break;
}
mode_data_addr += mode_data_addr[1] + 2;
}
}
/*****************************************************************************
*
* Mode Select
*
*
* wk_ptr
* mode_data_cnt Mode Data
* mode_data_addr Mode Data
* mode_chg_addr Changeable Data
*****************************************************************************/
int IsMSelRcvParaInvalid(void)
{
BYTE chg;
int i,ret = RC_NG; /* */
/* Changeable
*
* XOR
* ChangeableAND
*
*/
chg = wk_ptr[0] ^ mode_data_addr[0];
if (chg == 0x00) {
/* Page Code */
chg = wk_ptr[1] ^ mode_data_addr[1];
if (chg == 0x00) {
/*
* Page Length
*
*/
for (i = 2;i < mode_data_cnt;i++) {
chg = wk_ptr[i] ^ mode_data_addr[i];
if (chg != 0x00) {
if ((chg & ~mode_chg_addr[i]) != 0x00) {
/* */
break;
}
}
}
if (i == mode_data_cnt) {
/* */
ret = RC_OK;
}
}
}
return ret;
}
/*****************************************************************************
*
* Mode Sense
*
* OK:NG:
* tran_flag
* atten_flag
* tran_protocol BulkOnlyCBI
* bulk_total_tran_cnt
* cmd_block ATAPI
* wk_data ATA
* mode_data_cnt Mode Data
* mode_data_addr Mode Data
* mode_chg_addr Changeable Data
*****************************************************************************/
int ModeSense(void)
{
BYTE page;
int i,ret = RC_NG; /* */
/* CBWCBIATAPI */
bulk_total_tran_cnt = MKDWORD(0x00,0x00,cmd_block[7],cmd_block[8]);
if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
/* */
if ((cmd_block[2] & 0xC0) == 0xC0) {
/* Saved Value */
SetSenseKey_053900();
} else {
page = cmd_block[2] & 0x3F;
MSelFindPage(page);
if (page != 0x3F && mode_data_cnt == 0) {
/* */
SetSenseKey_052400();
} else {
if (page == 0x3F) {
/*
* Mode
* Current/Default Page
*/
mode_data_cnt = MODE_PAGES_LEN;
mode_data_addr = (BYTE *)&mode_data[0];
mode_chg_addr = (BYTE *)(&mode_data[0] + MODE_PAGES_LEN);
}
/* */
bulk_tran_start_addr = wk_data;
/* ModeSense */
/* */
for (i = 0;i < 8;i++) {
wk_data[i] = 0x00;
}
wk_data[1] = mode_data_cnt + 6;
if ((cmd_block[2] & 0xC0) != 0x40) {
/* Default,Current Value */
for (i = 0;i < mode_data_cnt;i++) {
wk_data[i + 8] = mode_data_addr[i];
}
} else {
/* Changeable Value */
for (i = 0;i < mode_data_cnt;i++) {
wk_data[i + 8] = mode_chg_addr[i];
}
}
/* */
if (bulk_total_tran_cnt > mode_data_cnt + 8) {
bulk_total_tran_cnt = mode_data_cnt + 8;
}
/* */
SetSenseKey_000000();
ret = RC_OK;
}
}
}
return ret;
}
/*****************************************************************************
*
* PREVENT/ALLOW MEDIUM REMOVAL
*
* OK:NG:
* atacmd_flag ATAPIATA
* atten_flag
*****************************************************************************/
int Prevent(void)
{
int ret = RC_NG; /* */
/* CBWCBIATAPI */
bulk_total_tran_cnt = 0;
if (IsCommonErrorFound(DIR_NONE) == RC_NO_ERROR) {
/* */
/*
*
*
*/
SetSenseKey_052400(); /* INVALID FIELD IN COMMAND PACKET */
}
return ret;
}
/*****************************************************************************
*
* CBI
*
* OK:NG:
* atacmd_flag ATAPIATA
* cmd_block ATAPI
* cmd_status CBW,CBI
*****************************************************************************/
int CBIReset(void)
{
int ret = RC_NG; /* */
if (cmd_block[1] == 0x04 &&
cmd_block[2] == 0xFF &&
cmd_block[3] == 0xFF &&
cmd_block[4] == 0xFF &&
cmd_block[5] == 0xFF &&
cmd_block[6] == 0xFF &&
cmd_block[7] == 0xFF &&
cmd_block[8] == 0xFF &&
cmd_block[9] == 0xFF &&
cmd_block[10] == 0xFF &&
cmd_block[11] == 0xFF) {
/* CBI Reset */
InitDeviceWorkArea();
ControlLED(PORT_TURN_OFF); /* PORTLED */
if( rDMA_Control_BP.DMA_Running ){
/* DMA */
MasterDMAStop(); /* DMA*/
di();
rDMA_Control_BP.DMA_Stop = 1;
while(rDMA_Control_BP.DMA_Running);
rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
rDMA_IntStat = 0x01; /* DMA_Cmp,FIFO_IN_Cmp,FIFO_OUT_Cmp
rFIFO_IntStat = 0x03; *
*/
ei();
}else{
rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
}
rEPbControl_BP.ForceNAK = 1;
bulk_in_state = BULK_IN_IDLE;
bulk_out_state = BULK_OUT_IDLE;
protocol_phase = COMMAND_PHASE;
/* */
SetSenseKey_000000();
ret = RC_OK;
} else {
SetSenseKey_052000();
}
return ret;
}
/*****************************************************************************
*
*
*
* NG:
* atacmd_flag ATAPIATA
*
* atten_flag
*****************************************************************************/
int CmdError(void)
{
int ret = RC_NG; /* */
bulk_total_tran_cnt = 0x00;
if( atten_flag.PowerOnReset ){
/* */
atten_flag.PowerOnReset = 0; /* */
SetSenseKey_062900();
return ret;
}else{
SetSenseKey_052000(); /* */
}
return ret;
}
/*****************************************************************************
*
* Read 10
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_protocol BulkOnlyCBI
* tran_flag
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* cmd_block ATAPI
* ata_cmd_block ATA
* ata_lba ATA LBA
* ata_remain_sector
*****************************************************************************/
int Read10(void)
{
int ret = RC_NG; /* */
WORD sec_cnt;
long retCode; /* */
/* CBWCBIATAPI */
sec_cnt = MKWORD(cmd_block[7], cmd_block[8]);
bulk_total_tran_cnt = sec_cnt * block_size;
if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
/* */
ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);
if (last_lba < ata_lba + sec_cnt - 1 ){
/* LBA */
SetSenseKey_052100(); /* LOGICAL BLOCK ADDRESS OUT OF RANGE */
} else {
/* */
SetSenseKey_000000();
ret = RC_OK;
/* */
if( bulk_total_tran_cnt != 0 ) {
/* Bulk */
tran_flag.DMA = 1; /* DMA */
#if 0 /* 03/09/07 Endo :DTQ */
// SysCnvLendian( &usbReqData.dCbwTag[0], 0x04d45fc1, 4 );
// SysCnvLendian( &usbReqData.dCbwDataLength[0], 0x00000002, 4 );
// usbReqData.dCbwFlags = 0x80;
// usbReqData.bCbwCblLength = 0x0a;
usbReqData.cbwcb = PCIF_USB_CMD_READ;
readReq = (READ_REQ *)&usbReqData.detail;
SysCnvLendian( &readReq->logBlkAddr[0], ata_lba, 4 );
SysCnvLendian( &readReq->transLen[0] , sec_cnt, 2 );
pc_rslt.result_cmplt = 0 ; // flag clear
pc_rslt.cmd = 0xff ;
retCode = 0; //
plc_IO = (struct c_IOtag *)0x40000 ; // append Endo
// 1. Read10 Request Send
retCode = UsbPcIf_PutReqData( (CHAR *)&usbReqData,
(ULONG )sizeof( PCIF_USB_REQ_DATA ),
(CHAR *)&usb_wk_buf[0],
(ULONG )LBA_DATA_BUFF_MAX );
/* USB Driver Put Request Data */
// 2. Command Error check
if( retCode == 0 ){
// nothing
}
#else /* 03/09/07 Endo :DTQ */
//----------------------------------------------------------------------------------------------
// enum{
// DRV_RAM, // RAM Disk
// DRV_ROM, // ROM Disk
// DRV_SM, //
// DRV_MMC // MMC/SD
// };
//----------------------------------------------------------------------------------------------
// int DRV_ReadSec(enDrvNum DrvNum, unsigned long StrSec, unsigned long SecNum, unsigned char *Buf)
//----------------------------------------------------------------------------------------------
// retCode = DRV_ReadSec(DRV_RAM, ata_lba, sec_cnt, &usb_wk_buf[0]);
retCode = DrvFS_ReadSec(g_StgMediaInfo.type, ata_lba, sec_cnt, &usb_wk_buf[0]);
// 2. Command Error check
if( retCode != 0 ){
panic(40); // nothing
}
#endif /* 03/09/07 Endo :DTQ */
}
}
}
return ret;
}
/*****************************************************************************
*
* Seek
*
* OK:NG:
* atacmd_flag ATAPIATA
* atten_flag
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* cmd_block ATAPI
* ata_cmd_block ATA
*****************************************************************************/
int Seek(void)
{
int ret = RC_NG; /* */
/* CBWCBIATAPI */
bulk_total_tran_cnt = 0;
if (IsCommonErrorFound(DIR_NONE) == RC_NO_ERROR) {
/* */
ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);
if( last_lba < ata_lba ){
/* LBA */
SetSenseKey_052100();
} else {
/* */
SetSenseKey_000000();
ret = RC_OK;
}
}
return ret;
}
/*****************************************************************************
*
* StartStopUnit
*
* OK:NG:
* atacmd_flag ATAPIATA
* atten_flag
* cmd_block ATAPI
* ata_cmd_block ATA
*****************************************************************************/
int StartStopUnit(void)
{
int ret = RC_NG; /* */
/* CBWCBIATAPI */
bulk_total_tran_cnt = 0;
if (IsCommonErrorFound(DIR_NONE) == RC_NO_ERROR) {
/* */
if ((cmd_block[4] & 0x02) == 0x02) {
/* LoEJ */
SetSenseKey_052400();
} else {
/* */
SetSenseKey_000000();
ret = RC_OK;
}
}
return ret;
}
/*****************************************************************************
*
* Verify
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_protocol BulkOnlyCBI
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* cmd_block ATAPI
* ata_cmd_block ATA
* ata_lba ATA LBA
* ata_remain_sector
*
*****************************************************************************/
int Verify(void)
{
int ret = RC_NG; /* */
WORD sec_cnt;
/* CBWCBIATAPI */
bulk_total_tran_cnt = 0;
if (IsCommonErrorFound(DIR_NONE) == RC_NO_ERROR) {
/* */
/* LBA */
ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);
/* Verify */
sec_cnt = MKWORD(cmd_block[7], cmd_block[8]);
if( last_lba < ata_lba + sec_cnt - 1 ) {
/* LBA */
SetSenseKey_052100();
} else if ((cmd_block[1] & 0x02) == 0x02) {
/* ByteChk() */
SetSenseKey_052400();
} else {
/* */
SetSenseKey_000000();
ret = RC_OK;
}
}
return ret;
}
/*****************************************************************************
*
* Write 10
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_protocol BulkOnlyCBI
* atten_flag
* tran_flag
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* cmd_block ATAPI
* ata_cmd_block ATA
*****************************************************************************/
int Write10(void)
{
WORD sec_cnt;
int f,ret = RC_NG; /* */
/* CBWCBIATAPI */
sec_cnt = MKWORD(cmd_block[7], cmd_block[8]);
bulk_total_tran_cnt = sec_cnt * block_size;
/* CBWCBIATAPI */
if (IsCommonErrorFound(DIR_OUT) == RC_NO_ERROR) {
/* */
ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);
if (last_lba < ata_lba + sec_cnt -1){
/* LBA */
SetSenseKey_052100(); /* LOGICAL BLOCK ADDRESS OUT OF RANGE */
} else {
/* */
SetSenseKey_000000();
ret = RC_OK;
/* */
if( bulk_total_tran_cnt != 0 ) {
/* Bulk */
g_UsbIFAns.ata_lba = ata_lba ;
g_UsbIFAns.sec_cnt = sec_cnt ;
tran_flag.DMA = 1; /* DMA */
#if 0 /* 03/09/08 Endo :u_bulkout.c fifo_out_cmp */
// High-speed DMA Ch.3 interrupt request flag register
// #define bINT_FDMA_FHDM3 fINT_FDMA.FHDM3
bINT_FDMA_FHDM3 = 1 ; // clear
// High-speed DMA Ch.3 interrupt enable register
// #define bINT_EDMA_EHDM3 fINT_EDMA.EHDM3
bINT_EDMA_EHDM3 = 1 ; // enable
#endif /* 03/09/08 Endo :u_bulkout.c fifo_out_cmp */
}
}
}
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -