From 561d3bdb7a0fad220f18cced64e83b86a5b52476 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 25 Nov 2019 14:55:31 -0700 Subject: [PATCH] Enable Arduino Uno i2c debugging --- src/board/arduino/uno/battery.c | 47 +++++++++++++++++++ src/board/arduino/uno/i2c.c | 10 ++++ src/board/arduino/uno/include/board/battery.h | 6 +++ src/board/arduino/uno/include/board/i2c.h | 6 +++ src/board/arduino/uno/main.c | 20 ++++++++ src/board/system76/galp3-c/board.mk | 4 +- 6 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/board/arduino/uno/battery.c create mode 100644 src/board/arduino/uno/i2c.c create mode 100644 src/board/arduino/uno/include/board/battery.h create mode 100644 src/board/arduino/uno/include/board/i2c.h diff --git a/src/board/arduino/uno/battery.c b/src/board/arduino/uno/battery.c new file mode 100644 index 0000000..484cf29 --- /dev/null +++ b/src/board/arduino/uno/battery.c @@ -0,0 +1,47 @@ +#include + +#include + +int smbus_read(uint8_t address, uint8_t command, uint16_t * data) { + return i2c_get(address, command, (uint8_t *)data, 2); +} + +int smbus_write(uint8_t address, uint8_t command, uint16_t data) { + return i2c_set(address, command, (uint8_t *)&data, 2); +} + +void battery_debug(void) { + uint16_t data = 0; + int res = 0; + + #define command(N, A, V) { \ + printf(#N ": "); \ + res = smbus_read(A, V, &data); \ + if (res < 0) { \ + printf("ERROR %04X\n", -res); \ + } else { \ + printf("%04X\n", data); \ + } \ + } + + printf("Battery:\n"); + command(Temperature, 0x0B, 0x08); + command(Voltage, 0x0B, 0x09); + command(Current, 0x0B, 0x0A); + command(Charge, 0x0B, 0x0D); + + printf("Charger:\n"); + command(ChargeOption0, 0x09, 0x12); + command(ChargeOption1, 0x09, 0x3B); + command(ChargeOption2, 0x09, 0x38); + command(ChargeOption3, 0x09, 0x37); + command(ChargeCurrent, 0x09, 0x14); + command(ChargeVoltage, 0x09, 0x15); + command(DishargeCurrent, 0x09, 0x39); + command(InputCurrent, 0x09, 0x3F); + command(ProchotOption0, 0x09, 0x3C); + command(ProchotOption1, 0x09, 0x3D); + command(ProchotStatus, 0x09, 0x3A); + + #undef command +} diff --git a/src/board/arduino/uno/i2c.c b/src/board/arduino/uno/i2c.c new file mode 100644 index 0000000..4b30c65 --- /dev/null +++ b/src/board/arduino/uno/i2c.c @@ -0,0 +1,10 @@ +#include + +#include +#include + +void i2c_init(unsigned long baud) { + TWAR = 0; + TWBR = (uint8_t)(((F_CPU / baud) - 16 ) / 2); + TWCR = 0; +} diff --git a/src/board/arduino/uno/include/board/battery.h b/src/board/arduino/uno/include/board/battery.h new file mode 100644 index 0000000..935ddad --- /dev/null +++ b/src/board/arduino/uno/include/board/battery.h @@ -0,0 +1,6 @@ +#ifndef _BOARD_BATTERY_H +#define _BOARD_BATTERY_H + +void battery_debug(void); + +#endif // _BOARD_BATTERY_H diff --git a/src/board/arduino/uno/include/board/i2c.h b/src/board/arduino/uno/include/board/i2c.h new file mode 100644 index 0000000..450ca6c --- /dev/null +++ b/src/board/arduino/uno/include/board/i2c.h @@ -0,0 +1,6 @@ +#ifndef _BOARD_I2C_H +#define _BOARD_I2C_H + +void i2c_init(unsigned long baud); + +#endif // _BOARD_I2C_H diff --git a/src/board/arduino/uno/main.c b/src/board/arduino/uno/main.c index c5c2533..8b5aaff 100644 --- a/src/board/arduino/uno/main.c +++ b/src/board/arduino/uno/main.c @@ -1,10 +1,24 @@ #include #include +#include #include +#include +#include void init(void) { uart_stdio_init(0, __CONSOLE_BAUD__); + i2c_init(50000); +} + +static void i2c_slave_new() {} + +static void i2c_slave_recv(uint8_t data) { + printf("%c", data); +} + +static uint8_t i2c_slave_send() { + return 0; } struct Gpio LED = GPIO(B, 5); @@ -15,10 +29,16 @@ int main(void) { gpio_set_dir(&LED, true); gpio_set(&LED, false); printf("Hello from System76 EC for the Arduino Uno!\n"); + + battery_debug(); + for (;;) { + i2c_slave_init(0x76, i2c_slave_new, i2c_slave_recv, i2c_slave_send); int c = getchar(); + i2c_slave_stop(); if (c == '\r') { putchar('\n'); + battery_debug(); } else if (c > 0) { putchar(c); } diff --git a/src/board/system76/galp3-c/board.mk b/src/board/system76/galp3-c/board.mk index 1e946d6..6c874ae 100644 --- a/src/board/system76/galp3-c/board.mk +++ b/src/board/system76/galp3-c/board.mk @@ -10,10 +10,10 @@ INCLUDE+=$(wildcard $(BOARD_DIR)/keymap/*.h) # 3 - INFO # 4 - DEBUG # 5 - TRACE -CFLAGS+=-DLEVEL=2 +CFLAGS+=-DLEVEL=4 # Enable I2C debug on 0x76 -#CFLAGS+=-DI2C_DEBUGGER=0x76 +CFLAGS+=-DI2C_DEBUGGER=0x76 # Add scratch ROM source SCRATCH_DIR=$(BOARD_DIR)/scratch