#ifndef RKDEVICE_HEADER #define RKDEVICE_HEADER #include "RKImage.h" #include "RKComm.h" #include "RKLog.h" #include "DefineHeader.h" #define SECTOR_SIZE 512 #define PAGE_SIZE 2048 #define SPARE_SIZE 16 #define CHIPINFO_LEN 16 #define IDBLOCK_TOP 50 #define CALC_UNIT(a, b) ((a > 0) ? ((a - 1) / b + 1) : (a)) #define BYTE2SECTOR(x) (CALC_UNIT(x, SECTOR_SIZE)) #define PAGEALIGN(x) (CALC_UNIT(x, 4)) #pragma pack(1) typedef struct _STRUCT_FLASH_INFO { char szManufacturerName[16]; UINT uiFlashSize; USHORT usBlockSize; UINT uiPageSize; UINT uiSectorPerBlock; BYTE blockState[IDBLOCK_TOP]; UINT uiBlockNum; BYTE bECCBits; BYTE bAccessTime; BYTE bFlashCS; USHORT usValidSecPerBlock; USHORT usPhyBlokcPerIDB; UINT uiSecNumPerIDB; } STRUCT_FLASH_INFO, *PSTRUCT_FLASH_INFO; typedef struct _STRUCT_FLASHINFO_CMD { UINT uiFlashSize; USHORT usBlockSize; BYTE bPageSize; BYTE bECCBits; BYTE bAccessTime; BYTE bManufCode; BYTE bFlashCS; BYTE reserved[501]; } STRUCT_FLASHINFO_CMD, *PSTRUCT_FLASHINFO_CMD; #pragma pack() class CRKDevice { public: USHORT GetVendorID(); void SetVendorID(USHORT value); property VendorID; USHORT GetProductID(); void SetProductID(USHORT value); property ProductID; ENUM_RKDEVICE_TYPE GetDeviceType(); void SetDeviceType(ENUM_RKDEVICE_TYPE value); property DeviceType; ENUM_RKUSB_TYPE GetUsbType(); void SetUsbType(ENUM_RKUSB_TYPE value); property UsbType; char *GetLayerName(); void SetLayerName(char *value); property LayerName; DWORD GetLocationID(); void SetLocationID(DWORD value); property LocationID; USHORT GetBcdUsb(); void SetBcdUsb(USHORT value); property BcdUsb; ENUM_OS_TYPE GetOsType(); void SetOsType(ENUM_OS_TYPE value); property OsType; CRKLog *GetLogObjectPointer(); property LogObjectPointer; CRKComm *GetCommObjectPointer(); property CommObjectPointer; void SetCallBackPointer(ProgressPromptCB value); property CallBackPointer; int DownloadBoot(); bool TestDevice(); bool ResetDevice(); bool PowerOffDevice(); bool CheckChip(); bool GetFlashInfo(); int EraseAllBlocks(); bool SetObject(CRKImage *pImage, CRKComm *pComm, CRKLog *pLog); string GetLayerString(DWORD dwLocationID); CRKDevice(STRUCT_RKDEVICE_DESC &device); ~CRKDevice(); protected: STRUCT_FLASH_INFO m_flashInfo; PBYTE m_pFlashInfoData; USHORT m_usFlashInfoDataOffset; USHORT m_usFlashInfoDataLen; PBYTE m_chipData; CRKImage *m_pImage; CRKComm *m_pComm; CRKLog *m_pLog; ProgressPromptCB m_callBackProc; bool m_bEmmc; bool m_bDirectLba; bool m_bFirst4mAccess; int EraseEmmcBlock(UCHAR ucFlashCS, DWORD dwPos, DWORD dwCount); int EraseEmmcByWriteLBA(DWORD dwSectorPos, DWORD dwCount); bool EraseEmmc(); bool Boot_VendorRequest(DWORD requestCode, PBYTE pBuffer, DWORD dwDataSize); bool ReadCapability(); private: USHORT m_vid; USHORT m_pid; ENUM_RKDEVICE_TYPE m_device; ENUM_OS_TYPE m_os; ENUM_RKUSB_TYPE m_usb; UINT m_locationID; USHORT m_bcdUsb; protected: char m_layerName[32]; }; #endif