fx3tool/cyimg.h

74 lines
1.6 KiB
C

#ifndef CYIMG_H_
#define CYIMG_H_
#include <stddef.h>
#include <stdint.h>
//#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