Serial Flasher Protocol Specification - version 1 (0x01 return value == 1) Command And Answer Sequence - not all commands give an answer PC: COMMAND(8bit) DEV: ACK/NAK(8bit) or nothing ACK = 0x10 NAK = 0xBA All multibyte values are little-endian. COMMAND Description Parameters Return Value 0x00 NOP (to synchronize) none NAK + ACK (a special sequence for easier sync) 0x01 Query programmer iface version none ACK + 16bit version (nonzero) 0x02 Query supported commands bitmap none ACK + 32 bytes (256 bits) of supported cmds flags eg. cmd 0 support: byte 0 bit 0 cmd 1 support: byte 0 bit 1 cmd 7 support: byte 0 bit 7 cmd 8 support: byte 1 bit 0 0x03 Query programmer name none ACK + 16 bytes string (null padding) / NAK 0x04 Query serial buffer size none ACK + 16bit size / NAK 0x05 Query supported bustypes none ACK + 8-bit flags (as per flashrom) / NAK bit 0: PARALLEL bit 1: LPC bit 2: FWH bit 3: SPI if ever supported 0x06 Query supported chip size none ACK + 8bit power of two / NAK 0x07 Query operation buffer size none ACK + 16bit size / NAK 0x08 Query write-n maximum data len none ACK + 24bit maximum length / NAK 0x00 Read byte 24-bit addr ACK + BYTE / NAK 0x0A Read n bytes 24-bit addr + 24-bit length ACK + length bytes / NAK 0x0B Initialize operation buffer none ACK / NAK 0x0C Write to opbuf: Write byte 24-bit addr + 8-bit byte ACK / NAK (NOTE: takes 6 bytes in opbuf) 0x0D Write to opbuf: Write n 24-bit length + 24-bit addr + ACK / NAK (NOTE: takes 7+n bytes in opbuf) + length bytes of data 0x0E Write to opbuf: delay 32-bit usecs ACK / NAK (NOTE: takes 5 bytes in opbuf) 0x0F Execute operation buffer none ACK / NAK - Execute operation buffer will also clear it, regardless of the return value 0x?? unimplemented command - dont do, dangerous, check for support with 0x02 before using any opcode exept 0x00, 0x01 and 0x02. if 0x01 doesn't return 1, dont do anything if you dont support a newer protocol. This define listing should help C coders - (it's here to be the single source for copying - will be a .h someday i think) #define S_ACK 0x10 #define S_NAK 0xBA #define S_CMD_SYNCNOP 0x00 /* No operation */ #define S_CMD_Q_IFACE 0x01 /* Query interface version */ #define S_CMD_Q_CMDMAP 0x02 /* Query supported commands bitmap */ #define S_CMD_Q_PGMNAME 0x03 /* Query programmer name */ #define S_CMD_Q_SERBUF 0x04 /* Query Serial Buffer Size */ #define S_CMD_Q_BUSTYPE 0x05 /* Query supported bustypes */ #define S_CMD_Q_CHIPSIZE 0x06 /* Query supported chipsize (2^n format) */ #define S_CMD_Q_OPBUF 0x07 /* Query operation buffer size */ #define S_CMD_Q_WRNMAXLEN 0x08 /* Query Write to opbuf: Write-N maximum lenght */ #define S_CMD_R_BYTE 0x09 /* Read a single byte */ #define S_CMD_R_NBYTES 0x0A /* Read n bytes */ #define S_CMD_O_INIT 0x0B /* Initialize operation buffer */ #define S_CMD_O_WRITEB 0x0C /* Write opbuf: Write byte with address */ #define S_CMD_O_WRITEN 0x0D /* Write to opbuf: Write-N */ #define S_CMD_O_DELAY 0x0E /* Write opbuf: udelay */ #define S_CMD_O_EXEC 0x0F /* Execute operation buffer */