#ifndef CYIMG_H_ #define CYIMG_H_ #include #include //#ifdef __LITTLE_ENDIAN__ #define CYIMG_MAGIC ('C'|(((uint16_t)'Y')<<8)) //#else //#define CYIMG_MAGIC ((((uint16_t)'C')<<8)|'Y') //#endif #define CYIMG_R32(d) (((uint32_t)(d)[0]<<0)|((uint32_t)(d)[1]<<8)|((uint32_t)(d)[2]<<16)|((uint32_t)(d)[3]<<24)) #define CYIMG_IMAGECTL_EXECUTABLE_MASK (1<<0) #define CYIMG_IMAGECTL_EXECUTABLE_LSB ( 0) #define CYIMG_IMAGECTL_I2CROMSIZE_MASK (7<<1) #define CYIMG_IMAGECTL_I2CROMSIZE_LSB ( 1) #define CYIMG_IMAGECTL_SPISPEED_MASK (3<<4) #define CYIMG_IMAGECTL_SPISPEED_LSB ( 4) #define CYIMG_IMAGETYPE_REGULAR 0xB0 #define CYIMG_IMAGETYPE_USBIDS 0xB2 struct cyimg_section { uint32_t dLength; // in 32-bit units uint32_t dAddress; // aligned to 32 bits // data follows immediately after }; struct cyimg_hdr { uint16_t wSignature; uint8_t bImageCTL; // bit 0: executable? // bit 1..3: I2C EEPROM size // bit 4..5: SPI speed (10/20/30/reserved MHz) OR I2C speed (100/400/1000/reserved kHz) // bit 6..7: reserved (zero) uint8_t bImageType; // 0xB0: regular firmware image // 0xB2: firmware image with VID/PID in 1st section struct cyimg_section usb_info; // optional (see bImageType) }; struct cyimg_footer { struct cyimg_section entry; uint32_t dChecksum; }; #define CYIMG_CHECKSUM_INIT 0 static inline uint32_t cyimg_checksum_calc(uint32_t init, size_t length, const uint8_t* data) { uint32_t v = init; for (size_t i = 0; i < length; ++i) v += CYIMG_R32(&data[i]); return v; } // --- #define ELF_FX3_NOTE_NAME "FX3" #define ELF_FX3_NOTE_TYPE_IMAGECTLTYPE 1 #define ELF_FX3_NOTE_TYPE_USBVIDPID 2 #endif