Format code according to conventions (#16322)
This commit is contained in:
parent
afcdd7079c
commit
63646e8906
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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
|
||||||
*
|
*
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////
|
/////////
|
||||||
|
|
|
@ -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))) {
|
||||||
|
|
|
@ -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) {}
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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++;
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
Loading…
Reference in New Issue