Format code according to conventions (#16322)

This commit is contained in:
QMK Bot 2022-02-12 10:29:31 -08:00 committed by GitHub
parent afcdd7079c
commit 63646e8906
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
345 changed files with 4916 additions and 3229 deletions

View File

@ -29,7 +29,7 @@
#endif #endif
#ifndef BLUEFRUIT_LE_SCK_DIVISOR #ifndef BLUEFRUIT_LE_SCK_DIVISOR
# define BLUEFRUIT_LE_SCK_DIVISOR 2 // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE # define BLUEFRUIT_LE_SCK_DIVISOR 2 // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE
#endif #endif
#define SAMPLE_BATTERY #define SAMPLE_BATTERY
@ -77,10 +77,10 @@ struct sdep_msg {
// information here. // information here.
enum queue_type { enum queue_type {
QTKeyReport, // 1-byte modifier + 6-byte key report QTKeyReport, // 1-byte modifier + 6-byte key report
QTConsumer, // 16-bit key code QTConsumer, // 16-bit key code
#ifdef MOUSE_ENABLE #ifdef MOUSE_ENABLE
QTMouseMove, // 4-byte mouse report QTMouseMove, // 4-byte mouse report
#endif #endif
}; };
@ -115,8 +115,8 @@ enum sdep_type {
SdepResponse = 0x20, SdepResponse = 0x20,
SdepAlert = 0x40, SdepAlert = 0x40,
SdepError = 0x80, SdepError = 0x80,
SdepSlaveNotReady = 0xFE, // Try again later SdepSlaveNotReady = 0xFE, // Try again later
SdepSlaveOverflow = 0xFF, // You read more data than is available SdepSlaveOverflow = 0xFF, // You read more data than is available
}; };
enum ble_cmd { enum ble_cmd {
@ -306,13 +306,15 @@ static bool ble_init(void) {
wait_ms(10); wait_ms(10);
writePinHigh(BLUEFRUIT_LE_RST_PIN); writePinHigh(BLUEFRUIT_LE_RST_PIN);
wait_ms(1000); // Give it a second to initialize wait_ms(1000); // Give it a second to initialize
state.initialized = true; state.initialized = true;
return state.initialized; return state.initialized;
} }
static inline uint8_t min(uint8_t a, uint8_t b) { return a < b ? a : b; } static inline uint8_t min(uint8_t a, uint8_t b) {
return a < b ? a : b;
}
static bool read_response(char *resp, uint16_t resplen, bool verbose) { static bool read_response(char *resp, uint16_t resplen, bool verbose) {
char *dest = resp; char *dest = resp;
@ -424,7 +426,9 @@ bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool verbose) {
return at_command(cmdbuf, resp, resplen, verbose); return at_command(cmdbuf, resp, resplen, verbose);
} }
bool bluefruit_le_is_connected(void) { return state.is_connected; } bool bluefruit_le_is_connected(void) {
return state.is_connected;
}
bool bluefruit_le_enable_keyboard(void) { bool bluefruit_le_enable_keyboard(void) {
char resbuf[128]; char resbuf[128];
@ -671,7 +675,9 @@ void bluefruit_le_send_mouse_move(int8_t x, int8_t y, int8_t scroll, int8_t pan,
} }
#endif #endif
uint32_t bluefruit_le_read_battery_voltage(void) { return state.vbat; } uint32_t bluefruit_le_read_battery_voltage(void) {
return state.vbat;
}
bool bluefruit_le_set_mode_leds(bool on) { bool bluefruit_le_set_mode_leds(bool on) {
if (!state.configured) { if (!state.configured) {

View File

@ -52,7 +52,7 @@ uint8_t auto_detect_output(void) {
#endif #endif
#ifdef BLUETOOTH_ENABLE #ifdef BLUETOOTH_ENABLE
return OUTPUT_BLUETOOTH; // should check if BT is connected here return OUTPUT_BLUETOOTH; // should check if BT is connected here
#endif #endif
return OUTPUT_NONE; return OUTPUT_NONE;

View File

@ -61,7 +61,9 @@ static inline uint16_t rn42_consumer_usage_to_bitmap(uint16_t usage) {
} }
} }
void rn42_init(void) { uart_init(RN42_BAUD_RATE); } void rn42_init(void) {
uart_init(RN42_BAUD_RATE);
}
void rn42_send_keyboard(report_keyboard_t *report) { void rn42_send_keyboard(report_keyboard_t *report) {
uart_write(0xFD); uart_write(0xFD);
@ -81,8 +83,8 @@ void rn42_send_mouse(report_mouse_t *report) {
uart_write(report->buttons); uart_write(report->buttons);
uart_write(report->x); uart_write(report->x);
uart_write(report->y); uart_write(report->y);
uart_write(report->v); // should try sending the wheel v here uart_write(report->v); // should try sending the wheel v here
uart_write(report->h); // should try sending the wheel h here uart_write(report->h); // should try sending the wheel h here
uart_write(0x00); uart_write(0x00);
} }

View File

@ -37,11 +37,17 @@ uint32_t eeprom_read_dword(const uint32_t *addr) {
return ret; return ret;
} }
void eeprom_write_byte(uint8_t *addr, uint8_t value) { eeprom_write_block(&value, addr, 1); } 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_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_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) { void eeprom_update_block(const void *buf, void *addr, size_t len) {
uint8_t read_buf[len]; uint8_t read_buf[len];

View File

@ -43,7 +43,7 @@
#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT) #if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
# include "timer.h" # include "timer.h"
# include "debug.h" # include "debug.h"
#endif // DEBUG_EEPROM_OUTPUT #endif // DEBUG_EEPROM_OUTPUT
static inline void fill_target_address(uint8_t *buffer, const void *addr) { static inline void fill_target_address(uint8_t *buffer, const void *addr) {
uintptr_t p = (uintptr_t)addr; uintptr_t p = (uintptr_t)addr;
@ -91,7 +91,7 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) {
dprintf(" %02X", (int)(((uint8_t *)buf)[i])); dprintf(" %02X", (int)(((uint8_t *)buf)[i]));
} }
dprintf("\n"); dprintf("\n");
#endif // DEBUG_EEPROM_OUTPUT #endif // DEBUG_EEPROM_OUTPUT
} }
void eeprom_write_block(const void *buf, void *addr, size_t len) { void eeprom_write_block(const void *buf, void *addr, size_t len) {
@ -122,7 +122,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
dprintf(" %02X", (int)(read_buf[i])); dprintf(" %02X", (int)(read_buf[i]));
} }
dprintf("\n"); dprintf("\n");
#endif // DEBUG_EEPROM_OUTPUT #endif // DEBUG_EEPROM_OUTPUT
i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE + write_length, 100); i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE + write_length, 100);
wait_ms(EXTERNAL_EEPROM_WRITE_TIME); wait_ms(EXTERNAL_EEPROM_WRITE_TIME);

View File

@ -52,7 +52,9 @@
# define EXTERNAL_EEPROM_SPI_TIMEOUT 100 # define EXTERNAL_EEPROM_SPI_TIMEOUT 100
#endif #endif
static bool spi_eeprom_start(void) { return spi_start(EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN, EXTERNAL_EEPROM_SPI_LSBFIRST, EXTERNAL_EEPROM_SPI_MODE, EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR); } static bool spi_eeprom_start(void) {
return spi_start(EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN, EXTERNAL_EEPROM_SPI_LSBFIRST, EXTERNAL_EEPROM_SPI_MODE, EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR);
}
static spi_status_t spi_eeprom_wait_while_busy(int timeout) { static spi_status_t spi_eeprom_wait_while_busy(int timeout) {
uint32_t deadline = timer_read32() + timeout; uint32_t deadline = timer_read32() + timeout;
@ -80,7 +82,9 @@ static void spi_eeprom_transmit_address(uintptr_t addr) {
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
void eeprom_driver_init(void) { spi_init(); } void eeprom_driver_init(void) {
spi_init();
}
void eeprom_driver_erase(void) { void eeprom_driver_erase(void) {
#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT) #if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
@ -135,7 +139,7 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) {
dprintf(" %02X", (int)(((uint8_t *)buf)[i])); dprintf(" %02X", (int)(((uint8_t *)buf)[i]));
} }
dprintf("\n"); dprintf("\n");
#endif // DEBUG_EEPROM_OUTPUT #endif // DEBUG_EEPROM_OUTPUT
spi_stop(); spi_stop();
} }
@ -192,7 +196,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
dprintf(" %02X", (int)(uint8_t)(read_buf[i])); dprintf(" %02X", (int)(uint8_t)(read_buf[i]));
} }
dprintf("\n"); dprintf("\n");
#endif // DEBUG_EEPROM_OUTPUT #endif // DEBUG_EEPROM_OUTPUT
spi_write(CMD_WRITE); spi_write(CMD_WRITE);
spi_eeprom_transmit_address(target_addr); spi_eeprom_transmit_address(target_addr);

View File

@ -30,9 +30,13 @@ size_t clamp_length(intptr_t offset, size_t len) {
return len; return len;
} }
void eeprom_driver_init(void) { eeprom_driver_erase(); } void eeprom_driver_init(void) {
eeprom_driver_erase();
}
void eeprom_driver_erase(void) { memset(transientBuffer, 0x00, TRANSIENT_EEPROM_SIZE); } void eeprom_driver_erase(void) {
memset(transientBuffer, 0x00, TRANSIENT_EEPROM_SIZE);
}
void eeprom_read_block(void *buf, const void *addr, size_t len) { void eeprom_read_block(void *buf, const void *addr, size_t len) {
intptr_t offset = (intptr_t)addr; intptr_t offset = (intptr_t)addr;

View File

@ -21,5 +21,5 @@
*/ */
#ifndef TRANSIENT_EEPROM_SIZE #ifndef TRANSIENT_EEPROM_SIZE
# include "eeconfig.h" # include "eeconfig.h"
# define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO # define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
#endif #endif

View File

@ -65,7 +65,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #define DEBUG_FLASH_SPI_OUTPUT // #define DEBUG_FLASH_SPI_OUTPUT
static bool spi_flash_start(void) { return spi_start(EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN, EXTERNAL_FLASH_SPI_LSBFIRST, EXTERNAL_FLASH_SPI_MODE, EXTERNAL_FLASH_SPI_CLOCK_DIVISOR); } static bool spi_flash_start(void) {
return spi_start(EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN, EXTERNAL_FLASH_SPI_LSBFIRST, EXTERNAL_FLASH_SPI_MODE, EXTERNAL_FLASH_SPI_CLOCK_DIVISOR);
}
static flash_status_t spi_flash_wait_while_busy(void) { static flash_status_t spi_flash_wait_while_busy(void) {
uint32_t deadline = timer_read32() + EXTERNAL_FLASH_SPI_TIMEOUT; uint32_t deadline = timer_read32() + EXTERNAL_FLASH_SPI_TIMEOUT;
@ -160,7 +162,9 @@ static flash_status_t spi_flash_transaction(uint8_t cmd, uint32_t addr, uint8_t
return response; return response;
} }
void flash_init(void) { spi_init(); } void flash_init(void) {
spi_init();
}
flash_status_t flash_erase_chip(void) { flash_status_t flash_erase_chip(void) {
flash_status_t response = FLASH_STATUS_SUCCESS; flash_status_t response = FLASH_STATUS_SUCCESS;
@ -304,7 +308,7 @@ flash_status_t flash_read_block(uint32_t addr, void *buf, size_t len) {
dprintf(" %02X", (int)(((uint8_t *)read_buf)[i])); dprintf(" %02X", (int)(((uint8_t *)read_buf)[i]));
} }
dprintf("\n"); dprintf("\n");
#endif // DEBUG_FLASH_SPI_OUTPUT #endif // DEBUG_FLASH_SPI_OUTPUT
return response; return response;
} }
@ -340,7 +344,7 @@ flash_status_t flash_write_block(uint32_t addr, const void *buf, size_t len) {
dprintf(" %02X", (int)(uint8_t)(write_buf[i])); dprintf(" %02X", (int)(uint8_t)(write_buf[i]));
} }
dprintf("\n"); dprintf("\n");
#endif // DEBUG_FLASH_SPI_OUTPUT #endif // DEBUG_FLASH_SPI_OUTPUT
/* Perform the write. */ /* Perform the write. */
response = spi_flash_transaction(FLASH_CMD_PP, addr, write_buf, write_length); response = spi_flash_transaction(FLASH_CMD_PP, addr, write_buf, write_length);

View File

@ -10,11 +10,11 @@
#define TIMEOUT 100 #define TIMEOUT 100
enum { enum {
CMD_IODIRA = 0x00, // i/o direction register CMD_IODIRA = 0x00, // i/o direction register
CMD_IODIRB = 0x01, CMD_IODIRB = 0x01,
CMD_GPPUA = 0x0C, // GPIO pull-up resistor register CMD_GPPUA = 0x0C, // GPIO pull-up resistor register
CMD_GPPUB = 0x0D, CMD_GPPUB = 0x0D,
CMD_GPIOA = 0x12, // general purpose i/o port register (write modifies OLAT) CMD_GPIOA = 0x12, // general purpose i/o port register (write modifies OLAT)
CMD_GPIOB = 0x13, CMD_GPIOB = 0x13,
}; };

View File

@ -106,12 +106,14 @@ void DRV_init(void) {
void DRV_rtp_init(void) { void DRV_rtp_init(void) {
DRV_write(DRV_GO, 0x00); DRV_write(DRV_GO, 0x00);
DRV_write(DRV_RTP_INPUT, 20); // 20 is the lowest value I've found where haptics can still be felt. DRV_write(DRV_RTP_INPUT, 20); // 20 is the lowest value I've found where haptics can still be felt.
DRV_write(DRV_MODE, 0x05); DRV_write(DRV_MODE, 0x05);
DRV_write(DRV_GO, 0x01); DRV_write(DRV_GO, 0x01);
} }
void DRV_amplitude(uint8_t amplitude) { DRV_write(DRV_RTP_INPUT, amplitude); } void DRV_amplitude(uint8_t amplitude) {
DRV_write(DRV_RTP_INPUT, amplitude);
}
void DRV_pulse(uint8_t sequence) { void DRV_pulse(uint8_t sequence) {
DRV_write(DRV_GO, 0x00); DRV_write(DRV_GO, 0x00);

View File

@ -28,13 +28,21 @@ uint8_t solenoid_dwell = SOLENOID_DEFAULT_DWELL;
extern haptic_config_t haptic_config; extern haptic_config_t haptic_config;
void solenoid_buzz_on(void) { haptic_set_buzz(1); } void solenoid_buzz_on(void) {
haptic_set_buzz(1);
}
void solenoid_buzz_off(void) { haptic_set_buzz(0); } void solenoid_buzz_off(void) {
haptic_set_buzz(0);
}
void solenoid_set_buzz(int buzz) { haptic_set_buzz(buzz); } void solenoid_set_buzz(int buzz) {
haptic_set_buzz(buzz);
}
void solenoid_set_dwell(uint8_t dwell) { solenoid_dwell = dwell; } void solenoid_set_dwell(uint8_t dwell) {
solenoid_dwell = dwell;
}
void solenoid_stop(void) { void solenoid_stop(void) {
SOLENOID_PIN_WRITE_INACTIVE(); SOLENOID_PIN_WRITE_INACTIVE();
@ -89,4 +97,6 @@ void solenoid_setup(void) {
} }
} }
void solenoid_shutdown(void) { SOLENOID_PIN_WRITE_INACTIVE(); } void solenoid_shutdown(void) {
SOLENOID_PIN_WRITE_INACTIVE();
}

View File

@ -39,7 +39,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Addressing Setting Commands // Addressing Setting Commands
#define PAM_SETCOLUMN_LSB 0x00 #define PAM_SETCOLUMN_LSB 0x00
#define PAM_SETCOLUMN_MSB 0x10 #define PAM_SETCOLUMN_MSB 0x10
#define PAM_PAGE_ADDR 0xB0 // 0xb0 -- 0xb7 #define PAM_PAGE_ADDR 0xB0 // 0xb0 -- 0xb7
// Hardware Configuration Commands // Hardware Configuration Commands
#define DISPLAY_START_LINE 0x40 #define DISPLAY_START_LINE 0x40
@ -138,7 +138,9 @@ bool st7565_init(display_rotation_t rotation) {
return true; return true;
} }
__attribute__((weak)) display_rotation_t st7565_init_user(display_rotation_t rotation) { return rotation; } __attribute__((weak)) display_rotation_t st7565_init_user(display_rotation_t rotation) {
return rotation;
}
void st7565_clear(void) { void st7565_clear(void) {
memset(st7565_buffer, 0, sizeof(st7565_buffer)); memset(st7565_buffer, 0, sizeof(st7565_buffer));
@ -212,7 +214,8 @@ void st7565_advance_page(bool clearPageRemainder) {
remaining = remaining / ST7565_FONT_WIDTH; remaining = remaining / ST7565_FONT_WIDTH;
// Write empty character until next line // Write empty character until next line
while (remaining--) st7565_write_char(' ', false); while (remaining--)
st7565_write_char(' ', false);
} else { } else {
// Next page index out of bounds? // Next page index out of bounds?
if (index + remaining >= ST7565_MATRIX_SIZE) { if (index + remaining >= ST7565_MATRIX_SIZE) {
@ -263,7 +266,7 @@ void st7565_write_char(const char data, bool invert) {
_Static_assert(sizeof(font) >= ((ST7565_FONT_END + 1 - ST7565_FONT_START) * ST7565_FONT_WIDTH), "ST7565_FONT_END references outside array"); _Static_assert(sizeof(font) >= ((ST7565_FONT_END + 1 - ST7565_FONT_START) * ST7565_FONT_WIDTH), "ST7565_FONT_END references outside array");
// set the reder buffer data // set the reder buffer data
uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index
if (cast_data < ST7565_FONT_START || cast_data > ST7565_FONT_END) { if (cast_data < ST7565_FONT_START || cast_data > ST7565_FONT_END) {
memset(st7565_cursor, 0x00, ST7565_FONT_WIDTH); memset(st7565_cursor, 0x00, ST7565_FONT_WIDTH);
} else { } else {
@ -389,7 +392,7 @@ void st7565_write_raw_P(const char *data, uint16_t size) {
st7565_dirty |= ((ST7565_BLOCK_TYPE)1 << (i / ST7565_BLOCK_SIZE)); st7565_dirty |= ((ST7565_BLOCK_TYPE)1 << (i / ST7565_BLOCK_SIZE));
} }
} }
#endif // defined(__AVR__) #endif // defined(__AVR__)
bool st7565_on(void) { bool st7565_on(void) {
if (!st7565_initialized) { if (!st7565_initialized) {
@ -429,7 +432,9 @@ bool st7565_off(void) {
__attribute__((weak)) void st7565_off_user(void) {} __attribute__((weak)) void st7565_off_user(void) {}
bool st7565_is_on(void) { return st7565_active; } bool st7565_is_on(void) {
return st7565_active;
}
bool st7565_invert(bool invert) { bool st7565_invert(bool invert) {
if (!st7565_initialized) { if (!st7565_initialized) {
@ -445,9 +450,13 @@ bool st7565_invert(bool invert) {
return st7565_inverted; return st7565_inverted;
} }
uint8_t st7565_max_chars(void) { return ST7565_DISPLAY_WIDTH / ST7565_FONT_WIDTH; } uint8_t st7565_max_chars(void) {
return ST7565_DISPLAY_WIDTH / ST7565_FONT_WIDTH;
}
uint8_t st7565_max_lines(void) { return ST7565_DISPLAY_HEIGHT / ST7565_FONT_HEIGHT; } uint8_t st7565_max_lines(void) {
return ST7565_DISPLAY_HEIGHT / ST7565_FONT_HEIGHT;
}
void st7565_task(void) { void st7565_task(void) {
if (!st7565_initialized) { if (!st7565_initialized) {

View File

@ -29,16 +29,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define ST7565_DISPLAY_HEIGHT 32 # define ST7565_DISPLAY_HEIGHT 32
#endif #endif
#ifndef ST7565_MATRIX_SIZE #ifndef ST7565_MATRIX_SIZE
# define ST7565_MATRIX_SIZE (ST7565_DISPLAY_HEIGHT / 8 * ST7565_DISPLAY_WIDTH) // 1024 (compile time mathed) # define ST7565_MATRIX_SIZE (ST7565_DISPLAY_HEIGHT / 8 * ST7565_DISPLAY_WIDTH) // 1024 (compile time mathed)
#endif #endif
#ifndef ST7565_BLOCK_TYPE #ifndef ST7565_BLOCK_TYPE
# define ST7565_BLOCK_TYPE uint16_t # define ST7565_BLOCK_TYPE uint16_t
#endif #endif
#ifndef ST7565_BLOCK_COUNT #ifndef ST7565_BLOCK_COUNT
# define ST7565_BLOCK_COUNT (sizeof(ST7565_BLOCK_TYPE) * 8) // 32 (compile time mathed) # define ST7565_BLOCK_COUNT (sizeof(ST7565_BLOCK_TYPE) * 8) // 32 (compile time mathed)
#endif #endif
#ifndef ST7565_BLOCK_SIZE #ifndef ST7565_BLOCK_SIZE
# define ST7565_BLOCK_SIZE (ST7565_MATRIX_SIZE / ST7565_BLOCK_COUNT) // 32 (compile time mathed) # define ST7565_BLOCK_SIZE (ST7565_MATRIX_SIZE / ST7565_BLOCK_COUNT) // 32 (compile time mathed)
#endif #endif
// the column address corresponding to the first column in the display hardware // the column address corresponding to the first column in the display hardware
@ -174,7 +174,7 @@ void st7565_write_raw_P(const char *data, uint16_t size);
# define st7565_write_P(data, invert) st7565_write(data, invert) # define st7565_write_P(data, invert) st7565_write(data, invert)
# define st7565_write_ln_P(data, invert) st7565_write_ln(data, invert) # define st7565_write_ln_P(data, invert) st7565_write_ln(data, invert)
# define st7565_write_raw_P(data, size) st7565_write_raw(data, size) # define st7565_write_raw_P(data, size) st7565_write_raw(data, size)
#endif // defined(__AVR__) #endif // defined(__AVR__)
// Can be used to manually turn on the screen if it is off // Can be used to manually turn on the screen if it is off
// Returns true if the screen was on or turns on // Returns true if the screen was on or turns on

View File

@ -20,15 +20,15 @@
#ifndef APA102_NOPS #ifndef APA102_NOPS
# if defined(__AVR__) # if defined(__AVR__)
# define APA102_NOPS 0 // AVR at 16 MHz already spends 62.5 ns per clock, so no extra delay is needed # define APA102_NOPS 0 // AVR at 16 MHz already spends 62.5 ns per clock, so no extra delay is needed
# elif defined(PROTOCOL_CHIBIOS) # elif defined(PROTOCOL_CHIBIOS)
# include "hal.h" # include "hal.h"
# if defined(STM32F0XX) || defined(STM32F1XX) || defined(STM32F3XX) || defined(STM32F4XX) || defined(STM32L0XX) || defined(GD32VF103) # if defined(STM32F0XX) || defined(STM32F1XX) || defined(STM32F3XX) || defined(STM32F4XX) || defined(STM32L0XX) || defined(GD32VF103)
# define APA102_NOPS (100 / (1000000000L / (CPU_CLOCK / 4))) // This calculates how many loops of 4 nops to run to delay 100 ns # define APA102_NOPS (100 / (1000000000L / (CPU_CLOCK / 4))) // This calculates how many loops of 4 nops to run to delay 100 ns
# else # else
# error("APA102_NOPS configuration required") # error("APA102_NOPS configuration required")
# define APA102_NOPS 0 // this just pleases the compile so the above error is easier to spot # define APA102_NOPS 0 // this just pleases the compile so the above error is easier to spot
# endif # endif
# endif # endif
#endif #endif
@ -72,7 +72,9 @@ void apa102_setleds(LED_TYPE *start_led, uint16_t num_leds) {
} }
// Overwrite the default rgblight_call_driver to use apa102 driver // Overwrite the default rgblight_call_driver to use apa102 driver
void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { apa102_setleds(start_led, num_leds); } void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) {
apa102_setleds(start_led, num_leds);
}
void static apa102_init(void) { void static apa102_init(void) {
setPinOutput(RGB_DI_PIN); setPinOutput(RGB_DI_PIN);

View File

@ -23,17 +23,17 @@
*/ */
#define AWINIC_ID 0b1010 << 4 #define AWINIC_ID 0b1010 << 4
#define AW_PAGE_FUNCTION 0x00 << 1 // PG0, Function registers #define AW_PAGE_FUNCTION 0x00 << 1 // PG0, Function registers
#define AW_PAGE_PWM 0x01 << 1 // PG1, LED PWM control #define AW_PAGE_PWM 0x01 << 1 // PG1, LED PWM control
#define AW_PAGE_SCALING 0x02 << 1 // PG2, LED current scaling control #define AW_PAGE_SCALING 0x02 << 1 // PG2, LED current scaling control
#define AW_PAGE_PATCHOICE 0x03 << 1 // PG3, Pattern choice? #define AW_PAGE_PATCHOICE 0x03 << 1 // PG3, Pattern choice?
#define AW_PAGE_PWMSCALING 0x04 << 1 // PG4, LED PWM + Scaling control? #define AW_PAGE_PWMSCALING 0x04 << 1 // PG4, LED PWM + Scaling control?
#define AW_WRITE 0 #define AW_WRITE 0
#define AW_READ 1 #define AW_READ 1
#define AW_REG_CONFIGURATION 0x00 // PG0 #define AW_REG_CONFIGURATION 0x00 // PG0
#define AW_REG_GLOBALCURRENT 0x01 // PG0 #define AW_REG_GLOBALCURRENT 0x01 // PG0
// Default value of AW_REG_CONFIGURATION // Default value of AW_REG_CONFIGURATION
// D7:D4 = 1011, SWSEL (SW1~SW12 active) // D7:D4 = 1011, SWSEL (SW1~SW12 active)

View File

@ -42,13 +42,13 @@
#define ISSI_REG_PICTUREFRAME 0x01 #define ISSI_REG_PICTUREFRAME 0x01
// Not defined in the datasheet -- See AN for IC // Not defined in the datasheet -- See AN for IC
#define ISSI_REG_GHOST_IMAGE_PREVENTION 0xC2 // Set bit 4 to enable de-ghosting #define ISSI_REG_GHOST_IMAGE_PREVENTION 0xC2 // Set bit 4 to enable de-ghosting
#define ISSI_REG_SHUTDOWN 0x0A #define ISSI_REG_SHUTDOWN 0x0A
#define ISSI_REG_AUDIOSYNC 0x06 #define ISSI_REG_AUDIOSYNC 0x06
#define ISSI_COMMANDREGISTER 0xFD #define ISSI_COMMANDREGISTER 0xFD
#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine' #define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
@ -148,7 +148,7 @@ void IS31FL3731_init(uint8_t addr) {
// enable software shutdown // enable software shutdown
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00); IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
#ifdef ISSI_3731_DEGHOST // set to enable de-ghosting of the array #ifdef ISSI_3731_DEGHOST // set to enable de-ghosting of the array
IS31FL3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10); IS31FL3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10);
#endif #endif

View File

@ -41,13 +41,13 @@
#define ISSI_REG_PICTUREFRAME 0x01 #define ISSI_REG_PICTUREFRAME 0x01
// Not defined in the datasheet -- See AN for IC // Not defined in the datasheet -- See AN for IC
#define ISSI_REG_GHOST_IMAGE_PREVENTION 0xC2 // Set bit 4 to enable de-ghosting #define ISSI_REG_GHOST_IMAGE_PREVENTION 0xC2 // Set bit 4 to enable de-ghosting
#define ISSI_REG_SHUTDOWN 0x0A #define ISSI_REG_SHUTDOWN 0x0A
#define ISSI_REG_AUDIOSYNC 0x06 #define ISSI_REG_AUDIOSYNC 0x06
#define ISSI_COMMANDREGISTER 0xFD #define ISSI_COMMANDREGISTER 0xFD
#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine' #define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
@ -136,7 +136,7 @@ void IS31FL3731_init(uint8_t addr) {
// enable software shutdown // enable software shutdown
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00); IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
#ifdef ISSI_3731_DEGHOST // set to enable de-ghosting of the array #ifdef ISSI_3731_DEGHOST // set to enable de-ghosting of the array
IS31FL3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10); IS31FL3731_write_register(addr, ISSI_REG_GHOST_IMAGE_PREVENTION, 0x10);
#endif #endif

View File

@ -39,16 +39,16 @@
#define ISSI_INTERRUPTMASKREGISTER 0xF0 #define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_PAGE_LEDCONTROL 0x00 // PG0 #define ISSI_PAGE_LEDCONTROL 0x00 // PG0
#define ISSI_PAGE_PWM 0x01 // PG1 #define ISSI_PAGE_PWM 0x01 // PG1
#define ISSI_PAGE_AUTOBREATH 0x02 // PG2 #define ISSI_PAGE_AUTOBREATH 0x02 // PG2
#define ISSI_PAGE_FUNCTION 0x03 // PG3 #define ISSI_PAGE_FUNCTION 0x03 // PG3
#define ISSI_REG_CONFIGURATION 0x00 // PG3 #define ISSI_REG_CONFIGURATION 0x00 // PG3
#define ISSI_REG_GLOBALCURRENT 0x01 // PG3 #define ISSI_REG_GLOBALCURRENT 0x01 // PG3
#define ISSI_REG_RESET 0x11 // PG3 #define ISSI_REG_RESET 0x11 // PG3
#define ISSI_REG_SWPULLUP 0x0F // PG3 #define ISSI_REG_SWPULLUP 0x0F // PG3
#define ISSI_REG_CSPULLUP 0x10 // PG3 #define ISSI_REG_CSPULLUP 0x10 // PG3
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
@ -59,7 +59,7 @@
#endif #endif
#ifndef ISSI_PWM_FREQUENCY #ifndef ISSI_PWM_FREQUENCY
# define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3733B only # define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3733B only
#endif #endif
#ifndef ISSI_SWPULLUP #ifndef ISSI_SWPULLUP

View File

@ -47,13 +47,13 @@ void IS31FL3733_set_led_control_register(uint8_t index, bool value);
void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index); void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index);
void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index); void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index);
#define PUR_0R 0x00 // No PUR resistor #define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL #define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL
#define PUR_3KR 0x03 // 3.0k Ohm resistor on all the time #define PUR_3KR 0x03 // 3.0k Ohm resistor on all the time
#define PUR_4KR 0x04 // 4.0k Ohm resistor on all the time #define PUR_4KR 0x04 // 4.0k Ohm resistor on all the time
#define PUR_8KR 0x05 // 8.0k Ohm resistor on all the time #define PUR_8KR 0x05 // 8.0k Ohm resistor on all the time
#define PUR_16KR 0x06 // 16k Ohm resistor on all the time #define PUR_16KR 0x06 // 16k Ohm resistor on all the time
#define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL #define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL
#define A_1 0x00 #define A_1 0x00
#define A_2 0x01 #define A_2 0x01

View File

@ -38,16 +38,16 @@
#define ISSI_INTERRUPTMASKREGISTER 0xF0 #define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_PAGE_LEDCONTROL 0x00 // PG0 #define ISSI_PAGE_LEDCONTROL 0x00 // PG0
#define ISSI_PAGE_PWM 0x01 // PG1 #define ISSI_PAGE_PWM 0x01 // PG1
#define ISSI_PAGE_AUTOBREATH 0x02 // PG2 #define ISSI_PAGE_AUTOBREATH 0x02 // PG2
#define ISSI_PAGE_FUNCTION 0x03 // PG3 #define ISSI_PAGE_FUNCTION 0x03 // PG3
#define ISSI_REG_CONFIGURATION 0x00 // PG3 #define ISSI_REG_CONFIGURATION 0x00 // PG3
#define ISSI_REG_GLOBALCURRENT 0x01 // PG3 #define ISSI_REG_GLOBALCURRENT 0x01 // PG3
#define ISSI_REG_RESET 0x11 // PG3 #define ISSI_REG_RESET 0x11 // PG3
#define ISSI_REG_SWPULLUP 0x0F // PG3 #define ISSI_REG_SWPULLUP 0x0F // PG3
#define ISSI_REG_CSPULLUP 0x10 // PG3 #define ISSI_REG_CSPULLUP 0x10 // PG3
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100
@ -58,7 +58,7 @@
#endif #endif
#ifndef ISSI_PWM_FREQUENCY #ifndef ISSI_PWM_FREQUENCY
# define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3733B only # define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3733B only
#endif #endif
#ifndef ISSI_SWPULLUP #ifndef ISSI_SWPULLUP

View File

@ -48,13 +48,13 @@ void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bo
void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index); void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index);
void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index); void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index);
#define PUR_0R 0x00 // No PUR resistor #define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL #define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL
#define PUR_3KR 0x03 // 3.0k Ohm resistor on all the time #define PUR_3KR 0x03 // 3.0k Ohm resistor on all the time
#define PUR_4KR 0x04 // 4.0k Ohm resistor on all the time #define PUR_4KR 0x04 // 4.0k Ohm resistor on all the time
#define PUR_8KR 0x05 // 8.0k Ohm resistor on all the time #define PUR_8KR 0x05 // 8.0k Ohm resistor on all the time
#define PUR_16KR 0x06 // 16k Ohm resistor on all the time #define PUR_16KR 0x06 // 16k Ohm resistor on all the time
#define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL #define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL
#define A_1 0x00 #define A_1 0x00
#define A_2 0x01 #define A_2 0x01

View File

@ -36,16 +36,16 @@
#define ISSI_INTERRUPTMASKREGISTER 0xF0 #define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_PAGE_LEDCONTROL 0x00 // PG0 #define ISSI_PAGE_LEDCONTROL 0x00 // PG0
#define ISSI_PAGE_PWM 0x01 // PG1 #define ISSI_PAGE_PWM 0x01 // PG1
#define ISSI_PAGE_AUTOBREATH 0x02 // PG2 #define ISSI_PAGE_AUTOBREATH 0x02 // PG2
#define ISSI_PAGE_FUNCTION 0x03 // PG3 #define ISSI_PAGE_FUNCTION 0x03 // PG3
#define ISSI_REG_CONFIGURATION 0x00 // PG3 #define ISSI_REG_CONFIGURATION 0x00 // PG3
#define ISSI_REG_GLOBALCURRENT 0x01 // PG3 #define ISSI_REG_GLOBALCURRENT 0x01 // PG3
#define ISSI_REG_RESET 0x11 // PG3 #define ISSI_REG_RESET 0x11 // PG3
#define ISSI_REG_SWPULLUP 0x0F // PG3 #define ISSI_REG_SWPULLUP 0x0F // PG3
#define ISSI_REG_CSPULLUP 0x10 // PG3 #define ISSI_REG_CSPULLUP 0x10 // PG3
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100

View File

@ -61,14 +61,14 @@ void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled);
void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2); void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2);
void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2); void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2);
#define PUR_0R 0x00 // No PUR resistor #define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x01 // 0.5k Ohm resistor #define PUR_05KR 0x01 // 0.5k Ohm resistor
#define PUR_1KR 0x02 // 1.0k Ohm resistor #define PUR_1KR 0x02 // 1.0k Ohm resistor
#define PUR_2KR 0x03 // 2.0k Ohm resistor #define PUR_2KR 0x03 // 2.0k Ohm resistor
#define PUR_4KR 0x04 // 4.0k Ohm resistor #define PUR_4KR 0x04 // 4.0k Ohm resistor
#define PUR_8KR 0x05 // 8.0k Ohm resistor #define PUR_8KR 0x05 // 8.0k Ohm resistor
#define PUR_16KR 0x06 // 16k Ohm resistor #define PUR_16KR 0x06 // 16k Ohm resistor
#define PUR_32KR 0x07 // 32k Ohm resistor #define PUR_32KR 0x07 // 32k Ohm resistor
#define A_1 0x00 #define A_1 0x00
#define A_2 0x02 #define A_2 0x02

View File

@ -38,16 +38,16 @@
#define ISSI_INTERRUPTMASKREGISTER 0xF0 #define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_PAGE_LEDCONTROL 0x00 // PG0 #define ISSI_PAGE_LEDCONTROL 0x00 // PG0
#define ISSI_PAGE_PWM 0x01 // PG1 #define ISSI_PAGE_PWM 0x01 // PG1
#define ISSI_PAGE_AUTOBREATH 0x02 // PG2 #define ISSI_PAGE_AUTOBREATH 0x02 // PG2
#define ISSI_PAGE_FUNCTION 0x03 // PG3 #define ISSI_PAGE_FUNCTION 0x03 // PG3
#define ISSI_REG_CONFIGURATION 0x00 // PG3 #define ISSI_REG_CONFIGURATION 0x00 // PG3
#define ISSI_REG_GLOBALCURRENT 0x01 // PG3 #define ISSI_REG_GLOBALCURRENT 0x01 // PG3
#define ISSI_REG_RESET 0x11 // PG3 #define ISSI_REG_RESET 0x11 // PG3
#define ISSI_REG_SWPULLUP 0x0F // PG3 #define ISSI_REG_SWPULLUP 0x0F // PG3
#define ISSI_REG_CSPULLUP 0x10 // PG3 #define ISSI_REG_CSPULLUP 0x10 // PG3
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100

View File

@ -48,14 +48,14 @@ void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bo
void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2); void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2);
void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2); void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2);
#define PUR_0R 0x00 // No PUR resistor #define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x01 // 0.5k Ohm resistor in t_NOL #define PUR_05KR 0x01 // 0.5k Ohm resistor in t_NOL
#define PUR_1KR 0x02 // 1.0k Ohm resistor in t_NOL #define PUR_1KR 0x02 // 1.0k Ohm resistor in t_NOL
#define PUR_2KR 0x03 // 2.0k Ohm resistor in t_NOL #define PUR_2KR 0x03 // 2.0k Ohm resistor in t_NOL
#define PUR_4KR 0x04 // 4.0k Ohm resistor in t_NOL #define PUR_4KR 0x04 // 4.0k Ohm resistor in t_NOL
#define PUR_8KR 0x05 // 8.0k Ohm resistor in t_NOL #define PUR_8KR 0x05 // 8.0k Ohm resistor in t_NOL
#define PUR_16KR 0x06 // 16k Ohm resistor in t_NOL #define PUR_16KR 0x06 // 16k Ohm resistor in t_NOL
#define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL #define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL
#define A_1 0x00 #define A_1 0x00
#define A_2 0x01 #define A_2 0x01

View File

@ -42,16 +42,16 @@
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 #define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_IDREGISTER 0xFC #define ISSI_IDREGISTER 0xFC
#define ISSI_PAGE_PWM0 0x00 // PG0 #define ISSI_PAGE_PWM0 0x00 // PG0
#define ISSI_PAGE_PWM1 0x01 // PG1 #define ISSI_PAGE_PWM1 0x01 // PG1
#define ISSI_PAGE_SCALING_0 0x02 // PG2 #define ISSI_PAGE_SCALING_0 0x02 // PG2
#define ISSI_PAGE_SCALING_1 0x03 // PG3 #define ISSI_PAGE_SCALING_1 0x03 // PG3
#define ISSI_PAGE_FUNCTION 0x04 // PG4 #define ISSI_PAGE_FUNCTION 0x04 // PG4
#define ISSI_REG_CONFIGURATION 0x00 // PG4 #define ISSI_REG_CONFIGURATION 0x00 // PG4
#define ISSI_REG_GLOBALCURRENT 0x01 // PG4 #define ISSI_REG_GLOBALCURRENT 0x01 // PG4
#define ISSI_REG_PULLDOWNUP 0x02 // PG4 #define ISSI_REG_PULLDOWNUP 0x02 // PG4
#define ISSI_REG_RESET 0x3F // PG4 #define ISSI_REG_RESET 0x3F // PG4
#ifndef ISSI_TIMEOUT #ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100 # define ISSI_TIMEOUT 100

View File

@ -51,14 +51,14 @@ void IS31FL3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t
void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue); void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);
#define PUR_0R 0x00 // No PUR resistor #define PUR_0R 0x00 // No PUR resistor
#define PUR_05KR 0x01 // 0.5k Ohm resistor #define PUR_05KR 0x01 // 0.5k Ohm resistor
#define PUR_1KR 0x02 // 1.0k Ohm resistor #define PUR_1KR 0x02 // 1.0k Ohm resistor
#define PUR_2KR 0x03 // 2.0k Ohm resistor #define PUR_2KR 0x03 // 2.0k Ohm resistor
#define PUR_4KR 0x04 // 4.0k Ohm resistor #define PUR_4KR 0x04 // 4.0k Ohm resistor
#define PUR_8KR 0x05 // 8.0k Ohm resistor #define PUR_8KR 0x05 // 8.0k Ohm resistor
#define PUR_16KR 0x06 // 16k Ohm resistor #define PUR_16KR 0x06 // 16k Ohm resistor
#define PUR_32KR 0x07 // 32k Ohm resistor #define PUR_32KR 0x07 // 32k Ohm resistor
#define CS1_SW1 0x00 #define CS1_SW1 0x00
#define CS2_SW1 0x01 #define CS2_SW1 0x01

View File

@ -34,16 +34,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define OLED_DISPLAY_HEIGHT 64 # define OLED_DISPLAY_HEIGHT 64
# endif # endif
# ifndef OLED_MATRIX_SIZE # ifndef OLED_MATRIX_SIZE
# define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed) # define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed)
# endif # endif
# ifndef OLED_BLOCK_TYPE # ifndef OLED_BLOCK_TYPE
# define OLED_BLOCK_TYPE uint16_t # define OLED_BLOCK_TYPE uint16_t
# endif # endif
# ifndef OLED_BLOCK_COUNT # ifndef OLED_BLOCK_COUNT
# define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 32 (compile time mathed) # define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 32 (compile time mathed)
# endif # endif
# ifndef OLED_BLOCK_SIZE # ifndef OLED_BLOCK_SIZE
# define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed) # define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed)
# endif # endif
# ifndef OLED_COM_PINS # ifndef OLED_COM_PINS
# define OLED_COM_PINS COM_PINS_ALT # define OLED_COM_PINS COM_PINS_ALT
@ -68,7 +68,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// If OLED_BLOCK_TYPE is uint8_t, these tables would look like: // If OLED_BLOCK_TYPE is uint8_t, these tables would look like:
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 } // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 }
// #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 } // #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 }
#else // defined(OLED_DISPLAY_128X64) #else // defined(OLED_DISPLAY_128X64)
// Default 128x32 // Default 128x32
# ifndef OLED_DISPLAY_WIDTH # ifndef OLED_DISPLAY_WIDTH
# define OLED_DISPLAY_WIDTH 128 # define OLED_DISPLAY_WIDTH 128
@ -77,16 +77,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define OLED_DISPLAY_HEIGHT 32 # define OLED_DISPLAY_HEIGHT 32
# endif # endif
# ifndef OLED_MATRIX_SIZE # ifndef OLED_MATRIX_SIZE
# define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed) # define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed)
# endif # endif
# ifndef OLED_BLOCK_TYPE # ifndef OLED_BLOCK_TYPE
# define OLED_BLOCK_TYPE uint16_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only # define OLED_BLOCK_TYPE uint16_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only
# endif # endif
# ifndef OLED_BLOCK_COUNT # ifndef OLED_BLOCK_COUNT
# define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed) # define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed)
# endif # endif
# ifndef OLED_BLOCK_SIZE # ifndef OLED_BLOCK_SIZE
# define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed) # define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed)
# endif # endif
# ifndef OLED_COM_PINS # ifndef OLED_COM_PINS
# define OLED_COM_PINS COM_PINS_SEQ # define OLED_COM_PINS COM_PINS_SEQ
@ -105,7 +105,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// If OLED_BLOCK_TYPE is uint8_t, these tables would look like: // If OLED_BLOCK_TYPE is uint8_t, these tables would look like:
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
// #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 } // #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 }
#endif // defined(OLED_DISPLAY_CUSTOM) #endif // defined(OLED_DISPLAY_CUSTOM)
#if !defined(OLED_IC) #if !defined(OLED_IC)
# define OLED_IC OLED_IC_SSD1306 # define OLED_IC OLED_IC_SSD1306
@ -180,7 +180,7 @@ typedef enum {
OLED_ROTATION_0 = 0, OLED_ROTATION_0 = 0,
OLED_ROTATION_90 = 1, OLED_ROTATION_90 = 1,
OLED_ROTATION_180 = 2, OLED_ROTATION_180 = 2,
OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180 OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180
} oled_rotation_t; } oled_rotation_t;
// Initialize the oled display, rotating the rendered output based on the define passed in. // Initialize the oled display, rotating the rendered output based on the define passed in.
@ -262,7 +262,7 @@ void oled_write_raw_P(const char *data, uint16_t size);
# define oled_write_P(data, invert) oled_write(data, invert) # define oled_write_P(data, invert) oled_write(data, invert)
# define oled_write_ln_P(data, invert) oled_write(data, invert) # define oled_write_ln_P(data, invert) oled_write(data, invert)
# define oled_write_raw_P(data, size) oled_write_raw(data, size) # define oled_write_raw_P(data, size) oled_write_raw(data, size)
#endif // defined(__AVR__) #endif // defined(__AVR__)
// Can be used to manually turn on the screen if it is off // Can be used to manually turn on the screen if it is off
// Returns true if the screen was on or turns on // Returns true if the screen was on or turns on

View File

@ -53,7 +53,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define PAGE_ADDR 0x22 #define PAGE_ADDR 0x22
#define PAM_SETCOLUMN_LSB 0x00 #define PAM_SETCOLUMN_LSB 0x00
#define PAM_SETCOLUMN_MSB 0x10 #define PAM_SETCOLUMN_MSB 0x10
#define PAM_PAGE_ADDR 0xB0 // 0xb0 -- 0xb7 #define PAM_PAGE_ADDR 0xB0 // 0xb0 -- 0xb7
// Hardware Configuration Commands // Hardware Configuration Commands
#define DISPLAY_START_LINE 0x40 #define DISPLAY_START_LINE 0x40
@ -97,9 +97,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define I2C_DATA 0x40 #define I2C_DATA 0x40
#if defined(__AVR__) #if defined(__AVR__)
# define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT) # define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
#else // defined(__AVR__) #else // defined(__AVR__)
# define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT) # define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
#endif // defined(__AVR__) #endif // defined(__AVR__)
#define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT) #define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), OLED_I2C_TIMEOUT)
#define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, OLED_I2C_TIMEOUT) #define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, OLED_I2C_TIMEOUT)
@ -119,7 +119,7 @@ bool oled_inverted = false;
uint8_t oled_brightness = OLED_BRIGHTNESS; uint8_t oled_brightness = OLED_BRIGHTNESS;
oled_rotation_t oled_rotation = 0; oled_rotation_t oled_rotation = 0;
uint8_t oled_rotation_width = 0; uint8_t oled_rotation_width = 0;
uint8_t oled_scroll_speed = 0; // this holds the speed after being remapped to ssd1306 internal values uint8_t oled_scroll_speed = 0; // this holds the speed after being remapped to ssd1306 internal values
uint8_t oled_scroll_start = 0; uint8_t oled_scroll_start = 0;
uint8_t oled_scroll_end = 7; uint8_t oled_scroll_end = 7;
#if OLED_TIMEOUT > 0 #if OLED_TIMEOUT > 0
@ -190,7 +190,7 @@ bool oled_init(oled_rotation_t rotation) {
#if (OLED_IC != OLED_IC_SH1106) #if (OLED_IC != OLED_IC_SH1106)
// MEMORY_MODE is unsupported on SH1106 (Page Addressing only) // MEMORY_MODE is unsupported on SH1106 (Page Addressing only)
MEMORY_MODE, MEMORY_MODE,
0x00, // Horizontal addressing mode 0x00, // Horizontal addressing mode
#endif #endif
}; };
if (I2C_TRANSMIT_P(display_setup1) != I2C_STATUS_SUCCESS) { if (I2C_TRANSMIT_P(display_setup1) != I2C_STATUS_SUCCESS) {
@ -232,8 +232,12 @@ bool oled_init(oled_rotation_t rotation) {
return true; return true;
} }
__attribute__((weak)) oled_rotation_t oled_init_kb(oled_rotation_t rotation) { return rotation; } __attribute__((weak)) oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
__attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rotation) { return rotation; } return rotation;
}
__attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return rotation;
}
void oled_clear(void) { void oled_clear(void) {
memset(oled_buffer, 0, sizeof(oled_buffer)); memset(oled_buffer, 0, sizeof(oled_buffer));
@ -306,9 +310,9 @@ void oled_render(void) {
// Set column & page position // Set column & page position
static uint8_t display_start[] = {I2C_CMD, COLUMN_ADDR, 0, OLED_DISPLAY_WIDTH - 1, PAGE_ADDR, 0, OLED_DISPLAY_HEIGHT / 8 - 1}; static uint8_t display_start[] = {I2C_CMD, COLUMN_ADDR, 0, OLED_DISPLAY_WIDTH - 1, PAGE_ADDR, 0, OLED_DISPLAY_HEIGHT / 8 - 1};
if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) { if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) {
calc_bounds(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start calc_bounds(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start
} else { } else {
calc_bounds_90(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start calc_bounds_90(update_start, &display_start[1]); // Offset from I2C_CMD byte at the start
} }
// Send column & page position // Send column & page position
@ -368,7 +372,8 @@ void oled_advance_page(bool clearPageRemainder) {
remaining = remaining / OLED_FONT_WIDTH; remaining = remaining / OLED_FONT_WIDTH;
// Write empty character until next line // Write empty character until next line
while (remaining--) oled_write_char(' ', false); while (remaining--)
oled_write_char(' ', false);
} else { } else {
// Next page index out of bounds? // Next page index out of bounds?
if (index + remaining >= OLED_MATRIX_SIZE) { if (index + remaining >= OLED_MATRIX_SIZE) {
@ -419,7 +424,7 @@ void oled_write_char(const char data, bool invert) {
_Static_assert(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array"); _Static_assert(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array");
// set the reder buffer data // set the reder buffer data
uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index
if (cast_data < OLED_FONT_START || cast_data > OLED_FONT_END) { if (cast_data < OLED_FONT_START || cast_data > OLED_FONT_END) {
memset(oled_cursor, 0x00, OLED_FONT_WIDTH); memset(oled_cursor, 0x00, OLED_FONT_WIDTH);
} else { } else {
@ -545,7 +550,7 @@ void oled_write_raw_P(const char *data, uint16_t size) {
oled_dirty |= ((OLED_BLOCK_TYPE)1 << (i / OLED_BLOCK_SIZE)); oled_dirty |= ((OLED_BLOCK_TYPE)1 << (i / OLED_BLOCK_SIZE));
} }
} }
#endif // defined(__AVR__) #endif // defined(__AVR__)
bool oled_on(void) { bool oled_on(void) {
if (!oled_initialized) { if (!oled_initialized) {
@ -595,7 +600,9 @@ bool oled_off(void) {
return !oled_active; return !oled_active;
} }
bool is_oled_on(void) { return oled_active; } bool is_oled_on(void) {
return oled_active;
}
uint8_t oled_set_brightness(uint8_t level) { uint8_t oled_set_brightness(uint8_t level) {
if (!oled_initialized) { if (!oled_initialized) {
@ -613,7 +620,9 @@ uint8_t oled_set_brightness(uint8_t level) {
return oled_brightness; return oled_brightness;
} }
uint8_t oled_get_brightness(void) { return oled_brightness; } uint8_t oled_get_brightness(void) {
return oled_brightness;
}
// Set the specific 8 lines rows of the screen to scroll. // Set the specific 8 lines rows of the screen to scroll.
// 0 is the default for start, and 7 for end, which is the entire // 0 is the default for start, and 7 for end, which is the entire
@ -693,7 +702,9 @@ bool oled_scroll_off(void) {
return !oled_scrolling; return !oled_scrolling;
} }
bool is_oled_scrolling(void) { return oled_scrolling; } bool is_oled_scrolling(void) {
return oled_scrolling;
}
bool oled_invert(bool invert) { bool oled_invert(bool invert) {
if (!oled_initialized) { if (!oled_initialized) {
@ -777,5 +788,9 @@ void oled_task(void) {
#endif #endif
} }
__attribute__((weak)) bool oled_task_kb(void) { return oled_task_user(); } __attribute__((weak)) bool oled_task_kb(void) {
__attribute__((weak)) bool oled_task_user(void) { return true; } return oled_task_user();
}
__attribute__((weak)) bool oled_task_user(void) {
return true;
}

View File

@ -71,12 +71,12 @@ uint8_t ps2_host_send(uint8_t data) {
/* terminate a transmission if we have */ /* terminate a transmission if we have */
inhibit(); inhibit();
wait_us(100); // 100us [4]p.13, [5]p.50 wait_us(100); // 100us [4]p.13, [5]p.50
/* 'Request to Send' and Start bit */ /* 'Request to Send' and Start bit */
data_lo(); data_lo();
clock_hi(); clock_hi();
WAIT(clock_lo, 10000, 10); // 10ms [5]p.50 WAIT(clock_lo, 10000, 10); // 10ms [5]p.50
/* Data bit */ /* Data bit */
for (uint8_t i = 0; i < 8; i++) { for (uint8_t i = 0; i < 8; i++) {
@ -143,7 +143,7 @@ uint8_t ps2_host_recv(void) {
idle(); idle();
/* start bit [1] */ /* start bit [1] */
WAIT(clock_lo, 100, 1); // TODO: this is enough? WAIT(clock_lo, 100, 1); // TODO: this is enough?
WAIT(data_lo, 1, 2); WAIT(data_lo, 1, 2);
WAIT(clock_hi, 50, 3); WAIT(clock_hi, 50, 3);

View File

@ -43,7 +43,7 @@ POSSIBILITY OF SUCH DAMAGE.
#if defined(__AVR__) #if defined(__AVR__)
# include <avr/interrupt.h> # include <avr/interrupt.h>
#elif defined(PROTOCOL_CHIBIOS) // TODO: or STM32 ? #elif defined(PROTOCOL_CHIBIOS) // TODO: or STM32 ?
// chibiOS headers // chibiOS headers
# include "ch.h" # include "ch.h"
# include "hal.h" # include "hal.h"
@ -71,7 +71,9 @@ static inline void pbuf_clear(void);
#if defined(PROTOCOL_CHIBIOS) #if defined(PROTOCOL_CHIBIOS)
void ps2_interrupt_service_routine(void); void ps2_interrupt_service_routine(void);
void palCallback(void *arg) { ps2_interrupt_service_routine(); } void palCallback(void *arg) {
ps2_interrupt_service_routine();
}
# define PS2_INT_INIT() \ # define PS2_INT_INIT() \
{ palSetLineMode(PS2_CLOCK_PIN, PAL_MODE_INPUT); } \ { palSetLineMode(PS2_CLOCK_PIN, PAL_MODE_INPUT); } \
@ -85,7 +87,7 @@ void palCallback(void *arg) { ps2_interrupt_service_routine(); }
# define PS2_INT_OFF() \ # define PS2_INT_OFF() \
{ palDisableLineEvent(PS2_CLOCK_PIN); } \ { palDisableLineEvent(PS2_CLOCK_PIN); } \
while (0) while (0)
#endif // PROTOCOL_CHIBIOS #endif // PROTOCOL_CHIBIOS
void ps2_host_init(void) { void ps2_host_init(void) {
idle(); idle();
@ -103,12 +105,12 @@ uint8_t ps2_host_send(uint8_t data) {
/* terminate a transmission if we have */ /* terminate a transmission if we have */
inhibit(); inhibit();
wait_us(100); // 100us [4]p.13, [5]p.50 wait_us(100); // 100us [4]p.13, [5]p.50
/* 'Request to Send' and Start bit */ /* 'Request to Send' and Start bit */
data_lo(); data_lo();
clock_hi(); clock_hi();
WAIT(clock_lo, 10000, 10); // 10ms [5]p.50 WAIT(clock_lo, 10000, 10); // 10ms [5]p.50
/* Data bit[2-9] */ /* Data bit[2-9] */
for (uint8_t i = 0; i < 8; i++) { for (uint8_t i = 0; i < 8; i++) {
@ -244,7 +246,9 @@ RETURN:
} }
#if defined(__AVR__) #if defined(__AVR__)
ISR(PS2_INT_VECT) { ps2_interrupt_service_routine(); } ISR(PS2_INT_VECT) {
ps2_interrupt_service_routine();
}
#endif #endif
/* send LED state to keyboard */ /* send LED state to keyboard */

View File

@ -42,7 +42,7 @@ static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report);
void ps2_mouse_init(void) { void ps2_mouse_init(void) {
ps2_host_init(); ps2_host_init();
wait_ms(PS2_MOUSE_INIT_DELAY); // wait for powering up wait_ms(PS2_MOUSE_INIT_DELAY); // wait for powering up
PS2_MOUSE_SEND(PS2_MOUSE_RESET, "ps2_mouse_init: sending reset"); PS2_MOUSE_SEND(PS2_MOUSE_RESET, "ps2_mouse_init: sending reset");
@ -113,9 +113,13 @@ void ps2_mouse_task(void) {
ps2_mouse_clear_report(&mouse_report); ps2_mouse_clear_report(&mouse_report);
} }
void ps2_mouse_disable_data_reporting(void) { PS2_MOUSE_SEND(PS2_MOUSE_DISABLE_DATA_REPORTING, "ps2 mouse disable data reporting"); } void ps2_mouse_disable_data_reporting(void) {
PS2_MOUSE_SEND(PS2_MOUSE_DISABLE_DATA_REPORTING, "ps2 mouse disable data reporting");
}
void ps2_mouse_enable_data_reporting(void) { PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting"); } void ps2_mouse_enable_data_reporting(void) {
PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting");
}
void ps2_mouse_set_remote_mode(void) { void ps2_mouse_set_remote_mode(void) {
PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode"); PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode");
@ -127,13 +131,21 @@ void ps2_mouse_set_stream_mode(void) {
ps2_mouse_mode = PS2_MOUSE_STREAM_MODE; ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
} }
void ps2_mouse_set_scaling_2_1(void) { PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_2_1, "ps2 mouse set scaling 2:1"); } void ps2_mouse_set_scaling_2_1(void) {
PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_2_1, "ps2 mouse set scaling 2:1");
}
void ps2_mouse_set_scaling_1_1(void) { PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_1_1, "ps2 mouse set scaling 1:1"); } void ps2_mouse_set_scaling_1_1(void) {
PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_1_1, "ps2 mouse set scaling 1:1");
}
void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution) { PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_RESOLUTION, resolution, "ps2 mouse set resolution"); } void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution) {
PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_RESOLUTION, resolution, "ps2 mouse set resolution");
}
void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate) { PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_SAMPLE_RATE, sample_rate, "ps2 mouse set sample rate"); } void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate) {
PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_SAMPLE_RATE, sample_rate, "ps2 mouse set sample rate");
}
/* ============================= HELPERS ============================ */ /* ============================= HELPERS ============================ */
@ -165,7 +177,7 @@ static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report)
#ifdef PS2_MOUSE_INVERT_X #ifdef PS2_MOUSE_INVERT_X
mouse_report->x = -mouse_report->x; mouse_report->x = -mouse_report->x;
#endif #endif
#ifndef PS2_MOUSE_INVERT_Y // NOTE if not! #ifndef PS2_MOUSE_INVERT_Y // NOTE if not!
// invert coordinate of y to conform to USB HID mouse // invert coordinate of y to conform to USB HID mouse
mouse_report->y = -mouse_report->y; mouse_report->y = -mouse_report->y;
#endif #endif

View File

@ -74,9 +74,13 @@ void adns5050_sync(void) {
writePinHigh(ADNS5050_CS_PIN); writePinHigh(ADNS5050_CS_PIN);
} }
void adns5050_cs_select(void) { writePinLow(ADNS5050_CS_PIN); } void adns5050_cs_select(void) {
writePinLow(ADNS5050_CS_PIN);
}
void adns5050_cs_deselect(void) { writePinHigh(ADNS5050_CS_PIN); } void adns5050_cs_deselect(void) {
writePinHigh(ADNS5050_CS_PIN);
}
uint8_t adns5050_serial_read(void) { uint8_t adns5050_serial_read(void) {
setPinInput(ADNS5050_SDIO_PIN); setPinInput(ADNS5050_SDIO_PIN);
@ -190,7 +194,7 @@ int8_t convert_twoscomp(uint8_t data) {
// Don't forget to use the definitions for CPI in the header file. // Don't forget to use the definitions for CPI in the header file.
void adns5050_set_cpi(uint16_t cpi) { void adns5050_set_cpi(uint16_t cpi) {
uint8_t cpival = constrain((cpi / 125), 0x1, 0xD); // limits to 0--119 uint8_t cpival = constrain((cpi / 125), 0x1, 0xD); // limits to 0--119
adns5050_write_reg(REG_MOUSE_CONTROL2, 0b10000 | cpival); adns5050_write_reg(REG_MOUSE_CONTROL2, 0b10000 | cpival);
} }

View File

@ -77,7 +77,9 @@
#define MSB1 0x80 #define MSB1 0x80
// clang-format on // clang-format on
void adns9800_spi_start(void) { spi_start(ADNS9800_CS_PIN, false, ADNS9800_SPI_MODE, ADNS9800_SPI_DIVISOR); } void adns9800_spi_start(void) {
spi_start(ADNS9800_CS_PIN, false, ADNS9800_SPI_MODE, ADNS9800_SPI_DIVISOR);
}
void adns9800_write(uint8_t reg_addr, uint8_t data) { void adns9800_write(uint8_t reg_addr, uint8_t data) {
adns9800_spi_start(); adns9800_spi_start();

View File

@ -24,7 +24,7 @@ uint16_t minAxisValue = ANALOG_JOYSTICK_AXIS_MIN;
uint16_t maxAxisValue = ANALOG_JOYSTICK_AXIS_MAX; uint16_t maxAxisValue = ANALOG_JOYSTICK_AXIS_MAX;
uint8_t maxCursorSpeed = ANALOG_JOYSTICK_SPEED_MAX; uint8_t maxCursorSpeed = ANALOG_JOYSTICK_SPEED_MAX;
uint8_t speedRegulator = ANALOG_JOYSTICK_SPEED_REGULATOR; // Lower Values Create Faster Movement uint8_t speedRegulator = ANALOG_JOYSTICK_SPEED_REGULATOR; // Lower Values Create Faster Movement
int16_t xOrigin, yOrigin; int16_t xOrigin, yOrigin;

View File

@ -54,7 +54,9 @@ void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count);
void RAP_Write(uint8_t address, uint8_t data); void RAP_Write(uint8_t address, uint8_t data);
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
void print_byte(uint8_t byte) { xprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); } void print_byte(uint8_t byte) {
xprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0'));
}
#endif #endif
/* Logical Scaling Functions */ /* Logical Scaling Functions */
@ -73,8 +75,12 @@ void ClipCoordinates(pinnacle_data_t* coordinates) {
} }
} }
uint16_t cirque_pinnacle_get_scale(void) { return scale_data; } uint16_t cirque_pinnacle_get_scale(void) {
void cirque_pinnacle_set_scale(uint16_t scale) { scale_data = scale; } return scale_data;
}
void cirque_pinnacle_set_scale(uint16_t scale) {
scale_data = scale;
}
// Scales data to desired X & Y resolution // Scales data to desired X & Y resolution
void cirque_pinnacle_scale_data(pinnacle_data_t* coordinates, uint16_t xResolution, uint16_t yResolution) { void cirque_pinnacle_scale_data(pinnacle_data_t* coordinates, uint16_t xResolution, uint16_t yResolution) {
@ -105,13 +111,13 @@ void cirque_pinnacle_clear_flags() {
void cirque_pinnacle_enable_feed(bool feedEnable) { void cirque_pinnacle_enable_feed(bool feedEnable) {
uint8_t temp; uint8_t temp;
RAP_ReadBytes(FEEDCONFIG_1, &temp, 1); // Store contents of FeedConfig1 register RAP_ReadBytes(FEEDCONFIG_1, &temp, 1); // Store contents of FeedConfig1 register
if (feedEnable) { if (feedEnable) {
temp |= 0x01; // Set Feed Enable bit temp |= 0x01; // Set Feed Enable bit
RAP_Write(0x04, temp); RAP_Write(0x04, temp);
} else { } else {
temp &= ~0x01; // Clear Feed Enable bit temp &= ~0x01; // Clear Feed Enable bit
RAP_Write(0x04, temp); RAP_Write(0x04, temp);
} }
} }
@ -122,13 +128,13 @@ void cirque_pinnacle_enable_feed(bool feedEnable) {
void ERA_ReadBytes(uint16_t address, uint8_t* data, uint16_t count) { void ERA_ReadBytes(uint16_t address, uint8_t* data, uint16_t count) {
uint8_t ERAControlValue = 0xFF; uint8_t ERAControlValue = 0xFF;
cirque_pinnacle_enable_feed(false); // Disable feed cirque_pinnacle_enable_feed(false); // Disable feed
RAP_Write(ERA_HIGH_BYTE, (uint8_t)(address >> 8)); // Send upper byte of ERA address RAP_Write(ERA_HIGH_BYTE, (uint8_t)(address >> 8)); // Send upper byte of ERA address
RAP_Write(ERA_LOW_BYTE, (uint8_t)(address & 0x00FF)); // Send lower byte of ERA address RAP_Write(ERA_LOW_BYTE, (uint8_t)(address & 0x00FF)); // Send lower byte of ERA address
for (uint16_t i = 0; i < count; i++) { for (uint16_t i = 0; i < count; i++) {
RAP_Write(ERA_CONTROL, 0x05); // Signal ERA-read (auto-increment) to Pinnacle RAP_Write(ERA_CONTROL, 0x05); // Signal ERA-read (auto-increment) to Pinnacle
// Wait for status register 0x1E to clear // Wait for status register 0x1E to clear
do { do {
@ -145,14 +151,14 @@ void ERA_ReadBytes(uint16_t address, uint8_t* data, uint16_t count) {
void ERA_WriteByte(uint16_t address, uint8_t data) { void ERA_WriteByte(uint16_t address, uint8_t data) {
uint8_t ERAControlValue = 0xFF; uint8_t ERAControlValue = 0xFF;
cirque_pinnacle_enable_feed(false); // Disable feed cirque_pinnacle_enable_feed(false); // Disable feed
RAP_Write(ERA_VALUE, data); // Send data byte to be written RAP_Write(ERA_VALUE, data); // Send data byte to be written
RAP_Write(ERA_HIGH_BYTE, (uint8_t)(address >> 8)); // Upper byte of ERA address RAP_Write(ERA_HIGH_BYTE, (uint8_t)(address >> 8)); // Upper byte of ERA address
RAP_Write(ERA_LOW_BYTE, (uint8_t)(address & 0x00FF)); // Lower byte of ERA address RAP_Write(ERA_LOW_BYTE, (uint8_t)(address & 0x00FF)); // Lower byte of ERA address
RAP_Write(ERA_CONTROL, 0x02); // Signal an ERA-write to Pinnacle RAP_Write(ERA_CONTROL, 0x02); // Signal an ERA-write to Pinnacle
// Wait for status register 0x1E to clear // Wait for status register 0x1E to clear
do { do {
@ -166,7 +172,7 @@ void cirque_pinnacle_set_adc_attenuation(uint8_t adcGain) {
uint8_t temp = 0x00; uint8_t temp = 0x00;
ERA_ReadBytes(0x0187, &temp, 1); ERA_ReadBytes(0x0187, &temp, 1);
temp &= 0x3F; // clear top two bits temp &= 0x3F; // clear top two bits
temp |= adcGain; temp |= adcGain;
ERA_WriteByte(0x0187, temp); ERA_WriteByte(0x0187, temp);
ERA_ReadBytes(0x0187, &temp, 1); ERA_ReadBytes(0x0187, &temp, 1);

View File

@ -26,16 +26,16 @@ void cirque_pinnacle_set_scale(uint16_t scale);
// Coordinate scaling values // Coordinate scaling values
#ifndef CIRQUE_PINNACLE_X_LOWER #ifndef CIRQUE_PINNACLE_X_LOWER
# define CIRQUE_PINNACLE_X_LOWER 127 // min "reachable" X value # define CIRQUE_PINNACLE_X_LOWER 127 // min "reachable" X value
#endif #endif
#ifndef CIRQUE_PINNACLE_X_UPPER #ifndef CIRQUE_PINNACLE_X_UPPER
# define CIRQUE_PINNACLE_X_UPPER 1919 // max "reachable" X value # define CIRQUE_PINNACLE_X_UPPER 1919 // max "reachable" X value
#endif #endif
#ifndef CIRQUE_PINNACLE_Y_LOWER #ifndef CIRQUE_PINNACLE_Y_LOWER
# define CIRQUE_PINNACLE_Y_LOWER 63 // min "reachable" Y value # define CIRQUE_PINNACLE_Y_LOWER 63 // min "reachable" Y value
#endif #endif
#ifndef CIRQUE_PINNACLE_Y_UPPER #ifndef CIRQUE_PINNACLE_Y_UPPER
# define CIRQUE_PINNACLE_Y_UPPER 1471 // max "reachable" Y value # define CIRQUE_PINNACLE_Y_UPPER 1471 // max "reachable" Y value
#endif #endif
#ifndef CIRQUE_PINNACLE_X_RANGE #ifndef CIRQUE_PINNACLE_X_RANGE
# define CIRQUE_PINNACLE_X_RANGE (CIRQUE_PINNACLE_X_UPPER - CIRQUE_PINNACLE_X_LOWER) # define CIRQUE_PINNACLE_X_RANGE (CIRQUE_PINNACLE_X_UPPER - CIRQUE_PINNACLE_X_LOWER)

View File

@ -14,7 +14,7 @@ extern bool touchpad_init;
/* RAP Functions */ /* RAP Functions */
// Reads <count> Pinnacle registers starting at <address> // Reads <count> Pinnacle registers starting at <address>
void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) { void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
uint8_t cmdByte = READ_MASK | address; // Form the READ command byte uint8_t cmdByte = READ_MASK | address; // Form the READ command byte
if (touchpad_init) { if (touchpad_init) {
i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, NULL, 0, CIRQUE_PINNACLE_TIMEOUT); i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, NULL, 0, CIRQUE_PINNACLE_TIMEOUT);
if (i2c_readReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, data, count, CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { if (i2c_readReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, data, count, CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) {
@ -29,7 +29,7 @@ void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
// Writes single-byte <data> to <address> // Writes single-byte <data> to <address>
void RAP_Write(uint8_t address, uint8_t data) { void RAP_Write(uint8_t address, uint8_t data) {
uint8_t cmdByte = WRITE_MASK | address; // Form the WRITE command byte uint8_t cmdByte = WRITE_MASK | address; // Form the WRITE command byte
if (touchpad_init) { if (touchpad_init) {
if (i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, &data, sizeof(data), CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { if (i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, &data, sizeof(data), CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) {

View File

@ -13,14 +13,14 @@ extern bool touchpad_init;
/* RAP Functions */ /* RAP Functions */
// Reads <count> Pinnacle registers starting at <address> // Reads <count> Pinnacle registers starting at <address>
void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) { void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
uint8_t cmdByte = READ_MASK | address; // Form the READ command byte uint8_t cmdByte = READ_MASK | address; // Form the READ command byte
if (touchpad_init) { if (touchpad_init) {
if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) { if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) {
spi_write(cmdByte); spi_write(cmdByte);
spi_read(); // filler spi_read(); // filler
spi_read(); // filler spi_read(); // filler
for (uint8_t i = 0; i < count; i++) { for (uint8_t i = 0; i < count; i++) {
data[i] = spi_read(); // each sepsequent read gets another register's contents data[i] = spi_read(); // each sepsequent read gets another register's contents
} }
} else { } else {
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
@ -34,7 +34,7 @@ void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
// Writes single-byte <data> to <address> // Writes single-byte <data> to <address>
void RAP_Write(uint8_t address, uint8_t data) { void RAP_Write(uint8_t address, uint8_t data) {
uint8_t cmdByte = WRITE_MASK | address; // Form the WRITE command byte uint8_t cmdByte = WRITE_MASK | address; // Form the WRITE command byte
if (touchpad_init) { if (touchpad_init) {
if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) { if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) {

View File

@ -33,7 +33,9 @@
static uint16_t precision = 128; static uint16_t precision = 128;
uint16_t pimoroni_trackball_get_cpi(void) { return (precision * 125); } uint16_t pimoroni_trackball_get_cpi(void) {
return (precision * 125);
}
/** /**
* @brief Sets the scaling value for pimoroni trackball * @brief Sets the scaling value for pimoroni trackball
* *

View File

@ -86,7 +86,9 @@
bool _inBurst = false; bool _inBurst = false;
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); } void print_byte(uint8_t byte) {
dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0'));
}
#endif #endif
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt))) #define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
@ -144,7 +146,7 @@ bool pmw3360_init(void) {
pmw3360_spi_start(); pmw3360_spi_start();
spi_stop(); spi_stop();
pmw3360_write(REG_Shutdown, 0xb6); // Shutdown first pmw3360_write(REG_Shutdown, 0xb6); // Shutdown first
wait_ms(300); wait_ms(300);
pmw3360_spi_start(); pmw3360_spi_start();
@ -222,7 +224,7 @@ bool pmw3360_check_signature(void) {
uint8_t pid = pmw3360_read(REG_Product_ID); uint8_t pid = pmw3360_read(REG_Product_ID);
uint8_t iv_pid = pmw3360_read(REG_Inverse_Product_ID); uint8_t iv_pid = pmw3360_read(REG_Inverse_Product_ID);
uint8_t SROM_ver = pmw3360_read(REG_SROM_ID); uint8_t SROM_ver = pmw3360_read(REG_SROM_ID);
return (pid == firmware_signature[0] && iv_pid == firmware_signature[1] && SROM_ver == firmware_signature[2]); // signature for SROM 0x04 return (pid == firmware_signature[0] && iv_pid == firmware_signature[1] && SROM_ver == firmware_signature[2]); // signature for SROM 0x04
} }
uint16_t pmw3360_get_cpi(void) { uint16_t pmw3360_get_cpi(void) {
@ -248,17 +250,17 @@ report_pmw3360_t pmw3360_read_burst(void) {
pmw3360_spi_start(); pmw3360_spi_start();
spi_write(REG_Motion_Burst); spi_write(REG_Motion_Burst);
wait_us(35); // waits for tSRAD_MOTBR wait_us(35); // waits for tSRAD_MOTBR
report.motion = spi_read(); report.motion = spi_read();
spi_read(); // skip Observation spi_read(); // skip Observation
// delta registers // delta registers
report.dx = spi_read(); report.dx = spi_read();
report.mdx = spi_read(); report.mdx = spi_read();
report.dy = spi_read(); report.dy = spi_read();
report.mdy = spi_read(); report.mdy = spi_read();
if (report.motion & 0b111) { // panic recovery, sometimes burst mode works weird. if (report.motion & 0b111) { // panic recovery, sometimes burst mode works weird.
_inBurst = false; _inBurst = false;
} }

View File

@ -58,11 +58,11 @@
typedef struct { typedef struct {
int8_t motion; int8_t motion;
bool isMotion; // True if a motion is detected. bool isMotion; // True if a motion is detected.
bool isOnSurface; // True when a chip is on a surface bool isOnSurface; // True when a chip is on a surface
int16_t dx; // displacement on x directions. Unit: Count. (CPI * Count = Inch value) int16_t dx; // displacement on x directions. Unit: Count. (CPI * Count = Inch value)
int8_t mdx; int8_t mdx;
int16_t dy; // displacement on y directions. int16_t dy; // displacement on y directions.
int8_t mdy; int8_t mdy;
} report_pmw3360_t; } report_pmw3360_t;

View File

@ -90,7 +90,9 @@
bool _inBurst = false; bool _inBurst = false;
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); } void print_byte(uint8_t byte) {
dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0'));
}
#endif #endif
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt))) #define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
@ -148,7 +150,7 @@ bool pmw3389_init(void) {
pmw3389_spi_start(); pmw3389_spi_start();
spi_stop(); spi_stop();
pmw3389_write(REG_Shutdown, 0xb6); // Shutdown first pmw3389_write(REG_Shutdown, 0xb6); // Shutdown first
wait_ms(300); wait_ms(300);
pmw3389_spi_start(); pmw3389_spi_start();
@ -226,7 +228,7 @@ bool pmw3389_check_signature(void) {
uint8_t pid = pmw3389_read(REG_Product_ID); uint8_t pid = pmw3389_read(REG_Product_ID);
uint8_t iv_pid = pmw3389_read(REG_Inverse_Product_ID); uint8_t iv_pid = pmw3389_read(REG_Inverse_Product_ID);
uint8_t SROM_ver = pmw3389_read(REG_SROM_ID); uint8_t SROM_ver = pmw3389_read(REG_SROM_ID);
return (pid == firmware_signature[0] && iv_pid == firmware_signature[1] && SROM_ver == firmware_signature[2]); // signature for SROM 0x04 return (pid == firmware_signature[0] && iv_pid == firmware_signature[1] && SROM_ver == firmware_signature[2]); // signature for SROM 0x04
} }
uint16_t pmw3389_get_cpi(void) { uint16_t pmw3389_get_cpi(void) {
@ -254,17 +256,17 @@ report_pmw3389_t pmw3389_read_burst(void) {
pmw3389_spi_start(); pmw3389_spi_start();
spi_write(REG_Motion_Burst); spi_write(REG_Motion_Burst);
wait_us(35); // waits for tSRAD_MOTBR wait_us(35); // waits for tSRAD_MOTBR
report.motion = spi_read(); report.motion = spi_read();
spi_read(); // skip Observation spi_read(); // skip Observation
// delta registers // delta registers
report.dx = spi_read(); report.dx = spi_read();
report.mdx = spi_read(); report.mdx = spi_read();
report.dy = spi_read(); report.dy = spi_read();
report.mdy = spi_read(); report.mdy = spi_read();
if (report.motion & 0b111) { // panic recovery, sometimes burst mode works weird. if (report.motion & 0b111) { // panic recovery, sometimes burst mode works weird.
_inBurst = false; _inBurst = false;
} }

View File

@ -59,11 +59,11 @@
typedef struct { typedef struct {
int8_t motion; int8_t motion;
bool isMotion; // True if a motion is detected. bool isMotion; // True if a motion is detected.
bool isOnSurface; // True when a chip is on a surface bool isOnSurface; // True when a chip is on a surface
int16_t dx; // displacement on x directions. Unit: Count. (CPI * Count = Inch value) int16_t dx; // displacement on x directions. Unit: Count. (CPI * Count = Inch value)
int8_t mdx; int8_t mdx;
int16_t dy; // displacement on y directions. int16_t dy; // displacement on y directions.
int8_t mdy; int8_t mdy;
} report_pmw3389_t; } report_pmw3389_t;

View File

@ -352,7 +352,7 @@ void USB2422_init() {
setPinInput(USB2422_ACTIVE_PIN); setPinInput(USB2422_ACTIVE_PIN);
#endif #endif
i2c_init(); // IC2 clk must be high at USB2422 reset release time to signal SMB configuration i2c_init(); // IC2 clk must be high at USB2422 reset release time to signal SMB configuration
} }
void USB2422_configure() { void USB2422_configure() {
@ -363,14 +363,14 @@ void USB2422_configure() {
// configure Usb2422 registers // configure Usb2422 registers
config.VID.reg = USB2422_VENDOR_ID; config.VID.reg = USB2422_VENDOR_ID;
config.PID.reg = USB2422_PRODUCT_ID; config.PID.reg = USB2422_PRODUCT_ID;
config.DID.reg = USB2422_DEVICE_VER; // BCD format, eg 01.01 config.DID.reg = USB2422_DEVICE_VER; // BCD format, eg 01.01
config.CFG1.bit.SELF_BUS_PWR = 1; // self powered for now config.CFG1.bit.SELF_BUS_PWR = 1; // self powered for now
config.CFG1.bit.HS_DISABLE = 1; // full or high speed config.CFG1.bit.HS_DISABLE = 1; // full or high speed
// config.CFG2.bit.COMPOUND = 0; // compound device // config.CFG2.bit.COMPOUND = 0; // compound device
config.CFG3.bit.STRING_EN = 1; // strings enabled config.CFG3.bit.STRING_EN = 1; // strings enabled
// config.NRD.bit.PORT2_NR = 0; // MCU is non-removable // config.NRD.bit.PORT2_NR = 0; // MCU is non-removable
config.MAXPB.reg = 20; // 0mA config.MAXPB.reg = 20; // 0mA
config.HCMCB.reg = 20; // 0mA config.HCMCB.reg = 20; // 0mA
config.MFRSL.reg = sizeof(USB2422_MANUFACTURER); config.MFRSL.reg = sizeof(USB2422_MANUFACTURER);
config.PRDSL.reg = sizeof(USB2422_PRODUCT); config.PRDSL.reg = sizeof(USB2422_PRODUCT);
config.SERSL.reg = sizeof(SERNAME); config.SERSL.reg = sizeof(SERNAME);

View File

@ -33,19 +33,19 @@
#endif #endif
#ifndef WS2812_T1H #ifndef WS2812_T1H
# define WS2812_T1H 900 // Width of a 1 bit in ns # define WS2812_T1H 900 // Width of a 1 bit in ns
#endif #endif
#ifndef WS2812_T1L #ifndef WS2812_T1L
# define WS2812_T1L (WS2812_TIMING - WS2812_T1H) // Width of a 1 bit in ns # define WS2812_T1L (WS2812_TIMING - WS2812_T1H) // Width of a 1 bit in ns
#endif #endif
#ifndef WS2812_T0H #ifndef WS2812_T0H
# define WS2812_T0H 350 // Width of a 0 bit in ns # define WS2812_T0H 350 // Width of a 0 bit in ns
#endif #endif
#ifndef WS2812_T0L #ifndef WS2812_T0L
# define WS2812_T0L (WS2812_TIMING - WS2812_T0H) // Width of a 0 bit in ns # define WS2812_T0L (WS2812_TIMING - WS2812_T0H) // Width of a 0 bit in ns
#endif #endif
/* /*

View File

@ -26,20 +26,20 @@ extern uint32_t _eram;
// CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method. // CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method.
void bootloader_jump(void) { void bootloader_jump(void) {
#ifdef KEYBOARD_massdrop_ctrl #ifdef KEYBOARD_massdrop_ctrl
uint8_t ver_ram_method[] = "v2.18Jun 22 2018 17:28:08"; // The version to match (NULL terminated by compiler) uint8_t ver_ram_method[] = "v2.18Jun 22 2018 17:28:08"; // The version to match (NULL terminated by compiler)
uint8_t *ver_check = ver_ram_method; // Pointer to version match string for traversal uint8_t *ver_check = ver_ram_method; // Pointer to version match string for traversal
uint8_t *ver_rom = (uint8_t *)0x21A0; // Pointer to address in ROM where this specific bootloader version would exist uint8_t *ver_rom = (uint8_t *)0x21A0; // Pointer to address in ROM where this specific bootloader version would exist
while (*ver_check && *ver_rom == *ver_check) { // While there are check version characters to match and bootloader's version matches check's version while (*ver_check && *ver_rom == *ver_check) { // While there are check version characters to match and bootloader's version matches check's version
ver_check++; // Move check version pointer to next character ver_check++; // Move check version pointer to next character
ver_rom++; // Move ROM version pointer to next character ver_rom++; // Move ROM version pointer to next character
} }
if (!*ver_check) { // If check version pointer is NULL, all characters have matched if (!*ver_check) { // If check version pointer is NULL, all characters have matched
*MAGIC_ADDR = BOOTLOADER_MAGIC; // Set magic number into RAM *MAGIC_ADDR = BOOTLOADER_MAGIC; // Set magic number into RAM
NVIC_SystemReset(); // Perform system reset NVIC_SystemReset(); // Perform system reset
while (1) while (1)
; // Won't get here ; // Won't get here
} }
#endif #endif
@ -61,5 +61,5 @@ void bootloader_jump(void) {
while (!WDT->CTRLA.bit.ENABLE) while (!WDT->CTRLA.bit.ENABLE)
; ;
while (1) while (1)
; // Wait on timeout ; // Wait on timeout
} }

View File

@ -155,7 +155,9 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
} }
} }
void eeprom_update_byte(uint8_t *addr, uint8_t value) { eeprom_write_byte(addr, value); } void eeprom_update_byte(uint8_t *addr, uint8_t value) {
eeprom_write_byte(addr, value);
}
void eeprom_update_word(uint16_t *addr, uint16_t value) { void eeprom_update_word(uint16_t *addr, uint16_t value) {
uint8_t *p = (uint8_t *)addr; uint8_t *p = (uint8_t *)addr;

2
platforms/arm_atsam/eeprom_samd.h Executable file → Normal file
View File

@ -4,5 +4,5 @@
#ifndef EEPROM_SIZE #ifndef EEPROM_SIZE
# include "eeconfig.h" # include "eeconfig.h"
# define EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO # define EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
#endif #endif

View File

@ -9,7 +9,7 @@
*/ */
void suspend_power_down(void) { void suspend_power_down(void) {
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
I2C3733_Control_Set(0); // Disable LED driver I2C3733_Control_Set(0); // Disable LED driver
#endif #endif
suspend_power_down_kb(); suspend_power_down_kb();

View File

@ -2,18 +2,34 @@
#include "timer.h" #include "timer.h"
#include "tmk_core/protocol/arm_atsam/clks.h" #include "tmk_core/protocol/arm_atsam/clks.h"
void set_time(uint64_t tset) { ms_clk = tset; } void set_time(uint64_t tset) {
ms_clk = tset;
}
void timer_init(void) { timer_clear(); } void timer_init(void) {
timer_clear();
}
uint16_t timer_read(void) { return (uint16_t)ms_clk; } uint16_t timer_read(void) {
return (uint16_t)ms_clk;
}
uint32_t timer_read32(void) { return (uint32_t)ms_clk; } uint32_t timer_read32(void) {
return (uint32_t)ms_clk;
}
uint64_t timer_read64(void) { return ms_clk; } uint64_t timer_read64(void) {
return ms_clk;
}
uint16_t timer_elapsed(uint16_t tlast) { return TIMER_DIFF_16(timer_read(), tlast); } uint16_t timer_elapsed(uint16_t tlast) {
return TIMER_DIFF_16(timer_read(), tlast);
}
uint32_t timer_elapsed32(uint32_t tlast) { return TIMER_DIFF_32(timer_read32(), tlast); } uint32_t timer_elapsed32(uint32_t tlast) {
return TIMER_DIFF_32(timer_read32(), tlast);
}
void timer_clear(void) { set_time(0); } void timer_clear(void) {
set_time(0);
}

View File

@ -30,9 +30,9 @@ uint32_t reset_key __attribute__((section(".noinit,\"aw\",@nobits;")));
__attribute__((weak)) void bootloader_jump(void) { __attribute__((weak)) void bootloader_jump(void) {
UDCON = 1; UDCON = 1;
USBCON = (1 << FRZCLK); // disable USB USBCON = (1 << FRZCLK); // disable USB
UCSR1B = 0; UCSR1B = 0;
_delay_ms(5); // 5 seems to work fine _delay_ms(5); // 5 seems to work fine
// watchdog reset // watchdog reset
reset_key = BOOTLOADER_RESET_KEY; reset_key = BOOTLOADER_RESET_KEY;

View File

@ -27,11 +27,11 @@ __attribute__((weak)) void bootloader_jump(void) {
// disable all peripherals // disable all peripherals
// a shutdown call might make sense here // a shutdown call might make sense here
UDCON = 1; UDCON = 1;
USBCON = (1 << FRZCLK); // disable USB USBCON = (1 << FRZCLK); // disable USB
UCSR1B = 0; UCSR1B = 0;
_delay_ms(5); _delay_ms(5);
#if defined(__AVR_AT90USB162__) // Teensy 1.0 #if defined(__AVR_AT90USB162__) // Teensy 1.0
EIMSK = 0; EIMSK = 0;
PCICR = 0; PCICR = 0;
SPCR = 0; SPCR = 0;
@ -47,7 +47,7 @@ __attribute__((weak)) void bootloader_jump(void) {
PORTC = 0; PORTC = 0;
PORTD = 0; PORTD = 0;
asm volatile("jmp 0x3E00"); asm volatile("jmp 0x3E00");
#elif defined(__AVR_ATmega32U4__) // Teensy 2.0 #elif defined(__AVR_ATmega32U4__) // Teensy 2.0
EIMSK = 0; EIMSK = 0;
PCICR = 0; PCICR = 0;
SPCR = 0; SPCR = 0;
@ -72,7 +72,7 @@ __attribute__((weak)) void bootloader_jump(void) {
PORTE = 0; PORTE = 0;
PORTF = 0; PORTF = 0;
asm volatile("jmp 0x7E00"); asm volatile("jmp 0x7E00");
#elif defined(__AVR_AT90USB646__) // Teensy++ 1.0 #elif defined(__AVR_AT90USB646__) // Teensy++ 1.0
EIMSK = 0; EIMSK = 0;
PCICR = 0; PCICR = 0;
SPCR = 0; SPCR = 0;
@ -98,7 +98,7 @@ __attribute__((weak)) void bootloader_jump(void) {
PORTE = 0; PORTE = 0;
PORTF = 0; PORTF = 0;
asm volatile("jmp 0xFC00"); asm volatile("jmp 0xFC00");
#elif defined(__AVR_AT90USB1286__) // Teensy++ 2.0 #elif defined(__AVR_AT90USB1286__) // Teensy++ 2.0
EIMSK = 0; EIMSK = 0;
PCICR = 0; PCICR = 0;
SPCR = 0; SPCR = 0;

View File

@ -21,9 +21,13 @@
static uint8_t aref = ADC_REF_POWER; static uint8_t aref = ADC_REF_POWER;
void analogReference(uint8_t mode) { aref = mode & (_BV(REFS1) | _BV(REFS0)); } void analogReference(uint8_t mode) {
aref = mode & (_BV(REFS1) | _BV(REFS0));
}
int16_t analogReadPin(pin_t pin) { return adc_read(pinToMux(pin)); } int16_t analogReadPin(pin_t pin) {
return adc_read(pinToMux(pin));
}
uint8_t pinToMux(pin_t pin) { uint8_t pinToMux(pin_t pin) {
switch (pin) { switch (pin) {

View File

@ -32,21 +32,21 @@ int16_t adc_read(uint8_t mux);
} }
#endif #endif
#define ADC_REF_EXTERNAL 0 // AREF, Internal Vref turned off #define ADC_REF_EXTERNAL 0 // AREF, Internal Vref turned off
#define ADC_REF_POWER _BV(REFS0) // AVCC with external capacitor on AREF pin #define ADC_REF_POWER _BV(REFS0) // AVCC with external capacitor on AREF pin
#define ADC_REF_INTERNAL (_BV(REFS1) | _BV(REFS0)) // Internal 2.56V Voltage Reference with external capacitor on AREF pin (1.1V for 328P) #define ADC_REF_INTERNAL (_BV(REFS1) | _BV(REFS0)) // Internal 2.56V Voltage Reference with external capacitor on AREF pin (1.1V for 328P)
// These prescaler values are for high speed mode, ADHSM = 1 // These prescaler values are for high speed mode, ADHSM = 1
#if F_CPU == 16000000L || F_CPU == 12000000L #if F_CPU == 16000000L || F_CPU == 12000000L
# define ADC_PRESCALER (_BV(ADPS2) | _BV(ADPS1)) // /64 # define ADC_PRESCALER (_BV(ADPS2) | _BV(ADPS1)) // /64
#elif F_CPU == 8000000L #elif F_CPU == 8000000L
# define ADC_PRESCALER (_BV(ADPS2) | _BV(ADPS0)) // /32 # define ADC_PRESCALER (_BV(ADPS2) | _BV(ADPS0)) // /32
#elif F_CPU == 4000000L #elif F_CPU == 4000000L
# define ADC_PRESCALER (_BV(ADPS2)) // /16 # define ADC_PRESCALER (_BV(ADPS2)) // /16
#elif F_CPU == 2000000L #elif F_CPU == 2000000L
# define ADC_PRESCALER (_BV(ADPS1) | _BV(ADPS0)) // /8 # define ADC_PRESCALER (_BV(ADPS1) | _BV(ADPS0)) // /8
#elif F_CPU == 1000000L #elif F_CPU == 1000000L
# define ADC_PRESCALER _BV(ADPS1) // /4 # define ADC_PRESCALER _BV(ADPS1) // /4
#else #else
# define ADC_PRESCALER _BV(ADPS0) // /2 # define ADC_PRESCALER _BV(ADPS0) // /2
#endif #endif

View File

@ -152,7 +152,7 @@ extern uint8_t note_timbre;
#ifdef AUDIO1_PIN_SET #ifdef AUDIO1_PIN_SET
static float channel_1_frequency = 0.0f; static float channel_1_frequency = 0.0f;
void channel_1_set_frequency(float freq) { void channel_1_set_frequency(float freq) {
if (freq == 0.0f) // a pause/rest is a valid "note" with freq=0 if (freq == 0.0f) // a pause/rest is a valid "note" with freq=0
{ {
// disable the output, but keep the pwm-ISR going (with the previous // disable the output, but keep the pwm-ISR going (with the previous
// frequency) so the audio-state keeps getting updated // frequency) so the audio-state keeps getting updated
@ -160,7 +160,7 @@ void channel_1_set_frequency(float freq) {
AUDIO1_TCCRxA &= ~(_BV(AUDIO1_COMxy1) | _BV(AUDIO1_COMxy0)); AUDIO1_TCCRxA &= ~(_BV(AUDIO1_COMxy1) | _BV(AUDIO1_COMxy0));
return; return;
} else { } else {
AUDIO1_TCCRxA |= _BV(AUDIO1_COMxy1); // enable output, PWM mode AUDIO1_TCCRxA |= _BV(AUDIO1_COMxy1); // enable output, PWM mode
} }
channel_1_frequency = freq; channel_1_frequency = freq;
@ -202,7 +202,9 @@ void channel_2_set_frequency(float freq) {
AUDIO2_OCRxy = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre / 100); AUDIO2_OCRxy = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre / 100);
} }
float channel_2_get_frequency(void) { return channel_2_frequency; } float channel_2_get_frequency(void) {
return channel_2_frequency;
}
void channel_2_start(void) { void channel_2_start(void) {
AUDIO2_TIMSKx |= _BV(AUDIO2_OCIExy); AUDIO2_TIMSKx |= _BV(AUDIO2_OCIExy);

View File

@ -10,14 +10,14 @@ static const unsigned char font[] PROGMEM = {
0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x03, 0x04, 0x78, 0x04, 0x03,
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C,
0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, 0x32, 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut 0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, 0x32, 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08, 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08, 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 0x38, 0x44, 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 0x38, 0x44, 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
}; };

View File

@ -262,7 +262,7 @@ static uint8_t lcd_waitbusy(void)
delay(LCD_DELAY_BUSY_FLAG); delay(LCD_DELAY_BUSY_FLAG);
/* now read the address counter */ /* now read the address counter */
return (lcd_read(0)); // return address counter return (lcd_read(0)); // return address counter
} /* lcd_waitbusy */ } /* lcd_waitbusy */
@ -362,17 +362,23 @@ void lcd_gotoxy(uint8_t x, uint8_t y) {
/************************************************************************* /*************************************************************************
*************************************************************************/ *************************************************************************/
int lcd_getxy(void) { return lcd_waitbusy(); } int lcd_getxy(void) {
return lcd_waitbusy();
}
/************************************************************************* /*************************************************************************
Clear display and set cursor to home position Clear display and set cursor to home position
*************************************************************************/ *************************************************************************/
void lcd_clrscr(void) { lcd_command(1 << LCD_CLR); } void lcd_clrscr(void) {
lcd_command(1 << LCD_CLR);
}
/************************************************************************* /*************************************************************************
Set cursor to home position Set cursor to home position
*************************************************************************/ *************************************************************************/
void lcd_home(void) { lcd_command(1 << LCD_HOME); } void lcd_home(void) {
lcd_command(1 << LCD_HOME);
}
/************************************************************************* /*************************************************************************
Display character at current cursor position Display character at current cursor position
@ -382,7 +388,7 @@ Returns: none
void lcd_putc(char c) { void lcd_putc(char c) {
uint8_t pos; uint8_t pos;
pos = lcd_waitbusy(); // read busy-flag and address counter pos = lcd_waitbusy(); // read busy-flag and address counter
if (c == '\n') { if (c == '\n') {
lcd_newline(pos); lcd_newline(pos);
} else { } else {
@ -483,8 +489,8 @@ void lcd_init(uint8_t dispAttr) {
delay(LCD_DELAY_BOOTUP); /* wait 16ms or more after power-on */ delay(LCD_DELAY_BOOTUP); /* wait 16ms or more after power-on */
/* initial write to lcd is 8bit */ /* initial write to lcd is 8bit */
LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // LCD_FUNCTION>>4; LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // LCD_FUNCTION>>4;
LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // LCD_FUNCTION_8BIT>>4; LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // LCD_FUNCTION_8BIT>>4;
lcd_e_toggle(); lcd_e_toggle();
delay(LCD_DELAY_INIT); /* delay, busy flag can't be checked here */ delay(LCD_DELAY_INIT); /* delay, busy flag can't be checked here */
@ -497,7 +503,7 @@ void lcd_init(uint8_t dispAttr) {
delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */ delay(LCD_DELAY_INIT_REP); /* delay, busy flag can't be checked here */
/* now configure for 4bit mode */ /* now configure for 4bit mode */
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); // LCD_FUNCTION_4BIT_1LINE>>4 LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); // LCD_FUNCTION_4BIT_1LINE>>4
lcd_e_toggle(); lcd_e_toggle();
delay(LCD_DELAY_INIT_4BIT); /* some displays need this additional delay */ delay(LCD_DELAY_INIT_4BIT); /* some displays need this additional delay */

View File

@ -25,12 +25,12 @@
#include "wait.h" #include "wait.h"
#ifndef F_SCL #ifndef F_SCL
# define F_SCL 400000UL // SCL frequency # define F_SCL 400000UL // SCL frequency
#endif #endif
#ifndef I2C_START_RETRY_COUNT #ifndef I2C_START_RETRY_COUNT
# define I2C_START_RETRY_COUNT 20 # define I2C_START_RETRY_COUNT 20
#endif // I2C_START_RETRY_COUNT #endif // I2C_START_RETRY_COUNT
#define I2C_ACTION_READ 0x01 #define I2C_ACTION_READ 0x01
#define I2C_ACTION_WRITE 0x00 #define I2C_ACTION_WRITE 0x00
@ -98,7 +98,7 @@ static i2c_status_t i2c_start_impl(uint8_t address, uint16_t timeout) {
i2c_status_t i2c_start(uint8_t address, uint16_t timeout) { i2c_status_t i2c_start(uint8_t address, uint16_t timeout) {
// Retry i2c_start_impl a bunch times in case the remote side has interrupts disabled. // Retry i2c_start_impl a bunch times in case the remote side has interrupts disabled.
uint16_t timeout_timer = timer_read(); uint16_t timeout_timer = timer_read();
uint16_t time_slice = MAX(1, (timeout == (I2C_TIMEOUT_INFINITE)) ? 5 : (timeout / (I2C_START_RETRY_COUNT))); // if it's infinite, wait 1ms between attempts, otherwise split up the entire timeout into the number of retries uint16_t time_slice = MAX(1, (timeout == (I2C_TIMEOUT_INFINITE)) ? 5 : (timeout / (I2C_START_RETRY_COUNT))); // if it's infinite, wait 1ms between attempts, otherwise split up the entire timeout into the number of retries
i2c_status_t status; i2c_status_t status;
do { do {
status = i2c_start_impl(address, time_slice); status = i2c_start_impl(address, time_slice);

View File

@ -29,7 +29,7 @@
# include "transactions.h" # include "transactions.h"
static volatile bool is_callback_executor = false; static volatile bool is_callback_executor = false;
#endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) #endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT]; volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT];
@ -57,7 +57,7 @@ ISR(TWI_vect) {
slave_has_register_set = false; slave_has_register_set = false;
#if defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) #if defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
is_callback_executor = false; is_callback_executor = false;
#endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) #endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
break; break;
case TW_SR_DATA_ACK: case TW_SR_DATA_ACK:
@ -66,16 +66,16 @@ ISR(TWI_vect) {
if (!slave_has_register_set) { if (!slave_has_register_set) {
buffer_address = TWDR; buffer_address = TWDR;
if (buffer_address >= I2C_SLAVE_REG_COUNT) { // address out of bounds dont ack if (buffer_address >= I2C_SLAVE_REG_COUNT) { // address out of bounds dont ack
ack = 0; ack = 0;
buffer_address = 0; buffer_address = 0;
} }
slave_has_register_set = true; // address has been received now fill in buffer slave_has_register_set = true; // address has been received now fill in buffer
#if defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) #if defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
// Work out if we're attempting to execute a callback // Work out if we're attempting to execute a callback
is_callback_executor = buffer_address == split_transaction_table[I2C_EXECUTE_CALLBACK].initiator2target_offset; is_callback_executor = buffer_address == split_transaction_table[I2C_EXECUTE_CALLBACK].initiator2target_offset;
#endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) #endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
} else { } else {
i2c_slave_reg[buffer_address] = TWDR; i2c_slave_reg[buffer_address] = TWDR;
buffer_address++; buffer_address++;
@ -88,7 +88,7 @@ ISR(TWI_vect) {
trans->slave_callback(trans->initiator2target_buffer_size, split_trans_initiator2target_buffer(trans), trans->target2initiator_buffer_size, split_trans_target2initiator_buffer(trans)); trans->slave_callback(trans->initiator2target_buffer_size, split_trans_initiator2target_buffer(trans), trans->target2initiator_buffer_size, split_trans_target2initiator_buffer(trans));
} }
} }
#endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) #endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
} }
break; break;

View File

@ -27,11 +27,11 @@
# if defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) # if defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
# include "transport.h" # include "transport.h"
# define I2C_SLAVE_REG_COUNT sizeof(split_shared_memory_t) # define I2C_SLAVE_REG_COUNT sizeof(split_shared_memory_t)
# else // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) # else // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
# define I2C_SLAVE_REG_COUNT 30 # define I2C_SLAVE_REG_COUNT 30
# endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) # endif // defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS)
#endif // I2C_SLAVE_REG_COUNT #endif // I2C_SLAVE_REG_COUNT
_Static_assert(I2C_SLAVE_REG_COUNT < 256, "I2C target registers must be single byte"); _Static_assert(I2C_SLAVE_REG_COUNT < 256, "I2C target registers must be single byte");

View File

@ -23,7 +23,9 @@ void clock_lo(void) {
setPinOutput(PS2_CLOCK_PIN); setPinOutput(PS2_CLOCK_PIN);
} }
void clock_hi(void) { setPinInputHigh(PS2_CLOCK_PIN); } void clock_hi(void) {
setPinInputHigh(PS2_CLOCK_PIN);
}
bool clock_in(void) { bool clock_in(void) {
setPinInputHigh(PS2_CLOCK_PIN); setPinInputHigh(PS2_CLOCK_PIN);
@ -42,7 +44,9 @@ void data_lo(void) {
setPinOutput(PS2_DATA_PIN); setPinOutput(PS2_DATA_PIN);
} }
void data_hi(void) { setPinInputHigh(PS2_DATA_PIN); } void data_hi(void) {
setPinInputHigh(PS2_DATA_PIN);
}
bool data_in(void) { bool data_in(void) {
setPinInputHigh(PS2_DATA_PIN); setPinInputHigh(PS2_DATA_PIN);

View File

@ -76,7 +76,7 @@ static inline bool pbuf_has_data(void);
static inline void pbuf_clear(void); static inline void pbuf_clear(void);
void ps2_host_init(void) { void ps2_host_init(void) {
idle(); // without this many USART errors occur when cable is disconnected idle(); // without this many USART errors occur when cable is disconnected
PS2_USART_INIT(); PS2_USART_INIT();
PS2_USART_RX_INT_ON(); PS2_USART_RX_INT_ON();
// POR(150-2000ms) plus BAT(300-500ms) may take 2.5sec([3]p.20) // POR(150-2000ms) plus BAT(300-500ms) may take 2.5sec([3]p.20)
@ -91,12 +91,12 @@ uint8_t ps2_host_send(uint8_t data) {
/* terminate a transmission if we have */ /* terminate a transmission if we have */
inhibit(); inhibit();
_delay_us(100); // [4]p.13 _delay_us(100); // [4]p.13
/* 'Request to Send' and Start bit */ /* 'Request to Send' and Start bit */
data_lo(); data_lo();
clock_hi(); clock_hi();
WAIT(clock_lo, 10000, 10); // 10ms [5]p.50 WAIT(clock_lo, 10000, 10); // 10ms [5]p.50
/* Data bit[2-9] */ /* Data bit[2-9] */
for (uint8_t i = 0; i < 8; i++) { for (uint8_t i = 0; i < 8; i++) {
@ -165,7 +165,7 @@ uint8_t ps2_host_recv(void) {
ISR(PS2_USART_RX_VECT) { ISR(PS2_USART_RX_VECT) {
// TODO: request RESEND when error occurs? // TODO: request RESEND when error occurs?
uint8_t error = PS2_USART_ERROR; // USART error should be read before data uint8_t error = PS2_USART_ERROR; // USART error should be read before data
uint8_t data = PS2_USART_RX_DATA; uint8_t data = PS2_USART_RX_DATA;
if (!error) { if (!error) {
pbuf_enqueue(data); pbuf_enqueue(data);

View File

@ -156,59 +156,59 @@
# if SELECT_SOFT_SERIAL_SPEED == 0 # if SELECT_SOFT_SERIAL_SPEED == 0
// Very High speed // Very High speed
# define SERIAL_DELAY 4 // micro sec # define SERIAL_DELAY 4 // micro sec
# if __GNUC__ < 6 # if __GNUC__ < 6
# define READ_WRITE_START_ADJUST 33 // cycles # define READ_WRITE_START_ADJUST 33 // cycles
# define READ_WRITE_WIDTH_ADJUST 3 // cycles # define READ_WRITE_WIDTH_ADJUST 3 // cycles
# else # else
# define READ_WRITE_START_ADJUST 34 // cycles # define READ_WRITE_START_ADJUST 34 // cycles
# define READ_WRITE_WIDTH_ADJUST 7 // cycles # define READ_WRITE_WIDTH_ADJUST 7 // cycles
# endif # endif
# elif SELECT_SOFT_SERIAL_SPEED == 1 # elif SELECT_SOFT_SERIAL_SPEED == 1
// High speed // High speed
# define SERIAL_DELAY 6 // micro sec # define SERIAL_DELAY 6 // micro sec
# if __GNUC__ < 6 # if __GNUC__ < 6
# define READ_WRITE_START_ADJUST 30 // cycles # define READ_WRITE_START_ADJUST 30 // cycles
# define READ_WRITE_WIDTH_ADJUST 3 // cycles # define READ_WRITE_WIDTH_ADJUST 3 // cycles
# else # else
# define READ_WRITE_START_ADJUST 33 // cycles # define READ_WRITE_START_ADJUST 33 // cycles
# define READ_WRITE_WIDTH_ADJUST 7 // cycles # define READ_WRITE_WIDTH_ADJUST 7 // cycles
# endif # endif
# elif SELECT_SOFT_SERIAL_SPEED == 2 # elif SELECT_SOFT_SERIAL_SPEED == 2
// Middle speed // Middle speed
# define SERIAL_DELAY 12 // micro sec # define SERIAL_DELAY 12 // micro sec
# define READ_WRITE_START_ADJUST 30 // cycles # define READ_WRITE_START_ADJUST 30 // cycles
# if __GNUC__ < 6 # if __GNUC__ < 6
# define READ_WRITE_WIDTH_ADJUST 3 // cycles # define READ_WRITE_WIDTH_ADJUST 3 // cycles
# else # else
# define READ_WRITE_WIDTH_ADJUST 7 // cycles # define READ_WRITE_WIDTH_ADJUST 7 // cycles
# endif # endif
# elif SELECT_SOFT_SERIAL_SPEED == 3 # elif SELECT_SOFT_SERIAL_SPEED == 3
// Low speed // Low speed
# define SERIAL_DELAY 24 // micro sec # define SERIAL_DELAY 24 // micro sec
# define READ_WRITE_START_ADJUST 30 // cycles # define READ_WRITE_START_ADJUST 30 // cycles
# if __GNUC__ < 6 # if __GNUC__ < 6
# define READ_WRITE_WIDTH_ADJUST 3 // cycles # define READ_WRITE_WIDTH_ADJUST 3 // cycles
# else # else
# define READ_WRITE_WIDTH_ADJUST 7 // cycles # define READ_WRITE_WIDTH_ADJUST 7 // cycles
# endif # endif
# elif SELECT_SOFT_SERIAL_SPEED == 4 # elif SELECT_SOFT_SERIAL_SPEED == 4
// Very Low speed // Very Low speed
# define SERIAL_DELAY 36 // micro sec # define SERIAL_DELAY 36 // micro sec
# define READ_WRITE_START_ADJUST 30 // cycles # define READ_WRITE_START_ADJUST 30 // cycles
# if __GNUC__ < 6 # if __GNUC__ < 6
# define READ_WRITE_WIDTH_ADJUST 3 // cycles # define READ_WRITE_WIDTH_ADJUST 3 // cycles
# else # else
# define READ_WRITE_WIDTH_ADJUST 7 // cycles # define READ_WRITE_WIDTH_ADJUST 7 // cycles
# endif # endif
# elif SELECT_SOFT_SERIAL_SPEED == 5 # elif SELECT_SOFT_SERIAL_SPEED == 5
// Ultra Low speed // Ultra Low speed
# define SERIAL_DELAY 48 // micro sec # define SERIAL_DELAY 48 // micro sec
# define READ_WRITE_START_ADJUST 30 // cycles # define READ_WRITE_START_ADJUST 30 // cycles
# if __GNUC__ < 6 # if __GNUC__ < 6
# define READ_WRITE_WIDTH_ADJUST 3 // cycles # define READ_WRITE_WIDTH_ADJUST 3 // cycles
# else # else
# define READ_WRITE_WIDTH_ADJUST 7 // cycles # define READ_WRITE_WIDTH_ADJUST 7 // cycles
# endif # endif
# else # else
# error invalid SELECT_SOFT_SERIAL_SPEED value # error invalid SELECT_SOFT_SERIAL_SPEED value
@ -223,29 +223,45 @@
# define SLAVE_INT_ACK_WIDTH 4 # define SLAVE_INT_ACK_WIDTH 4
inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) ALWAYS_INLINE;
inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } inline static void serial_delay(void) {
_delay_us(SERIAL_DELAY);
}
inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) ALWAYS_INLINE;
inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } inline static void serial_delay_half1(void) {
_delay_us(SERIAL_DELAY_HALF1);
}
inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) ALWAYS_INLINE;
inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); } inline static void serial_delay_half2(void) {
_delay_us(SERIAL_DELAY_HALF2);
}
inline static void serial_output(void) ALWAYS_INLINE; inline static void serial_output(void) ALWAYS_INLINE;
inline static void serial_output(void) { setPinOutput(SOFT_SERIAL_PIN); } inline static void serial_output(void) {
setPinOutput(SOFT_SERIAL_PIN);
}
// make the serial pin an input with pull-up resistor // make the serial pin an input with pull-up resistor
inline static void serial_input_with_pullup(void) ALWAYS_INLINE; inline static void serial_input_with_pullup(void) ALWAYS_INLINE;
inline static void serial_input_with_pullup(void) { setPinInputHigh(SOFT_SERIAL_PIN); } inline static void serial_input_with_pullup(void) {
setPinInputHigh(SOFT_SERIAL_PIN);
}
inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) ALWAYS_INLINE;
inline static uint8_t serial_read_pin(void) { return !!readPin(SOFT_SERIAL_PIN); } inline static uint8_t serial_read_pin(void) {
return !!readPin(SOFT_SERIAL_PIN);
}
inline static void serial_low(void) ALWAYS_INLINE; inline static void serial_low(void) ALWAYS_INLINE;
inline static void serial_low(void) { writePinLow(SOFT_SERIAL_PIN); } inline static void serial_low(void) {
writePinLow(SOFT_SERIAL_PIN);
}
inline static void serial_high(void) ALWAYS_INLINE; inline static void serial_high(void) ALWAYS_INLINE;
inline static void serial_high(void) { writePinHigh(SOFT_SERIAL_PIN); } inline static void serial_high(void) {
writePinHigh(SOFT_SERIAL_PIN);
}
void soft_serial_initiator_init(void) { void soft_serial_initiator_init(void) {
serial_output(); serial_output();
@ -286,7 +302,7 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) {
_delay_sub_us(READ_WRITE_START_ADJUST); _delay_sub_us(READ_WRITE_START_ADJUST);
for (i = 0, byte = 0, p = PARITY; i < bit; i++) { for (i = 0, byte = 0, p = PARITY; i < bit; i++) {
serial_delay_half1(); // read the middle of pulses serial_delay_half1(); // read the middle of pulses
if (serial_read_pin()) { if (serial_read_pin()) {
byte = (byte << 1) | 1; byte = (byte << 1) | 1;
p ^= 1; p ^= 1;
@ -298,7 +314,7 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) {
serial_delay_half2(); serial_delay_half2();
} }
/* recive parity bit */ /* recive parity bit */
serial_delay_half1(); // read the middle of pulses serial_delay_half1(); // read the middle of pulses
pb = serial_read_pin(); pb = serial_read_pin();
_delay_sub_us(READ_WRITE_WIDTH_ADJUST); _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
serial_delay_half2(); serial_delay_half2();
@ -330,7 +346,7 @@ void serial_write_chunk(uint8_t data, uint8_t bit) {
} }
serial_delay(); serial_delay();
serial_low(); // sync_send() / senc_recv() need raise edge serial_low(); // sync_send() / senc_recv() need raise edge
} }
static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
@ -356,19 +372,19 @@ static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) {
} }
inline static void change_sender2reciver(void) { inline static void change_sender2reciver(void) {
sync_send(); // 0 sync_send(); // 0
serial_delay_half1(); // 1 serial_delay_half1(); // 1
serial_low(); // 2 serial_low(); // 2
serial_input_with_pullup(); // 2 serial_input_with_pullup(); // 2
serial_delay_half1(); // 3 serial_delay_half1(); // 3
} }
inline static void change_reciver2sender(void) { inline static void change_reciver2sender(void) {
sync_recv(); // 0 sync_recv(); // 0
serial_delay(); // 1 serial_delay(); // 1
serial_low(); // 3 serial_low(); // 3
serial_output(); // 3 serial_output(); // 3
serial_delay_half1(); // 4 serial_delay_half1(); // 4
} }
static inline uint8_t nibble_bits_count(uint8_t bits) { static inline uint8_t nibble_bits_count(uint8_t bits) {
@ -391,11 +407,11 @@ ISR(SERIAL_PIN_INTERRUPT) {
} }
serial_delay_half1(); serial_delay_half1();
serial_high(); // response step1 low->high serial_high(); // response step1 low->high
serial_output(); serial_output();
_delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT * SLAVE_INT_ACK_WIDTH); _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT * SLAVE_INT_ACK_WIDTH);
split_transaction_desc_t *trans = &split_transaction_table[tid]; split_transaction_desc_t *trans = &split_transaction_table[tid];
serial_low(); // response step2 ack high->low serial_low(); // response step2 ack high->low
// If the transaction has a callback, we can execute it now // If the transaction has a callback, we can execute it now
if (trans->slave_callback) { if (trans->slave_callback) {
@ -412,7 +428,7 @@ ISR(SERIAL_PIN_INTERRUPT) {
serial_recive_packet((uint8_t *)split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size); serial_recive_packet((uint8_t *)split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size);
} }
sync_recv(); // weit initiator output to high sync_recv(); // weit initiator output to high
} }
///////// /////////

View File

@ -125,7 +125,7 @@ spi_status_t spi_write(uint8_t data) {
} }
spi_status_t spi_read() { spi_status_t spi_read() {
SPDR = 0x00; // Dummy SPDR = 0x00; // Dummy
uint16_t timeout_timer = timer_read(); uint16_t timeout_timer = timer_read();
while (!(SPSR & _BV(SPIF))) { while (!(SPSR & _BV(SPIF))) {

View File

@ -161,7 +161,7 @@ bool iota_gfx_init(void) {
send_cmd1(DeActivateScroll); send_cmd1(DeActivateScroll);
send_cmd1(DisplayOn); send_cmd1(DisplayOn);
send_cmd2(SetContrast, 0); // Dim send_cmd2(SetContrast, 0); // Dim
clear_display(); clear_display();
@ -226,7 +226,9 @@ void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
matrix_write_char_inner(matrix, c); matrix_write_char_inner(matrix, c);
} }
void iota_gfx_write_char(uint8_t c) { matrix_write_char(&display, c); } void iota_gfx_write_char(uint8_t c) {
matrix_write_char(&display, c);
}
void matrix_write(struct CharacterMatrix *matrix, const char *data) { void matrix_write(struct CharacterMatrix *matrix, const char *data) {
const char *end = data + strlen(data); const char *end = data + strlen(data);
@ -236,7 +238,9 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data) {
} }
} }
void iota_gfx_write(const char *data) { matrix_write(&display, data); } void iota_gfx_write(const char *data) {
matrix_write(&display, data);
}
void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
while (true) { while (true) {
@ -249,7 +253,9 @@ void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
} }
} }
void iota_gfx_write_P(const char *data) { matrix_write_P(&display, data); } void iota_gfx_write_P(const char *data) {
matrix_write_P(&display, data);
}
void matrix_clear(struct CharacterMatrix *matrix) { void matrix_clear(struct CharacterMatrix *matrix) {
memset(matrix->display, ' ', sizeof(matrix->display)); memset(matrix->display, ' ', sizeof(matrix->display));
@ -257,7 +263,9 @@ void matrix_clear(struct CharacterMatrix *matrix) {
matrix->dirty = true; matrix->dirty = true;
} }
void iota_gfx_clear_screen(void) { matrix_clear(&display); } void iota_gfx_clear_screen(void) {
matrix_clear(&display);
}
void matrix_render(struct CharacterMatrix *matrix) { void matrix_render(struct CharacterMatrix *matrix) {
last_flush = timer_read(); last_flush = timer_read();
@ -301,7 +309,9 @@ done:
# endif # endif
} }
void iota_gfx_flush(void) { matrix_render(&display); } void iota_gfx_flush(void) {
matrix_render(&display);
}
__attribute__((weak)) void iota_gfx_task_user(void) {} __attribute__((weak)) void iota_gfx_task_user(void) {}

View File

@ -108,7 +108,7 @@ void uart_write(uint8_t data) {
// return immediately to avoid deadlock when interrupt is disabled(called from ISR) // return immediately to avoid deadlock when interrupt is disabled(called from ISR)
if (tx_buffer_tail == i && (SREG & (1 << SREG_I)) == 0) return; if (tx_buffer_tail == i && (SREG & (1 << SREG_I)) == 0) return;
while (tx_buffer_tail == i) while (tx_buffer_tail == i)
; // wait until space in buffer ; // wait until space in buffer
// cli(); // cli();
tx_buffer[i] = data; tx_buffer[i] = data;
tx_buffer_head = i; tx_buffer_head = i;
@ -121,7 +121,7 @@ uint8_t uart_read(void) {
uint8_t data, i; uint8_t data, i;
while (rx_buffer_head == rx_buffer_tail) while (rx_buffer_head == rx_buffer_tail)
; // wait for character ; // wait for character
i = rx_buffer_tail + 1; i = rx_buffer_tail + 1;
if (i >= RX_BUFFER_SIZE) i = 0; if (i >= RX_BUFFER_SIZE) i = 0;
data = rx_buffer[i]; data = rx_buffer[i];

View File

@ -110,7 +110,7 @@ static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t
asm volatile(" ldi %0,8 \n\t" asm volatile(" ldi %0,8 \n\t"
"loop%=: \n\t" "loop%=: \n\t"
" out %2,%3 \n\t" // '1' [01] '0' [01] - re " out %2,%3 \n\t" // '1' [01] '0' [01] - re
#if (w1_nops & 1) #if (w1_nops & 1)
w_nop1 w_nop1
#endif #endif
@ -126,9 +126,9 @@ static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t
#if (w1_nops & 16) #if (w1_nops & 16)
w_nop16 w_nop16
#endif #endif
" sbrs %1,7 \n\t" // '1' [03] '0' [02] " sbrs %1,7 \n\t" // '1' [03] '0' [02]
" out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low " out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low
" lsl %1 \n\t" // '1' [04] '0' [04] " lsl %1 \n\t" // '1' [04] '0' [04]
#if (w2_nops & 1) #if (w2_nops & 1)
w_nop1 w_nop1
#endif #endif
@ -144,7 +144,7 @@ static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t
#if (w2_nops & 16) #if (w2_nops & 16)
w_nop16 w_nop16
#endif #endif
" out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high " out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high
#if (w3_nops & 1) #if (w3_nops & 1)
w_nop1 w_nop1
#endif #endif
@ -161,8 +161,8 @@ static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t
w_nop16 w_nop16
#endif #endif
" dec %0 \n\t" // '1' [+2] '0' [+2] " dec %0 \n\t" // '1' [+2] '0' [+2]
" brne loop%=\n\t" // '1' [+3] '0' [+4] " brne loop%=\n\t" // '1' [+3] '0' [+4]
: "=&d"(ctr) : "=&d"(ctr)
: "r"(curbyte), "I"(_SFR_IO_ADDR(PORTx_ADDRESS(RGB_DI_PIN))), "r"(maskhi), "r"(masklo)); : "r"(curbyte), "I"(_SFR_IO_ADDR(PORTx_ADDRESS(RGB_DI_PIN))), "r"(maskhi), "r"(masklo));
} }

View File

@ -13,7 +13,9 @@
# define WS2812_TIMEOUT 100 # define WS2812_TIMEOUT 100
#endif #endif
void ws2812_init(void) { i2c_init(); } void ws2812_init(void) {
i2c_init();
}
// Setleds for standard RGB // Setleds for standard RGB
void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {

View File

@ -17,7 +17,7 @@
#include <avr/io.h> #include <avr/io.h>
#define PORT_SHIFTER 4 // this may be 4 for all AVR chips #define PORT_SHIFTER 4 // this may be 4 for all AVR chips
// If you want to add more to this list, reference the PINx definitions in these header // If you want to add more to this list, reference the PINx definitions in these header
// files: https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/include/avr // files: https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/include/avr

View File

@ -17,4 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "xprintf.h" #include "xprintf.h"
#include "sendchar.h" #include "sendchar.h"
void print_set_sendchar(sendchar_func_t func) { xdev_out(func); } void print_set_sendchar(sendchar_func_t func) {
xdev_out(func);
}

View File

@ -12,7 +12,7 @@
#if SLEEP_LED_TIMER == 1 #if SLEEP_LED_TIMER == 1
# define TCCRxB TCCR1B # define TCCRxB TCCR1B
# define TIMERx_COMPA_vect TIMER1_COMPA_vect # define TIMERx_COMPA_vect TIMER1_COMPA_vect
# if defined(__AVR_ATmega32A__) // This MCU has only one TIMSK register # if defined(__AVR_ATmega32A__) // This MCU has only one TIMSK register
# define TIMSKx TIMSK # define TIMSKx TIMSK
# else # else
# define TIMSKx TIMSK1 # define TIMSKx TIMSK1

View File

@ -81,7 +81,7 @@ ISR(WDT_vect) {
// compensate timer for sleep // compensate timer for sleep
switch (wdt_timeout) { switch (wdt_timeout) {
case WDTO_15MS: case WDTO_15MS:
timer_count += 15 + 2; // WDTO_15MS + 2(from observation) timer_count += 15 + 2; // WDTO_15MS + 2(from observation)
break; break;
default:; default:;
} }

View File

@ -73,7 +73,9 @@ void timer_init(void) {
* FIXME: needs doc * FIXME: needs doc
*/ */
inline void timer_clear(void) { inline void timer_clear(void) {
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { timer_count = 0; } ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
timer_count = 0;
}
} }
/** \brief timer read /** \brief timer read
@ -83,7 +85,9 @@ inline void timer_clear(void) {
inline uint16_t timer_read(void) { inline uint16_t timer_read(void) {
uint32_t t; uint32_t t;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { t = timer_count; } ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
t = timer_count;
}
return (t & 0xFFFF); return (t & 0xFFFF);
} }
@ -95,7 +99,9 @@ inline uint16_t timer_read(void) {
inline uint32_t timer_read32(void) { inline uint32_t timer_read32(void) {
uint32_t t; uint32_t t;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { t = timer_count; } ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
t = timer_count;
}
return t; return t;
} }
@ -107,7 +113,9 @@ inline uint32_t timer_read32(void) {
inline uint16_t timer_elapsed(uint16_t last) { inline uint16_t timer_elapsed(uint16_t last) {
uint32_t t; uint32_t t;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { t = timer_count; } ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
t = timer_count;
}
return TIMER_DIFF_16((t & 0xFFFF), last); return TIMER_DIFF_16((t & 0xFFFF), last);
} }
@ -119,7 +127,9 @@ inline uint16_t timer_elapsed(uint16_t last) {
inline uint32_t timer_elapsed32(uint32_t last) { inline uint32_t timer_elapsed32(uint32_t last) {
uint32_t t; uint32_t t;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { t = timer_count; } ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
t = timer_count;
}
return TIMER_DIFF_32(t, last); return TIMER_DIFF_32(t, last);
} }
@ -130,4 +140,6 @@ inline uint32_t timer_elapsed32(uint32_t last) {
#else #else
# define TIMER_INTERRUPT_VECTOR TIMER0_COMP_vect # define TIMER_INTERRUPT_VECTOR TIMER0_COMP_vect
#endif #endif
ISR(TIMER_INTERRUPT_VECTOR, ISR_NOBLOCK) { timer_count++; } ISR(TIMER_INTERRUPT_VECTOR, ISR_NOBLOCK) {
timer_count++;
}

View File

@ -72,7 +72,7 @@ void enter_bootloader_mode_if_requested(void) {}
# define MAGIC_ADDR (unsigned long *)(SYMVAL(__ram0_end__) - 4) # define MAGIC_ADDR (unsigned long *)(SYMVAL(__ram0_end__) - 4)
__attribute__((weak)) void bootloader_jump(void) { __attribute__((weak)) void bootloader_jump(void) {
*MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader *MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader
NVIC_SystemReset(); NVIC_SystemReset();
} }

View File

@ -18,4 +18,6 @@
#include <ch.h> #include <ch.h>
__attribute__((weak)) void bootloader_jump(void) { NVIC_SystemReset(); } __attribute__((weak)) void bootloader_jump(void) {
NVIC_SystemReset();
}

View File

@ -16,7 +16,7 @@
#pragma once #pragma once
#ifndef USB_VBUS_PIN #ifndef USB_VBUS_PIN
# define SPLIT_USB_DETECT // Force this on when dedicated pin is not used # define SPLIT_USB_DETECT // Force this on when dedicated pin is not used
#endif #endif
// STM32 compatibility // STM32 compatibility
@ -76,7 +76,7 @@
# if defined(K20x) || defined(KL2x) # if defined(K20x) || defined(KL2x)
# define USE_I2CV1 # define USE_I2CV1
# define USE_I2CV1_CONTRIB // for some reason a bunch of ChibiOS-Contrib boards only have clock_speed # define USE_I2CV1_CONTRIB // for some reason a bunch of ChibiOS-Contrib boards only have clock_speed
# define USE_GPIOV1 # define USE_GPIOV1
# endif # endif
#endif #endif

View File

@ -101,9 +101,9 @@
// Options are 12, 10, 8, and 6 bit. // Options are 12, 10, 8, and 6 bit.
#ifndef ADC_RESOLUTION #ifndef ADC_RESOLUTION
# ifdef ADC_CFGR_RES_10BITS // ADCv3, ADCv4 # ifdef ADC_CFGR_RES_10BITS // ADCv3, ADCv4
# define ADC_RESOLUTION ADC_CFGR_RES_10BITS # define ADC_RESOLUTION ADC_CFGR_RES_10BITS
# else // ADCv1, ADCv5, or the bodge for ADCv2 above # else // ADCv1, ADCv5, or the bodge for ADCv2 above
# define ADC_RESOLUTION ADC_CFGR1_RES_10BIT # define ADC_RESOLUTION ADC_CFGR1_RES_10BIT
# endif # endif
#endif #endif
@ -123,7 +123,7 @@ static ADCConversionGroup adcConversionGroup = {
.smpr = ADC_SAMPLING_RATE, .smpr = ADC_SAMPLING_RATE,
#elif defined(USE_ADCV2) #elif defined(USE_ADCV2)
# if !defined(STM32F1XX) && !defined(GD32VF103) # if !defined(STM32F1XX) && !defined(GD32VF103)
.cr2 = ADC_CR2_SWSTART, // F103 seem very unhappy with, F401 seems very unhappy without... .cr2 = ADC_CR2_SWSTART, // F103 seem very unhappy with, F401 seems very unhappy without...
# endif # endif
.smpr2 = ADC_SMPR2_SMP_AN0(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN1(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN2(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN3(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN4(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN5(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN6(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN7(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN8(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN9(ADC_SAMPLING_RATE), .smpr2 = ADC_SMPR2_SMP_AN0(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN1(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN2(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN3(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN4(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN5(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN6(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN7(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN8(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN9(ADC_SAMPLING_RATE),
.smpr1 = ADC_SMPR1_SMP_AN10(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN11(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN12(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN13(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN14(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN15(ADC_SAMPLING_RATE), .smpr1 = ADC_SMPR1_SMP_AN10(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN11(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN12(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN13(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN14(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN15(ADC_SAMPLING_RATE),

View File

@ -28,7 +28,9 @@ typedef struct {
uint8_t adc; uint8_t adc;
} adc_mux; } adc_mux;
#define TO_MUX(i, a) \ #define TO_MUX(i, a) \
(adc_mux) { i, a } (adc_mux) { \
i, a \
}
int16_t analogReadPin(pin_t pin); int16_t analogReadPin(pin_t pin);
int16_t analogReadPinAdc(pin_t pin, uint8_t adc); int16_t analogReadPinAdc(pin_t pin, uint8_t adc);

View File

@ -52,19 +52,19 @@ static const dacsample_t dac_buffer_sine[AUDIO_DAC_BUFFER_SIZE] = {
// 256 values, max 4095 // 256 values, max 4095
0x0, 0x1, 0x2, 0x6, 0xa, 0xf, 0x16, 0x1e, 0x27, 0x32, 0x3d, 0x4a, 0x58, 0x67, 0x78, 0x89, 0x9c, 0xb0, 0xc5, 0xdb, 0xf2, 0x10a, 0x123, 0x13e, 0x159, 0x175, 0x193, 0x1b1, 0x1d1, 0x1f1, 0x212, 0x235, 0x258, 0x27c, 0x2a0, 0x2c6, 0x2ed, 0x314, 0x33c, 0x365, 0x38e, 0x3b8, 0x3e3, 0x40e, 0x43a, 0x467, 0x494, 0x4c2, 0x4f0, 0x51f, 0x54e, 0x57d, 0x5ad, 0x5dd, 0x60e, 0x63f, 0x670, 0x6a1, 0x6d3, 0x705, 0x737, 0x769, 0x79b, 0x7cd, 0x800, 0x832, 0x864, 0x896, 0x8c8, 0x8fa, 0x92c, 0x95e, 0x98f, 0x9c0, 0x9f1, 0xa22, 0xa52, 0xa82, 0xab1, 0xae0, 0xb0f, 0xb3d, 0xb6b, 0xb98, 0xbc5, 0xbf1, 0xc1c, 0xc47, 0xc71, 0xc9a, 0xcc3, 0xceb, 0xd12, 0xd39, 0xd5f, 0xd83, 0xda7, 0xdca, 0xded, 0xe0e, 0xe2e, 0xe4e, 0xe6c, 0xe8a, 0xea6, 0xec1, 0xedc, 0xef5, 0xf0d, 0xf24, 0xf3a, 0xf4f, 0xf63, 0xf76, 0xf87, 0xf98, 0xfa7, 0xfb5, 0xfc2, 0xfcd, 0xfd8, 0xfe1, 0xfe9, 0xff0, 0xff5, 0xff9, 0xffd, 0xffe, 0x0, 0x1, 0x2, 0x6, 0xa, 0xf, 0x16, 0x1e, 0x27, 0x32, 0x3d, 0x4a, 0x58, 0x67, 0x78, 0x89, 0x9c, 0xb0, 0xc5, 0xdb, 0xf2, 0x10a, 0x123, 0x13e, 0x159, 0x175, 0x193, 0x1b1, 0x1d1, 0x1f1, 0x212, 0x235, 0x258, 0x27c, 0x2a0, 0x2c6, 0x2ed, 0x314, 0x33c, 0x365, 0x38e, 0x3b8, 0x3e3, 0x40e, 0x43a, 0x467, 0x494, 0x4c2, 0x4f0, 0x51f, 0x54e, 0x57d, 0x5ad, 0x5dd, 0x60e, 0x63f, 0x670, 0x6a1, 0x6d3, 0x705, 0x737, 0x769, 0x79b, 0x7cd, 0x800, 0x832, 0x864, 0x896, 0x8c8, 0x8fa, 0x92c, 0x95e, 0x98f, 0x9c0, 0x9f1, 0xa22, 0xa52, 0xa82, 0xab1, 0xae0, 0xb0f, 0xb3d, 0xb6b, 0xb98, 0xbc5, 0xbf1, 0xc1c, 0xc47, 0xc71, 0xc9a, 0xcc3, 0xceb, 0xd12, 0xd39, 0xd5f, 0xd83, 0xda7, 0xdca, 0xded, 0xe0e, 0xe2e, 0xe4e, 0xe6c, 0xe8a, 0xea6, 0xec1, 0xedc, 0xef5, 0xf0d, 0xf24, 0xf3a, 0xf4f, 0xf63, 0xf76, 0xf87, 0xf98, 0xfa7, 0xfb5, 0xfc2, 0xfcd, 0xfd8, 0xfe1, 0xfe9, 0xff0, 0xff5, 0xff9, 0xffd, 0xffe,
0xfff, 0xffe, 0xffd, 0xff9, 0xff5, 0xff0, 0xfe9, 0xfe1, 0xfd8, 0xfcd, 0xfc2, 0xfb5, 0xfa7, 0xf98, 0xf87, 0xf76, 0xf63, 0xf4f, 0xf3a, 0xf24, 0xf0d, 0xef5, 0xedc, 0xec1, 0xea6, 0xe8a, 0xe6c, 0xe4e, 0xe2e, 0xe0e, 0xded, 0xdca, 0xda7, 0xd83, 0xd5f, 0xd39, 0xd12, 0xceb, 0xcc3, 0xc9a, 0xc71, 0xc47, 0xc1c, 0xbf1, 0xbc5, 0xb98, 0xb6b, 0xb3d, 0xb0f, 0xae0, 0xab1, 0xa82, 0xa52, 0xa22, 0x9f1, 0x9c0, 0x98f, 0x95e, 0x92c, 0x8fa, 0x8c8, 0x896, 0x864, 0x832, 0x800, 0x7cd, 0x79b, 0x769, 0x737, 0x705, 0x6d3, 0x6a1, 0x670, 0x63f, 0x60e, 0x5dd, 0x5ad, 0x57d, 0x54e, 0x51f, 0x4f0, 0x4c2, 0x494, 0x467, 0x43a, 0x40e, 0x3e3, 0x3b8, 0x38e, 0x365, 0x33c, 0x314, 0x2ed, 0x2c6, 0x2a0, 0x27c, 0x258, 0x235, 0x212, 0x1f1, 0x1d1, 0x1b1, 0x193, 0x175, 0x159, 0x13e, 0x123, 0x10a, 0xf2, 0xdb, 0xc5, 0xb0, 0x9c, 0x89, 0x78, 0x67, 0x58, 0x4a, 0x3d, 0x32, 0x27, 0x1e, 0x16, 0xf, 0xa, 0x6, 0x2, 0x1}; 0xfff, 0xffe, 0xffd, 0xff9, 0xff5, 0xff0, 0xfe9, 0xfe1, 0xfd8, 0xfcd, 0xfc2, 0xfb5, 0xfa7, 0xf98, 0xf87, 0xf76, 0xf63, 0xf4f, 0xf3a, 0xf24, 0xf0d, 0xef5, 0xedc, 0xec1, 0xea6, 0xe8a, 0xe6c, 0xe4e, 0xe2e, 0xe0e, 0xded, 0xdca, 0xda7, 0xd83, 0xd5f, 0xd39, 0xd12, 0xceb, 0xcc3, 0xc9a, 0xc71, 0xc47, 0xc1c, 0xbf1, 0xbc5, 0xb98, 0xb6b, 0xb3d, 0xb0f, 0xae0, 0xab1, 0xa82, 0xa52, 0xa22, 0x9f1, 0x9c0, 0x98f, 0x95e, 0x92c, 0x8fa, 0x8c8, 0x896, 0x864, 0x832, 0x800, 0x7cd, 0x79b, 0x769, 0x737, 0x705, 0x6d3, 0x6a1, 0x670, 0x63f, 0x60e, 0x5dd, 0x5ad, 0x57d, 0x54e, 0x51f, 0x4f0, 0x4c2, 0x494, 0x467, 0x43a, 0x40e, 0x3e3, 0x3b8, 0x38e, 0x365, 0x33c, 0x314, 0x2ed, 0x2c6, 0x2a0, 0x27c, 0x258, 0x235, 0x212, 0x1f1, 0x1d1, 0x1b1, 0x193, 0x175, 0x159, 0x13e, 0x123, 0x10a, 0xf2, 0xdb, 0xc5, 0xb0, 0x9c, 0x89, 0x78, 0x67, 0x58, 0x4a, 0x3d, 0x32, 0x27, 0x1e, 0x16, 0xf, 0xa, 0x6, 0x2, 0x1};
#endif // AUDIO_DAC_SAMPLE_WAVEFORM_SINE #endif // AUDIO_DAC_SAMPLE_WAVEFORM_SINE
#ifdef AUDIO_DAC_SAMPLE_WAVEFORM_TRIANGLE #ifdef AUDIO_DAC_SAMPLE_WAVEFORM_TRIANGLE
static const dacsample_t dac_buffer_triangle[AUDIO_DAC_BUFFER_SIZE] = { static const dacsample_t dac_buffer_triangle[AUDIO_DAC_BUFFER_SIZE] = {
// 256 values, max 4095 // 256 values, max 4095
0x0, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0x100, 0x120, 0x140, 0x160, 0x180, 0x1a0, 0x1c0, 0x1e0, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0x3c0, 0x3e0, 0x400, 0x420, 0x440, 0x460, 0x480, 0x4a0, 0x4c0, 0x4e0, 0x500, 0x520, 0x540, 0x560, 0x580, 0x5a0, 0x5c0, 0x5e0, 0x600, 0x620, 0x640, 0x660, 0x680, 0x6a0, 0x6c0, 0x6e0, 0x700, 0x720, 0x740, 0x760, 0x780, 0x7a0, 0x7c0, 0x7e0, 0x800, 0x81f, 0x83f, 0x85f, 0x87f, 0x89f, 0x8bf, 0x8df, 0x8ff, 0x91f, 0x93f, 0x95f, 0x97f, 0x99f, 0x9bf, 0x9df, 0x9ff, 0xa1f, 0xa3f, 0xa5f, 0xa7f, 0xa9f, 0xabf, 0xadf, 0xaff, 0xb1f, 0xb3f, 0xb5f, 0xb7f, 0xb9f, 0xbbf, 0xbdf, 0xbff, 0xc1f, 0xc3f, 0xc5f, 0xc7f, 0xc9f, 0xcbf, 0xcdf, 0xcff, 0xd1f, 0xd3f, 0xd5f, 0xd7f, 0xd9f, 0xdbf, 0xddf, 0xdff, 0xe1f, 0xe3f, 0xe5f, 0xe7f, 0xe9f, 0xebf, 0xedf, 0xeff, 0xf1f, 0xf3f, 0xf5f, 0xf7f, 0xf9f, 0xfbf, 0xfdf, 0x0, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0x100, 0x120, 0x140, 0x160, 0x180, 0x1a0, 0x1c0, 0x1e0, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0x3c0, 0x3e0, 0x400, 0x420, 0x440, 0x460, 0x480, 0x4a0, 0x4c0, 0x4e0, 0x500, 0x520, 0x540, 0x560, 0x580, 0x5a0, 0x5c0, 0x5e0, 0x600, 0x620, 0x640, 0x660, 0x680, 0x6a0, 0x6c0, 0x6e0, 0x700, 0x720, 0x740, 0x760, 0x780, 0x7a0, 0x7c0, 0x7e0, 0x800, 0x81f, 0x83f, 0x85f, 0x87f, 0x89f, 0x8bf, 0x8df, 0x8ff, 0x91f, 0x93f, 0x95f, 0x97f, 0x99f, 0x9bf, 0x9df, 0x9ff, 0xa1f, 0xa3f, 0xa5f, 0xa7f, 0xa9f, 0xabf, 0xadf, 0xaff, 0xb1f, 0xb3f, 0xb5f, 0xb7f, 0xb9f, 0xbbf, 0xbdf, 0xbff, 0xc1f, 0xc3f, 0xc5f, 0xc7f, 0xc9f, 0xcbf, 0xcdf, 0xcff, 0xd1f, 0xd3f, 0xd5f, 0xd7f, 0xd9f, 0xdbf, 0xddf, 0xdff, 0xe1f, 0xe3f, 0xe5f, 0xe7f, 0xe9f, 0xebf, 0xedf, 0xeff, 0xf1f, 0xf3f, 0xf5f, 0xf7f, 0xf9f, 0xfbf, 0xfdf,
0xfff, 0xfdf, 0xfbf, 0xf9f, 0xf7f, 0xf5f, 0xf3f, 0xf1f, 0xeff, 0xedf, 0xebf, 0xe9f, 0xe7f, 0xe5f, 0xe3f, 0xe1f, 0xdff, 0xddf, 0xdbf, 0xd9f, 0xd7f, 0xd5f, 0xd3f, 0xd1f, 0xcff, 0xcdf, 0xcbf, 0xc9f, 0xc7f, 0xc5f, 0xc3f, 0xc1f, 0xbff, 0xbdf, 0xbbf, 0xb9f, 0xb7f, 0xb5f, 0xb3f, 0xb1f, 0xaff, 0xadf, 0xabf, 0xa9f, 0xa7f, 0xa5f, 0xa3f, 0xa1f, 0x9ff, 0x9df, 0x9bf, 0x99f, 0x97f, 0x95f, 0x93f, 0x91f, 0x8ff, 0x8df, 0x8bf, 0x89f, 0x87f, 0x85f, 0x83f, 0x81f, 0x800, 0x7e0, 0x7c0, 0x7a0, 0x780, 0x760, 0x740, 0x720, 0x700, 0x6e0, 0x6c0, 0x6a0, 0x680, 0x660, 0x640, 0x620, 0x600, 0x5e0, 0x5c0, 0x5a0, 0x580, 0x560, 0x540, 0x520, 0x500, 0x4e0, 0x4c0, 0x4a0, 0x480, 0x460, 0x440, 0x420, 0x400, 0x3e0, 0x3c0, 0x3a0, 0x380, 0x360, 0x340, 0x320, 0x300, 0x2e0, 0x2c0, 0x2a0, 0x280, 0x260, 0x240, 0x220, 0x200, 0x1e0, 0x1c0, 0x1a0, 0x180, 0x160, 0x140, 0x120, 0x100, 0xe0, 0xc0, 0xa0, 0x80, 0x60, 0x40, 0x20}; 0xfff, 0xfdf, 0xfbf, 0xf9f, 0xf7f, 0xf5f, 0xf3f, 0xf1f, 0xeff, 0xedf, 0xebf, 0xe9f, 0xe7f, 0xe5f, 0xe3f, 0xe1f, 0xdff, 0xddf, 0xdbf, 0xd9f, 0xd7f, 0xd5f, 0xd3f, 0xd1f, 0xcff, 0xcdf, 0xcbf, 0xc9f, 0xc7f, 0xc5f, 0xc3f, 0xc1f, 0xbff, 0xbdf, 0xbbf, 0xb9f, 0xb7f, 0xb5f, 0xb3f, 0xb1f, 0xaff, 0xadf, 0xabf, 0xa9f, 0xa7f, 0xa5f, 0xa3f, 0xa1f, 0x9ff, 0x9df, 0x9bf, 0x99f, 0x97f, 0x95f, 0x93f, 0x91f, 0x8ff, 0x8df, 0x8bf, 0x89f, 0x87f, 0x85f, 0x83f, 0x81f, 0x800, 0x7e0, 0x7c0, 0x7a0, 0x780, 0x760, 0x740, 0x720, 0x700, 0x6e0, 0x6c0, 0x6a0, 0x680, 0x660, 0x640, 0x620, 0x600, 0x5e0, 0x5c0, 0x5a0, 0x580, 0x560, 0x540, 0x520, 0x500, 0x4e0, 0x4c0, 0x4a0, 0x480, 0x460, 0x440, 0x420, 0x400, 0x3e0, 0x3c0, 0x3a0, 0x380, 0x360, 0x340, 0x320, 0x300, 0x2e0, 0x2c0, 0x2a0, 0x280, 0x260, 0x240, 0x220, 0x200, 0x1e0, 0x1c0, 0x1a0, 0x180, 0x160, 0x140, 0x120, 0x100, 0xe0, 0xc0, 0xa0, 0x80, 0x60, 0x40, 0x20};
#endif // AUDIO_DAC_SAMPLE_WAVEFORM_TRIANGLE #endif // AUDIO_DAC_SAMPLE_WAVEFORM_TRIANGLE
#ifdef AUDIO_DAC_SAMPLE_WAVEFORM_SQUARE #ifdef AUDIO_DAC_SAMPLE_WAVEFORM_SQUARE
static const dacsample_t dac_buffer_square[AUDIO_DAC_BUFFER_SIZE] = { static const dacsample_t dac_buffer_square[AUDIO_DAC_BUFFER_SIZE] = {
[0 ... AUDIO_DAC_BUFFER_SIZE / 2 - 1] = 0, // first and [0 ... AUDIO_DAC_BUFFER_SIZE / 2 - 1] = 0, // first and
[AUDIO_DAC_BUFFER_SIZE / 2 ... AUDIO_DAC_BUFFER_SIZE - 1] = AUDIO_DAC_SAMPLE_MAX, // second half [AUDIO_DAC_BUFFER_SIZE / 2 ... AUDIO_DAC_BUFFER_SIZE - 1] = AUDIO_DAC_SAMPLE_MAX, // second half
}; };
#endif // AUDIO_DAC_SAMPLE_WAVEFORM_SQUARE #endif // AUDIO_DAC_SAMPLE_WAVEFORM_SQUARE
/* /*
// four steps: 0, 1/3, 2/3 and 1 // four steps: 0, 1/3, 2/3 and 1
static const dacsample_t dac_buffer_staircase[AUDIO_DAC_BUFFER_SIZE] = { static const dacsample_t dac_buffer_staircase[AUDIO_DAC_BUFFER_SIZE] = {
@ -77,7 +77,7 @@ static const dacsample_t dac_buffer_staircase[AUDIO_DAC_BUFFER_SIZE] = {
#ifdef AUDIO_DAC_SAMPLE_WAVEFORM_TRAPEZOID #ifdef AUDIO_DAC_SAMPLE_WAVEFORM_TRAPEZOID
static const dacsample_t dac_buffer_trapezoid[AUDIO_DAC_BUFFER_SIZE] = {0x0, 0x1f, 0x7f, 0xdf, 0x13f, 0x19f, 0x1ff, 0x25f, 0x2bf, 0x31f, 0x37f, 0x3df, 0x43f, 0x49f, 0x4ff, 0x55f, 0x5bf, 0x61f, 0x67f, 0x6df, 0x73f, 0x79f, 0x7ff, 0x85f, 0x8bf, 0x91f, 0x97f, 0x9df, 0xa3f, 0xa9f, 0xaff, 0xb5f, 0xbbf, 0xc1f, 0xc7f, 0xcdf, 0xd3f, 0xd9f, 0xdff, 0xe5f, 0xebf, 0xf1f, 0xf7f, 0xfdf, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, static const dacsample_t dac_buffer_trapezoid[AUDIO_DAC_BUFFER_SIZE] = {0x0, 0x1f, 0x7f, 0xdf, 0x13f, 0x19f, 0x1ff, 0x25f, 0x2bf, 0x31f, 0x37f, 0x3df, 0x43f, 0x49f, 0x4ff, 0x55f, 0x5bf, 0x61f, 0x67f, 0x6df, 0x73f, 0x79f, 0x7ff, 0x85f, 0x8bf, 0x91f, 0x97f, 0x9df, 0xa3f, 0xa9f, 0xaff, 0xb5f, 0xbbf, 0xc1f, 0xc7f, 0xcdf, 0xd3f, 0xd9f, 0xdff, 0xe5f, 0xebf, 0xf1f, 0xf7f, 0xfdf, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
0xfff, 0xfdf, 0xf7f, 0xf1f, 0xebf, 0xe5f, 0xdff, 0xd9f, 0xd3f, 0xcdf, 0xc7f, 0xc1f, 0xbbf, 0xb5f, 0xaff, 0xa9f, 0xa3f, 0x9df, 0x97f, 0x91f, 0x8bf, 0x85f, 0x7ff, 0x79f, 0x73f, 0x6df, 0x67f, 0x61f, 0x5bf, 0x55f, 0x4ff, 0x49f, 0x43f, 0x3df, 0x37f, 0x31f, 0x2bf, 0x25f, 0x1ff, 0x19f, 0x13f, 0xdf, 0x7f, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; 0xfff, 0xfdf, 0xf7f, 0xf1f, 0xebf, 0xe5f, 0xdff, 0xd9f, 0xd3f, 0xcdf, 0xc7f, 0xc1f, 0xbbf, 0xb5f, 0xaff, 0xa9f, 0xa3f, 0x9df, 0x97f, 0x91f, 0x8bf, 0x85f, 0x7ff, 0x79f, 0x73f, 0x6df, 0x67f, 0x61f, 0x5bf, 0x55f, 0x4ff, 0x49f, 0x43f, 0x3df, 0x37f, 0x31f, 0x2bf, 0x25f, 0x1ff, 0x19f, 0x13f, 0xdf, 0x7f, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
#endif // AUDIO_DAC_SAMPLE_WAVEFORM_TRAPEZOID #endif // AUDIO_DAC_SAMPLE_WAVEFORM_TRAPEZOID
static dacsample_t dac_buffer_empty[AUDIO_DAC_BUFFER_SIZE] = {AUDIO_DAC_OFF_VALUE}; static dacsample_t dac_buffer_empty[AUDIO_DAC_BUFFER_SIZE] = {AUDIO_DAC_OFF_VALUE};
@ -98,7 +98,7 @@ typedef enum {
OUTPUT_REACHED_ZERO_BEFORE_OFF, OUTPUT_REACHED_ZERO_BEFORE_OFF,
OUTPUT_OFF, OUTPUT_OFF,
OUTPUT_OFF_1, OUTPUT_OFF_1,
OUTPUT_OFF_2, // trailing off: giving the DAC two more conversion cycles until the AUDIO_DAC_OFF_VALUE reaches the output, then turn the timer off, which leaves the output at that level OUTPUT_OFF_2, // trailing off: giving the DAC two more conversion cycles until the AUDIO_DAC_OFF_VALUE reaches the output, then turn the timer off, which leaves the output at that level
number_of_output_states number_of_output_states
} output_states_t; } output_states_t;
output_states_t state = OUTPUT_OFF_2; output_states_t state = OUTPUT_OFF_2;
@ -171,7 +171,7 @@ static void dac_end(DACDriver *dacp) {
// work on the other half of the buffer // work on the other half of the buffer
if (dacIsBufferComplete(dacp)) { if (dacIsBufferComplete(dacp)) {
sample_p += AUDIO_DAC_BUFFER_SIZE / 2; // 'half_index' sample_p += AUDIO_DAC_BUFFER_SIZE / 2; // 'half_index'
} }
for (uint8_t s = 0; s < AUDIO_DAC_BUFFER_SIZE / 2; s++) { for (uint8_t s = 0; s < AUDIO_DAC_BUFFER_SIZE / 2; s++) {
@ -196,8 +196,8 @@ static void dac_end(DACDriver *dacp) {
* * * * * *
* =====*=*================================================= 0x0 * =====*=*================================================= 0x0
*/ */
if (((sample_p[s] + (AUDIO_DAC_SAMPLE_MAX / 100)) > AUDIO_DAC_OFF_VALUE) && // value approaches from below if (((sample_p[s] + (AUDIO_DAC_SAMPLE_MAX / 100)) > AUDIO_DAC_OFF_VALUE) && // value approaches from below
(sample_p[s] < (AUDIO_DAC_OFF_VALUE + (AUDIO_DAC_SAMPLE_MAX / 100))) // or above (sample_p[s] < (AUDIO_DAC_OFF_VALUE + (AUDIO_DAC_SAMPLE_MAX / 100))) // or above
) { ) {
if ((OUTPUT_SHOULD_START == state) && (active_tones_snapshot_length > 0)) { if ((OUTPUT_SHOULD_START == state) && (active_tones_snapshot_length > 0)) {
state = OUTPUT_RUN_NORMALLY; state = OUTPUT_RUN_NORMALLY;
@ -220,7 +220,7 @@ static void dac_end(DACDriver *dacp) {
// -> saves cpu cycles (?) // -> saves cpu cycles (?)
for (uint8_t i = 0; i < active_tones; i++) { for (uint8_t i = 0; i < active_tones; i++) {
float freq = audio_get_processed_frequency(i); float freq = audio_get_processed_frequency(i);
if (freq > 0) { // disregard 'rest' notes, with valid frequency 0.0f; which would only lower the resulting waveform volume during the additive synthesis step if (freq > 0) { // disregard 'rest' notes, with valid frequency 0.0f; which would only lower the resulting waveform volume during the additive synthesis step
active_tones_snapshot[active_tones_snapshot_length++] = freq; active_tones_snapshot[active_tones_snapshot_length++] = freq;
} }
} }
@ -321,7 +321,9 @@ void audio_driver_initialize() {
gptStart(&GPTD6, &gpt6cfg1); gptStart(&GPTD6, &gpt6cfg1);
} }
void audio_driver_stop(void) { state = OUTPUT_SHOULD_STOP; } void audio_driver_stop(void) {
state = OUTPUT_SHOULD_STOP;
}
void audio_driver_start(void) { void audio_driver_start(void) {
gptStartContinuous(&GPTD6, 2U); gptStartContinuous(&GPTD6, 2U);

View File

@ -115,13 +115,15 @@ void channel_1_set_frequency(float freq) {
channel_1_frequency = freq; channel_1_frequency = freq;
channel_1_stop(); channel_1_stop();
if (freq <= 0.0) // a pause/rest has freq=0 if (freq <= 0.0) // a pause/rest has freq=0
return; return;
gpt6cfg1.frequency = 2 * freq * AUDIO_DAC_BUFFER_SIZE; gpt6cfg1.frequency = 2 * freq * AUDIO_DAC_BUFFER_SIZE;
channel_1_start(); channel_1_start();
} }
float channel_1_get_frequency(void) { return channel_1_frequency; } float channel_1_get_frequency(void) {
return channel_1_frequency;
}
void channel_2_start(void) { void channel_2_start(void) {
gptStart(&GPTD7, &gpt7cfg1); gptStart(&GPTD7, &gpt7cfg1);
@ -140,13 +142,15 @@ void channel_2_set_frequency(float freq) {
channel_2_frequency = freq; channel_2_frequency = freq;
channel_2_stop(); channel_2_stop();
if (freq <= 0.0) // a pause/rest has freq=0 if (freq <= 0.0) // a pause/rest has freq=0
return; return;
gpt7cfg1.frequency = 2 * freq * AUDIO_DAC_BUFFER_SIZE; gpt7cfg1.frequency = 2 * freq * AUDIO_DAC_BUFFER_SIZE;
channel_2_start(); channel_2_start();
} }
float channel_2_get_frequency(void) { return channel_2_frequency; } float channel_2_get_frequency(void) {
return channel_2_frequency;
}
static void gpt_audio_state_cb(GPTDriver *gptp) { static void gpt_audio_state_cb(GPTDriver *gptp) {
if (audio_update_state()) { if (audio_update_state()) {
@ -155,8 +159,8 @@ static void gpt_audio_state_cb(GPTDriver *gptp) {
channel_1_set_frequency(audio_get_processed_frequency(0)); channel_1_set_frequency(audio_get_processed_frequency(0));
channel_2_set_frequency(audio_get_processed_frequency(0)); channel_2_set_frequency(audio_get_processed_frequency(0));
#else // two separate audio outputs/speakers #else // two separate audio outputs/speakers
// primary speaker on A4, optional secondary on A5 // primary speaker on A4, optional secondary on A5
if (AUDIO_PIN == A4) { if (AUDIO_PIN == A4) {
channel_1_set_frequency(audio_get_processed_frequency(0)); channel_1_set_frequency(audio_get_processed_frequency(0));
if (AUDIO_PIN_ALT == A5) { if (AUDIO_PIN_ALT == A5) {

View File

@ -72,7 +72,7 @@ static float channel_1_frequency = 0.0f;
void channel_1_set_frequency(float freq) { void channel_1_set_frequency(float freq) {
channel_1_frequency = freq; channel_1_frequency = freq;
if (freq <= 0.0) // a pause/rest has freq=0 if (freq <= 0.0) // a pause/rest has freq=0
return; return;
pwmcnt_t period = (pwmCFG.frequency / freq); pwmcnt_t period = (pwmCFG.frequency / freq);
@ -82,14 +82,18 @@ void channel_1_set_frequency(float freq) {
PWM_PERCENTAGE_TO_WIDTH(&AUDIO_PWM_DRIVER, (100 - note_timbre) * 100)); PWM_PERCENTAGE_TO_WIDTH(&AUDIO_PWM_DRIVER, (100 - note_timbre) * 100));
} }
float channel_1_get_frequency(void) { return channel_1_frequency; } float channel_1_get_frequency(void) {
return channel_1_frequency;
}
void channel_1_start(void) { void channel_1_start(void) {
pwmStop(&AUDIO_PWM_DRIVER); pwmStop(&AUDIO_PWM_DRIVER);
pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG); pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG);
} }
void channel_1_stop(void) { pwmStop(&AUDIO_PWM_DRIVER); } void channel_1_stop(void) {
pwmStop(&AUDIO_PWM_DRIVER);
}
static void gpt_callback(GPTDriver *gptp); static void gpt_callback(GPTDriver *gptp);
GPTConfig gptCFG = { GPTConfig gptCFG = {
@ -108,9 +112,9 @@ void audio_driver_initialize(void) {
pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG); pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG);
// connect the AUDIO_PIN to the PWM hardware // connect the AUDIO_PIN to the PWM hardware
#if defined(USE_GPIOV1) // STM32F103C8 #if defined(USE_GPIOV1) // STM32F103C8
palSetLineMode(AUDIO_PIN, PAL_MODE_ALTERNATE_PUSHPULL); palSetLineMode(AUDIO_PIN, PAL_MODE_ALTERNATE_PUSHPULL);
#else // GPIOv2 (or GPIOv3 for f4xx, which is the same/compatible at this command) #else // GPIOv2 (or GPIOv3 for f4xx, which is the same/compatible at this command)
palSetLineMode(AUDIO_PIN, PAL_MODE_ALTERNATE(AUDIO_PWM_PAL_MODE)); palSetLineMode(AUDIO_PIN, PAL_MODE_ALTERNATE(AUDIO_PWM_PAL_MODE));
#endif #endif
@ -135,10 +139,10 @@ void audio_driver_stop(void) {
* and updates the pwm to output that frequency * and updates the pwm to output that frequency
*/ */
static void gpt_callback(GPTDriver *gptp) { static void gpt_callback(GPTDriver *gptp) {
float freq; // TODO: freq_alt float freq; // TODO: freq_alt
if (audio_update_state()) { if (audio_update_state()) {
freq = audio_get_processed_frequency(0); // freq_alt would be index=1 freq = audio_get_processed_frequency(0); // freq_alt would be index=1
channel_1_set_frequency(freq); channel_1_set_frequency(freq);
} }
} }

View File

@ -57,7 +57,7 @@ static float channel_1_frequency = 0.0f;
void channel_1_set_frequency(float freq) { void channel_1_set_frequency(float freq) {
channel_1_frequency = freq; channel_1_frequency = freq;
if (freq <= 0.0) // a pause/rest has freq=0 if (freq <= 0.0) // a pause/rest has freq=0
return; return;
pwmcnt_t period = (pwmCFG.frequency / freq); pwmcnt_t period = (pwmCFG.frequency / freq);
@ -68,7 +68,9 @@ void channel_1_set_frequency(float freq) {
PWM_PERCENTAGE_TO_WIDTH(&AUDIO_PWM_DRIVER, (100 - note_timbre) * 100)); PWM_PERCENTAGE_TO_WIDTH(&AUDIO_PWM_DRIVER, (100 - note_timbre) * 100));
} }
float channel_1_get_frequency(void) { return channel_1_frequency; } float channel_1_get_frequency(void) {
return channel_1_frequency;
}
void channel_1_start(void) { void channel_1_start(void) {
pwmStop(&AUDIO_PWM_DRIVER); pwmStop(&AUDIO_PWM_DRIVER);
@ -81,10 +83,10 @@ void channel_1_start(void) {
void channel_1_stop(void) { void channel_1_stop(void) {
pwmStop(&AUDIO_PWM_DRIVER); pwmStop(&AUDIO_PWM_DRIVER);
palClearLine(AUDIO_PIN); // leave the line low, after last note was played palClearLine(AUDIO_PIN); // leave the line low, after last note was played
#if defined(AUDIO_PIN_ALT) && defined(AUDIO_PIN_ALT_AS_NEGATIVE) #if defined(AUDIO_PIN_ALT) && defined(AUDIO_PIN_ALT_AS_NEGATIVE)
palClearLine(AUDIO_PIN_ALT); // leave the line low, after last note was played palClearLine(AUDIO_PIN_ALT); // leave the line low, after last note was played
#endif #endif
} }
@ -100,7 +102,7 @@ static void pwm_audio_period_callback(PWMDriver *pwmp) {
static void pwm_audio_channel_interrupt_callback(PWMDriver *pwmp) { static void pwm_audio_channel_interrupt_callback(PWMDriver *pwmp) {
(void)pwmp; (void)pwmp;
if (channel_1_frequency > 0) { if (channel_1_frequency > 0) {
palSetLine(AUDIO_PIN); // generate a PWM signal on any pin, not necessarily the one connected to the timer palSetLine(AUDIO_PIN); // generate a PWM signal on any pin, not necessarily the one connected to the timer
#if defined(AUDIO_PIN_ALT) && defined(AUDIO_PIN_ALT_AS_NEGATIVE) #if defined(AUDIO_PIN_ALT) && defined(AUDIO_PIN_ALT_AS_NEGATIVE)
palClearLine(AUDIO_PIN_ALT); palClearLine(AUDIO_PIN_ALT);
#endif #endif
@ -131,7 +133,7 @@ void audio_driver_initialize(void) {
palClearLine(AUDIO_PIN_ALT); palClearLine(AUDIO_PIN_ALT);
#endif #endif
pwmEnablePeriodicNotification(&AUDIO_PWM_DRIVER); // enable pwm callbacks pwmEnablePeriodicNotification(&AUDIO_PWM_DRIVER); // enable pwm callbacks
pwmEnableChannelNotification(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1); pwmEnableChannelNotification(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1);
gptStart(&AUDIO_STATE_TIMER, &gptCFG); gptStart(&AUDIO_STATE_TIMER, &gptCFG);
@ -155,10 +157,10 @@ void audio_driver_stop(void) {
* and updates the pwm to output that frequency * and updates the pwm to output that frequency
*/ */
static void gpt_callback(GPTDriver *gptp) { static void gpt_callback(GPTDriver *gptp) {
float freq; // TODO: freq_alt float freq; // TODO: freq_alt
if (audio_update_state()) { if (audio_update_state()) {
freq = audio_get_processed_frequency(0); // freq_alt would be index=1 freq = audio_get_processed_frequency(0); // freq_alt would be index=1
channel_1_set_frequency(freq); channel_1_set_frequency(freq);
} }
} }

View File

@ -24,7 +24,7 @@
# define STM32_ONBOARD_EEPROM_SIZE 1024 # define STM32_ONBOARD_EEPROM_SIZE 1024
# else # else
# include "eeconfig.h" # include "eeconfig.h"
# define STM32_ONBOARD_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO and EEPROM page sizing # define STM32_ONBOARD_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO and EEPROM page sizing
# endif # endif
#endif #endif

View File

@ -203,4 +203,6 @@ i2c_status_t i2c_readReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uin
return chibios_to_qmk(&status); return chibios_to_qmk(&status);
} }
void i2c_stop(void) { i2cStop(&I2C_DRIVER); } void i2c_stop(void) {
i2cStop(&I2C_DRIVER);
}

View File

@ -50,14 +50,30 @@
# error invalid SELECT_SOFT_SERIAL_SPEED value # error invalid SELECT_SOFT_SERIAL_SPEED value
#endif #endif
inline static void serial_delay(void) { wait_us(SERIAL_DELAY); } inline static void serial_delay(void) {
inline static void serial_delay_half(void) { wait_us(SERIAL_DELAY / 2); } wait_us(SERIAL_DELAY);
inline static void serial_delay_blip(void) { wait_us(1); } }
inline static void serial_output(void) { setPinOutput(SOFT_SERIAL_PIN); } inline static void serial_delay_half(void) {
inline static void serial_input(void) { setPinInputHigh(SOFT_SERIAL_PIN); } wait_us(SERIAL_DELAY / 2);
inline static bool serial_read_pin(void) { return !!readPin(SOFT_SERIAL_PIN); } }
inline static void serial_low(void) { writePinLow(SOFT_SERIAL_PIN); } inline static void serial_delay_blip(void) {
inline static void serial_high(void) { writePinHigh(SOFT_SERIAL_PIN); } wait_us(1);
}
inline static void serial_output(void) {
setPinOutput(SOFT_SERIAL_PIN);
}
inline static void serial_input(void) {
setPinInputHigh(SOFT_SERIAL_PIN);
}
inline static bool serial_read_pin(void) {
return !!readPin(SOFT_SERIAL_PIN);
}
inline static void serial_low(void) {
writePinLow(SOFT_SERIAL_PIN);
}
inline static void serial_high(void) {
writePinHigh(SOFT_SERIAL_PIN);
}
void interrupt_handler(void *arg); void interrupt_handler(void *arg);
@ -226,7 +242,7 @@ bool soft_serial_transaction(int sstd_index) {
uint8_t checksum = 0; uint8_t checksum = 0;
// send data to the slave // send data to the slave
serial_write_byte(sstd_index); // first chunk is transaction id serial_write_byte(sstd_index); // first chunk is transaction id
sync_recv(); sync_recv();
for (int i = 0; i < trans->initiator2target_buffer_size; ++i) { for (int i = 0; i < trans->initiator2target_buffer_size; ++i) {
@ -238,7 +254,7 @@ bool soft_serial_transaction(int sstd_index) {
sync_recv(); sync_recv();
serial_delay(); serial_delay();
serial_delay(); // read mid pulses serial_delay(); // read mid pulses
// receive data from the slave // receive data from the slave
uint8_t checksum_computed = 0; uint8_t checksum_computed = 0;

View File

@ -238,7 +238,7 @@ void soft_serial_initiator_init(void) {
usart_master_init(&serial_driver); usart_master_init(&serial_driver);
#if defined(MCU_STM32) && defined(SERIAL_USART_PIN_SWAP) #if defined(MCU_STM32) && defined(SERIAL_USART_PIN_SWAP)
serial_config.cr2 |= USART_CR2_SWAP; // master has swapped TX/RX pins serial_config.cr2 |= USART_CR2_SWAP; // master has swapped TX/RX pins
#endif #endif
sdStart(serial_driver, &serial_config); sdStart(serial_driver, &serial_config);

View File

@ -50,15 +50,15 @@
#endif #endif
#if !defined(USART_CR1_M0) #if !defined(USART_CR1_M0)
# define USART_CR1_M0 USART_CR1_M // some platforms (f1xx) dont have this so # define USART_CR1_M0 USART_CR1_M // some platforms (f1xx) dont have this so
#endif #endif
#if !defined(SERIAL_USART_CR1) #if !defined(SERIAL_USART_CR1)
# define SERIAL_USART_CR1 (USART_CR1_PCE | USART_CR1_PS | USART_CR1_M0) // parity enable, odd parity, 9 bit length # define SERIAL_USART_CR1 (USART_CR1_PCE | USART_CR1_PS | USART_CR1_M0) // parity enable, odd parity, 9 bit length
#endif #endif
#if !defined(SERIAL_USART_CR2) #if !defined(SERIAL_USART_CR2)
# define SERIAL_USART_CR2 (USART_CR2_STOP_1) // 2 stop bits # define SERIAL_USART_CR2 (USART_CR2_STOP_1) // 2 stop bits
#endif #endif
#if !defined(SERIAL_USART_CR3) #if !defined(SERIAL_USART_CR3)

View File

@ -115,7 +115,7 @@ bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor) {
#elif defined(HT32) #elif defined(HT32)
spiConfig.cr0 = SPI_CR0_SELOEN; spiConfig.cr0 = SPI_CR0_SELOEN;
spiConfig.cr1 = SPI_CR1_MODE | 8; // 8 bits and in master mode spiConfig.cr1 = SPI_CR1_MODE | 8; // 8 bits and in master mode
if (lsbFirst) { if (lsbFirst) {
spiConfig.cr1 |= SPI_CR1_FIRSTBIT; spiConfig.cr1 |= SPI_CR1_FIRSTBIT;

View File

@ -43,7 +43,9 @@ void uart_init(uint32_t baud) {
} }
} }
void uart_write(uint8_t data) { sdPut(&SERIAL_DRIVER, c); } void uart_write(uint8_t data) {
sdPut(&SERIAL_DRIVER, c);
}
uint8_t uart_read(void) { uint8_t uart_read(void) {
msg_t res = sdGet(&SERIAL_DRIVER); msg_t res = sdGet(&SERIAL_DRIVER);
@ -51,8 +53,14 @@ uint8_t uart_read(void) {
return (uint8_t)res; return (uint8_t)res;
} }
void uart_transmit(const uint8_t *data, uint16_t length) { sdWrite(&SERIAL_DRIVER, data, length); } void uart_transmit(const uint8_t *data, uint16_t length) {
sdWrite(&SERIAL_DRIVER, data, length);
}
void uart_receive(uint8_t *data, uint16_t length) { sdRead(&SERIAL_DRIVER, data, length); } void uart_receive(uint8_t *data, uint16_t length) {
sdRead(&SERIAL_DRIVER, data, length);
}
bool uart_available(void) { return !sdGetWouldBlock(&SERIAL_DRIVER); } bool uart_available(void) {
return !sdGetWouldBlock(&SERIAL_DRIVER);
}

View File

@ -18,7 +18,7 @@
#ifndef USBPD_UCPD1_CFG1 #ifndef USBPD_UCPD1_CFG1
# define USBPD_UCPD1_CFG1 (UCPD_CFG1_PSC_UCPDCLK_0 | UCPD_CFG1_TRANSWIN_3 | UCPD_CFG1_IFRGAP_4 | UCPD_CFG1_HBITCLKDIV_4) # define USBPD_UCPD1_CFG1 (UCPD_CFG1_PSC_UCPDCLK_0 | UCPD_CFG1_TRANSWIN_3 | UCPD_CFG1_IFRGAP_4 | UCPD_CFG1_HBITCLKDIV_4)
#endif // USBPD_UCPD1_CFG1 #endif // USBPD_UCPD1_CFG1
// Initialises the USBPD subsystem // Initialises the USBPD subsystem
__attribute__((weak)) void usbpd_init(void) { __attribute__((weak)) void usbpd_init(void) {
@ -64,7 +64,7 @@ __attribute__((weak)) usbpd_allowance_t usbpd_get_allowance(void) {
switch (vstate_max) { switch (vstate_max) {
case 0: case 0:
case 1: case 1:
return USBPD_500MA; // Note that this is 500mA (i.e. max USB 2.0), not 900mA, as we're not using USB 3.1 as a sink device. return USBPD_500MA; // Note that this is 500mA (i.e. max USB 2.0), not 900mA, as we're not using USB 3.1 as a sink device.
case 2: case 2:
return USBPD_1500MA; return USBPD_1500MA;
case 3: case 3:

View File

@ -10,7 +10,7 @@
# define NOP_FUDGE 0.4 # define NOP_FUDGE 0.4
# else # else
# error("NOP_FUDGE configuration required") # error("NOP_FUDGE configuration required")
# define NOP_FUDGE 1 // this just pleases the compile so the above error is easier to spot # define NOP_FUDGE 1 // this just pleases the compile so the above error is easier to spot
# endif # endif
#endif #endif
@ -25,12 +25,12 @@
// The reset gap can be 6000 ns, but depending on the LED strip it may have to be increased // The reset gap can be 6000 ns, but depending on the LED strip it may have to be increased
// to values like 600000 ns. If it is too small, the pixels will show nothing most of the time. // to values like 600000 ns. If it is too small, the pixels will show nothing most of the time.
#ifndef WS2812_RES #ifndef WS2812_RES
# define WS2812_RES (1000 * WS2812_TRST_US) // Width of the low gap between bits to cause a frame to latch # define WS2812_RES (1000 * WS2812_TRST_US) // Width of the low gap between bits to cause a frame to latch
#endif #endif
#define NUMBER_NOPS 6 #define NUMBER_NOPS 6
#define CYCLES_PER_SEC (CPU_CLOCK / NUMBER_NOPS * NOP_FUDGE) #define CYCLES_PER_SEC (CPU_CLOCK / NUMBER_NOPS * NOP_FUDGE)
#define NS_PER_SEC (1000000000L) // Note that this has to be SIGNED since we want to be able to check for negative values of derivatives #define NS_PER_SEC (1000000000L) // Note that this has to be SIGNED since we want to be able to check for negative values of derivatives
#define NS_PER_CYCLE (NS_PER_SEC / CYCLES_PER_SEC) #define NS_PER_CYCLE (NS_PER_SEC / CYCLES_PER_SEC)
#define NS_TO_CYCLES(n) ((n) / NS_PER_CYCLE) #define NS_TO_CYCLES(n) ((n) / NS_PER_CYCLE)
@ -67,7 +67,9 @@ void sendByte(uint8_t byte) {
} }
} }
void ws2812_init(void) { palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE); } void ws2812_init(void) {
palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE);
}
// Setleds for standard RGB // Setleds for standard RGB
void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) { void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {

View File

@ -11,19 +11,19 @@
#endif #endif
#ifndef WS2812_PWM_DRIVER #ifndef WS2812_PWM_DRIVER
# define WS2812_PWM_DRIVER PWMD2 // TIMx # define WS2812_PWM_DRIVER PWMD2 // TIMx
#endif #endif
#ifndef WS2812_PWM_CHANNEL #ifndef WS2812_PWM_CHANNEL
# define WS2812_PWM_CHANNEL 2 // Channel # define WS2812_PWM_CHANNEL 2 // Channel
#endif #endif
#ifndef WS2812_PWM_PAL_MODE #ifndef WS2812_PWM_PAL_MODE
# define WS2812_PWM_PAL_MODE 2 // DI Pin's alternate function value # define WS2812_PWM_PAL_MODE 2 // DI Pin's alternate function value
#endif #endif
#ifndef WS2812_DMA_STREAM #ifndef WS2812_DMA_STREAM
# define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP # define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP
#endif #endif
#ifndef WS2812_DMA_CHANNEL #ifndef WS2812_DMA_CHANNEL
# define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP # define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP
#endif #endif
#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) && !defined(WS2812_DMAMUX_ID) #if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) && !defined(WS2812_DMAMUX_ID)
# error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP" # error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
@ -56,7 +56,7 @@
#ifndef WS2812_PWM_TARGET_PERIOD #ifndef WS2812_PWM_TARGET_PERIOD
//# define WS2812_PWM_TARGET_PERIOD 800000 // Original code is 800k...? //# define WS2812_PWM_TARGET_PERIOD 800000 // Original code is 800k...?
# define WS2812_PWM_TARGET_PERIOD 80000 // TODO: work out why 10x less on f303/f4x1 # define WS2812_PWM_TARGET_PERIOD 80000 // TODO: work out why 10x less on f303/f4x1
#endif #endif
/* --- PRIVATE CONSTANTS ---------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */
@ -259,8 +259,10 @@ write/read to/from the other buffer).
void ws2812_init(void) { void ws2812_init(void) {
// Initialize led frame buffer // Initialize led frame buffer
uint32_t i; uint32_t i;
for (i = 0; i < WS2812_COLOR_BIT_N; i++) ws2812_frame_buffer[i] = WS2812_DUTYCYCLE_0; // All color bits are zero duty cycle for (i = 0; i < WS2812_COLOR_BIT_N; i++)
for (i = 0; i < WS2812_RESET_BIT_N; i++) ws2812_frame_buffer[i + WS2812_COLOR_BIT_N] = 0; // All reset bits are zero ws2812_frame_buffer[i] = WS2812_DUTYCYCLE_0; // All color bits are zero duty cycle
for (i = 0; i < WS2812_RESET_BIT_N; i++)
ws2812_frame_buffer[i + WS2812_COLOR_BIT_N] = 0; // All reset bits are zero
palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE); palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE);
@ -268,22 +270,22 @@ void ws2812_init(void) {
//#pragma GCC diagnostic ignored "-Woverride-init" // Turn off override-init warning for this struct. We use the overriding ability to set a "default" channel config //#pragma GCC diagnostic ignored "-Woverride-init" // Turn off override-init warning for this struct. We use the overriding ability to set a "default" channel config
static const PWMConfig ws2812_pwm_config = { static const PWMConfig ws2812_pwm_config = {
.frequency = WS2812_PWM_FREQUENCY, .frequency = WS2812_PWM_FREQUENCY,
.period = WS2812_PWM_PERIOD, // Mit dieser Periode wird UDE-Event erzeugt und ein neuer Wert (Länge WS2812_BIT_N) vom DMA ins CCR geschrieben .period = WS2812_PWM_PERIOD, // Mit dieser Periode wird UDE-Event erzeugt und ein neuer Wert (Länge WS2812_BIT_N) vom DMA ins CCR geschrieben
.callback = NULL, .callback = NULL,
.channels = .channels =
{ {
[0 ... 3] = {.mode = PWM_OUTPUT_DISABLED, .callback = NULL}, // Channels default to disabled [0 ... 3] = {.mode = PWM_OUTPUT_DISABLED, .callback = NULL}, // Channels default to disabled
[WS2812_PWM_CHANNEL - 1] = {.mode = WS2812_PWM_OUTPUT_MODE, .callback = NULL}, // Turn on the channel we care about [WS2812_PWM_CHANNEL - 1] = {.mode = WS2812_PWM_OUTPUT_MODE, .callback = NULL}, // Turn on the channel we care about
}, },
.cr2 = 0, .cr2 = 0,
.dier = TIM_DIER_UDE, // DMA on update event for next period .dier = TIM_DIER_UDE, // DMA on update event for next period
}; };
//#pragma GCC diagnostic pop // Restore command-line warning options //#pragma GCC diagnostic pop // Restore command-line warning options
// Configure DMA // Configure DMA
// dmaInit(); // Joe added this // dmaInit(); // Joe added this
dmaStreamAlloc(WS2812_DMA_STREAM - STM32_DMA_STREAM(0), 10, NULL, NULL); dmaStreamAlloc(WS2812_DMA_STREAM - STM32_DMA_STREAM(0), 10, NULL, NULL);
dmaStreamSetPeripheral(WS2812_DMA_STREAM, &(WS2812_PWM_DRIVER.tim->CCR[WS2812_PWM_CHANNEL - 1])); // Ziel ist der An-Zeit im Cap-Comp-Register dmaStreamSetPeripheral(WS2812_DMA_STREAM, &(WS2812_PWM_DRIVER.tim->CCR[WS2812_PWM_CHANNEL - 1])); // Ziel ist der An-Zeit im Cap-Comp-Register
dmaStreamSetMemory0(WS2812_DMA_STREAM, ws2812_frame_buffer); dmaStreamSetMemory0(WS2812_DMA_STREAM, ws2812_frame_buffer);
dmaStreamSetTransactionSize(WS2812_DMA_STREAM, WS2812_BIT_N); dmaStreamSetTransactionSize(WS2812_DMA_STREAM, WS2812_BIT_N);
dmaStreamSetMode(WS2812_DMA_STREAM, STM32_DMA_CR_CHSEL(WS2812_DMA_CHANNEL) | STM32_DMA_CR_DIR_M2P | STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_MINC | STM32_DMA_CR_CIRC | STM32_DMA_CR_PL(3)); dmaStreamSetMode(WS2812_DMA_STREAM, STM32_DMA_CR_CHSEL(WS2812_DMA_CHANNEL) | STM32_DMA_CR_DIR_M2P | STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_MINC | STM32_DMA_CR_CIRC | STM32_DMA_CR_PL(3));
@ -302,7 +304,7 @@ void ws2812_init(void) {
// ChibiOS driver code, so we don't have to do anything special to the timer. If we did, we'd have to start the timer, // ChibiOS driver code, so we don't have to do anything special to the timer. If we did, we'd have to start the timer,
// disable counting, enable the channel, and then make whatever configuration changes we need. // disable counting, enable the channel, and then make whatever configuration changes we need.
pwmStart(&WS2812_PWM_DRIVER, &ws2812_pwm_config); pwmStart(&WS2812_PWM_DRIVER, &ws2812_pwm_config);
pwmEnableChannel(&WS2812_PWM_DRIVER, WS2812_PWM_CHANNEL - 1, 0); // Initial period is 0; output will be low until first duty cycle is DMA'd in pwmEnableChannel(&WS2812_PWM_DRIVER, WS2812_PWM_CHANNEL - 1, 0); // Initial period is 0; output will be low until first duty cycle is DMA'd in
} }
void ws2812_write_led(uint16_t led_number, uint8_t r, uint8_t g, uint8_t b) { void ws2812_write_led(uint16_t led_number, uint8_t r, uint8_t g, uint8_t b) {

View File

@ -42,7 +42,7 @@
# define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_0) # define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_0)
#elif WS2812_SPI_DIVISOR == 8 #elif WS2812_SPI_DIVISOR == 8
# define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_1) # define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_1)
#elif WS2812_SPI_DIVISOR == 16 // same as default #elif WS2812_SPI_DIVISOR == 16 // same as default
# define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_1 | SPI_CR1_BR_0) # define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_1 | SPI_CR1_BR_0)
#elif WS2812_SPI_DIVISOR == 32 #elif WS2812_SPI_DIVISOR == 32
# define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_2) # define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_2)
@ -53,14 +53,14 @@
#elif WS2812_SPI_DIVISOR == 256 #elif WS2812_SPI_DIVISOR == 256
# define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) # define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0)
#else #else
# define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_1 | SPI_CR1_BR_0) // default # define WS2812_SPI_DIVISOR_CR1_BR_X (SPI_CR1_BR_1 | SPI_CR1_BR_0) // default
#endif #endif
// Use SPI circular buffer // Use SPI circular buffer
#ifdef WS2812_SPI_USE_CIRCULAR_BUFFER #ifdef WS2812_SPI_USE_CIRCULAR_BUFFER
# define WS2812_SPI_BUFFER_MODE 1 // circular buffer # define WS2812_SPI_BUFFER_MODE 1 // circular buffer
#else #else
# define WS2812_SPI_BUFFER_MODE 0 // normal buffer # define WS2812_SPI_BUFFER_MODE 0 // normal buffer
#endif #endif
#if defined(USE_GPIOV1) #if defined(USE_GPIOV1)
@ -104,20 +104,30 @@ static void set_led_color_rgb(LED_TYPE color, int pos) {
uint8_t* tx_start = &txbuf[PREAMBLE_SIZE]; uint8_t* tx_start = &txbuf[PREAMBLE_SIZE];
#if (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_GRB) #if (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_GRB)
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.g, j); for (int j = 0; j < 4; j++)
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.r, j); tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.g, j);
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j); for (int j = 0; j < 4; j++)
tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.r, j);
for (int j = 0; j < 4; j++)
tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j);
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB) #elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB)
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.r, j); for (int j = 0; j < 4; j++)
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j); tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.r, j);
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j); for (int j = 0; j < 4; j++)
tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j);
for (int j = 0; j < 4; j++)
tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.b, j);
#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR) #elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.b, j); for (int j = 0; j < 4; j++)
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j); tx_start[BYTES_FOR_LED * pos + j] = get_protocol_eq(color.b, j);
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.r, j); for (int j = 0; j < 4; j++)
tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE + j] = get_protocol_eq(color.g, j);
for (int j = 0; j < 4; j++)
tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 2 + j] = get_protocol_eq(color.r, j);
#endif #endif
#ifdef RGBW #ifdef RGBW
for (int j = 0; j < 4; j++) tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 4 + j] = get_protocol_eq(color.w, j); for (int j = 0; j < 4; j++)
tx_start[BYTES_FOR_LED * pos + BYTES_FOR_LED_BYTE * 4 + j] = get_protocol_eq(color.w, j);
#endif #endif
} }
@ -126,7 +136,7 @@ void ws2812_init(void) {
#ifdef WS2812_SPI_SCK_PIN #ifdef WS2812_SPI_SCK_PIN
palSetLineMode(WS2812_SPI_SCK_PIN, WS2812_SCK_OUTPUT_MODE); palSetLineMode(WS2812_SPI_SCK_PIN, WS2812_SCK_OUTPUT_MODE);
#endif // WS2812_SPI_SCK_PIN #endif // WS2812_SPI_SCK_PIN
// TODO: more dynamic baudrate // TODO: more dynamic baudrate
static const SPIConfig spicfg = {WS2812_SPI_BUFFER_MODE, NULL, PAL_PORT(RGB_DI_PIN), PAL_PAD(RGB_DI_PIN), WS2812_SPI_DIVISOR_CR1_BR_X}; static const SPIConfig spicfg = {WS2812_SPI_BUFFER_MODE, NULL, PAL_PORT(RGB_DI_PIN), PAL_PAD(RGB_DI_PIN), WS2812_SPI_DIVISOR_CR1_BR_X};

View File

@ -560,9 +560,13 @@ uint16_t EEPROM_ReadDataWord(uint16_t Address) {
/***************************************************************************** /*****************************************************************************
* Bind to eeprom_driver.c * Bind to eeprom_driver.c
*******************************************************************************/ *******************************************************************************/
void eeprom_driver_init(void) { EEPROM_Init(); } void eeprom_driver_init(void) {
EEPROM_Init();
}
void eeprom_driver_erase(void) { EEPROM_Erase(); } void eeprom_driver_erase(void) {
EEPROM_Erase();
}
void eeprom_read_block(void *buf, const void *addr, size_t len) { void eeprom_read_block(void *buf, const void *addr, size_t len) {
const uint8_t *src = (const uint8_t *)addr; const uint8_t *src = (const uint8_t *)addr;

View File

@ -20,41 +20,41 @@
#if !defined(FEE_PAGE_SIZE) || !defined(FEE_PAGE_COUNT) #if !defined(FEE_PAGE_SIZE) || !defined(FEE_PAGE_COUNT)
# if defined(STM32F103xB) || defined(STM32F042x6) || defined(GD32VF103C8) || defined(GD32VF103CB) # if defined(STM32F103xB) || defined(STM32F042x6) || defined(GD32VF103C8) || defined(GD32VF103CB)
# ifndef FEE_PAGE_SIZE # ifndef FEE_PAGE_SIZE
# define FEE_PAGE_SIZE 0x400 // Page size = 1KByte # define FEE_PAGE_SIZE 0x400 // Page size = 1KByte
# endif # endif
# ifndef FEE_PAGE_COUNT # ifndef FEE_PAGE_COUNT
# define FEE_PAGE_COUNT 2 // How many pages are used # define FEE_PAGE_COUNT 2 // How many pages are used
# endif # endif
# elif defined(STM32F103xE) || defined(STM32F303xC) || defined(STM32F072xB) || defined(STM32F070xB) # elif defined(STM32F103xE) || defined(STM32F303xC) || defined(STM32F072xB) || defined(STM32F070xB)
# ifndef FEE_PAGE_SIZE # ifndef FEE_PAGE_SIZE
# define FEE_PAGE_SIZE 0x800 // Page size = 2KByte # define FEE_PAGE_SIZE 0x800 // Page size = 2KByte
# endif # endif
# ifndef FEE_PAGE_COUNT # ifndef FEE_PAGE_COUNT
# define FEE_PAGE_COUNT 4 // How many pages are used # define FEE_PAGE_COUNT 4 // How many pages are used
# endif # endif
# elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xG) || defined(STM32F411xE) # elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xG) || defined(STM32F411xE)
# ifndef FEE_PAGE_SIZE # ifndef FEE_PAGE_SIZE
# define FEE_PAGE_SIZE 0x4000 // Page size = 16KByte # define FEE_PAGE_SIZE 0x4000 // Page size = 16KByte
# endif # endif
# ifndef FEE_PAGE_COUNT # ifndef FEE_PAGE_COUNT
# define FEE_PAGE_COUNT 1 // How many pages are used # define FEE_PAGE_COUNT 1 // How many pages are used
# endif # endif
# endif # endif
#endif #endif
#if !defined(FEE_MCU_FLASH_SIZE) #if !defined(FEE_MCU_FLASH_SIZE)
# if defined(STM32F042x6) # if defined(STM32F042x6)
# define FEE_MCU_FLASH_SIZE 32 // Size in Kb # define FEE_MCU_FLASH_SIZE 32 // Size in Kb
# elif defined(GD32VF103C8) # elif defined(GD32VF103C8)
# define FEE_MCU_FLASH_SIZE 64 // Size in Kb # define FEE_MCU_FLASH_SIZE 64 // Size in Kb
# elif defined(STM32F103xB) || defined(STM32F072xB) || defined(STM32F070xB) || defined(GD32VF103CB) # elif defined(STM32F103xB) || defined(STM32F072xB) || defined(STM32F070xB) || defined(GD32VF103CB)
# define FEE_MCU_FLASH_SIZE 128 // Size in Kb # define FEE_MCU_FLASH_SIZE 128 // Size in Kb
# elif defined(STM32F303xC) || defined(STM32F401xC) # elif defined(STM32F303xC) || defined(STM32F401xC)
# define FEE_MCU_FLASH_SIZE 256 // Size in Kb # define FEE_MCU_FLASH_SIZE 256 // Size in Kb
# elif defined(STM32F103xE) || defined(STM32F401xE) || defined(STM32F411xE) # elif defined(STM32F103xE) || defined(STM32F401xE) || defined(STM32F411xE)
# define FEE_MCU_FLASH_SIZE 512 // Size in Kb # define FEE_MCU_FLASH_SIZE 512 // Size in Kb
# elif defined(STM32F405xG) # elif defined(STM32F405xG)
# define FEE_MCU_FLASH_SIZE 1024 // Size in Kb # define FEE_MCU_FLASH_SIZE 1024 // Size in Kb
# endif # endif
#endif #endif
@ -62,7 +62,7 @@
#if !defined(FEE_PAGE_BASE_ADDRESS) #if !defined(FEE_PAGE_BASE_ADDRESS)
# if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xG) || defined(STM32F411xE) # if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xG) || defined(STM32F411xE)
# ifndef FEE_PAGE_BASE_ADDRESS # ifndef FEE_PAGE_BASE_ADDRESS
# define FEE_PAGE_BASE_ADDRESS 0x08004000 // bodge to force 2nd 16k page # define FEE_PAGE_BASE_ADDRESS 0x08004000 // bodge to force 2nd 16k page
# endif # endif
# else # else
# ifndef FEE_FLASH_BASE # ifndef FEE_FLASH_BASE

View File

@ -60,19 +60,19 @@
// Minimum EEPROM Endurance // Minimum EEPROM Endurance
// ------------------------ // ------------------------
# if (EEPROM_SIZE == 2048) // 35000 writes/byte or 70000 writes/word # if (EEPROM_SIZE == 2048) // 35000 writes/byte or 70000 writes/word
# define EEESIZE 0x33 # define EEESIZE 0x33
# elif (EEPROM_SIZE == 1024) // 75000 writes/byte or 150000 writes/word # elif (EEPROM_SIZE == 1024) // 75000 writes/byte or 150000 writes/word
# define EEESIZE 0x34 # define EEESIZE 0x34
# elif (EEPROM_SIZE == 512) // 155000 writes/byte or 310000 writes/word # elif (EEPROM_SIZE == 512) // 155000 writes/byte or 310000 writes/word
# define EEESIZE 0x35 # define EEESIZE 0x35
# elif (EEPROM_SIZE == 256) // 315000 writes/byte or 630000 writes/word # elif (EEPROM_SIZE == 256) // 315000 writes/byte or 630000 writes/word
# define EEESIZE 0x36 # define EEESIZE 0x36
# elif (EEPROM_SIZE == 128) // 635000 writes/byte or 1270000 writes/word # elif (EEPROM_SIZE == 128) // 635000 writes/byte or 1270000 writes/word
# define EEESIZE 0x37 # define EEESIZE 0x37
# elif (EEPROM_SIZE == 64) // 1275000 writes/byte or 2550000 writes/word # elif (EEPROM_SIZE == 64) // 1275000 writes/byte or 2550000 writes/word
# define EEESIZE 0x38 # define EEESIZE 0x38
# elif (EEPROM_SIZE == 32) // 2555000 writes/byte or 5110000 writes/word # elif (EEPROM_SIZE == 32) // 2555000 writes/byte or 5110000 writes/word
# define EEESIZE 0x39 # define EEESIZE 0x39
# endif # endif
@ -88,9 +88,9 @@ void eeprom_initialize(void) {
if (FTFL->FCNFG & FTFL_FCNFG_RAMRDY) { if (FTFL->FCNFG & FTFL_FCNFG_RAMRDY) {
// FlexRAM is configured as traditional RAM // FlexRAM is configured as traditional RAM
// We need to reconfigure for EEPROM usage // We need to reconfigure for EEPROM usage
FTFL->FCCOB0 = 0x80; // PGMPART = Program Partition Command FTFL->FCCOB0 = 0x80; // PGMPART = Program Partition Command
FTFL->FCCOB4 = EEESIZE; // EEPROM Size FTFL->FCCOB4 = EEESIZE; // EEPROM Size
FTFL->FCCOB5 = 0x03; // 0K for Dataflash, 32K for EEPROM backup FTFL->FCCOB5 = 0x03; // 0K for Dataflash, 32K for EEPROM backup
__disable_irq(); __disable_irq();
// do_flash_cmd() must execute from RAM. Luckily the C syntax is simple... // do_flash_cmd() must execute from RAM. Luckily the C syntax is simple...
(*((void (*)(volatile uint8_t *))((uint32_t)do_flash_cmd | 1)))(&(FTFL->FSTAT)); (*((void (*)(volatile uint8_t *))((uint32_t)do_flash_cmd | 1)))(&(FTFL->FSTAT));
@ -98,7 +98,7 @@ void eeprom_initialize(void) {
status = FTFL->FSTAT; status = FTFL->FSTAT;
if (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL)) { if (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL)) {
FTFL->FSTAT = (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL)); FTFL->FSTAT = (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL));
return; // error return; // error
} }
} }
// wait for eeprom to become ready (is this really necessary?) // wait for eeprom to become ready (is this really necessary?)
@ -162,7 +162,9 @@ void eeprom_read_block(void *buf, const void *addr, uint32_t len) {
* *
* FIXME: needs doc * FIXME: needs doc
*/ */
int eeprom_is_ready(void) { return (FTFL->FCNFG & FTFL_FCNFG_EEERDY) ? 1 : 0; } int eeprom_is_ready(void) {
return (FTFL->FCNFG & FTFL_FCNFG_EEERDY) ? 1 : 0;
}
/** \brief flexram wait /** \brief flexram wait
* *
@ -486,7 +488,9 @@ void eeprom_read_block(void *buf, const void *addr, uint32_t len) {
} }
} }
int eeprom_is_ready(void) { return 1; } int eeprom_is_ready(void) {
return 1;
}
void eeprom_write_word(uint16_t *addr, uint16_t value) { void eeprom_write_word(uint16_t *addr, uint16_t value) {
uint8_t *p = (uint8_t *)addr; uint8_t *p = (uint8_t *)addr;
@ -515,7 +519,9 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
#endif /* chip selection */ #endif /* chip selection */
// The update functions just calls write for now, but could probably be optimized // The update functions just calls write for now, but could probably be optimized
void eeprom_update_byte(uint8_t *addr, uint8_t value) { eeprom_write_byte(addr, value); } void eeprom_update_byte(uint8_t *addr, uint8_t value) {
eeprom_write_byte(addr, value);
}
void eeprom_update_word(uint16_t *addr, uint16_t value) { void eeprom_update_word(uint16_t *addr, uint16_t value) {
uint8_t *p = (uint8_t *)addr; uint8_t *p = (uint8_t *)addr;

View File

@ -97,10 +97,10 @@
/* Serial USART redefines. */ /* Serial USART redefines. */
#if HAL_USE_SERIAL #if HAL_USE_SERIAL
# if !defined(SERIAL_USART_CR1) # if !defined(SERIAL_USART_CR1)
# define SERIAL_USART_CR1 (USART_CTL0_PCEN | USART_CTL0_PM | USART_CTL0_WL) // parity enable, odd parity, 9 bit length # define SERIAL_USART_CR1 (USART_CTL0_PCEN | USART_CTL0_PM | USART_CTL0_WL) // parity enable, odd parity, 9 bit length
# endif # endif
# if !defined(SERIAL_USART_CR2) # if !defined(SERIAL_USART_CR2)
# define SERIAL_USART_CR2 (USART_CTL1_STB_1) // 2 stop bits # define SERIAL_USART_CR2 (USART_CTL1_STB_1) // 2 stop bits
# endif # endif
# if !defined(SERIAL_USART_CR3) # if !defined(SERIAL_USART_CR3)
# define SERIAL_USART_CR3 0x0 # define SERIAL_USART_CR3 0x0

View File

@ -93,7 +93,7 @@ void sleep_led_init(void) {
/* Reset LPTMR settings */ /* Reset LPTMR settings */
LPTMR0->CSR = 0; LPTMR0->CSR = 0;
/* Set the compare value */ /* Set the compare value */
LPTMR0->CMR = 0; // trigger on counter value (i.e. every time) LPTMR0->CMR = 0; // trigger on counter value (i.e. every time)
/* Set up clock source and prescaler */ /* Set up clock source and prescaler */
/* Software PWM /* Software PWM
@ -118,11 +118,11 @@ void sleep_led_init(void) {
/* === OPTION 2 === */ /* === OPTION 2 === */
# if 1 # if 1
// nMHz IRC (n=4 on KL25Z, KL26Z and K20x; n=2 or 8 on KL27Z) // nMHz IRC (n=4 on KL25Z, KL26Z and K20x; n=2 or 8 on KL27Z)
MCG->C2 |= MCG_C2_IRCS; // fast (4MHz) internal ref clock MCG->C2 |= MCG_C2_IRCS; // fast (4MHz) internal ref clock
# if defined(KL27) // divide the 8MHz IRC by 2, to have the same MCGIRCLK speed as others # if defined(KL27) // divide the 8MHz IRC by 2, to have the same MCGIRCLK speed as others
MCG->MC |= MCG_MC_LIRC_DIV2_DIV2; MCG->MC |= MCG_MC_LIRC_DIV2_DIV2;
# endif /* KL27 */ # endif /* KL27 */
MCG->C1 |= MCG_C1_IRCLKEN; // enable internal ref clock MCG->C1 |= MCG_C1_IRCLKEN; // enable internal ref clock
// to work in stop mode, also MCG_C1_IREFSTEN // to work in stop mode, also MCG_C1_IREFSTEN
// Divide 4MHz by 2^N (N=6) => 62500 irqs/sec => // Divide 4MHz by 2^N (N=6) => 62500 irqs/sec =>
// => approx F=61, R=256, duration = 4 // => approx F=61, R=256, duration = 4
@ -140,7 +140,7 @@ void sleep_led_init(void) {
/* === END OPTIONS === */ /* === END OPTIONS === */
/* Interrupt on TCF set (compare flag) */ /* Interrupt on TCF set (compare flag) */
nvicEnableVector(LPTMR0_IRQn, 2); // vector, priority nvicEnableVector(LPTMR0_IRQn, 2); // vector, priority
LPTMR0->CSR |= LPTMRx_CSR_TIE; LPTMR0->CSR |= LPTMRx_CSR_TIE;
} }
@ -169,21 +169,33 @@ static void gptTimerCallback(GPTDriver *gptp) {
static const GPTConfig gptcfg = {1000000, gptTimerCallback, 0, 0}; static const GPTConfig gptcfg = {1000000, gptTimerCallback, 0, 0};
/* Initialise the timer */ /* Initialise the timer */
void sleep_led_init(void) { gptStart(&SLEEP_LED_GPT_DRIVER, &gptcfg); } void sleep_led_init(void) {
gptStart(&SLEEP_LED_GPT_DRIVER, &gptcfg);
}
void sleep_led_enable(void) { gptStartContinuous(&SLEEP_LED_GPT_DRIVER, gptcfg.frequency / 0xFFFF); } void sleep_led_enable(void) {
gptStartContinuous(&SLEEP_LED_GPT_DRIVER, gptcfg.frequency / 0xFFFF);
}
void sleep_led_disable(void) { gptStopTimer(&SLEEP_LED_GPT_DRIVER); } void sleep_led_disable(void) {
gptStopTimer(&SLEEP_LED_GPT_DRIVER);
}
void sleep_led_toggle(void) { (SLEEP_LED_GPT_DRIVER.state == GPT_READY) ? sleep_led_enable() : sleep_led_disable(); } void sleep_led_toggle(void) {
(SLEEP_LED_GPT_DRIVER.state == GPT_READY) ? sleep_led_enable() : sleep_led_disable();
}
#else /* platform selection: not on familiar chips */ #else /* platform selection: not on familiar chips */
void sleep_led_init(void) {} void sleep_led_init(void) {}
void sleep_led_enable(void) { led_set(1 << USB_LED_CAPS_LOCK); } void sleep_led_enable(void) {
led_set(1 << USB_LED_CAPS_LOCK);
}
void sleep_led_disable(void) { led_set(0); } void sleep_led_disable(void) {
led_set(0);
}
void sleep_led_toggle(void) { void sleep_led_toggle(void) {
// not implemented // not implemented

Some files were not shown because too many files have changed in this diff Show More