Reorganize to allow compiling and running AVR firmware
This commit is contained in:
parent
608326af30
commit
b04352cb63
3
Makefile
3
Makefile
@ -1,5 +1,6 @@
|
||||
# Parameter for current board
|
||||
BOARD?=galp3-c
|
||||
#BOARD?=system76/galp3-c
|
||||
BOARD?=arduino/atmega2560
|
||||
|
||||
# Set build directory
|
||||
BUILD=build/$(BOARD)
|
||||
|
5
doc/README.md
Normal file
5
doc/README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# System76 EC documetation
|
||||
|
||||
## TODO
|
||||
|
||||
- Define what functions are required in each board, ec, and arch
|
@ -9,12 +9,12 @@ sim: $(BUILD)/ec.rom
|
||||
--no-default-features \
|
||||
-- $<
|
||||
|
||||
# Convert from Intel Hex format to binary
|
||||
# Convert from Intel Hex file to binary file
|
||||
$(BUILD)/ec.rom: $(BUILD)/ec.ihx
|
||||
@mkdir -p $(@D)
|
||||
makebin -p < $< > $@
|
||||
|
||||
# Link object files into Intel Hex format
|
||||
# Link object files into Intel Hex file
|
||||
$(BUILD)/ec.ihx: $(OBJ)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) -o $@ $^
|
||||
|
26
src/arch/avr/arch.mk
Normal file
26
src/arch/avr/arch.mk
Normal file
@ -0,0 +1,26 @@
|
||||
CC=avr-gcc -mmcu=$(EC)
|
||||
OBJ=$(patsubst src/%.c,$(BUILD)/%.o,$(SRC))
|
||||
|
||||
# Run EC rom in simulator
|
||||
sim: $(BUILD)/ec.elf
|
||||
simavr $< --mcu $(EC)
|
||||
|
||||
# Convert from Intel Hex file to binary file
|
||||
$(BUILD)/ec.rom: $(BUILD)/ec.ihx
|
||||
@mkdir -p $(@D)
|
||||
makebin -p < $< > $@
|
||||
|
||||
# Convert from ELF file to Intel Hex file
|
||||
$(BUILD)/ec.ihx: $(OBJ)
|
||||
@mkdir -p $(@D)
|
||||
avr-objcopy -j .text -j .data -O ihex $< $@
|
||||
|
||||
# Link object files into ELF file
|
||||
$(BUILD)/ec.elf: $(OBJ)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) -o $@ $^
|
||||
|
||||
# Compile C files into object files
|
||||
$(BUILD)/%.o: src/%.c $(INCLUDE)
|
||||
@mkdir -p $(@D)
|
||||
$(CC) -o $@ -c $<
|
1
src/board/arduino/atmega2560/board.mk
Normal file
1
src/board/arduino/atmega2560/board.mk
Normal file
@ -0,0 +1 @@
|
||||
EC=atmega2560
|
6
src/board/arduino/atmega2560/include/cpu.h
Normal file
6
src/board/arduino/atmega2560/include/cpu.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef CPU_H
|
||||
#define CPU_H
|
||||
|
||||
#define F_CPU 16000000ULL
|
||||
|
||||
#endif // CPU_H
|
7
src/board/arduino/atmega2560/include/stdio.h
Normal file
7
src/board/arduino/atmega2560/include/stdio.h
Normal file
@ -0,0 +1,7 @@
|
||||
#ifndef STDIO_H
|
||||
#define STDIO_H
|
||||
|
||||
extern struct Uart * stdio_uart;
|
||||
void stdio_init(int num, unsigned long baud);
|
||||
|
||||
#endif // STDIO_H
|
31
src/board/arduino/atmega2560/include/uart.h
Normal file
31
src/board/arduino/atmega2560/include/uart.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef UART_H
|
||||
#define UART_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct Uart {
|
||||
volatile uint8_t * a;
|
||||
volatile uint8_t * b;
|
||||
volatile uint8_t * c;
|
||||
volatile uint8_t * data;
|
||||
volatile uint8_t * baud_l;
|
||||
volatile uint8_t * baud_h;
|
||||
uint8_t a_read;
|
||||
uint8_t a_write;
|
||||
uint8_t a_init;
|
||||
uint8_t b_init;
|
||||
uint8_t c_init;
|
||||
};
|
||||
|
||||
void uart_init(struct Uart * uart, unsigned long baud);
|
||||
|
||||
int uart_count();
|
||||
struct Uart * uart_new(int num);
|
||||
|
||||
unsigned char uart_can_read(struct Uart * uart);
|
||||
unsigned char uart_can_write(struct Uart * uart);
|
||||
|
||||
unsigned char uart_read(struct Uart * uart);
|
||||
void uart_write(struct Uart * uart, unsigned char data);
|
||||
|
||||
#endif // UART_H
|
14
src/board/arduino/atmega2560/main.c
Normal file
14
src/board/arduino/atmega2560/main.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "include/stdio.h"
|
||||
|
||||
void init(void) {
|
||||
stdio_init(0, 9600);
|
||||
}
|
||||
|
||||
void main(void) {
|
||||
init();
|
||||
|
||||
printf("Hello from System76 EC for the Arduino Mega 2560!\n");
|
||||
for (;;) {}
|
||||
}
|
29
src/board/arduino/atmega2560/stdio.c
Normal file
29
src/board/arduino/atmega2560/stdio.c
Normal file
@ -0,0 +1,29 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "include/stdio.h"
|
||||
#include "include/uart.h"
|
||||
|
||||
struct Uart * stdio_uart = NULL;
|
||||
|
||||
int stdio_get(FILE * stream) {
|
||||
return (int)uart_read(stdio_uart);
|
||||
}
|
||||
|
||||
int stdio_put(char data, FILE * stream) {
|
||||
if (data == '\n') {
|
||||
uart_write(stdio_uart, '\r');
|
||||
}
|
||||
uart_write(stdio_uart, (unsigned char)data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
FILE stdio_file = FDEV_SETUP_STREAM(stdio_put, stdio_get, _FDEV_SETUP_RW);
|
||||
|
||||
void stdio_init(int num, unsigned long baud) {
|
||||
struct Uart * uart = uart_new(num);
|
||||
if(uart != NULL) {
|
||||
uart_init(uart, baud);
|
||||
stdio_uart = uart;
|
||||
stdin = stdout = stderr = &stdio_file;
|
||||
}
|
||||
}
|
74
src/board/arduino/atmega2560/uart.c
Normal file
74
src/board/arduino/atmega2560/uart.c
Normal file
@ -0,0 +1,74 @@
|
||||
#include <stdio.h>
|
||||
#include <avr/io.h>
|
||||
|
||||
#include "include/cpu.h"
|
||||
#include "include/uart.h"
|
||||
|
||||
#define UART(N) \
|
||||
{ \
|
||||
&UCSR ## N ## A, \
|
||||
&UCSR ## N ## B, \
|
||||
&UCSR ## N ## C, \
|
||||
&UDR ## N, \
|
||||
&UBRR ## N ## L, \
|
||||
&UBRR ## N ## H, \
|
||||
_BV(RXC ## N), \
|
||||
_BV(UDRE ## N), \
|
||||
0, \
|
||||
_BV(RXEN ## N) | _BV(TXEN ## N), \
|
||||
_BV(UCSZ ## N ## 1) | _BV(UCSZ ## N ## 0) \
|
||||
}
|
||||
|
||||
#if defined(__AVR_ATmega32U4__)
|
||||
static struct Uart UARTS[] = {
|
||||
UART(1)
|
||||
};
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
static struct Uart UARTS[] = {
|
||||
UART(0),
|
||||
UART(1),
|
||||
UART(2),
|
||||
UART(3)
|
||||
};
|
||||
#else
|
||||
#error "Could not find UART definitions"
|
||||
#endif
|
||||
|
||||
int uart_count() {
|
||||
return sizeof(UARTS)/sizeof(struct Uart);
|
||||
}
|
||||
|
||||
struct Uart * uart_new(int num) {
|
||||
if (num < uart_count()) {
|
||||
return &UARTS[num];
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void uart_init(struct Uart * uart, unsigned long baud) {
|
||||
unsigned long baud_prescale = (F_CPU / (baud * 16UL)) - 1;
|
||||
*(uart->baud_h) = (uint8_t)(baud_prescale>>8);
|
||||
*(uart->baud_l) = (uint8_t)(baud_prescale);
|
||||
*(uart->a) = uart->a_init;
|
||||
*(uart->b) = uart->b_init;
|
||||
*(uart->c) = uart->c_init;
|
||||
}
|
||||
|
||||
unsigned char uart_can_read(struct Uart * uart) {
|
||||
return (*(uart->a)) & uart->a_read;
|
||||
}
|
||||
|
||||
unsigned char uart_read(struct Uart * uart) {
|
||||
while (!uart_can_read(uart)) ;
|
||||
return *(uart->data);
|
||||
}
|
||||
|
||||
unsigned char uart_can_write(struct Uart * uart) {
|
||||
return (*(uart->a)) & uart->a_write;
|
||||
}
|
||||
|
||||
void uart_write(struct Uart * uart, unsigned char data) {
|
||||
while (!uart_can_write(uart)) ;
|
||||
*(uart->data) = data;
|
||||
}
|
1
src/ec/atmega2560/ec.mk
Normal file
1
src/ec/atmega2560/ec.mk
Normal file
@ -0,0 +1 @@
|
||||
ARCH=avr
|
Loading…
x
Reference in New Issue
Block a user