* Add External EEPROM driver

* Add keyboard

* Fix i2c address

* Revert i2c address for eeprom

* Reduce page size for 24LC128

* Disable External EEPROM for now

* Fix up RGB Matrix and layout

* Cleanup moonlander.c file

* Fix led array center

* Disable External EEPROM for now

* Cleanup and optimization of files

* Add and clean up mappings

* Enable "ZSA" defaults for Moonlander

* Update matrix to use i2c_readReg

* Disable render limit for rgb matrix

* Update pin controls to GPIO Commands

* Add proper changed mechanism

* Additional cleanup

* Run clang-format on moonlander files

* Align keymap

* Limit brightness for rgb matrix to 200

To prevent power draw issues

* Add USB-IF VID/PID

* Add RGB Matrix Sleep code

* Enable External EEPROM on Moonlander

* Port over Ergodox Expander error handling and retry code

* Re-init RGB Matrix drivers when half is reconnected

* Add threaded LED display

* Correct layer state settings after moonlander_led_task

* Update Moonlander to include Oryx configuration

* Add webUSB Stuff

* Update default keymap

* fix: merge conflict

Co-authored-by: Drashna Jaelre <drashna@live.com>
This commit is contained in:
Florian Didron
2020-01-21 13:50:53 +09:00
parent 0c676d6e47
commit d3f23ecfbc
27 changed files with 1485 additions and 48 deletions

View File

@@ -428,6 +428,57 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
OPT_DEFS += -DDIP_SWITCH_ENABLE OPT_DEFS += -DDIP_SWITCH_ENABLE
endif endif
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c
EEPROM_DRIVER ?= vendor
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
$(error EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
else
OPT_DEFS += -DEEPROM_ENABLE
ifeq ($(strip $(EEPROM_DRIVER)), custom)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
COMMON_VPATH += $(DRIVER_PATH)/eeprom
QUANTUM_LIB_SRC += i2c_master.c
SRC += eeprom_driver.c eeprom_i2c.c
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c eeprom_transient.c
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
OPT_DEFS += -DEEPROM_VENDOR
ifeq ($(PLATFORM),AVR)
# Automatically provided by avr-libc, nothing required
else ifeq ($(PLATFORM),CHIBIOS)
ifeq ($(MCU_SERIES), STM32F3xx)
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
OPT_DEFS += -DEEPROM_EMU_STM32F303xC
OPT_DEFS += -DSTM32_EEPROM_ENABLE
else ifeq ($(MCU_SERIES), STM32F1xx)
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
OPT_DEFS += -DEEPROM_EMU_STM32F103xB
OPT_DEFS += -DSTM32_EEPROM_ENABLE
else ifeq ($(MCU_SERIES)_$(MCU_LDSCRIPT), STM32F0xx_STM32F072xB)
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
OPT_DEFS += -DEEPROM_EMU_STM32F072xB
OPT_DEFS += -DSTM32_EEPROM_ENABLE
else
# This will effectively work the same as "transient" if not supported by the chip
SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
endif
else ifeq ($(PLATFORM),ARM_ATSAM)
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
else ifeq ($(PLATFORM),TEST)
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
endif
endif
endif
ifeq ($(strip $(DYNAMIC_MACRO_ENABLE)), yes) ifeq ($(strip $(DYNAMIC_MACRO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_dynamic_macro.c SRC += $(QUANTUM_DIR)/process_keycode/process_dynamic_macro.c
OPT_DEFS += -DDYNAMIC_MACRO_ENABLE OPT_DEFS += -DDYNAMIC_MACRO_ENABLE

View File

@@ -91,6 +91,10 @@ i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16
return chibios_to_qmk(&status); return chibios_to_qmk(&status);
} }
i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length) {
return i2cMasterTransmitTimeout(&I2C_DRIVER, address/2, tx_body, tx_length, rx_body, rx_length, MS2ST(100));
}
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) {
i2c_address = devaddr; i2c_address = devaddr;
i2cStart(&I2C_DRIVER, &i2cconfig); i2cStart(&I2C_DRIVER, &i2cconfig);

View File

@@ -0,0 +1,73 @@
/* Copyright 2019 Nick Brassel (tzarc)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <string.h>
#include "eeprom_driver.h"
uint8_t eeprom_read_byte(const uint8_t *addr) {
uint8_t ret;
eeprom_read_block(&ret, addr, 1);
return ret;
}
uint16_t eeprom_read_word(const uint16_t *addr) {
uint16_t ret;
eeprom_read_block(&ret, addr, 2);
return ret;
}
uint32_t eeprom_read_dword(const uint32_t *addr) {
uint32_t ret;
eeprom_read_block(&ret, addr, 4);
return ret;
}
void eeprom_write_byte(uint8_t *addr, uint8_t value) { eeprom_write_block(&value, addr, 1); }
void eeprom_write_word(uint16_t *addr, uint16_t value) { eeprom_write_block(&value, addr, 2); }
void eeprom_write_dword(uint32_t *addr, uint32_t value) { eeprom_write_block(&value, addr, 4); }
void eeprom_update_block(const void *buf, void *addr, size_t len) {
uint8_t read_buf[len];
eeprom_read_block(read_buf, addr, len);
if (memcmp(buf, read_buf, len) != 0) {
eeprom_write_block(buf, addr, len);
}
}
void eeprom_update_byte(uint8_t *addr, uint8_t value) {
uint8_t orig = eeprom_read_byte(addr);
if (orig != value) {
eeprom_write_byte(addr, value);
}
}
void eeprom_update_word(uint16_t *addr, uint16_t value) {
uint16_t orig = eeprom_read_word(addr);
if (orig != value) {
eeprom_write_word(addr, value);
}
}
void eeprom_update_dword(uint32_t *addr, uint32_t value) {
uint32_t orig = eeprom_read_dword(addr);
if (orig != value) {
eeprom_write_dword(addr, value);
}
}

View File

@@ -0,0 +1,22 @@
/* Copyright 2019 Nick Brassel (tzarc)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "eeprom.h"
void eeprom_driver_init(void);
void eeprom_driver_erase(void);

120
drivers/eeprom/eeprom_i2c.c Normal file
View File

@@ -0,0 +1,120 @@
/* Copyright 2019 Nick Brassel (tzarc)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <string.h>
/*
Note that the implementations of eeprom_XXXX_YYYY on AVR are normally
provided by avr-libc. The same functions are reimplemented below and are
rerouted to the external i2c equivalent.
Seemingly, as this is compiled from within QMK, the object file generated
during the build overrides the avr-libc implementation during the linking
stage.
On other platforms such as ARM, there are no provided implementations, so
there is nothing to override during linkage.
*/
#include "wait.h"
#include "i2c_master.h"
#include "eeprom.h"
#include "eeprom_i2c.h"
// #define DEBUG_EEPROM_OUTPUT
#ifdef DEBUG_EEPROM_OUTPUT
# include "print.h"
#endif // DEBUG_EEPROM_OUTPUT
static inline void init_i2c_if_required(void) {
static int done = 0;
if (!done) {
i2c_init();
done = 1;
}
}
static inline void fill_target_address(uint8_t *buffer, const void *addr) {
intptr_t p = (intptr_t)addr;
for (int i = 0; i < EXTERNAL_EEPROM_ADDRESS_SIZE; ++i) {
buffer[EXTERNAL_EEPROM_ADDRESS_SIZE - 1 - i] = p & 0xFF;
p >>= 8;
}
}
void eeprom_driver_init(void) {}
void eeprom_driver_erase(void) {
uint8_t buf[EXTERNAL_EEPROM_PAGE_SIZE];
memset(buf, 0x00, EXTERNAL_EEPROM_PAGE_SIZE);
for (intptr_t addr = 0; addr < EXTERNAL_EEPROM_BYTE_COUNT; addr += EXTERNAL_EEPROM_PAGE_SIZE) {
eeprom_write_block(buf, (void *)addr, EXTERNAL_EEPROM_PAGE_SIZE);
}
}
void eeprom_read_block(void *buf, const void *addr, size_t len) {
uint8_t complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE];
fill_target_address(complete_packet, addr);
init_i2c_if_required();
i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE, 100);
i2c_receive(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), buf, len, 100);
#ifdef DEBUG_EEPROM_OUTPUT
uprintf("[EEPROM R] 0x%04X: ", ((int)addr));
for (size_t i = 0; i < len; ++i) {
uprintf(" %02X", (int)(((uint8_t *)buf)[i]));
}
uprintf("\n");
#endif // DEBUG_EEPROM_OUTPUT
}
void eeprom_write_block(const void *buf, void *addr, size_t len) {
uint8_t complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE + EXTERNAL_EEPROM_PAGE_SIZE];
uint8_t *read_buf = (uint8_t *)buf;
intptr_t target_addr = (intptr_t)addr;
init_i2c_if_required();
while (len > 0) {
intptr_t page_offset = target_addr % EXTERNAL_EEPROM_PAGE_SIZE;
int write_length = EXTERNAL_EEPROM_PAGE_SIZE - page_offset;
if (write_length > len) {
write_length = len;
}
fill_target_address(complete_packet, (const void *)target_addr);
for (uint8_t i = 0; i < write_length; i++) {
complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE + i] = read_buf[i];
}
#ifdef DEBUG_EEPROM_OUTPUT
uprintf("[EEPROM W] 0x%04X: ", ((int)target_addr));
for (uint8_t i = 0; i < write_length; i++) {
uprintf(" %02X", (int)(read_buf[i]));
}
uprintf("\n");
#endif // DEBUG_EEPROM_OUTPUT
i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE + write_length, 100);
wait_ms(EXTERNAL_EEPROM_WRITE_TIME);
read_buf += write_length;
target_addr += write_length;
len -= write_length;
}
}

115
drivers/eeprom/eeprom_i2c.h Normal file
View File

@@ -0,0 +1,115 @@
/* Copyright 2019 Nick Brassel (tzarc)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/*
Default device configurations:
For the Sparkfun Qwiic I2C EEPROM module: https://www.sparkfun.com/products/14764
#define EEPROM_I2C_CAT24C512 // (part number 24512A)
#define EEPROM_I2C_RM24C512C // (part number 24512C)
For the Sparkfun I2C EEPROM chip: https://www.sparkfun.com/products/525
#define EEPROM_I2C_24LC256
For the Adafruit I2C FRAM chip: https://www.adafruit.com/product/1895
#define EEPROM_I2C_MB85RC256V
*/
#if defined(EEPROM_I2C_CAT24C512)
# define EXTERNAL_EEPROM_BYTE_COUNT 65536
# define EXTERNAL_EEPROM_PAGE_SIZE 128
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
# define EXTERNAL_EEPROM_WRITE_TIME 5
#elif defined(EEPROM_I2C_RM24C512C)
# define EXTERNAL_EEPROM_BYTE_COUNT 65536
# define EXTERNAL_EEPROM_PAGE_SIZE 128
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
# define EXTERNAL_EEPROM_WRITE_TIME 3
#elif defined(EEPROM_I2C_24LC256)
# define EXTERNAL_EEPROM_BYTE_COUNT 32768
# define EXTERNAL_EEPROM_PAGE_SIZE 64
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
# define EXTERNAL_EEPROM_WRITE_TIME 5
#elif defined(EEPROM_I2C_24LC128)
# define EXTERNAL_EEPROM_BYTE_COUNT 16384
# define EXTERNAL_EEPROM_PAGE_SIZE 64
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
# define EXTERNAL_EEPROM_WRITE_TIME 5
#elif defined(EEPROM_I2C_MB85RC256V)
# define EXTERNAL_EEPROM_BYTE_COUNT 32768
# define EXTERNAL_EEPROM_PAGE_SIZE 128
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
# define EXTERNAL_EEPROM_WRITE_TIME 0
#endif
/*
The base I2C address of the EEPROM.
This needs to be shifted up by 1, to match i2c_master requirements.
*/
#ifndef EXTERNAL_EEPROM_I2C_BASE_ADDRESS
# define EXTERNAL_EEPROM_I2C_BASE_ADDRESS 0b10100000
#endif
/*
The calculated I2C address based on the input memory location.
For EEPROM chips that embed part of the memory location in the I2C address
such as AT24M02 you can use something similar to the following (ensuring the
result is shifted by left by 1):
#define EXTERNAL_EEPROM_I2C_ADDRESS(loc) \
(EXTERNAL_EEPROM_I2C_BASE_ADDRESS | ((((loc) >> 16) & 0x07) << 1))
*/
#ifndef EXTERNAL_EEPROM_I2C_ADDRESS
# define EXTERNAL_EEPROM_I2C_ADDRESS(loc) (EXTERNAL_EEPROM_I2C_BASE_ADDRESS)
#endif
/*
The total size of the EEPROM, in bytes. The EEPROM datasheet will usually
specify this value in kbits, and will require conversion to bytes.
*/
#ifndef EXTERNAL_EEPROM_BYTE_COUNT
# define EXTERNAL_EEPROM_BYTE_COUNT 8192
#endif
/*
The page size in bytes of the EEPROM, as specified in the datasheet.
*/
#ifndef EXTERNAL_EEPROM_PAGE_SIZE
# define EXTERNAL_EEPROM_PAGE_SIZE 32
#endif
/*
The address size in bytes of the EEPROM. For EEPROMs with <=256 bytes, this
will likely be 1. For EEPROMs >256 and <=65536, this will be 2. For EEPROMs
>65536, this will likely need to be 2 with the modified variant of
EXTERNAL_EEPROM_I2C_ADDRESS above.
As expected, consult the datasheet for specifics of your EEPROM.
*/
#ifndef EXTERNAL_EEPROM_ADDRESS_SIZE
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
#endif
/*
The write cycle time of the EEPROM in milliseconds, as specified in the
datasheet.
*/
#ifndef EXTERNAL_EEPROM_WRITE_TIME
# define EXTERNAL_EEPROM_WRITE_TIME 5
#endif

View File

@@ -0,0 +1,52 @@
/* Copyright 2019 Nick Brassel (tzarc)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <string.h>
#include "eeprom_driver.h"
#include "eeprom_transient.h"
static uint8_t transientBuffer[TRANSIENT_EEPROM_SIZE] = {0};
size_t clamp_length(intptr_t offset, size_t len) {
if (offset + len > TRANSIENT_EEPROM_SIZE) {
len = TRANSIENT_EEPROM_SIZE - offset;
}
return len;
}
void eeprom_driver_init(void) { eeprom_driver_erase(); }
void eeprom_driver_erase(void) { memset(transientBuffer, 0x00, TRANSIENT_EEPROM_SIZE); }
void eeprom_read_block(void *buf, const void *addr, size_t len) {
intptr_t offset = (intptr_t)addr;
memset(buf, 0x00, len);
len = clamp_length(offset, len);
if (len > 0) {
memcpy(buf, &transientBuffer[offset], len);
}
}
void eeprom_write_block(const void *buf, void *addr, size_t len) {
intptr_t offset = (intptr_t)addr;
len = clamp_length(offset, len);
if (len > 0) {
memcpy(&transientBuffer[offset], buf, len);
}
}

View File

@@ -0,0 +1,24 @@
/* Copyright 2019 Nick Brassel (tzarc)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/*
The size of the transient EEPROM buffer size.
*/
#ifndef TRANSIENT_EEPROM_SIZE
# define TRANSIENT_EEPROM_SIZE 64
#endif

View File

@@ -0,0 +1,114 @@
/*
Copyright 2018 Jack Humbert <jack.humb@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
// clang-format off
#define VENDOR_ID 0x3297
#define PRODUCT_ID 0x1969
#define MANUFACTURER ZSA
#define PRODUCT Moonlander
#define DESCRIPTION A keyboard
#define DEVICE_VER 0x0001
#define WEBUSB_LANDING_PAGE_URL u8"configure.ergodox-ez.com"
// clang-format on
/* key matrix size */
#define MATRIX_ROWS 12
#define MATRIX_COLS 7
/* Planck PCB default pin-out */
// #define MATRIX_ROW_PINS { B10, B11, B12, B13, B14, B15 }
// #define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6 }
// #define MCP23_ROW_PINS { GPB5, GBP4, GBP3, GBP2, GBP1, GBP0 }
// #define MCP23_COL_PINS { GPA0, GBA1, GBA2, GBA3, GBA4, GBA5, GBA6 }
// #define MCP23_LED_R GPB7
// #define MCP23_LED_G GPB6
// #define MCP23_LED_B GPA7
#define EEPROM_I2C_24LC128
// Not needed, is default address:
// #define EXTERNAL_EEPROM_I2C_BASE_ADDRESS 0b10100000
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION ROW2COL
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
#ifndef LINK_TIME_OPTIMIZATION_ENABLE
# define NO_ACTION_MACRO
# define NO_ACTION_FUNCTION
#endif
#define I2C1_CLOCK_SPEED 400000
#define DRIVER_ADDR_1 0b1110100
#define DRIVER_ADDR_2 0b1110111
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 36
#define DRIVER_2_LED_TOTAL 36
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
#define RGB_MATRIX_CENTER \
{ 125, 26 }
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 175 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES
#define RGB_DISABLE_WHEN_USB_SUSPENDED true
// #define RGB_MATRIX_LED_PROCESS_LIMIT 5
// #define RGB_MATRIX_LED_FLUSH_LIMIT 26
#define IGNORE_MOD_TAP_INTERRUPT
#define TAPPING_TOGGLE 1
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_DELAY 0
#define MUSIC_MAP

View File

@@ -0,0 +1,3 @@
#pragma once
#define ORYX_CONFIGURATOR

View File

@@ -0,0 +1,79 @@
/*
Copyright 2018 Jack Humbert <jack.humb@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "version.h"
enum layers {
BASE, // default layer
SYMB, // symbols
MDIA, // media keys
};
enum custom_keycodes {
EPRM = ML_SAFE_RANGE,
VRSN,
};
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT_moonlander(
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HYPR, KC_MEH, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT),
KC_LSFT, LCTL_T(KC_Z),KC_X,KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LCTL_T(KC_SLSH), KC_LSFT,
LT(SYMB,KC_GRV),KC_QUOT,A(KC_LSFT),KC_LEFT, KC_RGHT, LALT_T(KC_APP), RCTL_T(KC_ESC), KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB),
KC_SPC, KC_BSPC, KC_LGUI, KC_RALT, KC_TAB, KC_ENT
),
[SYMB] = LAYOUT_moonlander(
VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_TRNS, KC_TRNS, KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
EPRM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, RGB_TOG, KC_TRNS, KC_DOT, KC_0, KC_EQL, KC_TRNS,
RGB_HUD, RGB_VAD, RGB_HUI, TOGGLE_LAYER_COLOR,KC_TRNS, KC_TRNS
),
[1] = LAYOUT_moonlander(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch (keycode) {
case EPRM:
eeconfig_init();
return false;
case VRSN:
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
return false;
#ifdef RGBLIGHT_ENABLE
case RGB_SLD:
rgblight_mode(1);
return false;
#endif
}
}
return true;
}

View File

@@ -0,0 +1,3 @@
#pragma once
#include "../default/config.h"

View File

@@ -0,0 +1 @@
// placeholder

View File

@@ -0,0 +1,4 @@
SRC += ../default/keymap.c
-include ../default/rules.mk
WEBUSB_ENABLE = yes

View File

@@ -0,0 +1,262 @@
/*
Copyright 2018 Jack Humbert <jack.humb@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "hal.h"
#include "timer.h"
#include "wait.h"
#include "printf.h"
#include "matrix.h"
#include "action.h"
#include "keycode.h"
#include <string.h>
#include "moonlander.h"
#include "i2c_master.h"
#include "debounce.h"
/*
#define MATRIX_ROW_PINS { B10, B11, B12, B13, B14, B15 } outputs
#define MATRIX_COL_PINS { A0, A1, A2, A3, A6, A7, B0 } inputs
*/
/* 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 matrix_debouncing_right[MATRIX_COLS];
static bool debouncing = false;
static uint16_t debouncing_time = 0;
static bool debouncing_right = false;
static uint16_t debouncing_time_right = 0;
#define ROWS_PER_HAND (MATRIX_ROWS / 2)
extern bool mcp23018_leds[3];
extern bool is_launching;
__attribute__((weak)) void matrix_init_user(void) {}
__attribute__((weak)) void matrix_scan_user(void) {}
__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
bool mcp23018_initd = false;
static uint8_t mcp23018_reset_loop;
uint8_t mcp23018_tx[3];
uint8_t mcp23018_rx[1];
void mcp23018_init(void) {
i2c_init();
i2c_start(MCP23018_DEFAULT_ADDRESS << 1);
// #define MCP23_ROW_PINS { GPB5, GBP4, GBP3, GBP2, GBP1, GBP0 } outputs
// #define MCP23_COL_PINS { GPA0, GBA1, GBA2, GBA3, GBA4, GBA5, GBA6 } inputs
mcp23018_tx[0] = 0x00; // IODIRA
mcp23018_tx[1] = 0b00000000; // A is output
mcp23018_tx[2] = 0b00111111; // B is inputs
if (MSG_OK != i2c_transmit(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx, 3, I2C_TIMEOUT)) {
printf("error hori\n");
} else {
mcp23018_tx[0] = 0x0C; // GPPUA
mcp23018_tx[1] = 0b10000000; // A is not pulled-up
mcp23018_tx[2] = 0b11111111; // B is pulled-up
if (MSG_OK != i2c_transmit(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx, 3, I2C_TIMEOUT)) {
printf("error hori\n");
} else {
mcp23018_initd = is_launching = true;
}
}
}
void matrix_init(void) {
printf("matrix init\n");
// debug_matrix = true;
// outputs
setPinOutput(B10);
setPinOutput(B11);
setPinOutput(B12);
setPinOutput(B13);
setPinOutput(B14);
setPinOutput(B15);
// inputs
setPinInputLow(A0);
setPinInputLow(A1);
setPinInputLow(A2);
setPinInputLow(A3);
setPinInputLow(A6);
setPinInputLow(A7);
setPinInputLow(B0);
memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
memset(matrix_debouncing, 0, MATRIX_ROWS * sizeof(matrix_row_t));
memset(matrix_debouncing_right, 0, MATRIX_COLS * sizeof(matrix_row_t));
mcp23018_init();
matrix_init_quantum();
}
uint8_t matrix_scan(void) {
bool changed = false;
matrix_row_t data = 0;
// actual matrix
for (uint8_t row = 0; row < ROWS_PER_HAND; row++) {
// strobe row
switch (row) {
case 0: writePinHigh(B10); break;
case 1: writePinHigh(B11); break;
case 2: writePinHigh(B12); break;
case 3: writePinHigh(B13); break;
case 4: writePinHigh(B14); break;
case 5: writePinHigh(B15); break;
}
// need wait to settle pin state
wait_us(20);
// read col data
data = (
(readPin(A0) << 0 ) |
(readPin(A1) << 1 ) |
(readPin(A2) << 2 ) |
(readPin(A3) << 3 ) |
(readPin(A6) << 4 ) |
(readPin(A7) << 5 ) |
(readPin(B0) << 6 )
);
// unstrobe row
switch (row) {
case 0: writePinLow(B10); break;
case 1: writePinLow(B11); break;
case 2: writePinLow(B12); break;
case 3: writePinLow(B13); break;
case 4: writePinLow(B14); break;
case 5: writePinLow(B15); break;
}
if (matrix_debouncing[row] != data) {
matrix_debouncing[row] = data;
debouncing = true;
debouncing_time = timer_read();
changed = true;
}
}
for (uint8_t row = 0; row <= ROWS_PER_HAND; row++) {
// right side
if (!mcp23018_initd) {
if (++mcp23018_reset_loop == 0) {
// if (++mcp23018_reset_loop >= 1300) {
// since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
// this will be approx bit more frequent than once per second
print("trying to reset mcp23018\n");
mcp23018_init();
if (!mcp23018_initd) {
print("left side not responding\n");
} else {
print("left side attached\n");
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_init();
#endif
}
}
}
// #define MCP23_ROW_PINS { GPB5, GBP4, GBP3, GBP2, GBP1, GBP0 } outputs
// #define MCP23_COL_PINS { GPA0, GBA1, GBA2, GBA3, GBA4, GBA5, GBA6 } inputs
// select row
mcp23018_tx[0] = 0x12; // GPIOA
mcp23018_tx[1] = (0b01111111 & ~(1 << (row))) | ((uint8_t)!mcp23018_leds[2] << 7); // activate row
mcp23018_tx[2] = ((uint8_t)!mcp23018_leds[1] << 6) | ((uint8_t)!mcp23018_leds[0] << 7); // activate row
if (MSG_OK != i2c_transmit(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx, 3, I2C_TIMEOUT)) {
printf("error hori\n");
mcp23018_initd = false;
}
// read col
mcp23018_tx[0] = 0x13; // GPIOB
if (MSG_OK != i2c_readReg(MCP23018_DEFAULT_ADDRESS << 1, mcp23018_tx[0], &mcp23018_rx[0], 1, I2C_TIMEOUT)) {
printf("error vert\n");
mcp23018_initd = false;
}
data = ~(mcp23018_rx[0] & 0b00111111);
// data = 0x01;
if (matrix_debouncing_right[row] != data) {
matrix_debouncing_right[row] = data;
debouncing_right = true;
debouncing_time_right = timer_read();
changed = true;
}
}
if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
for (int row = 0; row < ROWS_PER_HAND; row++) {
matrix[row] = matrix_debouncing[row];
}
debouncing = false;
}
if (debouncing_right && timer_elapsed(debouncing_time_right) > DEBOUNCE && mcp23018_initd) {
for (int row = 0; row < ROWS_PER_HAND; row++) {
matrix[11 - row] = 0;
for (int col = 0; col < MATRIX_COLS; col++) {
matrix[11 - row] |= ((matrix_debouncing_right[6 - col] & (1 << row) ? 1 : 0) << col);
}
}
debouncing_right = false;
}
matrix_scan_quantum();
return (uint8_t)changed;
}
bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & (1 << col)); }
matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; }
void matrix_print(void) {
printf("\nr/c 01234567\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
printf("%X0: ", row);
matrix_row_t data = matrix_get_row(row);
for (int col = 0; col < MATRIX_COLS; col++) {
if (data & (1 << col))
printf("1");
else
printf("0");
}
printf("\n");
}
}

View File

@@ -0,0 +1,425 @@
/*
Copyright 2018 Jack Humbert <jack.humb@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "moonlander.h"
#ifdef WEBUSB_ENABLE
#include "webusb.h"
#endif
keyboard_config_t keyboard_config;
bool mcp23018_leds[3] = {0, 0, 0};
bool is_launching = false;
void moonlander_led_task(void) {
if (is_launching) {
ML_LED_1(false);
ML_LED_2(false);
ML_LED_3(false);
ML_LED_4(false);
ML_LED_5(false);
ML_LED_6(false);
ML_LED_1(true);
wait_ms(250);
ML_LED_2(true);
wait_ms(250);
ML_LED_3(true);
wait_ms(250);
ML_LED_4(true);
wait_ms(250);
ML_LED_5(true);
wait_ms(250);
ML_LED_6(true);
wait_ms(250);
ML_LED_1(false);
wait_ms(250);
ML_LED_2(false);
wait_ms(250);
ML_LED_3(false);
wait_ms(250);
ML_LED_4(false);
wait_ms(250);
ML_LED_5(false);
wait_ms(250);
ML_LED_6(false);
wait_ms(250);
is_launching = false;
layer_state_set_kb(layer_state);
}
#ifdef WEBUSB_ENABLE
if (webusb_state.pairing == true) {
static uint8_t led_mask;
ML_LED_1(false);
ML_LED_2(false);
ML_LED_3(false);
ML_LED_4(false);
ML_LED_5(false);
ML_LED_6(false);
if (!led_mask) {
led_mask = 1;
} else {
led_mask++;
if (led_mask > 10) led_mask = 1;
}
switch (led_mask) {
case 1:
ML_LED_1(true);
break;
case 2:
case 10:
ML_LED_2(true);
break;
case 3:
case 9:
ML_LED_3(true);
break;
case 4:
case 8:
ML_LED_4(true);
break;
case 5:
case 7:
ML_LED_5(true);
break;
case 6:
ML_LED_6(true);
break;
}
wait_ms(150);
}
#endif
}
static THD_WORKING_AREA(waLEDThread, 128);
static THD_FUNCTION(LEDThread, arg) {
(void)arg;
chRegSetThreadName("LEDThread");
while (true) {
moonlander_led_task();
}
}
void keyboard_pre_init_kb(void) {
setPinOutput(B5);
setPinOutput(B4);
setPinOutput(B3);
writePinLow(B5);
writePinLow(B4);
writePinLow(B3);
chThdCreateStatic(waLEDThread, sizeof(waLEDThread), NORMALPRIO-16, LEDThread, NULL);
/* the array is initialized to 0, no need to re-set it here */
// mcp23018_leds[0] = 0; // blue
// mcp23018_leds[1] = 0; // green
// mcp23018_leds[2] = 0; // red
keyboard_pre_init_user();
}
layer_state_t layer_state_set_kb(layer_state_t state) {
state = layer_state_set_user(state);
if (is_launching) return state;
ML_LED_1(0);
ML_LED_2(0);
ML_LED_3(0);
ML_LED_4(0);
ML_LED_5(0);
ML_LED_6(0);
uint8_t layer = get_highest_layer(state);
switch (layer) {
case 1:
ML_LED_1(1);
ML_LED_4(1);
break;
case 2:
ML_LED_2(1);
ML_LED_5(1);
break;
case 3:
ML_LED_3(1);
break;
case 4:
ML_LED_4(1);
break;
case 5:
ML_LED_5(1);
break;
case 6:
ML_LED_6(1);
break;
default:
break;
}
return state;
}
#ifdef RGB_MATRIX_ENABLE
// clang-format off
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
/* Refer to IS31 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0, C3_2, C1_1, C4_2}, // 1
{0, C2_2, C1_2, C4_3},
{0, C2_3, C1_3, C3_3},
{0, C2_4, C1_4, C3_4},
{0, C2_5, C1_5, C3_5},
{0, C2_6, C1_6, C3_6},
{0, C2_7, C1_7, C3_7},
{0, C2_8, C1_8, C3_8},
{0, C3_1, C2_1, C4_1},
{0, C7_8, C6_8, C8_8}, // 10
{0, C7_7, C6_7, C9_8},
{0, C8_7, C6_6, C9_7},
{0, C8_6, C7_6, C9_6},
{0, C8_5, C7_5, C9_5},
{0, C8_4, C7_4, C9_4},
{0, C8_3, C7_3, C9_3},
{0, C8_2, C7_2, C9_2},
{0, C8_1, C7_1, C9_1},
{0, C3_10, C1_9, C4_10}, // 19
{0, C2_10, C1_10, C4_11},
{0, C2_11, C1_11, C3_11},
{0, C2_12, C1_12, C3_12},
{0, C2_13, C1_13, C3_13},
{0, C2_14, C1_14, C3_14},
{0, C2_15, C1_15, C3_15},
{0, C2_16, C1_16, C3_16},
{0, C3_9, C2_9, C4_9},
{0, C7_16, C6_16, C8_16}, // 28
{0, C7_15, C6_15, C9_16},
{0, C8_15, C6_14, C9_15},
{0, C8_10, C7_10, C9_10},
{0, C8_9, C7_9, C9_9},
{0, C8_11, C7_11, C9_11},
{0, C8_12, C7_12, C9_12},
{0, C8_13, C7_13, C9_13},
{0, C8_14, C7_14, C9_14},
{1, C3_2, C1_1, C4_2}, // 1
{1, C2_2, C1_2, C4_3},
{1, C2_3, C1_3, C3_3},
{1, C2_4, C1_4, C3_4},
{1, C2_5, C1_5, C3_5},
{1, C2_6, C1_6, C3_6},
{1, C2_7, C1_7, C3_7},
{1, C2_8, C1_8, C3_8},
{1, C3_1, C2_1, C4_1},
{1, C7_8, C6_8, C8_8}, // 10
{1, C7_7, C6_7, C9_8},
{1, C8_7, C6_6, C9_7},
{1, C8_6, C7_6, C9_6},
{1, C8_5, C7_5, C9_5},
{1, C8_4, C7_4, C9_4},
{1, C8_3, C7_3, C9_3},
{1, C8_2, C7_2, C9_2},
{1, C8_1, C7_1, C9_1},
{1, C3_10, C1_9, C4_10}, // 19
{1, C2_10, C1_10, C4_11},
{1, C2_11, C1_11, C3_11},
{1, C2_12, C1_12, C3_12},
{1, C2_13, C1_13, C3_13},
{1, C2_14, C1_14, C3_14},
{1, C2_15, C1_15, C3_15},
{1, C2_16, C1_16, C3_16},
{1, C3_9, C2_9, C4_9},
{1, C7_16, C6_16, C8_16}, // 28
{1, C7_15, C6_15, C9_16},
{1, C8_15, C6_14, C9_15},
{1, C8_10, C7_10, C9_10},
{1, C8_9, C7_9, C9_9},
{1, C8_11, C7_11, C9_11},
{1, C8_12, C7_12, C9_12},
{1, C8_13, C7_13, C9_13},
{1, C8_14, C7_14, C9_14},
};
led_config_t g_led_config = { {
{ 0, 5, 10, 15, 20, 25, 29 },
{ 1, 6, 11, 16, 21, 26, 30 },
{ 2, 7, 12, 17, 22, 27, 31 },
{ 3, 8, 13, 18, 23, 28, NO_LED },
{ 4, 9, 14, 19, 24, NO_LED, NO_LED },
{ 32, 33, 34, 35, NO_LED, NO_LED, NO_LED },
{ 65, 61, 56, 51, 46, 41, 36 },
{ 66, 62, 57, 52, 47, 42, 37 },
{ 67, 63, 58, 53, 48, 43, 38 },
{ NO_LED, 64, 59, 54, 49, 44, 39 },
{ NO_LED, NO_LED, 60, 55, 50, 45, 40 },
{ NO_LED, NO_LED, NO_LED, 71, 70, 69, 68 },
}, {
{ 0, 0 }, { 0, 12 }, { 0, 25 }, { 0, 38 }, { 0, 51 },
{ 17, 0 }, { 17, 12 }, { 17, 25 }, { 17, 38 }, { 17, 51 },
{ 34, 0 }, { 34, 12 }, { 34, 25 }, { 34, 38 }, { 34, 51 },
{ 51, 0 }, { 51, 12 }, { 51, 25 }, { 51, 38 }, { 51, 51 },
{ 68, 0 }, { 68, 12 }, { 68, 25 }, { 68, 38 }, { 68, 51 },
{ 86, 0 }, { 86, 12 }, { 86, 25 }, { 86, 38 },
{ 105, 0 }, { 105, 12 }, { 105, 25 },
{ 90, 55 }, { 105, 68 }, { 116, 86 }, { 116, 59 },
{ 250, 0 }, { 250, 12 }, { 250, 25 }, { 250, 38 }, { 250, 51 },
{ 233, 0 }, { 233, 12 }, { 233, 25 }, { 233, 38 }, { 233, 51 },
{ 216, 0 }, { 216, 12 }, { 216, 25 }, { 216, 38 }, { 216, 51 },
{ 198, 0 }, { 198, 12 }, { 198, 25 }, { 198, 38 }, { 198, 51 },
{ 181, 0 }, { 181, 12 }, { 181, 25 }, { 181, 38 }, { 181, 51 },
{ 163, 0 }, { 163, 12 }, { 163, 25 }, { 163, 38 },
{ 146, 0 }, { 146, 12 }, { 146, 25 },
{ 161, 55 }, { 161, 68 }, { 146, 86 }, { 131, 59 }
}, {
1, 1, 1, 1, 1, 4,
4, 4, 4, 1, 4, 4,
4, 4, 1, 4, 4, 4,
4, 1, 4, 4, 4, 4,
1, 4, 4, 4, 4, 4,
4, 4, 1, 1, 1, 1,
1, 1, 1, 1, 1, 4,
4, 4, 4, 1, 4, 4,
4, 4, 1, 4, 4, 4,
4, 1, 4, 4, 4, 4,
1, 4, 4, 4, 4, 4,
4, 4, 1, 1, 1, 1
} };
// clang-format on
void suspend_power_down_kb(void) {
rgb_matrix_set_suspend_state(true);
suspend_power_down_user();
}
void suspend_wakeup_init_kb(void) {
rgb_matrix_set_suspend_state(false);
suspend_wakeup_init_user();
}
#endif
#ifdef AUDIO_ENABLE
bool music_mask_kb(uint16_t keycode) {
switch (keycode) {
case QK_LAYER_TAP ... QK_ONE_SHOT_LAYER_MAX:
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_MOD_MAX:
case QK_MOD_TAP ... QK_MOD_TAP_MAX:
case AU_ON ... MUV_DE:
case RESET:
case EEP_RST:
return false;
default:
return music_mask_user(keycode);
}
}
#endif
#ifdef SWAP_HANDS_ENABLE
// swap-hands action needs a matrix to define the swap
// clang-format off
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
/* Left hand, matrix positions */
{{6,6}, {5,6}, {4,6}, {3,6}, {2,6}, {1,6},{0,6}},
{{6,7}, {5,7}, {4,7}, {3,7}, {2,7}, {1,7},{0,7}},
{{6,8}, {5,8}, {4,8}, {3,8}, {2,8}, {1,8},{0,8}},
{{6,9}, {5,9}, {4,9}, {3,9}, {2,9}, {1,9},{0,9}},
{{6,10},{5,10},{4,10},{3,10},{2,10},{1,10},{0,10}},
{{6,11},{5,11},{4,11},{3,11},{2,11},{1,11},{0,11}},
/* Right hand, matrix positions */
{{6,0}, {5,0}, {4,0}, {3,0}, {2,0}, {1,0},{0,0}},
{{6,1}, {5,1}, {4,1}, {3,1}, {2,1}, {1,1},{0,1}},
{{6,2}, {5,2}, {4,2}, {3,2}, {2,2}, {1,2},{0,2}},
{{6,3}, {5,3}, {4,3}, {3,3}, {2,3}, {1,3},{0,3}},
{{6,4}, {5,4}, {4,4}, {3,4}, {2,4}, {1,4},{0,4}},
{{6,5}, {5,5}, {4,5}, {3,5}, {2,5}, {1,5},{0,5}},
};
// clang-format on
#endif
#if defined(AUDIO_ENABLE) && defined(MUSIC_MAP)
// clang-format off
const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_moonlander(
58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
8, 9, 10, 11, 12, 3, 4, 13, 14, 15, 16, 17,
0, 1, 2, 5, 6, 7
);
// clang-format on
#endif
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
#ifdef WEBUSB_ENABLE
if(webusb_state.paired == true) {
uint8_t event[5];
event[0] = WEBUSB_STATUS_OK;
event[1] = record->event.pressed ? WEBUSB_EVT_KEYDOWN : WEBUSB_EVT_KEYUP;
event[2] = record->event.key.col;
event[3] = record->event.key.row;
event[4] = WEBUSB_STOP_BIT;
webusb_send(event, sizeof(event));
}
#endif
switch (keycode) {
#ifdef RGB_MATRIX_ENABLE
case TOGGLE_LAYER_COLOR:
if (record->event.pressed) {
keyboard_config.disable_layer_led ^= 1;
if (keyboard_config.disable_layer_led)
rgb_matrix_set_color_all(0, 0, 0);
eeconfig_update_kb(keyboard_config.raw);
}
break;
case RGB_TOG:
if (record->event.pressed) {
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_NONE);
keyboard_config.rgb_matrix_enable = false;
rgb_matrix_set_color_all(0, 0, 0);
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
keyboard_config.rgb_matrix_enable = true;
}
break;
}
eeconfig_update_kb(keyboard_config.raw);
}
return false;
#endif
}
return process_record_user(keycode, record);
}

View File

@@ -0,0 +1,71 @@
/*
Copyright 2018 Jack Humbert <jack.humb@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define MCP23018_DEFAULT_ADDRESS 0b0100000
#define ML_LED_1(status) writePin(B5, (bool)status)
#define ML_LED_2(status) writePin(B4, (bool)status)
#define ML_LED_3(status) writePin(B3, (bool)status)
#define ML_LED_4(status) mcp23018_leds[0] = (bool)status
#define ML_LED_5(status) mcp23018_leds[1] = (bool)status
#define ML_LED_6(status) mcp23018_leds[2] = (bool)status
#include "quantum.h"
// clang-format off
#define LAYOUT_moonlander( \
k00, k01, k02, k03, k04, k05, k06, k60, k61, k62, k63, k64, k65, k66, \
k10, k11, k12, k13, k14, k15, k16, k70, k71, k72, k73, k74, k75, k76, \
k20, k21, k22, k23, k24, k25, k26, k80, k81, k82, k83, k84, k85, k86, \
k30, k31, k32, k33, k34, k35, k91, k92, k93, k94, k95, k96, \
k40, k41, k42, k43, k44, k53, kb3, ka2, ka3, ka4, ka5, ka6, \
k50, k51, k52, kb4, kb5, kb6 \
) \
{ \
{ k00, k01, k02, k03, k04, k05, k06 }, \
{ k10, k11, k12, k13, k14, k15, k16 }, \
{ k20, k21, k22, k23, k24, k25, k26 }, \
{ k30, k31, k32, k33, k34, k35, KC_NO }, \
{ k40, k41, k42, k43, k44, KC_NO, KC_NO }, \
{ k50, k51, k52, k53, KC_NO, KC_NO, KC_NO }, \
\
{ k60, k61, k62, k63, k64, k65, k66 }, \
{ k70, k71, k72, k73, k74, k75, k76 }, \
{ k80, k81, k82, k83, k84, k85, k86 }, \
{ KC_NO,k91, k92, k93, k94, k95, k96 }, \
{ KC_NO, KC_NO, ka2, ka3, ka4, ka5, ka6 }, \
{ KC_NO, KC_NO, KC_NO, kb3, kb4, kb5, kb6 } \
}
// clang-format on
enum planck_ez_keycodes {
TOGGLE_LAYER_COLOR = SAFE_RANGE,
ML_SAFE_RANGE,
};
typedef union {
uint32_t raw;
struct {
bool disable_layer_led :1;
bool rgb_matrix_enable :1;
};
} keyboard_config_t;
extern keyboard_config_t keyboard_config;

View File

@@ -0,0 +1,24 @@
#Cortex version
MCU = STM32F303
#Build Options
#comment out to disable the options.
#
BACKLIGHT_ENABLE = no
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
#SLEEP_LED_ENABLE = yes #Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = yes # Custom matrix file
AUDIO_ENABLE = yes
SWAP_HANDS_ENABLE = yes
RGB_MATRIX_ENABLE = IS31FL3731
#SERIAL_LINK_ENABLE = yes
EEPROM_DRIVER = i2c
#project specific files
SRC = matrix.c
QUANTUM_LIB_SRC += i2c_master.c

View File

@@ -270,7 +270,7 @@ void audio_init() {
} }
// Check EEPROM // Check EEPROM
#if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) #ifdef EEPROM_ENABLE
if (!eeconfig_is_enabled()) { if (!eeconfig_is_enabled()) {
eeconfig_init(); eeconfig_init();
} }

View File

@@ -19,9 +19,11 @@
# include <avr/eeprom.h> # include <avr/eeprom.h>
# include <avr/interrupt.h> # include <avr/interrupt.h>
#endif #endif
#ifdef EEPROM_ENABLE
# include "eeprom.h"
#endif
#ifdef STM32_EEPROM_ENABLE #ifdef STM32_EEPROM_ENABLE
# include "hal.h" # include "hal.h"
# include "eeprom.h"
# include "eeprom_stm32.h" # include "eeprom_stm32.h"
#endif #endif
#include "wait.h" #include "wait.h"
@@ -146,7 +148,7 @@ void rgblight_check_config(void) {
} }
uint32_t eeconfig_read_rgblight(void) { uint32_t eeconfig_read_rgblight(void) {
#if defined(__AVR__) || defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) #ifdef EEPROM_ENABLE
return eeprom_read_dword(EECONFIG_RGBLIGHT); return eeprom_read_dword(EECONFIG_RGBLIGHT);
#else #else
return 0; return 0;
@@ -154,7 +156,7 @@ uint32_t eeconfig_read_rgblight(void) {
} }
void eeconfig_update_rgblight(uint32_t val) { void eeconfig_update_rgblight(uint32_t val) {
#if defined(__AVR__) || defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) #ifdef EEPROM_ENABLE
rgblight_check_config(); rgblight_check_config();
eeprom_update_dword(EECONFIG_RGBLIGHT, val); eeprom_update_dword(EECONFIG_RGBLIGHT, val);
#endif #endif

View File

@@ -26,29 +26,11 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
$(PLATFORM_COMMON_DIR)/bootloader.c \ $(PLATFORM_COMMON_DIR)/bootloader.c \
ifeq ($(PLATFORM),AVR) ifeq ($(PLATFORM),AVR)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/xprintf.S TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/xprintf.S
endif endif
ifeq ($(PLATFORM),CHIBIOS) ifeq ($(PLATFORM),CHIBIOS)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
ifeq ($(MCU_SERIES), STM32F3xx)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F303xC
TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
else ifeq ($(MCU_SERIES), STM32F1xx)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F103xB
TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
else ifeq ($(MCU_SERIES)_$(MCU_LDSCRIPT), STM32F0xx_STM32F072xB)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F072xB
TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
else
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
endif
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c
else ifeq ($(strip $(TERMINAL_ENABLE)), yes) else ifeq ($(strip $(TERMINAL_ENABLE)), yes)
@@ -57,15 +39,9 @@ ifeq ($(PLATFORM),CHIBIOS)
endif endif
ifeq ($(PLATFORM),ARM_ATSAM) ifeq ($(PLATFORM),ARM_ATSAM)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
endif endif
ifeq ($(PLATFORM),TEST)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
endif
# Option modules # Option modules
BOOTMAGIC_ENABLE ?= no BOOTMAGIC_ENABLE ?= no

View File

@@ -40,7 +40,7 @@ uint32_t eeprom_read_dword(const uint32_t *addr) {
return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24); return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24);
} }
void eeprom_read_block(void *buf, const void *addr, uint32_t len) { void eeprom_read_block(void *buf, const void *addr, size_t len) {
const uint8_t *p = (const uint8_t *)addr; const uint8_t *p = (const uint8_t *)addr;
uint8_t * dest = (uint8_t *)buf; uint8_t * dest = (uint8_t *)buf;
while (len--) { while (len--) {
@@ -62,7 +62,7 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
eeprom_write_byte(p, value >> 24); eeprom_write_byte(p, value >> 24);
} }
void eeprom_write_block(const void *buf, void *addr, uint32_t len) { void eeprom_write_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {
@@ -86,7 +86,7 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
eeprom_write_byte(p, value >> 24); eeprom_write_byte(p, value >> 24);
} }
void eeprom_update_block(const void *buf, void *addr, uint32_t len) { void eeprom_update_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {

View File

@@ -173,7 +173,7 @@ void eeprom_update_dword(uint32_t *Address, uint32_t Value) {
} }
} }
void eeprom_read_block(void *buf, const void *addr, uint32_t len) { void eeprom_read_block(void *buf, const void *addr, size_t len) {
const uint8_t *p = (const uint8_t *)addr; const uint8_t *p = (const uint8_t *)addr;
uint8_t * dest = (uint8_t *)buf; uint8_t * dest = (uint8_t *)buf;
while (len--) { while (len--) {
@@ -181,7 +181,7 @@ void eeprom_read_block(void *buf, const void *addr, uint32_t len) {
} }
} }
void eeprom_write_block(const void *buf, void *addr, uint32_t len) { void eeprom_write_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {
@@ -189,7 +189,7 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
} }
} }
void eeprom_update_block(const void *buf, void *addr, uint32_t len) { void eeprom_update_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {

View File

@@ -517,7 +517,7 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
#else #else
// No EEPROM supported, so emulate it // No EEPROM supported, so emulate it
# define EEPROM_SIZE 32 # define EEPROM_SIZE 64
static uint8_t buffer[EEPROM_SIZE]; static uint8_t buffer[EEPROM_SIZE];
uint8_t eeprom_read_byte(const uint8_t *addr) { uint8_t eeprom_read_byte(const uint8_t *addr) {
@@ -540,7 +540,7 @@ uint32_t eeprom_read_dword(const uint32_t *addr) {
return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24); return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24);
} }
void eeprom_read_block(void *buf, const void *addr, uint32_t len) { void eeprom_read_block(void *buf, const void *addr, size_t len) {
const uint8_t *p = (const uint8_t *)addr; const uint8_t *p = (const uint8_t *)addr;
uint8_t * dest = (uint8_t *)buf; uint8_t * dest = (uint8_t *)buf;
while (len--) { while (len--) {
@@ -562,7 +562,7 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
eeprom_write_byte(p, value >> 24); eeprom_write_byte(p, value >> 24);
} }
void eeprom_write_block(const void *buf, void *addr, uint32_t len) { void eeprom_write_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {
@@ -589,7 +589,7 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
eeprom_write_byte(p, value >> 24); eeprom_write_byte(p, value >> 24);
} }
void eeprom_update_block(const void *buf, void *addr, uint32_t len) { void eeprom_update_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {

View File

@@ -9,6 +9,11 @@
# include "eeprom_stm32.h" # include "eeprom_stm32.h"
#endif #endif
#if defined(EEPROM_DRIVER)
# include "eeprom_driver.h"
#endif
extern uint32_t default_layer_state;
/** \brief eeconfig enable /** \brief eeconfig enable
* *
* FIXME: needs doc * FIXME: needs doc
@@ -31,6 +36,9 @@ __attribute__((weak)) void eeconfig_init_kb(void) {
void eeconfig_init_quantum(void) { void eeconfig_init_quantum(void) {
#ifdef STM32_EEPROM_ENABLE #ifdef STM32_EEPROM_ENABLE
EEPROM_Erase(); EEPROM_Erase();
#endif
#if defined(EEPROM_DRIVER)
eeprom_driver_erase();
#endif #endif
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
eeprom_update_byte(EECONFIG_DEBUG, 0); eeprom_update_byte(EECONFIG_DEBUG, 0);
@@ -80,6 +88,9 @@ void eeconfig_enable(void) { eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_N
void eeconfig_disable(void) { void eeconfig_disable(void) {
#ifdef STM32_EEPROM_ENABLE #ifdef STM32_EEPROM_ENABLE
EEPROM_Erase(); EEPROM_Erase();
#endif
#if defined(EEPROM_DRIVER)
eeprom_driver_erase();
#endif #endif
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
} }

View File

@@ -1,23 +1,24 @@
#ifndef TMK_CORE_COMMON_EEPROM_H_ #ifndef TMK_CORE_COMMON_EEPROM_H_
#define TMK_CORE_COMMON_EEPROM_H_ #define TMK_CORE_COMMON_EEPROM_H_
#if defined(__AVR__) #if defined(__AVR__) && !defined(EEPROM_DRIVER)
# include <avr/eeprom.h> # include <avr/eeprom.h>
#else #else
# include <stdint.h> # include <stdint.h>
# include <stdlib.h>
uint8_t eeprom_read_byte(const uint8_t *__p); uint8_t eeprom_read_byte(const uint8_t *__p);
uint16_t eeprom_read_word(const uint16_t *__p); uint16_t eeprom_read_word(const uint16_t *__p);
uint32_t eeprom_read_dword(const uint32_t *__p); uint32_t eeprom_read_dword(const uint32_t *__p);
void eeprom_read_block(void *__dst, const void *__src, uint32_t __n); void eeprom_read_block(void *__dst, const void *__src, size_t __n);
void eeprom_write_byte(uint8_t *__p, uint8_t __value); void eeprom_write_byte(uint8_t *__p, uint8_t __value);
void eeprom_write_word(uint16_t *__p, uint16_t __value); void eeprom_write_word(uint16_t *__p, uint16_t __value);
void eeprom_write_dword(uint32_t *__p, uint32_t __value); void eeprom_write_dword(uint32_t *__p, uint32_t __value);
void eeprom_write_block(const void *__src, void *__dst, uint32_t __n); void eeprom_write_block(const void *__src, void *__dst, size_t __n);
void eeprom_update_byte(uint8_t *__p, uint8_t __value); void eeprom_update_byte(uint8_t *__p, uint8_t __value);
void eeprom_update_word(uint16_t *__p, uint16_t __value); void eeprom_update_word(uint16_t *__p, uint16_t __value);
void eeprom_update_dword(uint32_t *__p, uint32_t __value); void eeprom_update_dword(uint32_t *__p, uint32_t __value);
void eeprom_update_block(const void *__src, void *__dst, uint32_t __n); void eeprom_update_block(const void *__src, void *__dst, size_t __n);
#endif #endif
#endif /* TMK_CORE_COMMON_EEPROM_H_ */ #endif /* TMK_CORE_COMMON_EEPROM_H_ */

View File

@@ -40,7 +40,7 @@ uint32_t eeprom_read_dword(const uint32_t *addr) {
return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24); return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24);
} }
void eeprom_read_block(void *buf, const void *addr, uint32_t len) { void eeprom_read_block(void *buf, const void *addr, size_t len) {
const uint8_t *p = (const uint8_t *)addr; const uint8_t *p = (const uint8_t *)addr;
uint8_t * dest = (uint8_t *)buf; uint8_t * dest = (uint8_t *)buf;
while (len--) { while (len--) {
@@ -62,7 +62,7 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
eeprom_write_byte(p, value >> 24); eeprom_write_byte(p, value >> 24);
} }
void eeprom_write_block(const void *buf, void *addr, uint32_t len) { void eeprom_write_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {
@@ -86,7 +86,7 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
eeprom_write_byte(p, value >> 24); eeprom_write_byte(p, value >> 24);
} }
void eeprom_update_block(const void *buf, void *addr, uint32_t len) { void eeprom_update_block(const void *buf, void *addr, size_t len) {
uint8_t * p = (uint8_t *)addr; uint8_t * p = (uint8_t *)addr;
const uint8_t *src = (const uint8_t *)buf; const uint8_t *src = (const uint8_t *)buf;
while (len--) { while (len--) {