Changed some pins and added I2C support

This commit is contained in:
Dreaded_X 2021-01-07 03:44:13 +01:00
parent 827bcdb386
commit c1c9774db7
7 changed files with 42 additions and 28 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "libs/avr-i2c-slave"]
path = libs/avr-i2c-slave
url = https://github.com/thegouger/avr-i2c-slave

View File

@ -1,20 +1,23 @@
OBJCOPY = avr-objcopy OBJCOPY = avr-objcopy
CC = avr-gcc CC = avr-gcc
BUILD = .build BUILD = .build
TARGET = main TARGET = keyboard
OPT = s OPT = s
CFLAGS = -Wall -Wextra -std=c18 -O$(OPT) -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -Iinclude
CFLAGS = -Wall -Wextra -std=c18 -O$(OPT) -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -Iinclude -Ilibs/avr-i2c-slave
LDFLAGS = -Wall -Wextra -O$(OPT) -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p LDFLAGS = -Wall -Wextra -O$(OPT) -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p
SRC = \ SRC = \
src/main.c \ src/main.c \
src/keyboard.c \ src/keyboard.c \
src/fifo.c \ src/fifo.c \
src/scancode.c src/scancode.c \
libs/avr-i2c-slave/I2CSlave.c
OBJ = $(addprefix $(BUILD)/, $(notdir $(SRC:.c=.o))) OBJ = $(addprefix $(BUILD)/, $(notdir $(SRC:.c=.o)))
vpath %.c $(sort $(dir $(SRC))) # We can't use this as it will use the wrong main
# vpath %.c $(sort $(dir $(SRC)))
vpath %.c $(dir $(SRC))
.PHONY: all clean .PHONY: all clean

BIN
blink.bin Normal file

Binary file not shown.

View File

@ -4,11 +4,8 @@
#include <stdint.h> #include <stdint.h>
// SCHEMATIC // SCHEMATIC
// #define KEYBOARD_CLK 2
// #define KEYBOARD_DATA 3
#define KEYBOARD_CLK 2 #define KEYBOARD_CLK 2
#define KEYBOARD_DATA 7 #define KEYBOARD_DATA 3
void send_keyboard_cmd(uint8_t value); void send_keyboard_cmd(uint8_t value);
void queue_keyboard_cmd(uint8_t value); void queue_keyboard_cmd(uint8_t value);

View File

@ -3,7 +3,6 @@
#include <stdint.h> #include <stdint.h>
void setup_scancode(); uint8_t convert_scancode(uint8_t shift, uint8_t code);
// uint8_t convert_scancode(uint8_t shift, uint8_t code);
#endif #endif

1
libs/avr-i2c-slave Submodule

@ -0,0 +1 @@
Subproject commit ae740b0954a0760431db5c3f49d55de8ed74dd7c

View File

@ -7,16 +7,13 @@
#include "keyboard.h" #include "keyboard.h"
#include "fifo.h" #include "fifo.h"
// SCHEMATIC #include "I2CSlave.h"
/* #define CLK 4 */
/* #define DATA 5 */
/* #define RDY 6 */
/* #define WAIT 7 */
#define RDY 3 // SCHEMATIC
#define CLK 4 #define CLK 4
#define DATA 5 #define DATA 5
#define WAIT 6 #define RDY 6
#define WAIT 7
// Clock the value to 74164 // Clock the value to 74164
void write_value(uint8_t value) { void write_value(uint8_t value) {
@ -41,6 +38,24 @@ ISR(PCINT2_vect) {
keyboard_interrupt(add_to_queue); keyboard_interrupt(add_to_queue);
} }
void I2C_received(uint8_t value) {
// Reset to bootloader
if (value == 0xFF) {
cli();
WDTCSR = 0x18;
WDTCSR = 0x08;
while (1);
} else if (value == 0x01) {
return;
}
FIFO_push(&buffer, value);
}
void I2C_requested() {
I2C_transmitByte(0x00);
}
int main() { int main() {
// Configure pins as output // Configure pins as output
DDRD |= (1<<RDY) | (1<<CLK) | (1<<DATA); DDRD |= (1<<RDY) | (1<<CLK) | (1<<DATA);
@ -53,14 +68,14 @@ int main() {
PCMSK2 |= (1<<PCINT18); PCMSK2 |= (1<<PCINT18);
PCICR |= (1<<PCIE2); PCICR |= (1<<PCIE2);
// Setup I2C
I2C_setCallbacks(I2C_received, I2C_requested);
I2C_init(0x29);
sei(); sei();
// Wait for the keyboard to be ready /* // Wait for the keyboard to be ready */
_delay_ms(1000); _delay_ms(500);
// Reset the keyboard
send_keyboard_cmd(0xFF);
_delay_ms(1000);
// Set the keyboard repeat rate (and delay) // Set the keyboard repeat rate (and delay)
send_keyboard_cmd(0xF3); send_keyboard_cmd(0xF3);
@ -70,10 +85,6 @@ int main() {
send_keyboard_cmd_queue(); send_keyboard_cmd_queue();
if (FIFO_size(&buffer) && !(PIND>>WAIT & 1)) { if (FIFO_size(&buffer) && !(PIND>>WAIT & 1)) {
// We currently need this to make sure that RDY gets set
// However that is possibly because of the button
// And might not be a problem on actual hardware
_delay_ms(1);
write_value(FIFO_pop(&buffer)); write_value(FIFO_pop(&buffer));
} }
} }