1*4882a593Smuzhiyun #ifndef RKCOMM_HEADER 2*4882a593Smuzhiyun #define RKCOMM_HEADER 3*4882a593Smuzhiyun #include "DefineHeader.h" 4*4882a593Smuzhiyun typedef enum 5*4882a593Smuzhiyun { 6*4882a593Smuzhiyun USB_BULK_READ = 0, 7*4882a593Smuzhiyun USB_BULK_WRITE, 8*4882a593Smuzhiyun USB_CONTROL, 9*4882a593Smuzhiyun } USB_ACCESS_TYPE; 10*4882a593Smuzhiyun typedef enum 11*4882a593Smuzhiyun { 12*4882a593Smuzhiyun TU_NONE_SUBCODE = 0, 13*4882a593Smuzhiyun TU_ERASESYSTEM_SUBCODE = 0xFE, 14*4882a593Smuzhiyun TU_LOWERFORMAT_SUBCODE = 0xFD, 15*4882a593Smuzhiyun TU_ERASEUSERDATA_SUBCODE = 0xFB, 16*4882a593Smuzhiyun TU_GETUSERSECTOR_SUBCODE = 0xF9 17*4882a593Smuzhiyun } TESTUNIT_SUBCODE; 18*4882a593Smuzhiyun typedef enum 19*4882a593Smuzhiyun { 20*4882a593Smuzhiyun RST_NONE_SUBCODE = 0, 21*4882a593Smuzhiyun RST_RESETMSC_SUBCODE, 22*4882a593Smuzhiyun RST_POWEROFF_SUBCODE, 23*4882a593Smuzhiyun RST_RESETMASKROM_SUBCODE, 24*4882a593Smuzhiyun RST_DISCONNECTRESET_SUBCODE 25*4882a593Smuzhiyun } RESET_SUBCODE; 26*4882a593Smuzhiyun typedef enum 27*4882a593Smuzhiyun { 28*4882a593Smuzhiyun RWMETHOD_IMAGE = 0, 29*4882a593Smuzhiyun RWMETHOD_LBA, 30*4882a593Smuzhiyun } RW_SUBCODE; 31*4882a593Smuzhiyun /* ���� */ 32*4882a593Smuzhiyun typedef enum 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun TEST_UNIT_READY = 0, 35*4882a593Smuzhiyun READ_FLASH_ID = 0x01, 36*4882a593Smuzhiyun TEST_BAD_BLOCK = 0x03, 37*4882a593Smuzhiyun READ_SECTOR = 0x04, 38*4882a593Smuzhiyun WRITE_SECTOR = 0x05, 39*4882a593Smuzhiyun ERASE_NORMAL = 0x06, 40*4882a593Smuzhiyun ERASE_FORCE = 0x0B, 41*4882a593Smuzhiyun READ_LBA = 0x14, 42*4882a593Smuzhiyun WRITE_LBA = 0x15, 43*4882a593Smuzhiyun ERASE_SYSTEMDISK = 0x16, 44*4882a593Smuzhiyun READ_SDRAM = 0x17, 45*4882a593Smuzhiyun WRITE_SDRAM = 0x18, 46*4882a593Smuzhiyun EXECUTE_SDRAM = 0x19, 47*4882a593Smuzhiyun READ_FLASH_INFO = 0x1A, 48*4882a593Smuzhiyun READ_CHIP_INFO = 0x1B, 49*4882a593Smuzhiyun SET_RESET_FLAG = 0x1E, 50*4882a593Smuzhiyun WRITE_EFUSE = 0x1F, 51*4882a593Smuzhiyun READ_EFUSE = 0x20, 52*4882a593Smuzhiyun READ_SPI_FLASH = 0x21, 53*4882a593Smuzhiyun WRITE_SPI_FLASH = 0x22, 54*4882a593Smuzhiyun SWITCH_MASKROM = 0xFE, 55*4882a593Smuzhiyun DEVICE_RESET = 0xFF 56*4882a593Smuzhiyun } USB_OPERATION_CODE; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #pragma pack(1) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun typedef struct 61*4882a593Smuzhiyun { 62*4882a593Smuzhiyun BYTE ucOperCode; 63*4882a593Smuzhiyun BYTE ucReserved; 64*4882a593Smuzhiyun DWORD dwAddress; 65*4882a593Smuzhiyun BYTE ucReserved2; 66*4882a593Smuzhiyun USHORT usLength; 67*4882a593Smuzhiyun BYTE ucReserved3[7]; 68*4882a593Smuzhiyun } CBWCB, *PCBWCB; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun typedef struct 71*4882a593Smuzhiyun { 72*4882a593Smuzhiyun DWORD dwCBWSignature; 73*4882a593Smuzhiyun DWORD dwCBWTag; 74*4882a593Smuzhiyun DWORD dwCBWTransferLength; 75*4882a593Smuzhiyun BYTE ucCBWFlags; 76*4882a593Smuzhiyun BYTE ucCBWLUN; 77*4882a593Smuzhiyun BYTE ucCBWCBLength; 78*4882a593Smuzhiyun CBWCB cbwcb; 79*4882a593Smuzhiyun } CBW, *PCBW; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun typedef struct 82*4882a593Smuzhiyun { 83*4882a593Smuzhiyun DWORD dwCSWSignature; 84*4882a593Smuzhiyun DWORD dwCSWTag; 85*4882a593Smuzhiyun DWORD dwCBWDataResidue; 86*4882a593Smuzhiyun BYTE ucCSWStatus; 87*4882a593Smuzhiyun } CSW, *PCSW; 88*4882a593Smuzhiyun typedef struct 89*4882a593Smuzhiyun { 90*4882a593Smuzhiyun UINT uiSize; 91*4882a593Smuzhiyun UINT uiCrc; 92*4882a593Smuzhiyun UINT uiBlock[5]; 93*4882a593Smuzhiyun } STRUCT_END_WRITE_SECTOR, *PSTRUCT_END_WRITE_SECTOR; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #pragma pack() 96*4882a593Smuzhiyun #define NAND_DRIVER_DEV "/dev/rknand_sys_storage" 97*4882a593Smuzhiyun #define NAND_DRIVER_DEV_VENDOR "/dev/rknand_sys_storage" 98*4882a593Smuzhiyun #define NAND_DRIVER_DEV_LBA "/dev/rkflash0" 99*4882a593Smuzhiyun #define EMMC_DRIVER_DEV "/dev/rknand_sys_storage" 100*4882a593Smuzhiyun #define EMMC_DRIVER_DEV_VENDOR "/dev/vendor_storage" 101*4882a593Smuzhiyun //#define EMMC_DRIVER_DEV_LBA "/dev/block/mmcblk0" 102*4882a593Smuzhiyun #define EMMC_DRIVER_DEV_LBA "/dev/mmcblk0" 103*4882a593Smuzhiyun #define EMMC_POINT_NAME "emmc_point_name" 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define READ_SECTOR_IO _IOW('r', READ_SECTOR, unsigned int) 106*4882a593Smuzhiyun #define WRITE_SECTOR_IO _IOW('r', WRITE_SECTOR, unsigned int) 107*4882a593Smuzhiyun #define READ_LBA_IO _IOW('r', READ_LBA, unsigned int) 108*4882a593Smuzhiyun #define WRITE_LBA_IO _IOW('r', WRITE_LBA, unsigned int) 109*4882a593Smuzhiyun #define START_WRITE_SECTOR_IO _IOW('r', 0x51, unsigned int) 110*4882a593Smuzhiyun #define END_WRITE_SECTOR_IO _IOW('r', 0x52, unsigned int) 111*4882a593Smuzhiyun #define GET_FLASH_INFO_IO _IOW('r', READ_FLASH_INFO, unsigned int) 112*4882a593Smuzhiyun #define GET_BAD_BLOCK_IO _IOW('r', TEST_BAD_BLOCK, unsigned int) 113*4882a593Smuzhiyun #define GET_LOCK_FLAG_IO _IOW('r', 0x53, unsigned int) 114*4882a593Smuzhiyun #define GET_PUBLIC_KEY_IO _IOW('r', 0x54, unsigned int) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define DISABLE_NAND_LBA_WRITE_IO _IO('V',0) 117*4882a593Smuzhiyun #define ENABLE_NAND_LBA_WRITE_IO _IO('V',1) 118*4882a593Smuzhiyun #define DISABLE_NAND_LBA_READ_IO _IO('V',2) 119*4882a593Smuzhiyun #define ENABLE_NAND_LBA_READ_IO _IO('V',3) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define CMD_TIMEOUT 0 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define CBW_SIGN 0x43425355 /* "USBC" */ 125*4882a593Smuzhiyun #define CSW_SIGN 0x53425355 /* "USBS" */ 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define DIRECTION_OUT 0x00 129*4882a593Smuzhiyun #define DIRECTION_IN 0x80 130*4882a593Smuzhiyun #define MAX_TEST_BLOCKS 512 131*4882a593Smuzhiyun #define MAX_ERASE_BLOCKS 128 132*4882a593Smuzhiyun #define MAX_CLEAR_LEN 16*1024 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #ifndef ERR_SUCCESS 135*4882a593Smuzhiyun #define ERR_SUCCESS 0 136*4882a593Smuzhiyun #endif 137*4882a593Smuzhiyun #define ERR_DEVICE_READY 0 138*4882a593Smuzhiyun #define ERR_DEVICE_OPEN_FAILED -1 139*4882a593Smuzhiyun #define ERR_CSW_OPEN_FAILED -2 140*4882a593Smuzhiyun #define ERR_DEVICE_WRITE_FAILED -3 141*4882a593Smuzhiyun #define ERR_DEVICE_READ_FAILED -4 142*4882a593Smuzhiyun #define ERR_CMD_NOTMATCH -5 143*4882a593Smuzhiyun #define ERR_DEVICE_UNREADY -6 144*4882a593Smuzhiyun #define ERR_FOUND_BAD_BLOCK -7 145*4882a593Smuzhiyun #define ERR_FAILED -8 146*4882a593Smuzhiyun #define ERR_CROSS_BORDER -9 147*4882a593Smuzhiyun #define ERR_DEVICE_NOT_SUPPORT -10 148*4882a593Smuzhiyun #define ERR_REQUEST_NOT_SUPPORT -11 149*4882a593Smuzhiyun #define ERR_REQUEST_FAIL -12 150*4882a593Smuzhiyun #define ERR_BUFFER_NOT_ENOUGH -13 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define UFI_CHECK_SIGN(cbw, csw) ((CSW_SIGN == (csw).dwCSWSignature) && ((csw).dwCSWTag == (cbw).dwCBWTag)) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun class CRKLog; 155*4882a593Smuzhiyun class CRKComm 156*4882a593Smuzhiyun { 157*4882a593Smuzhiyun public: 158*4882a593Smuzhiyun virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType) = 0; 159*4882a593Smuzhiyun virtual int RKU_ReadChipInfo(BYTE *lpBuffer) = 0; 160*4882a593Smuzhiyun virtual int RKU_ReadFlashID(BYTE *lpBuffer) = 0; 161*4882a593Smuzhiyun virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL) = 0; 162*4882a593Smuzhiyun virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 163*4882a593Smuzhiyun virtual int RKU_ReadSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0; 164*4882a593Smuzhiyun virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE) = 0; 165*4882a593Smuzhiyun virtual int RKU_TestBadBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0; 166*4882a593Smuzhiyun virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE) = 0; 167*4882a593Smuzhiyun virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 168*4882a593Smuzhiyun virtual int RKU_LoaderWriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE) = 0; 169*4882a593Smuzhiyun virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer) = 0; 170*4882a593Smuzhiyun virtual int RKU_EndWriteSector(BYTE *lpBuffer) = 0; 171*4882a593Smuzhiyun virtual int RKU_GetLockFlag(BYTE *lpBuffer) = 0; 172*4882a593Smuzhiyun virtual int RKU_GetPublicKey(BYTE *lpBuffer) = 0; 173*4882a593Smuzhiyun virtual void RKU_ReopenLBAHandle() = 0; 174*4882a593Smuzhiyun virtual int RKU_ShowNandLBADevice() = 0; 175*4882a593Smuzhiyun virtual bool RKU_IsEmmcFlash() = 0; 176*4882a593Smuzhiyun CRKComm(CRKLog *pLog); 177*4882a593Smuzhiyun virtual ~CRKComm(); 178*4882a593Smuzhiyun protected: 179*4882a593Smuzhiyun CRKLog *m_log; 180*4882a593Smuzhiyun bool m_bEmmc; 181*4882a593Smuzhiyun int m_hDev; 182*4882a593Smuzhiyun int m_hLbaDev; 183*4882a593Smuzhiyun private: 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun class CRKUsbComm: public CRKComm 187*4882a593Smuzhiyun { 188*4882a593Smuzhiyun public: 189*4882a593Smuzhiyun virtual int RKU_EraseBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE ucEraseType); 190*4882a593Smuzhiyun virtual int RKU_ReadChipInfo(BYTE *lpBuffer); 191*4882a593Smuzhiyun virtual int RKU_ReadFlashID(BYTE *lpBuffer); 192*4882a593Smuzhiyun virtual int RKU_ReadFlashInfo(BYTE *lpBuffer, UINT *puiRead = NULL); 193*4882a593Smuzhiyun virtual int RKU_ReadLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 194*4882a593Smuzhiyun virtual int RKU_ReadSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer); 195*4882a593Smuzhiyun virtual int RKU_ResetDevice(BYTE bySubCode = RST_NONE_SUBCODE); 196*4882a593Smuzhiyun virtual int RKU_TestBadBlock(BYTE ucFlashCS, DWORD dwPos, DWORD dwCount, BYTE *lpBuffer); 197*4882a593Smuzhiyun virtual int RKU_TestDeviceReady(DWORD *dwTotal = NULL, DWORD *dwCurrent = NULL, BYTE bySubCode = TU_NONE_SUBCODE); 198*4882a593Smuzhiyun virtual int RKU_WriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 199*4882a593Smuzhiyun virtual int RKU_LoaderWriteLBA(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer, BYTE bySubCode = RWMETHOD_IMAGE); 200*4882a593Smuzhiyun virtual int RKU_WriteSector(DWORD dwPos, DWORD dwCount, BYTE *lpBuffer); 201*4882a593Smuzhiyun virtual int RKU_EndWriteSector(BYTE *lpBuffer); 202*4882a593Smuzhiyun virtual int RKU_GetLockFlag(BYTE *lpBuffer); 203*4882a593Smuzhiyun virtual int RKU_GetPublicKey(BYTE *lpBuffer); 204*4882a593Smuzhiyun virtual void RKU_ReopenLBAHandle(); 205*4882a593Smuzhiyun virtual int RKU_ShowNandLBADevice(); 206*4882a593Smuzhiyun virtual bool RKU_IsEmmcFlash(); 207*4882a593Smuzhiyun CRKUsbComm(CRKLog *pLog); 208*4882a593Smuzhiyun ~CRKUsbComm(); 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun protected: 211*4882a593Smuzhiyun STRUCT_RKDEVICE_DESC m_deviceDesc; 212*4882a593Smuzhiyun CRKLog *m_log; 213*4882a593Smuzhiyun private: 214*4882a593Smuzhiyun bool CtrlNandLbaWrite(bool bEnable = true); 215*4882a593Smuzhiyun bool CtrlNandLbaRead(bool bEnable = true); 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun }; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun #endif 220