📄 u_atapicmd.c
字号:
/****************************************************************************
* File name : atapicmd.c
* Module name : ATAPI Command Check module
* Author : Hiromichi Kondo
*---------------------------------------------------------------------------
* $Id: atapicmd.c,v 1.3 2003/05/13 11:00:30 9551619 Exp $
****************************************************************************/
#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_value.h"
#include "u_com_fp.h"
#include "u_macro.h"
#include "u_dev_fp.h"
#include <stdio.h>
#include <string.h>
//#include "sysdef.h"
#include "usbfw_if.h"
#include "drvFS.h"
extern STG_MEDIA_INFO g_StgMediaInfo;
extern USBFW_IF_ANS g_UsbIFAns ;
/*--- Function Prototype ---------------------------------------------------*/
int IsCommonErrorFound(int dir);
int IsUnitAttention(void);
int IsLUNFieldValid(void);
void SetSenseKey_000000(void);
void SetSenseKey_030200(void);
void SetSenseKey_031100(void);
void SetSenseKey_040000(void);
void SetSenseKey_040803(void);
void SetSenseKey_051A00(void);
void SetSenseKey_052000(void);
void SetSenseKey_052100(void);
void SetSenseKey_052400(void);
void SetSenseKey_052500(void);
void SetSenseKey_052600(void);
void SetSenseKey_053900(void);
void SetSenseKey_062800(void);
void SetSenseKey_062900(void);
int TestUnitReady(void);
int RequestSense(void);
int Inquiry(void);
int ReadCapacity(void);
int ReadFormatCapacity(void);
int ModeSelect(void);
int ModeSelectPara(void);
void MSelFindPage(BYTE page);
int IsMSelRcvParaInvalid(void);
int ModeSense(void);
int Prevent(void);
int CBIReset(void);
int CmdError(void);
int FormatUnitCmd(void);
int FormatUnitPara(void);
int Read10(void);
int Read12(void);
int Seek(void);
int StartStopUnit(void);
int Verify(void);
int Write10(void);
int Write12(void);
int WriteAndVerify(void);
/*****************************************************************************
*
* CBWCBIATAPI
* dir:
*
* bulk_total_tran_cnt
*****************************************************************************/
int IsCommonErrorFound(int dir)
{
int ret = RC_ERROR;
if( tran_protocol == CBI ){
/* CBI */
/* CBI */
if( dir != DIR_NONE ){
/* */
tran_flag.Direction = dir;
}
/* CBI */
bulk_req_tran_cnt = bulk_total_tran_cnt;
}else{
/* BulkOnly */
if( bulk_req_tran_cnt != bulk_total_tran_cnt ){
cmd_status = PHASE_ERROR;
return ret;
}
if( bulk_req_tran_cnt != 0x00 && tran_flag.Direction != dir ){
cmd_status = PHASE_ERROR;
return ret;
}
}
if( cmd_block[0] != 0x03 && cmd_block[0] != 0x12 ){
/* Request SenseInquiry */
if( atten_flag.PowerOnReset ){
/* */
atten_flag.PowerOnReset = 0; /* */
SetSenseKey_062900();
return ret;
}
}
if ((cmd_block[1] & 0xE0) == 0x00) {
/* LUN 000b */
ret = RC_NO_ERROR;
}else{
SetSenseKey_052500();
}
return ret;
}
/*****************************************************************************
*
* SenseKey()
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_000000(void)
{
sense_data[0] = 0x00;
sense_data[1] = 0x00;
sense_data[2] = 0x00;
cmd_status = COMMAND_SUCCESS;
}
/*****************************************************************************
*
* SenseKey(NO SEEK COMPLETE)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_030200(void)
{
sense_data[0] = 0x03;
sense_data[1] = 0x02;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(Unrecovered Read Error)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_031100(void)
{
sense_data[0] = 0x03;
sense_data[1] = 0x11;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(Hardware Error)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_040000(void)
{
sense_data[0] = 0x04;
sense_data[1] = 0x00;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(Logical Unit Communication Error)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_040803(void)
{
sense_data[0] = 0x04;
sense_data[1] = 0x08;
sense_data[2] = 0x03;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(Parameter List Length Error)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_051A00(void)
{
sense_data[0] = 0x05;
sense_data[1] = 0x1A;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(INVALID COMMAND OPERATION CODE)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_052000(void)
{
sense_data[0] = 0x05;
sense_data[1] = 0x20;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(LOGICAL BLOCK ADDRESS OUT OF RANGE)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_052100(void)
{
sense_data[0] = 0x05;
sense_data[1] = 0x21;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(INVALID FIELD IN COMMAND PACKET)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_052400(void)
{
sense_data[0] = 0x05;
sense_data[1] = 0x24;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(LOGICAL UNIT NOT SUPPORTED)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_052500(void)
{
sense_data[0] = 0x05;
sense_data[1] = 0x25;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(INVALID FIELD IN PARAMETER LIST)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_052600(void)
{
sense_data[0] = 0x05;
sense_data[1] = 0x26;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(SAVING PARAMETERS NOT SUPPORTED)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_053900(void)
{
sense_data[0] = 0x05;
sense_data[1] = 0x39;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(MEDIA CHANGED)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_062800(void)
{
sense_data[0] = 0x06;
sense_data[1] = 0x28;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* SenseKey(POWER ON RESET OR BUS DEVICE RESET OCCURRED)
*
*
* sense_data
* cmd_status CBW,CBI
*****************************************************************************/
void SetSenseKey_062900(void)
{
sense_data[0] = 0x06;
sense_data[1] = 0x29;
sense_data[2] = 0x00;
cmd_status = COMMAND_FAILED;
}
/*****************************************************************************
*
* Test Unit Ready
*
* OK:NG:
* bulk_total_tran_cnt
*****************************************************************************/
int TestUnitReady(void)
{
int ret = RC_NG; /* */
/* CBWCBIATAPI */
bulk_total_tran_cnt = 0;
if (IsCommonErrorFound(DIR_NONE) == RC_NO_ERROR) {
/* */
test_unit_ready_cnt++;
if( test_unit_ready_cnt > 3 ){
/* OS *
* Test Unit Ready *
* *
* 昡壙帪埲奜偼偙偺張棟偼昁梫側偄 */
test_unit_ready_cnt = 0;
SetSenseKey_062800();
}else{
/* */
SetSenseKey_000000();
}
ret = RC_OK;
}
return ret;
}
/*****************************************************************************
*
* Request Sense
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_flag
* tran_protocol BulkOnlyCBI
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* wk_data ATA
*****************************************************************************/
int RequestSense(void)
{
int i;
int ret = RC_NG; /* */
/* CBWCBIATAPI */
bulk_total_tran_cnt = MKDWORD(0x00,0x00,0x00,cmd_block[4]);
if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
/* */
bulk_tran_start_addr = wk_data;
/* Sense Data */
for (i = 0;i < 18;i++) {
wk_data[i] = 0x00;
}
wk_data[ 0] = 0x70;
wk_data[ 7] = 0x0A;
wk_data[ 2] = sense_data[0];
wk_data[12] = sense_data[1];
wk_data[13] = sense_data[2];
/* */
if (bulk_total_tran_cnt > 18) {
bulk_total_tran_cnt = 18;
}
/* */
SetSenseKey_000000();
ret = RC_OK;
}
return ret;
}
/*****************************************************************************
*
* Inquiry
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_protocol BulkOnlyCBI
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* cmd_block ATAPI
* wk_data ATA
*****************************************************************************/
int Inquiry(void)
{
int i,ret = RC_NG; /* */
/* CBWCBIATAPI */
bulk_total_tran_cnt = MKDWORD(0x00,0x00,0x00,cmd_block[4]);
if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
/* */
bulk_tran_start_addr = (BYTE *)&inquiry_data[0]; /* */
/* */
if (bulk_total_tran_cnt > 36) {
bulk_total_tran_cnt = 36;
}
/* */
SetSenseKey_000000();
ret = RC_OK;
}
return ret;
}
/*****************************************************************************
*
* ReadCapacity
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_flag
* tran_protocol BulkOnlyCBI
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* cmd_block ATAPI
* wk_data LBA
*****************************************************************************/
int ReadCapacity(void)
{
int ret = RC_NG; /* */
DWORD total_sec_cnt;
/* CBWCBIATAPI */
bulk_total_tran_cnt = 0x08;
if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
/* */
/* */
bulk_tran_start_addr = wk_data;
/* Read Capacity */
/* */
wk_data[0] = DWORD2BYTE_HH(last_lba);
wk_data[1] = DWORD2BYTE_HL(last_lba);
wk_data[2] = DWORD2BYTE_LH(last_lba);
wk_data[3] = DWORD2BYTE_LL(last_lba);
/* */
wk_data[4] = DWORD2BYTE_HH(block_size);
wk_data[5] = DWORD2BYTE_HL(block_size);
wk_data[6] = DWORD2BYTE_LH(block_size);
wk_data[7] = DWORD2BYTE_LL(block_size);
/* */
SetSenseKey_000000();
ret = RC_OK;
}
return ret;
}
/*****************************************************************************
*
* ReadFormatCapacity
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_protocol BulkOnlyCBI
* bulk_req_tran_cnt
* bulk_total_tran_cnt
* cmd_block ATAPI
* wk_data ATA
*****************************************************************************/
int ReadFormatCapacity(void)
{
int i;
int ret = RC_NG; /* */
DWORD total_sec_cnt;
/* CBWCBIATAPI */
bulk_total_tran_cnt = MKDWORD(0x00,0x00,cmd_block[7],cmd_block[8]);
if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
/* */
/* */
bulk_tran_start_addr = wk_data;
/* Read Format Capacity */
wk_data[0] = 0x00;
wk_data[1] = 0x00;
wk_data[2] = 0x00;
wk_data[3] = 0x10;
/* -- Current/Maximum Capacity Descriptor -- */
total_sec_cnt = last_lba + 1;
/* */
wk_data[4] = DWORD2BYTE_HH(total_sec_cnt);
wk_data[5] = DWORD2BYTE_HL(total_sec_cnt);
wk_data[6] = DWORD2BYTE_LH(total_sec_cnt);
wk_data[7] = DWORD2BYTE_LL(total_sec_cnt);
/* */
wk_data[8] = 0x03; /* */
/* */
wk_data[9] = DWORD2BYTE_HL(block_size);
wk_data[10] = DWORD2BYTE_LH(block_size);
wk_data[11] = DWORD2BYTE_LL(block_size);
/* -- Formattable Capacity Descriptor -- */
/* */
wk_data[12] = DWORD2BYTE_HH(total_sec_cnt);
wk_data[13] = DWORD2BYTE_HL(total_sec_cnt);
wk_data[14] = DWORD2BYTE_LH(total_sec_cnt);
wk_data[15] = DWORD2BYTE_LL(total_sec_cnt);
/* Reserved */
wk_data[16] = 0x00;
/* */
wk_data[17] = DWORD2BYTE_HL(block_size);
wk_data[18] = DWORD2BYTE_LH(block_size);
wk_data[19] = DWORD2BYTE_LL(block_size);
/* */
if (bulk_total_tran_cnt > 20) {
bulk_total_tran_cnt = 20;
}
/* */
SetSenseKey_000000();
ret = RC_OK;
}
return ret;
}
/*****************************************************************************
*
* Mode Select
*
* OK:NG:
* atacmd_flag ATAPIATA
* tran_flag
* atten_flag
* tran_protocol BulkOnlyCBI
* bulk_total_tran_cnt
* cmd_block ATAPI
* wk_data ATA
*****************************************************************************/
int ModeSelect(void)
{
int ret = RC_NG; /* */
bulk_total_tran_cnt = MKDWORD(0x00,0x00,cmd_block[7],cmd_block[8]);
/* CBWCBIATAPI */
if (IsCommonErrorFound(DIR_OUT) == RC_NO_ERROR) {
/* */
if ((cmd_block[1] & 0x01) == 0x01) { /* SP */
/* */
SetSenseKey_052400();
} else {
/* */
/* ModeSelect */
bulk_tran_start_addr = wk_data;
/* */
ret = RC_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -