summaryrefslogtreecommitdiffstats
path: root/keyboards/lets_split/uno-slave
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2016-07-05 23:27:10 -0400
committerJack Humbert <jack.humb@gmail.com>2016-07-05 23:27:10 -0400
commitd707738616c140f8d9c8eded7b64e5fc806f4b24 (patch)
treef8aaebebb526903bb49283aa9fa53242c4bf793b /keyboards/lets_split/uno-slave
parent96f44e120295e677d21d3dbb9dc4bf642ba2af09 (diff)
i2c working
Diffstat (limited to 'keyboards/lets_split/uno-slave')
-rw-r--r--keyboards/lets_split/uno-slave/Makefile226
-rw-r--r--keyboards/lets_split/uno-slave/keyboard-i2c-slave.c42
-rw-r--r--keyboards/lets_split/uno-slave/readme.md1
-rw-r--r--keyboards/lets_split/uno-slave/uno-matrix.c160
-rw-r--r--keyboards/lets_split/uno-slave/uno-matrix.h19
5 files changed, 448 insertions, 0 deletions
diff --git a/keyboards/lets_split/uno-slave/Makefile b/keyboards/lets_split/uno-slave/Makefile
new file mode 100644
index 0000000000..84e67de113
--- /dev/null
+++ b/keyboards/lets_split/uno-slave/Makefile
@@ -0,0 +1,226 @@
+# Hey Emacs, this is a -*- makefile -*-
+
+# AVR-GCC Makefile template, derived from the WinAVR template (which
+# is public domain), believed to be neutral to any flavor of "make"
+# (GNU make, BSD make, SysV make)
+
+
+MCU = atmega328p
+FORMAT = ihex
+TARGET = keyboard-i2c-slave
+SRC = \
+ $(TARGET).c \
+ uno-matrix.c \
+ ../serial.c \
+ ../i2c-slave.c
+
+ASRC =
+OPT = s
+
+# Programming support using avrdude. Settings and variables.
+
+AVRDUDE_PROGRAMMER = arduino
+AVRDUDE_PORT = /dev/ttyACM0
+
+# Name of this Makefile (used for "make depend").
+MAKEFILE = Makefile
+
+# Debugging format.
+# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
+# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
+DEBUG = stabs
+
+# Compiler flag to set the C Standard level.
+# c89 - "ANSI" C
+# gnu89 - c89 plus GCC extensions
+# c99 - ISO C99 standard (not yet fully implemented)
+# gnu99 - c99 plus GCC extensions
+CSTANDARD = -std=gnu99
+
+# Place -D or -U options here
+CDEFS =
+
+# Place -I options here
+CINCS =
+
+
+CDEBUG = -g$(DEBUG)
+CWARN = -Wall -Wstrict-prototypes
+CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
+#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
+CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) \
+ -fno-aggressive-loop-optimizations
+
+#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
+
+
+#Additional libraries.
+
+# Minimalistic printf version
+PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
+
+# Floating point printf version (requires MATH_LIB = -lm below)
+PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
+
+PRINTF_LIB =
+
+# Minimalistic scanf version
+SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
+
+# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
+SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
+
+SCANF_LIB =
+
+MATH_LIB = -lm
+
+# External memory options
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# used for variables (.data/.bss) and heap (malloc()).
+#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# only used for heap (malloc()).
+#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
+
+EXTMEMOPTS =
+
+#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref
+LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
+
+
+AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level. Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+AVRDUDE_BASIC = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS = $(AVRDUDE_BASIC) $(AVRDUDE_NO_VERIFY) $(AVRDUDE_VERBOSE) $(AVRDUDE_ERASE_COUNTER)
+
+
+CC = avr-gcc
+OBJCOPY = avr-objcopy
+OBJDUMP = avr-objdump
+SIZE = avr-size
+NM = avr-nm
+AVRDUDE = avrdude
+REMOVE = rm -f
+MV = mv -f
+
+# Define all object files.
+OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
+
+# Define all listing files.
+LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
+ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+# Default target.
+all: build
+
+build: elf hex eep
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+eep: $(TARGET).eep
+lss: $(TARGET).lss
+sym: $(TARGET).sym
+
+
+# Program the device.
+program: $(TARGET).hex $(TARGET).eep
+ $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+
+# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
+COFFCONVERT=$(OBJCOPY) --debugging \
+--change-section-address .data-0x800000 \
+--change-section-address .bss-0x800000 \
+--change-section-address .noinit-0x800000 \
+--change-section-address .eeprom-0x810000
+
+
+coff: $(TARGET).elf
+ $(COFFCONVERT) -O coff-avr $(TARGET).elf $(TARGET).cof
+
+
+extcoff: $(TARGET).elf
+ $(COFFCONVERT) -O coff-ext-avr $(TARGET).elf $(TARGET).cof
+
+
+.SUFFIXES: .elf .hex .eep .lss .sym
+
+.elf.hex:
+ $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
+
+.elf.eep:
+ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+ --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
+
+# Create extended listing file from ELF output file.
+.elf.lss:
+ $(OBJDUMP) -h -S $< > $@
+
+# Create a symbol table from ELF output file.
+.elf.sym:
+ $(NM) -n $< > $@
+
+
+
+# Link: create ELF output file from object files.
+$(TARGET).elf: $(OBJ)
+ $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+.c.o:
+ $(CC) -c $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C source files.
+.c.s:
+ $(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+.S.o:
+ $(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+
+
+# Target: clean project.
+clean:
+ $(REMOVE) $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).elf \
+ $(TARGET).map $(TARGET).sym $(TARGET).lss \
+ $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d)
+
+depend:
+ if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \
+ then \
+ sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \
+ $(MAKEFILE).$$$$ && \
+ $(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \
+ fi
+ echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \
+ >> $(MAKEFILE); \
+ $(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) $(ASRC) >> $(MAKEFILE)
+
+.PHONY: all build elf hex eep lss sym program coff extcoff clean depend
diff --git a/keyboards/lets_split/uno-slave/keyboard-i2c-slave.c b/keyboards/lets_split/uno-slave/keyboard-i2c-slave.c
new file mode 100644
index 0000000000..2043e7b94f
--- /dev/null
+++ b/keyboards/lets_split/uno-slave/keyboard-i2c-slave.c
@@ -0,0 +1,42 @@
+#include "../i2c-slave.h"
+#include "../serial.h"
+#include "uno-matrix.h"
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+
+void setup(void) {
+ // give some time for noise to clear
+ _delay_us(1000);
+
+ // turn off arduino uno's led on pin 13
+ DDRB |= (1 << 5);
+ PORTB &= ~(1 << 5);
+
+ matrix_init();
+ /* i2c_slave_init(0x32); */
+ serial_slave_init();
+
+ /* serial_slave_buffer[0] = 0xa1; */
+ /* serial_slave_buffer[1] = 0x52; */
+ /* serial_slave_buffer[2] = 0xa2; */
+ /* serial_slave_buffer[3] = 0x67; */
+
+ // need interrupts for i2c slave code to work
+ sei();
+}
+
+void loop(void) {
+ matrix_scan();
+ for(int i=0; i<MATRIX_ROWS; ++i) {
+ slaveBuffer[i] = matrix_get_row(i);
+ serial_slave_buffer[i] = slaveBuffer[i];
+ }
+}
+
+int main(int argc, char *argv[]) {
+ setup();
+ while (1)
+ loop();
+}
diff --git a/keyboards/lets_split/uno-slave/readme.md b/keyboards/lets_split/uno-slave/readme.md
new file mode 100644
index 0000000000..d0f03126c3
--- /dev/null
+++ b/keyboards/lets_split/uno-slave/readme.md
@@ -0,0 +1 @@
+Code for Arduino uno (atmega328p) slave used for testing.
diff --git a/keyboards/lets_split/uno-slave/uno-matrix.c b/keyboards/lets_split/uno-slave/uno-matrix.c
new file mode 100644
index 0000000000..4ac3c33acd
--- /dev/null
+++ b/keyboards/lets_split/uno-slave/uno-matrix.c
@@ -0,0 +1,160 @@
+#define F_CPU 16000000UL
+
+#include <util/delay.h>
+#include <avr/io.h>
+#include <stdlib.h>
+
+#include "uno-matrix.h"
+
+#define debug(X) NULL
+#define debug_hex(X) NULL
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 5
+#endif
+
+static uint8_t debouncing = DEBOUNCE;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static matrix_row_t read_cols(void);
+static void init_cols(void);
+static void unselect_rows(void);
+static void select_row(uint8_t row);
+
+inline
+uint8_t matrix_rows(void)
+{
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+ return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+ //debug_enable = true;
+ //debug_matrix = true;
+ //debug_mouse = true;
+ // initialize row and col
+ unselect_rows();
+ init_cols();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+}
+
+uint8_t matrix_scan(void)
+{
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ select_row(i);
+ _delay_us(30); // without this wait read unstable value.
+ matrix_row_t cols = read_cols();
+ //Serial.println(cols, BIN);
+ if (matrix_debouncing[i] != cols) {
+ matrix_debouncing[i] = cols;
+ if (debouncing) {
+ debug("bounce!: "); debug_hex(debouncing); debug("\n");
+ }
+ debouncing = DEBOUNCE;
+ }
+ unselect_rows();
+ }
+
+ if (debouncing) {
+ if (--debouncing) {
+ _delay_ms(1);
+ } else {
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ matrix[i] = matrix_debouncing[i];
+ }
+ }
+ }
+
+ return 1;
+}
+
+bool matrix_is_modified(void)
+{
+ if (debouncing) return false;
+ return true;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+ return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+ return matrix[row];
+}
+
+// TODO update this comment
+/* Column pin configuration
+ * col: 0 1 2 3 4 5
+ * pin: D3 D4 D5 D6 D7 B0
+ */
+static void init_cols(void)
+{
+ // Input with pull-up(DDR:0, PORT:1)
+ DDRD &= ~(1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7);
+ PORTD |= (1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7);
+
+ DDRB &= ~(1<<0);
+ PORTB |= (1<<0);
+}
+
+static matrix_row_t read_cols(void)
+{
+ return (PIND&(1<<3) ? 0 : (1<<0)) |
+ (PIND&(1<<4) ? 0 : (1<<1)) |
+ (PIND&(1<<5) ? 0 : (1<<2)) |
+ (PIND&(1<<6) ? 0 : (1<<3)) |
+ (PIND&(1<<7) ? 0 : (1<<4)) |
+ (PINB&(1<<0) ? 0 : (1<<5));
+}
+
+/* Row pin configuration
+ * row: 0 1 2 3
+ * pin: C0 C1 C2 C3
+ */
+static void unselect_rows(void)
+{
+ // Hi-Z(DDR:0, PORT:0) to unselect
+ DDRC &= ~0xF;
+ PORTC &= ~0xF;
+}
+
+static void select_row(uint8_t row)
+{
+ // Output low(DDR:1, PORT:0) to select
+ switch (row) {
+ case 0:
+ DDRC |= (1<<0);
+ PORTC &= ~(1<<0);
+ break;
+ case 1:
+ DDRC |= (1<<1);
+ PORTC &= ~(1<<1);
+ break;
+ case 2:
+ DDRC |= (1<<2);
+ PORTC &= ~(1<<2);
+ break;
+ case 3:
+ DDRC |= (1<<3);
+ PORTC &= ~(1<<3);
+ break;
+ }
+}
diff --git a/keyboards/lets_split/uno-slave/uno-matrix.h b/keyboards/lets_split/uno-slave/uno-matrix.h
new file mode 100644
index 0000000000..c0f636f805
--- /dev/null
+++ b/keyboards/lets_split/uno-slave/uno-matrix.h
@@ -0,0 +1,19 @@
+#ifndef UNO_MATRIX
+#define UNO_MATRIX
+
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 6
+
+#include <stdbool.h>
+
+typedef uint8_t matrix_row_t;
+
+uint8_t matrix_rows(void);
+uint8_t matrix_cols(void);
+void matrix_init(void);
+uint8_t matrix_scan(void);
+bool matrix_is_modified(void);
+bool matrix_is_on(uint8_t row, uint8_t col);
+matrix_row_t matrix_get_row(uint8_t row);
+
+#endif