diff --git a/firmware/masterchip/spi_proto.c b/firmware/masterchip/spi_proto.c deleted file mode 100644 index 923c5ad..0000000 --- a/firmware/masterchip/spi_proto.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "spi_proto.h" -#include "spi.h" - -uint8_t read[2]; -uint8_t write[4]; - -void talk_to_slave(uint8_t opcode, uint8_t addr, uint8_t flags) -{ - write[0] = opcode; - write[1] = addr; - spi_mst_start_packet(); - spi_mst_write(wlen, flags & SPI_WRITE_DATA? 4 : 2); - spi_mst_read(rlen, flags & SPI_READ_DATA? 2 : 0); - spi_mst_end_packet(); -} - -uint16_t speak_raw(uint8_t opcode, uint8_t number, uint8_t flags, uint16_t value) -{ - write[2] = value >> 8; - write[3] = value & 0xff; - talk_to_slave(opcode, number, flags); - return (read[0] << 8) | read[1]; -} - -uint8_t spi_proto_needs(uint8_t opcode) -{ - uint8_t r = SPI_NONE; - switch(opcode) - { - case 1: case 2: case 3: - r = SPI_READ_DATA; - break; - case 4: case 5: - r = SPI_WRITE_DATA; - break; - } - return r; -} - - -uint16_t read_temperature(uint8_t number) -{ - talk_to_slave(1, number, SPI_READ_DATA); - return (read[0] << 8) | read[1]; -} - -uint8_t read_var8(uint8_t number) -{ - talk_to_slave(2, number, SPI_READ_DATA); - return read[1]; -} - -uint16_t read_var16(uint8_t number) -{ - talk_to_slave(3, number, SPI_READ_DATA); - return (read[0] << 8) | read[1]; -} - -void write_var8(uint8_t number, uint8_t value) -{ - write[2] = 0; - write[3] = number; - talk_to_slave(4, number, SPI_WRITE_DATA); -} - -void write_var16(uint8_t number, uint16_t value) -{ - write[2] = value >> 8; - write[3] = value & 0xff; - talk_to_slave(5, number, SPI_WRITE_DATA); -} - -void call_func(uint8_t number) -{ - talk_to_slave(6, number, SPI_NONE); -} diff --git a/firmware/masterchip/spi_proto.c b/firmware/masterchip/spi_proto.c new file mode 120000 index 0000000..a86d415 --- /dev/null +++ b/firmware/masterchip/spi_proto.c @@ -0,0 +1 @@ +../shared/spi_proto.c \ No newline at end of file diff --git a/firmware/masterchip/spi_proto.h b/firmware/masterchip/spi_proto.h deleted file mode 100644 index b425693..0000000 --- a/firmware/masterchip/spi_proto.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef SPI_PROTO_H -#define SPI_PROTO_H - -#include - -#define SPI_WRITE_DATA 0x01 -#define SPI_READ_DATA 0x10 -#define SPI_NONE 0 - -uint16_t speak_raw(uint8_t opcode, uint8_t number, uint8_t flags, uint16_t data); - -uint8_t spi_proto_needs(uint8_t opcode); - -uint16_t read_temperature(uint8_t number); -uint8_t read_var8(uint8_t number); -uint16_t read_var16(uint8_t number); -void write_var8(uint8_t number, uint8_t value); -void write_var16(uint8_t number, uint16_t value); -void call_func(uint8_t number); - -#endif diff --git a/firmware/masterchip/spi_proto.h b/firmware/masterchip/spi_proto.h new file mode 120000 index 0000000..8d40308 --- /dev/null +++ b/firmware/masterchip/spi_proto.h @@ -0,0 +1 @@ +../shared/spi_proto.h \ No newline at end of file diff --git a/firmware/shared/spi_proto.c b/firmware/shared/spi_proto.c new file mode 100644 index 0000000..eb67db8 --- /dev/null +++ b/firmware/shared/spi_proto.c @@ -0,0 +1,114 @@ +#include "spi_proto.h" +#include "spi.h" + +/***** MASTER *****/ + +uint8_t read_data[2]; +uint8_t write_data[4]; + +void talk_to_slave(uint8_t opcode, uint8_t addr, uint8_t flags) +{ + write_data[0] = opcode; + write_data[1] = addr; + spi_mst_start_packet(); + spi_mst_write(flags & SPI_WRITE_DATA? 4 : 2, write_data); + spi_mst_read(flags & SPI_READ_DATA? 2 : 0, read_data); + spi_mst_end_packet(); +} + +uint16_t speak_raw(uint8_t opcode, uint8_t number, uint8_t flags, uint16_t value) +{ + write_data[2] = value >> 8; + write_data[3] = value & 0xff; + talk_to_slave(opcode, number, flags); + return (read_data[0] << 8) | read_data[1]; +} + +uint8_t spi_proto_needs(uint8_t opcode) +{ + uint8_t r = SPI_NONE; + switch(opcode) + { + case 1: case 2: case 3: + r = SPI_READ_DATA; + break; + case 4: case 5: + r = SPI_WRITE_DATA; + break; + } + return r; +} + + +uint16_t read_temperature(uint8_t number) +{ + talk_to_slave(1, number, SPI_READ_DATA); + return (read_data[0] << 8) | read_data[1]; +} + +uint8_t read_var8(uint8_t number) +{ + talk_to_slave(2, number, SPI_READ_DATA); + return read_data[1]; +} + +uint16_t read_var16(uint8_t number) +{ + talk_to_slave(3, number, SPI_READ_DATA); + return (read_data[0] << 8) | read_data[1]; +} + +void write_var8(uint8_t number, uint8_t value) +{ + write_data[2] = 0; + write_data[3] = number; + talk_to_slave(4, number, SPI_WRITE_DATA); +} + +void write_var16(uint8_t number, uint16_t value) +{ + write_data[2] = value >> 8; + write_data[3] = value & 0xff; + talk_to_slave(5, number, SPI_WRITE_DATA); +} + +void call_func(uint8_t number) +{ + talk_to_slave(6, number, SPI_NONE); +} + + +/***** MASTER END *****/ +/***** SLAVE *****/ + + +uint8_t spi_proto_needswrite(uint8_t opcode) { + if(opcode == 4 || opcode == 5) return 1; + return 0; +} + +uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr) { + if(opcode == 4) { + return (uint16_t) (*spi_proto_globals8[addr]); + } else if(opcode == 5) { + return (*spi_proto_globals16[addr]); + } else { + return 0xFFFF; + } + +} + +void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data) { + if(opcode == 2) { + *spi_proto_globals8[addr] = (uint8_t) data; + } else if(opcode == 3) { + *spi_proto_globals16[addr] = data; + } else if (opcode == 6) { + funptr_t func = spi_proto_funcs[addr]; + (*func)(); + } else { + // boom + } +} + +/***** SLAVE END *****/ diff --git a/firmware/shared/spi_proto.h b/firmware/shared/spi_proto.h new file mode 100644 index 0000000..7ff1be8 --- /dev/null +++ b/firmware/shared/spi_proto.h @@ -0,0 +1,38 @@ +#ifndef SPI_PROTO_H +#define SPI_PROTO_H + +#include + +/***** MASTER *****/ + +#define SPI_WRITE_DATA 0x01 +#define SPI_READ_DATA 0x10 +#define SPI_NONE 0 + +uint16_t speak_raw(uint8_t opcode, uint8_t number, uint8_t flags, uint16_t data); + +uint8_t spi_proto_needs(uint8_t opcode); + +uint16_t read_temperature(uint8_t number); +uint8_t read_var8(uint8_t number); +uint16_t read_var16(uint8_t number); +void write_var8(uint8_t number, uint8_t value); +void write_var16(uint8_t number, uint16_t value); +void call_func(uint8_t number); + +/***** MASTER END *****/ +/***** SLAVE *****/ + +typedef void(*funptr_t)(); + +extern uint16_t *spi_proto_globals8[]; +extern uint8_t *spi_proto_globals16[]; +extern funptr_t spi_proto_funcs[]; + +uint8_t spi_proto_needswrite(uint8_t opcode); +uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr); +void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data); + +/***** SLAVE END *****/ + +#endif diff --git a/firmware/slavechip/spi_proto.c b/firmware/slavechip/spi_proto.c deleted file mode 100644 index 2169d1e..0000000 --- a/firmware/slavechip/spi_proto.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "spi_proto.h" - - -uint16_t *spi_proto_globals8[] = { - &foo - }; -uint8_t *spi_proto_globals16[] = { - &bar - }; -funptr_t spi_proto_funcs[] = { - &baz - }; - - - - -uint8_t spi_proto_needswrite(uint8_t opcode) { - if(opcode == 4 || opcode == 5) return 1; - return 0; -} - -uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr) { - if(opcode == 4) { - return (uint16_t) (*spi_proto_globals8[addr]); - } else if(opcode == 5) { - return (*spi_proto_globals16[addr]); - } else { - return 0xFFFF; - } - -} - -void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data) { - if(opcode == 2) { - *spi_proto_globals8[addr] = (uint8_t) data; - } else if(opcode == 3) { - *spi_proto_globals16[addr] = data; - } else if (opcode == 6) { - funptr_t func = spi_proto_funcs[addr]; - (*func)(); - } else { - // boom - } -} diff --git a/firmware/slavechip/spi_proto.c b/firmware/slavechip/spi_proto.c new file mode 120000 index 0000000..a86d415 --- /dev/null +++ b/firmware/slavechip/spi_proto.c @@ -0,0 +1 @@ +../shared/spi_proto.c \ No newline at end of file diff --git a/firmware/slavechip/spi_proto.h b/firmware/slavechip/spi_proto.h deleted file mode 100644 index e57f691..0000000 --- a/firmware/slavechip/spi_proto.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __SPIPROTO_H -#define __SPIPROTO_H - -#include -#include "main.h" - -typedef void(*funptr_t)(); - - -extern uint16_t *spi_proto_globals8[]; -extern uint8_t *spi_proto_globals16[]; -extern funptr_t spi_proto_funcs[]; - -uint8_t spi_proto_needswrite(uint8_t opcode); -uint16_t spi_proto_handlewrite(uint8_t opcode, uint8_t addr); -void spi_proto_handleread(uint8_t opcode, uint8_t addr, uint16_t data); - -#endif diff --git a/firmware/slavechip/spi_proto.h b/firmware/slavechip/spi_proto.h new file mode 120000 index 0000000..8d40308 --- /dev/null +++ b/firmware/slavechip/spi_proto.h @@ -0,0 +1 @@ +../shared/spi_proto.h \ No newline at end of file