205 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
#ifndef _SCSI_OP_H
 | 
						|
#define _SCSI_OP_H
 | 
						|
 | 
						|
/**
 | 
						|
Only Support MSDC Vendor command code 0xF0/0xE0/0xC0.
 | 
						|
Others vendor code would STALL OUT EP. Sense data would return illegal request sense code.
 | 
						|
*/
 | 
						|
#define SCSI_OP_SET0				0xF0
 | 
						|
#define SCSI_OP_SET1				0xE0
 | 
						|
#define SCSI_OP_SET2				0xC0
 | 
						|
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Uart's return status: CDB[13]
 | 
						|
// Uart's extra data len: CDB[6] ~ CDB[9] except SCSIOP_OUT_ADDR_WRITE
 | 
						|
// Checksum rule: The CDB[0] ~ CDB[15]'s sum LSB 8bits shall be 0x00
 | 
						|
// Checksum is fixed CDB[14] ~ CDB[15]
 | 
						|
// When Checksum failed. CSW Status 0x1 means command failed.
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
#define IDX_CDB_UART_DATA_LEN_LWLB  6 ///< uart's data len low word low byte
 | 
						|
#define IDX_CDB_UART_DATA_LEN_LWHB  7 ///< uart's data len low word high byte
 | 
						|
#define IDX_CDB_UART_DATA_LEN_HWLB  8 ///< uart's data len high word low byte
 | 
						|
#define IDX_CDB_UART_DATA_LEN_HWHB  9 ///< uart's data len high word low byte
 | 
						|
#define IDX_CDB_UART_STATUS_ER     13 ///< uart's csw status
 | 
						|
#define IDX_CDB_CHKSUM_LB          14 ///< check sum low bytes
 | 
						|
#define IDX_CDB_CHKSUM_HB          15 ///< check sum high bytes
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// SCSI CBW
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
typedef struct _NVT_SCSI_CBW {
 | 
						|
	unsigned int  dCBWSignature;
 | 
						|
	unsigned int  dCBWTag;
 | 
						|
	unsigned int  dCBWDataTransferLength;
 | 
						|
	unsigned char bmCBWFlags;
 | 
						|
	unsigned char bCBWLUN;
 | 
						|
	unsigned char bCBWCBLength;
 | 
						|
	unsigned char CBWCB[16];
 | 
						|
} NVT_SCSI_CBW;
 | 
						|
 | 
						|
/**
 | 
						|
Open NVT Device
 | 
						|
 | 
						|
The commands except SCSIOP_IN_IS_NVT can be run if open device success.
 | 
						|
If not open first, the operation commands got CSW Status 0x1 means command failed.
 | 
						|
 | 
						|
@DATA_PHASE: None.
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_OUT_OPEN_DEVICE 0x01
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
Send Write Loader
 | 
						|
 | 
						|
The Write Address @ CDB[2]~[5];
 | 
						|
For example address 0xFE080000 shall fill CDB[2]=0x00 CDB[3]=0x00 CDB[4]=0x08 CDB[5]=0xFE
 | 
						|
MSDC: CDB[6]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
UART: CDB[6]~[9] is data size (because uart has no CBW to tell transmitting size)
 | 
						|
 | 
						|
@DATA_PHASE: None.
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_OUT_WRLOADER 0x02
 | 
						|
 | 
						|
/**
 | 
						|
Address WRITE WORD (DRAM/REG/SRAM  dont care)
 | 
						|
 | 
						|
The Write Address @ CDB[2]~[5];
 | 
						|
For example address 0xFE080000 shall fill CDB[2]=0x00 CDB[3]=0x00 CDB[4]=0x08 CDB[5]=0xFE
 | 
						|
The Write DATA @ CDB[6]~[9].
 | 
						|
For example address 0x12345678 shall fill CDB[6]=0x78 CDB[7]=0x56 CDB[8]=0x34 CDB[9]=0x12
 | 
						|
CDB[10]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
 | 
						|
@DATA_PHASE: None.
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_OUT_ADDR_WRITE 0x03
 | 
						|
 | 
						|
/**
 | 
						|
Write Memory
 | 
						|
 | 
						|
The Write Starting Address @ CDB[2]~[5];
 | 
						|
For example offset 0xFE080000 shall fill CDB[2]=0x00 CDB[3]=0x00 CDB[4]=0x08 CDB[5]=0xFE
 | 
						|
MSDC: CDB[6]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
UART: CDB[6]~[9] is data size (because uart has no CBW to tell transmitting size)
 | 
						|
 | 
						|
@DATA_PHASE: None.
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_OUT_MEM_WRITE 0x04
 | 
						|
 | 
						|
/**
 | 
						|
Read / Write flash
 | 
						|
 | 
						|
send SCSIOP_FLASH_OP to loader
 | 
						|
MSDC: CDB[6]~[15] shall follow checksum rule. Content is dont care. except CDB[10]
 | 
						|
UART: CDB[6]~[9] is SCSIOP_FLASH_OP size (because uart has no CBW to tell transmitting size)
 | 
						|
 | 
						|
@DATA_PHASE: None.
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define FLASH_ACCESS_TYPE_AUTO 0
 | 
						|
#define FLASH_ACCESS_TYPE_NAND 1
 | 
						|
#define FLASH_ACCESS_TYPE_NOR  2
 | 
						|
#define FLASH_ACCESS_TYPE_EMMC 3
 | 
						|
typedef struct _SCSIOP_FLASH_OP {
 | 
						|
	unsigned int type; //FLASH_ACCESS_TYPE
 | 
						|
	unsigned int is_write; //indicate write
 | 
						|
	unsigned long long offset; //flash r/w offset
 | 
						|
	unsigned long long size;   //flash r/w size
 | 
						|
	unsigned long long partition_size; //flash partition size
 | 
						|
} SCSIOP_FLASH_OP;
 | 
						|
#define SCSIOP_OUT_FLASH_ACCESS 0x05
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
Ask if NVT Device
 | 
						|
 | 
						|
No need to SCSIOP_IN_OPEN_DEVICE
 | 
						|
CDB[2]~[15] shall follow checksum rule
 | 
						|
 | 
						|
@DATA_PHASE: IN 4 bytes return; The value 0x81200000 woule be return for 98321. <8321 = 0x2081> If checksum fail, the 0x0 would be returned.
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
 | 
						|
*/
 | 
						|
#define SCSIOP_IN_IS_NVT 0x81
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
End USB ROM CODE.
 | 
						|
 | 
						|
Exit USB ROM code after receiving this command. The checksum must be correct.
 | 
						|
After SCSIOP_IN_WRLOADER is invoked, PC invoked this to confirm write loader is ok.
 | 
						|
 | 
						|
CDB[2]~[15] shall follow checksum rule
 | 
						|
 | 
						|
@DATA_PHASE: None.
 | 
						|
@CSW_PHASE status code: 0 is success and end usb rom.  0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_IN_WAIT_DONE 0x82
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
Address READ WORD (DRAM/REG/SRAM  dont care)
 | 
						|
 | 
						|
The READ Address @ CDB[2]~[5];
 | 
						|
For example address 0xFE080000 shall fill CDB[2]=0x00 CDB[3]=0x00 CDB[4]=0x08 CDB[5]=0xFE
 | 
						|
CDB[6]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
 | 
						|
@DATA_PHASE: IN 8 bytes return. DATA[0]~[3] is repeat CDB address. Read out DATA is [4] ~[7].
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_IN_ADDR_READ 0x83
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
The Read Starting Address @ CDB[2]~[5];
 | 
						|
For example address 0xFE080000 shall fill CDB[2]=0x00 CDB[3]=0x00 CDB[4]=0x08 CDB[5]=0xFE
 | 
						|
CDB[6]~[9] is read data size
 | 
						|
CDB[10]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
 | 
						|
@DATA_PHASE: IN 8 bytes return. DATA[0]~[3] is repeat CDB address. Read out DATA is [3] ~[7].
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
 | 
						|
*/
 | 
						|
#define SCSIOP_IN_MEM_READ 0x84
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
Get Temp Buffer Address
 | 
						|
 | 
						|
MSDC: CDB[6]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
UART: CDB[6]~[9] is data size (because uart has no CBW to tell transmitting size)
 | 
						|
 | 
						|
@DATA_PHASE: Read out DATA is [3] ~[7].
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_IN_GET_TMP_ADDR 0x85
 | 
						|
 | 
						|
/**
 | 
						|
Notify fdt has send
 | 
						|
 | 
						|
The fdt has sent into loader's temp buffer. notify loader to check its sanity.
 | 
						|
CDB[2]~[5] is status result in word.
 | 
						|
MSDC: CDB[6]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
UART: CDB[6]~[9] is data size (because uart has no CBW to tell transmitting size)
 | 
						|
 | 
						|
@DATA_PHASE: None.
 | 
						|
@CSW_PHASE status code: 0 is success. 0x1 means checksum failed.
 | 
						|
*/
 | 
						|
#define SCSIOP_IN_FDT 0x86
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
Notify uboot or nvtpack has send
 | 
						|
 | 
						|
The uboot or nvtpack has sent into loader's temp buffer. notify loader to check its sanity.
 | 
						|
CDB[2]~[5] is status result in word.
 | 
						|
MSDC: CDB[6]~[15] shall follow checksum rule. Content is dont care.
 | 
						|
UART: CDB[6]~[9] is data size (because uart has no CBW to tell transmitting size)
 | 
						|
*/
 | 
						|
#define SCSIOP_IN_UBOOT 0x87
 | 
						|
 | 
						|
#endif |