From 0cc3435cdcd49d4b4e646ddb7e89d05d1a407795 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Thu, 27 Oct 2016 18:28:01 +0200 Subject: [PATCH] Added parts of the avr library --- software/AVR8/.clang_complete | 2 + software/AVR8/.gitignore | 3 + software/AVR8/Makefile | 59 ++++++++++++++ software/AVR8/main.c | 9 +++ software/AVR8/sss7.c | 143 ++++++++++++++++++++++++++++++++++ software/AVR8/sss7.h | 47 +++++++++++ 6 files changed, 263 insertions(+) create mode 100644 software/AVR8/.clang_complete create mode 100644 software/AVR8/.gitignore create mode 100644 software/AVR8/Makefile create mode 100644 software/AVR8/main.c create mode 100644 software/AVR8/sss7.c create mode 100644 software/AVR8/sss7.h diff --git a/software/AVR8/.clang_complete b/software/AVR8/.clang_complete new file mode 100644 index 0000000..a5f3d5c --- /dev/null +++ b/software/AVR8/.clang_complete @@ -0,0 +1,2 @@ +-I/usr/avr/include +-D__AVR_ATmega328__ diff --git a/software/AVR8/.gitignore b/software/AVR8/.gitignore new file mode 100644 index 0000000..a39790f --- /dev/null +++ b/software/AVR8/.gitignore @@ -0,0 +1,3 @@ +*.o +*.elf +*.hex diff --git a/software/AVR8/Makefile b/software/AVR8/Makefile new file mode 100644 index 0000000..bb6f1e7 --- /dev/null +++ b/software/AVR8/Makefile @@ -0,0 +1,59 @@ +AVRMCU ?= atmega8 +F_CPU ?= 16000000 +ISPPORT ?= /dev/ttyUSB0 + +VERSION = 0.1 + +HEADERS = +SRC = main.c +TARGET = sss7 +OBJDIR = bin + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size + +OBJ = $(SRC:%.c=$(OBJDIR)/$(AVRMCU)/%.o) + +CFLAGS = -Os -Wall -Wstrict-prototypes +CFLAGS += -ffunction-sections -fdata-sections +CFLAGS += -fshort-enums -fpack-struct -funsigned-char -funsigned-bitfields +CFLAGS += -mmcu=$(AVRMCU) -DF_CPU=$(F_CPU)UL -DVERSION=$(VERSION) + +LDFLAGS = -mmcu=$(AVRMCU) -Wl,--gc-sections + +all: start $(OBJDIR)/$(AVRMCU)/$(TARGET).hex size + @echo ":: Done !" + +start: + @echo "AS5043 demo version $(VERSION)" + @echo "==============================" + @echo ":: Building for $(AVRMCU)" + @echo ":: MCU operating frequency is $(F_CPU)Hz" + +$(OBJDIR)/$(AVRMCU)/%.o : %.c $(HEADERS) + @mkdir -p $$(dirname $@) + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/$(AVRMCU)/$(TARGET).elf : $(OBJ) + $(CC) $(LDFLAGS) $+ -o $@ + +$(OBJDIR)/$(AVRMCU)/$(TARGET).hex : $(OBJDIR)/$(AVRMCU)/$(TARGET).elf + $(OBJCOPY) -O ihex $< $@ + +size : $(OBJDIR)/$(AVRMCU)/$(TARGET).elf + @echo + @$(SIZE) --mcu=$(AVRMCU) -C $(OBJDIR)/$(AVRMCU)/$(TARGET).elf + @echo + +clean : + @rm -rf $(OBJDIR) + +flash : all + avrdude -c arduino \ + -p $(AVRMCU) -P $(ISPPORT) \ + -U flash:w:$(OBJDIR)/$(AVRMCU)/$(TARGET).hex + +test : flash + screen $(ISPPORT) 38400 diff --git a/software/AVR8/main.c b/software/AVR8/main.c new file mode 100644 index 0000000..b21ec5d --- /dev/null +++ b/software/AVR8/main.c @@ -0,0 +1,9 @@ + + +#include "sss7.h" + + +int main(void) { + + +} diff --git a/software/AVR8/sss7.c b/software/AVR8/sss7.c new file mode 100644 index 0000000..2d61fa7 --- /dev/null +++ b/software/AVR8/sss7.c @@ -0,0 +1,143 @@ +#include "sss7.h" + +#include +#include +#include + +volatile enum sss7State sss7_state; + +uint8_t sss7_rx_buffer[2][SSS7_PAYLOAD_SIZE]; +uint8_t sss7_rx_active_buffer; +uint8_t sss7_rx_pos; + +uint8_t sss7_tx_buffer[SSS7_PAYLOAD_SIZE]; +uint8_t sss7_tx_pos; +uint8_t sss7_tx_crc; +uint8_t sss7_tx_failed; +uint8_t sss7_tx_last_byte = 0; + +void sss7_init() { + sss7_state = SSS7_IDLE; + + sss7_rx_pos = 0; + sss7_rx_oldest_buffer = 0; + sss7_rx_active_buffer = 0; + + sss7_tx_pos = 0; + sss7_tx_crc = 0; + sss7_tx_failed = 0; +} + +inline uint8_t sss7_payload_crc(uint8_t buffer[SSS7_PAYLOAD_SIZE]) { + uint8_t crc = 0; + for(uint8_t i = 0; i < SSS7_PAYLOAD_SIZE; i++) { + crc = _crc_ibutton_update(crc, buffer[i]); + } + return crc; +} + +void sss7_send(uint8_t msg[SSS7_PAYLOAD_SIZE]) { + // Check that we can send, because we will overwritte the buffer + if(sss7_state != SSS7_IDLE) { + sss7_tx_failed = 1; + return; + } + + memcpy(sss7_tx_buffer, msg, SSS7_PAYLOAD_SIZE); + + sss7_tx_pos = 0; + sss7_tx_crc = sss7_payload_crc(sss7_tx_buffer); + + // Commit to send state + sss7_state = SSS7_TX_HEADER; + uart_sent_byte(SSS7_HEADER[0]); +} + +void sss7_receive_byte() { + uint8_t byte = uart_get_byte(); + uint8_t crc = 0; + + switch(sss7_state) { + case SSS7_IDLE: + if(byte == SSS7_HEADER[0]) { + sss7_state = SSS7_RX_HEADER; + } + else { + sss7_state = SSS7_IDLE; + } + break; + + case SSS7_RX_HEADER: + if(byte == SSS7_HEADER[1]) { + sss7_state = SSS7_RX_PAYLOAD; + sss7_rx_pos = 0; + } + else { + sss7_state = SSS7_IDLE; + } + break; + + case SSS7_RX_PAYLOAD: + sss7_rx_buffer[sss7_rx_active_buffer][sss7_rx_pos] = byte; + sss7_rx_pos++; + if(sss7_rx_pos >= SSS7_PAYLOAD_SIZE) { + sss7_state = SSS7_RX_CRC; + } + break; + + case SSS7_RX_CRC: + crc = sss7_payload_crc(sss7_rx_buffer[sss7_rx_active_buffer]); + if(byte == crc) { + sss7_rx_active_buffer = (sss7_rx_active_buffer + 1); + } + sss7_state = SSS7_IDLE; + break; + + // all the TX states + default: + if(byte != sss7_tx_last_byte) { + sss7_state = SSS7_IDLE; + sss7_tx_failed = 1; + } + break; + } +} + +void sss7_transmit_byte() { + uint8_t byte; + switch(sss7_state) { + case SSS7_TX_HEADER: + uart_sent_byte(SSS7_HEADER[1]); + sss7_state = SSS7_TX_PAYLOAD; + sss7_tx_pos = 0; + break; + + case SSS7_TX_PAYLOAD: + byte = sss7_tx_buffer[sss7_tx_pos]; + uart_sent_byte(byte); + sss7_tx_last_byte = byte; + sss7_tx_pos++; + + if(sss7_tx_pos >= SSS7_PAYLOAD_SIZE) { + sss7_state = SSS7_TX_CRC; + } + break; + + case SSS7_TX_CRC: + uart_sent_byte(sss7_tx_crc); + sss7_tx_last_byte = sss7_tx_crc; + sss7_state = SSS7_IDLE; + break; + + //All the RX states + default: + break; + } +} + +void sss7_get_received(uint8_t msg[SSS7_PAYLOAD_SIZE]) { + if(sss7_has_received()) { + memcpy(msg, sss7_rx_buffer[sss7_rx_oldest_buffer], SSS7_PAYLOAD_SIZE); + sss7_rx_oldest_buffer++; + }; +} diff --git a/software/AVR8/sss7.h b/software/AVR8/sss7.h new file mode 100644 index 0000000..e7b808c --- /dev/null +++ b/software/AVR8/sss7.h @@ -0,0 +1,47 @@ +#ifndef _SSS7_H_ +#define _SSS7_H_ + +#include "stdint.h" + +enum sss7State { + SSS7_IDLE, + SSS7_TX_HEADER, + SSS7_TX_PAYLOAD, + SSS7_TX_CRC, + + SSS7_RX_HEADER, + SSS7_RX_PAYLOAD, + SSS7_RX_CRC +}; + +const uint8_t SSS7_HEADER[] = {0xAA, 0xFE}; + +#define SSS7_PAYLOAD_SIZE 16 +#define SSS7_RX_BUFFER_COUNT 2 + +extern volatile enum sss7State sss7_state; +extern uint8_t sss7_tx_failed; +extern uint8_t sss7_rx_active_buffer; +extern uint8_t sss7_rx_oldest_buffer; + +void sss7_init(); + +static inline uint8_t sss7_can_send() { + return sss7_state == SSS7_IDLE; +} + +void sss7_send(uint8_t msg[SSS7_PAYLOAD_SIZE]); + +static inline uint8_t sss7_send_failed() { + return sss7_state != SSS7_IDLE && sss7_tx_failed; +} + +static inline uint8_t sss7_has_received() { + return sss7_rx_oldest_buffer < sss7_rx_active_buffer; +} + + + +void sss7_get_received(uint8_t msg[SSS7_PAYLOAD_SIZE]); + +#endif