194 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			194 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /* CH592 Flash-ROM & Data-Flash  */ | |||
|  | /* Website:  http://wch.cn       */ | |||
|  | /* Email:    tech@wch.cn         */ | |||
|  | /* Author:   W.ch 2020.06        */ | |||
|  | /* V1.0 FlashROM library for USER/BOOT */ | |||
|  | /* for the target in USER code area on the chip divided into USER code area and BOOT area */ | |||
|  | /* 用于具有用户代码区和引导区的芯片、操作目标为用户代码区的情况,
 | |||
|  |    可以在用户代码中被调用(IAP,擦写自身),也可以在引导代码中被调用(更新用户代码) */ | |||
|  | 
 | |||
|  | /* Flash-ROM feature:
 | |||
|  |      for store program code, support block erasing, dword and page writing, dword verifying, unit for Length is byte, | |||
|  |      minimal quantity for write or verify is one dword (4-bytes), | |||
|  |      256 bytes/page for writing, FLASH_ROM_WRITE support one dword or more dword writing, but multiple of 256 is the best, | |||
|  |      4KB (4096 bytes) bytes/block for erasing, so multiple of 4096 is the best */ | |||
|  | 
 | |||
|  | /* Data-Flash(EEPROM) feature:
 | |||
|  |      for store data, support block erasing, byte and page writing, byte reading, | |||
|  |      minimal quantity for write or read is one byte, | |||
|  |      256 bytes/page for writing, EEPROM_WRITE support one byte or more byte writing, but multiple of 256 is the best, | |||
|  |      0.25KB/4KB (256/4096 bytes) bytes/block for erasing, so multiple of 256 or 4096 is the best */ | |||
|  | 
 | |||
|  | 
 | |||
|  | #ifndef EEPROM_PAGE_SIZE
 | |||
|  | #define EEPROM_PAGE_SIZE    256                       // Flash-ROM & Data-Flash page size for writing
 | |||
|  | #define EEPROM_BLOCK_SIZE   4096                      // Flash-ROM & Data-Flash block size for erasing
 | |||
|  | #define EEPROM_MIN_ER_SIZE  EEPROM_PAGE_SIZE          // Data-Flash minimal size for erasing
 | |||
|  | //#define EEPROM_MIN_ER_SIZE  EEPROM_BLOCK_SIZE         // Flash-ROM  minimal size for erasing
 | |||
|  | #define EEPROM_MIN_WR_SIZE  1                         // Data-Flash minimal size for writing
 | |||
|  | #define EEPROM_MAX_SIZE     0x8000                    // Data-Flash maximum size, 32KB
 | |||
|  | #endif
 | |||
|  | #ifndef FLASH_MIN_WR_SIZE
 | |||
|  | #define FLASH_MIN_WR_SIZE   4                         // Flash-ROM minimal size for writing
 | |||
|  | #endif
 | |||
|  | #ifndef FLASH_ROM_MAX_SIZE
 | |||
|  | #define FLASH_ROM_MAX_SIZE  0x070000                  // Flash-ROM maximum program size, 448KB
 | |||
|  | #endif
 | |||
|  | 
 | |||
|  | #ifndef CMD_FLASH_ROM_SW_RESET
 | |||
|  | // CMD_* for caller from FlashROM or RAM, auto execute CMD_FLASH_ROM_SW_RESET before command
 | |||
|  | 
 | |||
|  | #define CMD_FLASH_ROM_START_IO	0x00		// start FlashROM I/O, without parameter
 | |||
|  | #define CMD_FLASH_ROM_SW_RESET	0x04		// software reset FlashROM, without parameter
 | |||
|  | #define CMD_GET_ROM_INFO		0x06		// get information from FlashROM, parameter @Address,Buffer
 | |||
|  | #define CMD_GET_UNIQUE_ID		0x07		// get 64 bit unique ID, parameter @Buffer
 | |||
|  | #define CMD_FLASH_ROM_PWR_DOWN	0x0D		// power-down FlashROM, without parameter
 | |||
|  | #define CMD_FLASH_ROM_PWR_UP	0x0C		// power-up FlashROM, without parameter
 | |||
|  | #define CMD_FLASH_ROM_LOCK		0x08		// lock(protect)/unlock FlashROM data block, return 0 if success, parameter @StartAddr
 | |||
|  | // StartAddr: 0=unlock all, 1=lock boot code, 3=lock all code and data
 | |||
|  | 
 | |||
|  | #define CMD_EEPROM_ERASE		0x09		// erase Data-Flash block, return 0 if success, parameter @StartAddr,Length
 | |||
|  | #define CMD_EEPROM_WRITE		0x0A		// write Data-Flash data block, return 0 if success, parameter @StartAddr,Buffer,Length
 | |||
|  | #define CMD_EEPROM_READ			0x0B		// read Data-Flash data block, parameter @StartAddr,Buffer,Length
 | |||
|  | #define CMD_FLASH_ROM_ERASE		0x01		// erase FlashROM block, return 0 if success, parameter @StartAddr,Length
 | |||
|  | #define CMD_FLASH_ROM_WRITE		0x02		// write FlashROM data block, minimal block is dword, return 0 if success, parameter @StartAddr,Buffer,Length
 | |||
|  | #define CMD_FLASH_ROM_VERIFY	0x03		// read FlashROM data block, minimal block is dword, return 0 if success, parameter @StartAddr,Buffer,Length
 | |||
|  | #endif
 | |||
|  | 
 | |||
|  | #define ROM_CFG_VERISON     0x7F010
 | |||
|  | #define DEF_CHIP_ID_CH592A  9               // QFN28
 | |||
|  | #define ROM_CFG_MAC_ADDR	0x7F018			// address for MAC address information
 | |||
|  | #define ROM_CFG_BOOT_INFO	0x7DFF8			// address for BOOT information
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   execute Flash/EEPROM command, caller from FlashROM or RAM | |||
|  |  * | |||
|  |  * @param   cmd         - CMD_* for caller from FlashROM or RAM. | |||
|  |  * @param   StartAddr   - Address of the data to be process. | |||
|  |  * @param   Buffer      - Pointer to the buffer where data should be process, Must in RAM and be aligned to 4 bytes. | |||
|  |  * @param   Length      - Size of data to be process, in bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | extern uint32_t FLASH_EEPROM_CMD( uint8_t cmd, uint32_t StartAddr, void *Buffer, uint32_t Length ); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   start FlashROM I/O | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define FLASH_ROM_START_IO( )                       FLASH_EEPROM_CMD( CMD_FLASH_ROM_START_IO, 0, NULL, 0 )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   software reset FlashROM | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define FLASH_ROM_SW_RESET( )                       FLASH_EEPROM_CMD( CMD_FLASH_ROM_SW_RESET, 0, NULL, 0 )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   get 6 bytes MAC address | |||
|  |  * | |||
|  |  * @param   Buffer      - Pointer to the buffer where data should be stored, Must in RAM and be aligned to 4 bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define GetMACAddress(Buffer)                       FLASH_EEPROM_CMD( CMD_GET_ROM_INFO, ROM_CFG_MAC_ADDR, Buffer, 0 )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   get 8 bytes BOOT information | |||
|  |  * | |||
|  |  * @param   Buffer      - Pointer to the buffer where data should be stored, Must in RAM and be aligned to 4 bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define GET_BOOT_INFO(Buffer)                       FLASH_EEPROM_CMD( CMD_GET_ROM_INFO, ROM_CFG_BOOT_INFO, Buffer, 0 )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   power-down FlashROM | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define FLASH_ROM_PWR_DOWN( )                       FLASH_EEPROM_CMD( CMD_FLASH_ROM_PWR_DOWN, 0, NULL, 0 )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   power-up FlashROM | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define FLASH_ROM_PWR_UP( )                         FLASH_EEPROM_CMD( CMD_FLASH_ROM_PWR_UP, 0, NULL, 0 )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   read Data-Flash data block | |||
|  |  * | |||
|  |  * @param   StartAddr   - Address of the data to be read. | |||
|  |  * @param   Buffer      - Pointer to the buffer where data should be stored, Must in RAM and be aligned to 4 bytes. | |||
|  |  * @param   Length      - Size of data to be read, in bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define EEPROM_READ(StartAddr,Buffer,Length)        FLASH_EEPROM_CMD( CMD_EEPROM_READ, StartAddr, Buffer, Length )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * | |||
|  |  * @param   StartAddr   - Address of the data to be erased. | |||
|  |  * @param   Length      - Size of data to be erased, in bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | __attribute__((always_inline)) RV_STATIC_INLINE uint32_t EEPROM_ERASE(uint32_t StartAddr, uint32_t Length) | |||
|  | { | |||
|  |     if(((*(uint32_t*)ROM_CFG_VERISON)&0xFF) == DEF_CHIP_ID_CH592A) | |||
|  |     { | |||
|  |         if(Length%EEPROM_BLOCK_SIZE) | |||
|  |         { | |||
|  |             while(1); | |||
|  |         } | |||
|  |     } | |||
|  |     return FLASH_EEPROM_CMD( CMD_EEPROM_ERASE, StartAddr, NULL, Length ); | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   write Data-Flash data block | |||
|  |  * | |||
|  |  * @param   StartAddr   - Address of the data to be written. | |||
|  |  * @param   Buffer      - Pointer to the source buffer, Must in RAM and be aligned to 4 bytes. | |||
|  |  * @param   Length      - Size of data to be written, in bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define EEPROM_WRITE(StartAddr,Buffer,Length)       FLASH_EEPROM_CMD( CMD_EEPROM_WRITE, StartAddr, Buffer, Length )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   erase FlashROM block | |||
|  |  * | |||
|  |  * @param   StartAddr   - Address of the data to be erased. | |||
|  |  * @param   Length      - Size of data to be erased, in bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define FLASH_ROM_ERASE(StartAddr,Length)           FLASH_EEPROM_CMD( CMD_FLASH_ROM_ERASE, StartAddr, NULL, Length )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   write FlashROM data block, minimal block is dword. | |||
|  |  * | |||
|  |  * @param   StartAddr   - Address of the data to be written. | |||
|  |  * @param   Buffer      - Pointer to the source buffer, Must in RAM and be aligned to 4 bytes. | |||
|  |  * @param   Length      - Size of data to be written, in bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define FLASH_ROM_WRITE(StartAddr,Buffer,Length)    FLASH_EEPROM_CMD( CMD_FLASH_ROM_WRITE, StartAddr, Buffer, Length )
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   verify FlashROM data block, minimal block is dword. | |||
|  |  * | |||
|  |  * @param   StartAddr   - Address of the data to verify. | |||
|  |  * @param   Buffer      - Pointer to the source buffer, Must in RAM and be aligned to 4 bytes. | |||
|  |  * @param   Length      - Size of data to verify, in bytes. | |||
|  |  * | |||
|  |  * @return  0-SUCCESS  (!0)-FAILURE | |||
|  |  */ | |||
|  | #define FLASH_ROM_VERIFY(StartAddr,Buffer,Length)   FLASH_EEPROM_CMD( CMD_FLASH_ROM_VERIFY, StartAddr, Buffer, Length )
 | |||
|  | 
 |