📄 u_device.c
字号:
/****************************************************************************
* File name : device.c
* Module name : Device module
* Author : Hiromichi Kondo
*---------------------------------------------------------------------------
* $Id: device.c,v 1.2 2003/05/13 11:02:05 9551619 Exp $
****************************************************************************/
#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_regNikka.h"
#include "u_value.h"
#include "u_com_fp.h"
#include "u_dev_fp.h"
#include "usbfw_if.h"
#include "drvFS.h"
/*--- Function Prototype ---------------------------------------------------*/
void DeviceProc(void);
void WaitRcvCommand(void);
void CommandCheck(void);
void SetStatus(void);
void WaitCSWCmp(void);
void CBWCheck(void);
void CSWSet(void);
void InitDeviceWorkArea(void);
void MasterDMAStop(void);
void MasterDMAStart(void);
void MasterDMAXferEndProc(void);
extern STG_MEDIA_INFO g_StgMediaInfo;
extern USBFW_IF_ANS g_UsbIFAns ;
/*****************************************************************************
*
* : Device
* : Device
* :
* :
* :device_state Device
*
*****************************************************************************/
void (*const device_tbl[])() = {
WaitRcvCommand,
CommandCheck,
SetStatus,
WaitCSWCmp
};
void DeviceProc(void)
{
if( usb_state == CONFIGURED_STATE){
/* Configured State */
if (device_state > DEV_WAIT_CSW_CMP) {
/* */
panic(5);
}
/* device_state */
device_tbl[device_state]();
}
}
/*****************************************************************************
*
* :
* :
* :
* :
* :device_state Device
* device_flag Device
* tran_protocol
* tran_flag
* bulk_actual_tran_cnt Bulk
* bulk_tran_start_addr Bulk
* bulk_out_state BulkOUT
*
*****************************************************************************/
void WaitRcvCommand(void)
{
if( device_flag.RcvCommand ){
/* */
device_flag.RcvCommand = 0; /* */
ControlLED(PORT_TURN_ON); /* PORTLED */
device_state = DEV_CMD_CHECK; /* */
}else{
/* */
if( tran_protocol == BULKONLY ){
if( device_flag.WaitCBW ){
/* CBW */
if( tran_flag.XferCmp ){
/* */
device_flag.WaitCBW = 0; /* CBW */
tran_flag.XferCmp = 0; /* */
CBWCheck(); /* CBW */
}
}else{
/* CBW */
device_flag.WaitCBW = 1; /* CBW */
tran_flag.DMA = 0; /* DMA */
bulk_actual_tran_cnt = 31; /* bulk */
bulk_tran_start_addr = cbw; /* */
bulk_out_state = BULK_OUT_DATA_GET;
}
}
}
}
/*****************************************************************************
*
* :
* :
* :
* :
* :device_state Device
* tran_flag
* bulk_actual_tran_cnt Bulk
* bulk_req_tran_cnt Bulk
* bulk_total_tran_cnt Bulk
* bulk_out_state BulkOUT
* bulk_in_state BulkIN
* protocol_phase
* cmd_block[]
*
*****************************************************************************/
void CommandCheck(void)
{
int ret;
WORD fifo_remain;
if( cmd_block[0] != 0x00 ){
test_unit_ready_cnt = 0;
}
switch( cmd_block[0] ){
case 0x00: /* Test Unit Ready */
ret = TestUnitReady();
break;
case 0x03: /* Request Sense */
ret = RequestSense();
break;
case 0x12: /* Inquiry */
ret = Inquiry();
break;
case 0x1B: /* Start Stop Unit */
ret = StartStopUnit();
break;
case 0x1D: /* CBI Reset */
ret = CBIReset();
break;
case 0x1E: /* Prevent/Allow Medium Removal */
ret = Prevent();
break;
case 0x23: /* Read Format Capacity */
ret = ReadFormatCapacity();
break;
case 0x25: /* Read Capacity */
ret = ReadCapacity();
break;
case 0x28: /* Read(10) */
ret = Read10();
break;
case 0x2A: /* Write(10) */
ret = Write10();
break;
case 0x2B: /* Seek */
ret = Seek();
break;
case 0x2F: /* Verify */
ret = Verify();
break;
case 0x55: /* Mode Select */
ret = ModeSelect();
break;
case 0x5A: /* Mode Sense */
ret = ModeSense();
break;
default:
ret = CmdError();
}
if( ret == RC_OK ){
/* OK */
if( bulk_total_tran_cnt == 0 ){
/* */
protocol_phase = STATUS_PHASE;
tran_flag.XferCmp = 1; /* */
}else{
/* */
protocol_phase = DATA_PHASE;
bulk_actual_tran_cnt = bulk_total_tran_cnt; /* Bulk */
if( tran_flag.DMA ){
/* DMA */
#if 1 /* 03/09/05 Endo :DTQ */
MasterDMAStart(); /* MasterDMA */
if( tran_flag.Direction == DIR_IN ){
/* IN */
bulk_in_state = BULK_IN_DATA_SET;
}else{
/* OUT */
bulk_out_state = BULK_OUT_DATA_GET;
}
#else /* 03/09/05 Endo :DTQ */
pc_rslt.dir = tran_flag.Direction ; // no need ?
pc_rslt.req_wait = 1 ;
#endif /* 03/09/05 Endo :DTQ */
}else{
if( tran_flag.Direction == DIR_IN ){
/* IN */
bulk_in_state = BULK_IN_DATA_SET;
}else{
/* OUT */
bulk_out_state = BULK_OUT_DATA_GET;
}
}
}
}else{
/* NG */
if( bulk_req_tran_cnt == 0 ){
/* */
protocol_phase = STATUS_PHASE;
tran_flag.XferCmp = 1; /* */
}else{
/* */
bulk_total_tran_cnt = 0; /* Bulk */
protocol_phase = DATA_PHASE;
if( tran_flag.Direction == DIR_OUT ){
/* OUT */
rEPbControl_BP.ForceNAK = 1;
#if 1 /* 03/09/04 Endo :wait */
/* 1ms */
WaitTMStart();
while(WaitTMCheck(TMOUT_1) != TIMEOUT);
WaitTMStop();
#endif /* 03/09/04 Endo :wait */
rCPU_JoinRd_BP.JoinEPbRd = 1;
fifo_remain = MKWORD(rEPnRdRemain_H, rEPnRdRemain_L);
rCPU_JoinRd_BP.JoinEPbRd = 0;
if( bulk_req_tran_cnt <= fifo_remain ){
/* */
rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
protocol_phase = STATUS_PHASE;
tran_flag.XferCmp = 1; /* */
}else{
/* */
rEPbControl_BP.ForceSTALL = 1;
bulk_out_state = BULK_OUT_STALL;
}
}else{
/* IN */
rEPaControl_BP.ForceSTALL = 1;
bulk_in_state = BULK_IN_STALL;
}
}
}
device_state = DEV_SET_STATUS; /* */
}
/*****************************************************************************
*
* :
* :
*
* :
* :
* :device_state Device
* device_flag Device
* tran_protocol
* tran_flag
* protocol_phase
* int_int_state InterruptIN
* cmd_block[]
*
*****************************************************************************/
void SetStatus(void)
{
if( tran_flag.XferCmp ){
/* */
if( protocol_phase == STATUS_PHASE ){
/* */
tran_flag.XferCmp = 0; /* */
rEPbControl_BP.ForceNAK = 1;
if( cmd_block[0] == 0x55 ){
/* Mode Select */
ModeSelParaCheck(); /* Mode Select */
}
if( tran_protocol == BULKONLY ){
/* BulkOnly */
CSWSet(); /* CSW */
device_state = DEV_WAIT_CSW_CMP; /* CSW */
ControlLED(PORT_TURN_OFF); /* PORTLED */
}else{
/* CBI */
int_in_state = INT_IN_DATA_SET;
device_state = DEV_WAIT_RCV_CMD; /* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -