clang-format changes
This commit is contained in:
parent
61af76a10d
commit
b624f32f94
|
@ -38,11 +38,7 @@ static const I2CConfig i2cconfig = {
|
||||||
I2C1_CLOCK_SPEED,
|
I2C1_CLOCK_SPEED,
|
||||||
I2C1_DUTY_CYCLE,
|
I2C1_DUTY_CYCLE,
|
||||||
#else
|
#else
|
||||||
STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) |
|
STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) | STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) | STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL), 0, 0
|
||||||
STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) |
|
|
||||||
STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL),
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -58,9 +54,7 @@ static i2c_status_t chibios_to_qmk(const msg_t* status) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) void i2c_init(void) {
|
||||||
void i2c_init(void)
|
|
||||||
{
|
|
||||||
// Try releasing special pins for a short time
|
// Try releasing special pins for a short time
|
||||||
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_INPUT);
|
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_INPUT);
|
||||||
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT);
|
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT);
|
||||||
|
@ -75,41 +69,36 @@ void i2c_init(void)
|
||||||
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//i2cInit(); //This is invoked by halInit() so no need to redo it.
|
// i2cInit(); //This is invoked by halInit() so no need to redo it.
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_start(uint8_t address)
|
i2c_status_t i2c_start(uint8_t address) {
|
||||||
{
|
|
||||||
i2c_address = address;
|
i2c_address = address;
|
||||||
i2cStart(&I2C_DRIVER, &i2cconfig);
|
i2cStart(&I2C_DRIVER, &i2cconfig);
|
||||||
return I2C_STATUS_SUCCESS;
|
return I2C_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)
|
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout) {
|
||||||
{
|
|
||||||
i2c_address = address;
|
i2c_address = address;
|
||||||
i2cStart(&I2C_DRIVER, &i2cconfig);
|
i2cStart(&I2C_DRIVER, &i2cconfig);
|
||||||
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, 0, 0, MS2ST(timeout));
|
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, 0, 0, MS2ST(timeout));
|
||||||
return chibios_to_qmk(&status);
|
return chibios_to_qmk(&status);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
|
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) {
|
||||||
{
|
|
||||||
i2c_address = address;
|
i2c_address = address;
|
||||||
i2cStart(&I2C_DRIVER, &i2cconfig);
|
i2cStart(&I2C_DRIVER, &i2cconfig);
|
||||||
msg_t status = i2cMasterReceiveTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, MS2ST(timeout));
|
msg_t status = i2cMasterReceiveTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, MS2ST(timeout));
|
||||||
return chibios_to_qmk(&status);
|
return chibios_to_qmk(&status);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)
|
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) {
|
||||||
{
|
|
||||||
i2c_address = devaddr;
|
i2c_address = devaddr;
|
||||||
i2cStart(&I2C_DRIVER, &i2cconfig);
|
i2cStart(&I2C_DRIVER, &i2cconfig);
|
||||||
|
|
||||||
uint8_t complete_packet[length + 1];
|
uint8_t complete_packet[length + 1];
|
||||||
for(uint8_t i = 0; i < length; i++)
|
for (uint8_t i = 0; i < length; i++) {
|
||||||
{
|
complete_packet[i + 1] = data[i];
|
||||||
complete_packet[i+1] = data[i];
|
|
||||||
}
|
}
|
||||||
complete_packet[0] = regaddr;
|
complete_packet[0] = regaddr;
|
||||||
|
|
||||||
|
@ -117,15 +106,11 @@ i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data,
|
||||||
return chibios_to_qmk(&status);
|
return chibios_to_qmk(&status);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
|
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) {
|
||||||
{
|
|
||||||
i2c_address = devaddr;
|
i2c_address = devaddr;
|
||||||
i2cStart(&I2C_DRIVER, &i2cconfig);
|
i2cStart(&I2C_DRIVER, &i2cconfig);
|
||||||
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), ®addr, 1, data, length, MS2ST(timeout));
|
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), ®addr, 1, data, length, MS2ST(timeout));
|
||||||
return chibios_to_qmk(&status);
|
return chibios_to_qmk(&status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void i2c_stop(void)
|
void i2c_stop(void) { i2cStop(&I2C_DRIVER); }
|
||||||
{
|
|
||||||
i2cStop(&I2C_DRIVER);
|
|
||||||
}
|
|
||||||
|
|
|
@ -27,71 +27,70 @@
|
||||||
#include "ch.h"
|
#include "ch.h"
|
||||||
#include <hal.h>
|
#include <hal.h>
|
||||||
|
|
||||||
|
|
||||||
#if defined(STM32F1XX) || defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32L0xx) || defined(STM32L1xx)
|
#if defined(STM32F1XX) || defined(STM32F1xx) || defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32L0xx) || defined(STM32L1xx)
|
||||||
#define USE_I2CV1
|
# define USE_I2CV1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef I2C1_BANK
|
#ifdef I2C1_BANK
|
||||||
#define I2C1_SCL_BANK I2C1_BANK
|
# define I2C1_SCL_BANK I2C1_BANK
|
||||||
#define I2C1_SDA_BANK I2C1_BANK
|
# define I2C1_SDA_BANK I2C1_BANK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef I2C1_SCL_BANK
|
#ifndef I2C1_SCL_BANK
|
||||||
#define I2C1_SCL_BANK GPIOB
|
# define I2C1_SCL_BANK GPIOB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef I2C1_SDA_BANK
|
#ifndef I2C1_SDA_BANK
|
||||||
#define I2C1_SDA_BANK GPIOB
|
# define I2C1_SDA_BANK GPIOB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef I2C1_SCL
|
#ifndef I2C1_SCL
|
||||||
#define I2C1_SCL 6
|
# define I2C1_SCL 6
|
||||||
#endif
|
#endif
|
||||||
#ifndef I2C1_SDA
|
#ifndef I2C1_SDA
|
||||||
#define I2C1_SDA 7
|
# define I2C1_SDA 7
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_I2CV1
|
#ifdef USE_I2CV1
|
||||||
#ifndef I2C1_OPMODE
|
# ifndef I2C1_OPMODE
|
||||||
#define I2C1_OPMODE OPMODE_I2C
|
# define I2C1_OPMODE OPMODE_I2C
|
||||||
#endif
|
# endif
|
||||||
#ifndef I2C1_CLOCK_SPEED
|
# ifndef I2C1_CLOCK_SPEED
|
||||||
#define I2C1_CLOCK_SPEED 100000 /* 400000 */
|
# define I2C1_CLOCK_SPEED 100000 /* 400000 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef I2C1_DUTY_CYCLE
|
# ifndef I2C1_DUTY_CYCLE
|
||||||
#define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */
|
# define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */
|
||||||
#endif
|
# endif
|
||||||
#else
|
#else
|
||||||
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
// The default PAL alternate modes are used to signal that the pins are used for I2C
|
||||||
#ifndef I2C1_SCL_PAL_MODE
|
# ifndef I2C1_SCL_PAL_MODE
|
||||||
#define I2C1_SCL_PAL_MODE 4
|
# define I2C1_SCL_PAL_MODE 4
|
||||||
#endif
|
# endif
|
||||||
#ifndef I2C1_SDA_PAL_MODE
|
# ifndef I2C1_SDA_PAL_MODE
|
||||||
#define I2C1_SDA_PAL_MODE 4
|
# define I2C1_SDA_PAL_MODE 4
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
|
// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
|
||||||
// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
|
// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
|
||||||
#ifndef I2C1_TIMINGR_PRESC
|
# ifndef I2C1_TIMINGR_PRESC
|
||||||
#define I2C1_TIMINGR_PRESC 15U
|
# define I2C1_TIMINGR_PRESC 15U
|
||||||
#endif
|
# endif
|
||||||
#ifndef I2C1_TIMINGR_SCLDEL
|
# ifndef I2C1_TIMINGR_SCLDEL
|
||||||
#define I2C1_TIMINGR_SCLDEL 4U
|
# define I2C1_TIMINGR_SCLDEL 4U
|
||||||
#endif
|
# endif
|
||||||
#ifndef I2C1_TIMINGR_SDADEL
|
# ifndef I2C1_TIMINGR_SDADEL
|
||||||
#define I2C1_TIMINGR_SDADEL 2U
|
# define I2C1_TIMINGR_SDADEL 2U
|
||||||
#endif
|
# endif
|
||||||
#ifndef I2C1_TIMINGR_SCLH
|
# ifndef I2C1_TIMINGR_SCLH
|
||||||
#define I2C1_TIMINGR_SCLH 15U
|
# define I2C1_TIMINGR_SCLH 15U
|
||||||
#endif
|
# endif
|
||||||
#ifndef I2C1_TIMINGR_SCLL
|
# ifndef I2C1_TIMINGR_SCLL
|
||||||
#define I2C1_TIMINGR_SCLL 21U
|
# define I2C1_TIMINGR_SCLL 21U
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef I2C_DRIVER
|
#ifndef I2C_DRIVER
|
||||||
#define I2C_DRIVER I2CD1
|
# define I2C_DRIVER I2CD1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef int16_t i2c_status_t;
|
typedef int16_t i2c_status_t;
|
||||||
|
@ -104,7 +103,7 @@ void i2c_init(void);
|
||||||
i2c_status_t i2c_start(uint8_t address);
|
i2c_status_t i2c_start(uint8_t address);
|
||||||
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout);
|
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
|
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t * tx_body, uint16_t tx_length, uint8_t * rx_body, uint16_t rx_length);
|
i2c_status_t i2c_transmit_receive(uint8_t address, uint8_t* tx_body, uint16_t tx_length, uint8_t* rx_body, uint16_t rx_length);
|
||||||
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout);
|
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
|
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
void i2c_stop(void);
|
void i2c_stop(void);
|
||||||
|
|
|
@ -21,23 +21,14 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "analog.h"
|
#include "analog.h"
|
||||||
|
|
||||||
|
static uint8_t aref = (1 << REFS0); // default to AREF = Vcc
|
||||||
|
|
||||||
static uint8_t aref = (1<<REFS0); // default to AREF = Vcc
|
void analogReference(uint8_t mode) { aref = mode & 0xC0; }
|
||||||
|
|
||||||
|
|
||||||
void analogReference(uint8_t mode)
|
|
||||||
{
|
|
||||||
aref = mode & 0xC0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Arduino compatible pin input
|
// Arduino compatible pin input
|
||||||
int16_t analogRead(uint8_t pin)
|
int16_t analogRead(uint8_t pin) {
|
||||||
{
|
|
||||||
#if defined(__AVR_ATmega32U4__)
|
#if defined(__AVR_ATmega32U4__)
|
||||||
static const uint8_t PROGMEM pin_to_mux[] = {
|
static const uint8_t PROGMEM pin_to_mux[] = {0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
|
||||||
0x00, 0x01, 0x04, 0x05, 0x06, 0x07,
|
|
||||||
0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
|
|
||||||
if (pin >= 12) return 0;
|
if (pin >= 12) return 0;
|
||||||
return adc_read(pgm_read_byte(pin_to_mux + pin));
|
return adc_read(pgm_read_byte(pin_to_mux + pin));
|
||||||
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
|
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
|
||||||
|
@ -49,21 +40,19 @@ int16_t analogRead(uint8_t pin)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mux input
|
// Mux input
|
||||||
int16_t adc_read(uint8_t mux)
|
int16_t adc_read(uint8_t mux) {
|
||||||
{
|
|
||||||
#if defined(__AVR_AT90USB162__)
|
#if defined(__AVR_AT90USB162__)
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
uint8_t low;
|
uint8_t low;
|
||||||
|
|
||||||
ADCSRA = (1<<ADEN) | ADC_PRESCALER; // enable ADC
|
ADCSRA = (1 << ADEN) | ADC_PRESCALER; // enable ADC
|
||||||
ADCSRB = (1<<ADHSM) | (mux & 0x20); // high speed mode
|
ADCSRB = (1 << ADHSM) | (mux & 0x20); // high speed mode
|
||||||
ADMUX = aref | (mux & 0x1F); // configure mux input
|
ADMUX = aref | (mux & 0x1F); // configure mux input
|
||||||
ADCSRA = (1<<ADEN) | ADC_PRESCALER | (1<<ADSC); // start the conversion
|
ADCSRA = (1 << ADEN) | ADC_PRESCALER | (1 << ADSC); // start the conversion
|
||||||
while (ADCSRA & (1<<ADSC)) ; // wait for result
|
while (ADCSRA & (1 << ADSC))
|
||||||
|
; // wait for result
|
||||||
low = ADCL; // must read LSB first
|
low = ADCL; // must read LSB first
|
||||||
return (ADCH << 8) | low; // must read MSB only once!
|
return (ADCH << 8) | low; // must read MSB only once!
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,30 +23,30 @@ void analogReference(uint8_t mode);
|
||||||
int16_t analogRead(uint8_t pin);
|
int16_t analogRead(uint8_t pin);
|
||||||
int16_t adc_read(uint8_t mux);
|
int16_t adc_read(uint8_t mux);
|
||||||
|
|
||||||
#define ADC_REF_POWER (1<<REFS0)
|
#define ADC_REF_POWER (1 << REFS0)
|
||||||
#define ADC_REF_INTERNAL ((1<<REFS1) | (1<<REFS0))
|
#define ADC_REF_INTERNAL ((1 << REFS1) | (1 << REFS0))
|
||||||
#define ADC_REF_EXTERNAL (0)
|
#define ADC_REF_EXTERNAL (0)
|
||||||
|
|
||||||
// These prescaler values are for high speed mode, ADHSM = 1
|
// These prescaler values are for high speed mode, ADHSM = 1
|
||||||
#if F_CPU == 16000000L
|
#if F_CPU == 16000000L
|
||||||
#define ADC_PRESCALER ((1<<ADPS2) | (1<<ADPS1))
|
# define ADC_PRESCALER ((1 << ADPS2) | (1 << ADPS1))
|
||||||
#elif F_CPU == 8000000L
|
#elif F_CPU == 8000000L
|
||||||
#define ADC_PRESCALER ((1<<ADPS2) | (1<<ADPS0))
|
# define ADC_PRESCALER ((1 << ADPS2) | (1 << ADPS0))
|
||||||
#elif F_CPU == 4000000L
|
#elif F_CPU == 4000000L
|
||||||
#define ADC_PRESCALER ((1<<ADPS2))
|
# define ADC_PRESCALER ((1 << ADPS2))
|
||||||
#elif F_CPU == 2000000L
|
#elif F_CPU == 2000000L
|
||||||
#define ADC_PRESCALER ((1<<ADPS1) | (1<<ADPS0))
|
# define ADC_PRESCALER ((1 << ADPS1) | (1 << ADPS0))
|
||||||
#elif F_CPU == 1000000L
|
#elif F_CPU == 1000000L
|
||||||
#define ADC_PRESCALER ((1<<ADPS1))
|
# define ADC_PRESCALER ((1 << ADPS1))
|
||||||
#else
|
#else
|
||||||
#define ADC_PRESCALER ((1<<ADPS0))
|
# define ADC_PRESCALER ((1 << ADPS0))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// some avr-libc versions do not properly define ADHSM
|
// some avr-libc versions do not properly define ADHSM
|
||||||
#if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
|
#if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
|
||||||
#if !defined(ADHSM)
|
# if !defined(ADHSM)
|
||||||
#define ADHSM (7)
|
# define ADHSM (7)
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
69
drivers/avr/apa102.c
Executable file → Normal file
69
drivers/avr/apa102.c
Executable file → Normal file
|
@ -1,24 +1,24 @@
|
||||||
/*
|
/*
|
||||||
* APA102 lib V1.0a
|
* APA102 lib V1.0a
|
||||||
*
|
*
|
||||||
* Controls APA102 RGB-LEDs
|
* Controls APA102 RGB-LEDs
|
||||||
* Author: Mikkel (Duckle29 on github)
|
* Author: Mikkel (Duckle29 on github)
|
||||||
*
|
*
|
||||||
* Dec 22th, 2017 v1.0a Initial Version
|
* Dec 22th, 2017 v1.0a Initial Version
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 2 of the License, or
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "apa102.h"
|
#include "apa102.h"
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
@ -27,39 +27,34 @@
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
// Setleds for standard RGB
|
// Setleds for standard RGB
|
||||||
void inline apa102_setleds(LED_TYPE *ledarray, uint16_t leds){
|
void inline apa102_setleds(LED_TYPE *ledarray, uint16_t leds) { apa102_setleds_pin(ledarray, leds, _BV(RGB_DI_PIN & 0xF), _BV(RGB_CLK_PIN & 0xF)); }
|
||||||
apa102_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF), _BV(RGB_CLK_PIN & 0xF));
|
|
||||||
}
|
|
||||||
|
|
||||||
void static inline apa102_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask_DI, uint8_t pinmask_CLK){
|
void static inline apa102_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask_DI, uint8_t pinmask_CLK) {
|
||||||
pinMode(RGB_DI_PIN, PinDirectionOutput);
|
pinMode(RGB_DI_PIN, PinDirectionOutput);
|
||||||
pinMode(RGB_CLK_PIN, PinDirectionOutput);
|
pinMode(RGB_CLK_PIN, PinDirectionOutput);
|
||||||
|
|
||||||
apa102_send_array((uint8_t*)ledarray,leds)
|
apa102_send_array((uint8_t *)ledarray, leds)
|
||||||
}
|
}
|
||||||
|
|
||||||
void apa102_send_array(uint8_t *data, uint16_t leds){ // Data is struct of 3 bytes. RGB - leds is number of leds in data
|
void apa102_send_array(uint8_t *data, uint16_t leds) { // Data is struct of 3 bytes. RGB - leds is number of leds in data
|
||||||
apa102_start_frame();
|
apa102_start_frame();
|
||||||
while(leds--){
|
while (leds--) {
|
||||||
apa102_send_frame(0xFF000000 | (data->b << 16) | (data->g << 8) | data->r);
|
apa102_send_frame(0xFF000000 | (data->b << 16) | (data->g << 8) | data->r);
|
||||||
data++;
|
data++;
|
||||||
}
|
}
|
||||||
apa102_end_frame(leds);
|
apa102_end_frame(leds);
|
||||||
}
|
}
|
||||||
|
|
||||||
void apa102_send_frame(uint32_t frame){
|
void apa102_send_frame(uint32_t frame) {
|
||||||
for(uint32_t i=0xFF; i>0;){
|
for (uint32_t i = 0xFF; i > 0;) {
|
||||||
apa102_send_byte(frame & i);
|
apa102_send_byte(frame & i);
|
||||||
i = i << 8;
|
i = i << 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void apa102_start_frame(){
|
void apa102_start_frame() { apa102_send_frame(0); }
|
||||||
apa102_send_frame(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void apa102_end_frame(uint16_t leds)
|
void apa102_end_frame(uint16_t leds) {
|
||||||
{
|
|
||||||
// This function has been taken from: https://github.com/pololu/apa102-arduino/blob/master/APA102.h
|
// This function has been taken from: https://github.com/pololu/apa102-arduino/blob/master/APA102.h
|
||||||
// and adapted. The code is MIT licensed. I think thats compatible?
|
// and adapted. The code is MIT licensed. I think thats compatible?
|
||||||
|
|
||||||
|
@ -87,14 +82,14 @@ void apa102_end_frame(uint16_t leds)
|
||||||
// start displaying their new colors right away.
|
// start displaying their new colors right away.
|
||||||
|
|
||||||
apa102_send_byte(0xFF);
|
apa102_send_byte(0xFF);
|
||||||
for (uint16_t i = 0; i < 5 + leds / 16; i++){
|
for (uint16_t i = 0; i < 5 + leds / 16; i++) {
|
||||||
apa102_send_byte(0);
|
apa102_send_byte(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void apa102_send_byte(uint8_t byte){
|
void apa102_send_byte(uint8_t byte) {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for (i = 0; i < 8; i++){
|
for (i = 0; i < 8; i++) {
|
||||||
digitalWrite(RGB_DI_PIN, !!(byte & (1 << (7-i)));
|
digitalWrite(RGB_DI_PIN, !!(byte & (1 << (7-i)));
|
||||||
digitalWrite(RGB_CLK_PIN, PinLevelHigh);
|
digitalWrite(RGB_CLK_PIN, PinLevelHigh);
|
||||||
}
|
}
|
||||||
|
|
5
drivers/avr/apa102.h
Executable file → Normal file
5
drivers/avr/apa102.h
Executable file → Normal file
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
|
|
||||||
|
|
||||||
/* User Interface
|
/* User Interface
|
||||||
*
|
*
|
||||||
* Input:
|
* Input:
|
||||||
|
@ -41,6 +40,6 @@
|
||||||
* - Wait 50<EFBFBD>s to reset the LEDs
|
* - Wait 50<EFBFBD>s to reset the LEDs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void apa102_setleds (LED_TYPE *ledarray, uint16_t number_of_leds);
|
void apa102_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
|
||||||
void apa102_setleds_pin (LED_TYPE *ledarray, uint16_t number_of_leds,uint8_t pinmask);
|
void apa102_setleds_pin(LED_TYPE *ledarray, uint16_t number_of_leds, uint8_t pinmask);
|
||||||
void apa102_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
|
void apa102_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
|
||||||
|
|
|
@ -5,272 +5,30 @@
|
||||||
#define FONT5X7_H
|
#define FONT5X7_H
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
#elif defined(ESP8266)
|
#elif defined(ESP8266)
|
||||||
#include <pgmspace.h>
|
# include <pgmspace.h>
|
||||||
#else
|
#else
|
||||||
#define PROGMEM
|
# define PROGMEM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Standard ASCII 5x7 font
|
// Standard ASCII 5x7 font
|
||||||
|
|
||||||
static const unsigned char font[] PROGMEM = {
|
static const unsigned char font[] PROGMEM = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
|
||||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
|
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,
|
||||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
|
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,
|
||||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
|
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,
|
||||||
0x18, 0x3C, 0x7E, 0x3C, 0x18,
|
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
|
||||||
0x1C, 0x57, 0x7D, 0x57, 0x1C,
|
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
|
||||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
|
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
|
||||||
0x00, 0x18, 0x3C, 0x18, 0x00,
|
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
|
||||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
|
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
|
||||||
0x00, 0x18, 0x24, 0x18, 0x00,
|
|
||||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
|
|
||||||
0x30, 0x48, 0x3A, 0x06, 0x0E,
|
|
||||||
0x26, 0x29, 0x79, 0x29, 0x26,
|
|
||||||
0x40, 0x7F, 0x05, 0x05, 0x07,
|
|
||||||
0x40, 0x7F, 0x05, 0x25, 0x3F,
|
|
||||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
|
|
||||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
|
|
||||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
|
|
||||||
0x14, 0x22, 0x7F, 0x22, 0x14,
|
|
||||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
|
|
||||||
0x06, 0x09, 0x7F, 0x01, 0x7F,
|
|
||||||
0x00, 0x66, 0x89, 0x95, 0x6A,
|
|
||||||
0x60, 0x60, 0x60, 0x60, 0x60,
|
|
||||||
0x94, 0xA2, 0xFF, 0xA2, 0x94,
|
|
||||||
0x08, 0x04, 0x7E, 0x04, 0x08,
|
|
||||||
0x10, 0x20, 0x7E, 0x20, 0x10,
|
|
||||||
0x08, 0x08, 0x2A, 0x1C, 0x08,
|
|
||||||
0x08, 0x1C, 0x2A, 0x08, 0x08,
|
|
||||||
0x1E, 0x10, 0x10, 0x10, 0x10,
|
|
||||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
|
|
||||||
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,
|
|
||||||
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
|
|
||||||
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
|
|
||||||
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
|
|
||||||
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,
|
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,
|
||||||
0x10, 0x10, 0x10, 0xFF, 0x00,
|
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, 0xFF, 0x00,
|
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
|
||||||
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
|
|
||||||
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
|
|
||||||
};
|
};
|
||||||
#endif // FONT5X7_H
|
#endif // FONT5X7_H
|
||||||
|
|
|
@ -34,46 +34,45 @@
|
||||||
*/
|
*/
|
||||||
#define DDR(x) (*(&x - 1)) /* address of data direction register of port x */
|
#define DDR(x) (*(&x - 1)) /* address of data direction register of port x */
|
||||||
#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
||||||
/* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
|
/* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
|
||||||
#define PIN(x) ( &PORTF==&(x) ? _SFR_IO8(0x00) : (*(&x - 2)) )
|
# define PIN(x) (&PORTF == &(x) ? _SFR_IO8(0x00) : (*(&x - 2)))
|
||||||
#else
|
#else
|
||||||
#define PIN(x) (*(&x - 2)) /* address of input register of port x */
|
# define PIN(x) (*(&x - 2)) /* address of input register of port x */
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define lcd_e_delay() _delay_us(LCD_DELAY_ENABLE_PULSE)
|
|
||||||
#define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
|
|
||||||
#define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
|
|
||||||
#define lcd_e_toggle() toggle_e()
|
|
||||||
#define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
|
|
||||||
#define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
|
|
||||||
#define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
|
|
||||||
#define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
#if LCD_IO_MODE
|
||||||
#if LCD_LINES==1
|
# define lcd_e_delay() _delay_us(LCD_DELAY_ENABLE_PULSE)
|
||||||
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
|
# define lcd_e_high() LCD_E_PORT |= _BV(LCD_E_PIN);
|
||||||
#else
|
# define lcd_e_low() LCD_E_PORT &= ~_BV(LCD_E_PIN);
|
||||||
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
|
# define lcd_e_toggle() toggle_e()
|
||||||
|
# define lcd_rw_high() LCD_RW_PORT |= _BV(LCD_RW_PIN)
|
||||||
|
# define lcd_rw_low() LCD_RW_PORT &= ~_BV(LCD_RW_PIN)
|
||||||
|
# define lcd_rs_high() LCD_RS_PORT |= _BV(LCD_RS_PIN)
|
||||||
|
# define lcd_rs_low() LCD_RS_PORT &= ~_BV(LCD_RS_PIN)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LCD_IO_MODE
|
||||||
|
# if LCD_LINES == 1
|
||||||
|
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
|
||||||
|
# else
|
||||||
|
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
#if LCD_LINES==1
|
# if LCD_LINES == 1
|
||||||
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
|
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
|
||||||
#else
|
# else
|
||||||
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
|
# define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LCD_CONTROLLER_KS0073
|
#if LCD_CONTROLLER_KS0073
|
||||||
#if LCD_LINES==4
|
# if LCD_LINES == 4
|
||||||
|
|
||||||
#define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x2C /* |0|010|1100 4-bit mode, extension-bit RE = 1 */
|
# define KS0073_EXTENDED_FUNCTION_REGISTER_ON 0x2C /* |0|010|1100 4-bit mode, extension-bit RE = 1 */
|
||||||
#define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x28 /* |0|010|1000 4-bit mode, extension-bit RE = 0 */
|
# define KS0073_EXTENDED_FUNCTION_REGISTER_OFF 0x28 /* |0|010|1000 4-bit mode, extension-bit RE = 0 */
|
||||||
#define KS0073_4LINES_MODE 0x09 /* |0|000|1001 4 lines mode */
|
# define KS0073_4LINES_MODE 0x09 /* |0|000|1001 4 lines mode */
|
||||||
|
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -87,25 +86,21 @@ static void toggle_e(void);
|
||||||
** local functions
|
** local functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
delay for a minimum of <us> microseconds
|
delay for a minimum of <us> microseconds
|
||||||
the number of loops is calculated at compile-time from MCU clock frequency
|
the number of loops is calculated at compile-time from MCU clock frequency
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
#define delay(us) _delay_us(us)
|
#define delay(us) _delay_us(us)
|
||||||
|
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
#if LCD_IO_MODE
|
||||||
/* toggle Enable Pin to initiate write */
|
/* toggle Enable Pin to initiate write */
|
||||||
static void toggle_e(void)
|
static void toggle_e(void) {
|
||||||
{
|
|
||||||
lcd_e_high();
|
lcd_e_high();
|
||||||
lcd_e_delay();
|
lcd_e_delay();
|
||||||
lcd_e_low();
|
lcd_e_low();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Low-level function to write byte to LCD controller
|
Low-level function to write byte to LCD controller
|
||||||
Input: data byte to write to LCD
|
Input: data byte to write to LCD
|
||||||
|
@ -114,10 +109,8 @@ Input: data byte to write to LCD
|
||||||
Returns: none
|
Returns: none
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
#if LCD_IO_MODE
|
#if LCD_IO_MODE
|
||||||
static void lcd_write(uint8_t data,uint8_t rs)
|
static void lcd_write(uint8_t data, uint8_t rs) {
|
||||||
{
|
unsigned char dataBits;
|
||||||
unsigned char dataBits ;
|
|
||||||
|
|
||||||
|
|
||||||
if (rs) { /* write data (RS=1, RW=0) */
|
if (rs) { /* write data (RS=1, RW=0) */
|
||||||
lcd_rs_high();
|
lcd_rs_high();
|
||||||
|
@ -126,26 +119,22 @@ static void lcd_write(uint8_t data,uint8_t rs)
|
||||||
}
|
}
|
||||||
lcd_rw_low(); /* RW=0 write mode */
|
lcd_rw_low(); /* RW=0 write mode */
|
||||||
|
|
||||||
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
|
if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
|
||||||
&& (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
|
|
||||||
{
|
|
||||||
/* configure data pins as output */
|
/* configure data pins as output */
|
||||||
DDR(LCD_DATA0_PORT) |= 0x0F;
|
DDR(LCD_DATA0_PORT) |= 0x0F;
|
||||||
|
|
||||||
/* output high nibble first */
|
/* output high nibble first */
|
||||||
dataBits = LCD_DATA0_PORT & 0xF0;
|
dataBits = LCD_DATA0_PORT & 0xF0;
|
||||||
LCD_DATA0_PORT = dataBits |((data>>4)&0x0F);
|
LCD_DATA0_PORT = dataBits | ((data >> 4) & 0x0F);
|
||||||
lcd_e_toggle();
|
lcd_e_toggle();
|
||||||
|
|
||||||
/* output low nibble */
|
/* output low nibble */
|
||||||
LCD_DATA0_PORT = dataBits | (data&0x0F);
|
LCD_DATA0_PORT = dataBits | (data & 0x0F);
|
||||||
lcd_e_toggle();
|
lcd_e_toggle();
|
||||||
|
|
||||||
/* all data pins high (inactive) */
|
/* all data pins high (inactive) */
|
||||||
LCD_DATA0_PORT = dataBits | 0x0F;
|
LCD_DATA0_PORT = dataBits | 0x0F;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* configure data pins as output */
|
/* configure data pins as output */
|
||||||
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
|
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
|
||||||
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
|
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
|
||||||
|
@ -157,10 +146,10 @@ static void lcd_write(uint8_t data,uint8_t rs)
|
||||||
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
|
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
|
||||||
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
|
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
|
||||||
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
|
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
|
||||||
if(data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
|
if (data & 0x80) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
|
||||||
if(data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
|
if (data & 0x40) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
|
||||||
if(data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
|
if (data & 0x20) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
|
||||||
if(data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
|
if (data & 0x10) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
|
||||||
lcd_e_toggle();
|
lcd_e_toggle();
|
||||||
|
|
||||||
/* output low nibble */
|
/* output low nibble */
|
||||||
|
@ -168,10 +157,10 @@ static void lcd_write(uint8_t data,uint8_t rs)
|
||||||
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
|
LCD_DATA2_PORT &= ~_BV(LCD_DATA2_PIN);
|
||||||
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
|
LCD_DATA1_PORT &= ~_BV(LCD_DATA1_PIN);
|
||||||
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
|
LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN);
|
||||||
if(data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
|
if (data & 0x08) LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN);
|
||||||
if(data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
|
if (data & 0x04) LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN);
|
||||||
if(data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
|
if (data & 0x02) LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN);
|
||||||
if(data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
|
if (data & 0x01) LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN);
|
||||||
lcd_e_toggle();
|
lcd_e_toggle();
|
||||||
|
|
||||||
/* all data pins high (inactive) */
|
/* all data pins high (inactive) */
|
||||||
|
@ -182,12 +171,15 @@ static void lcd_write(uint8_t data,uint8_t rs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define lcd_write(d,rs) if (rs) *(volatile uint8_t*)(LCD_IO_DATA) = d; else *(volatile uint8_t*)(LCD_IO_FUNCTION) = d;
|
# define lcd_write(d, rs) \
|
||||||
|
if (rs) \
|
||||||
|
*(volatile uint8_t *)(LCD_IO_DATA) = d; \
|
||||||
|
else \
|
||||||
|
*(volatile uint8_t *)(LCD_IO_FUNCTION) = d;
|
||||||
/* rs==0 -> write instruction to LCD_IO_FUNCTION */
|
/* rs==0 -> write instruction to LCD_IO_FUNCTION */
|
||||||
/* rs==1 -> write data to LCD_IO_DATA */
|
/* rs==1 -> write data to LCD_IO_DATA */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Low-level function to read byte from LCD controller
|
Low-level function to read byte from LCD controller
|
||||||
Input: rs 1: read data
|
Input: rs 1: read data
|
||||||
|
@ -195,20 +187,16 @@ Input: rs 1: read data
|
||||||
Returns: byte read from LCD controller
|
Returns: byte read from LCD controller
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
#if LCD_IO_MODE
|
#if LCD_IO_MODE
|
||||||
static uint8_t lcd_read(uint8_t rs)
|
static uint8_t lcd_read(uint8_t rs) {
|
||||||
{
|
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
|
|
||||||
|
|
||||||
if (rs)
|
if (rs)
|
||||||
lcd_rs_high(); /* RS=1: read data */
|
lcd_rs_high(); /* RS=1: read data */
|
||||||
else
|
else
|
||||||
lcd_rs_low(); /* RS=0: read busy flag */
|
lcd_rs_low(); /* RS=0: read busy flag */
|
||||||
lcd_rw_high(); /* RW=1 read mode */
|
lcd_rw_high(); /* RW=1 read mode */
|
||||||
|
|
||||||
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
|
if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
|
||||||
&& ( LCD_DATA0_PIN == 0 )&& (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
|
|
||||||
{
|
|
||||||
DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */
|
DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */
|
||||||
|
|
||||||
lcd_e_high();
|
lcd_e_high();
|
||||||
|
@ -220,11 +208,9 @@ static uint8_t lcd_read(uint8_t rs)
|
||||||
|
|
||||||
lcd_e_high();
|
lcd_e_high();
|
||||||
lcd_e_delay();
|
lcd_e_delay();
|
||||||
data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */
|
data |= PIN(LCD_DATA0_PORT) & 0x0F; /* read low nibble */
|
||||||
lcd_e_low();
|
lcd_e_low();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* configure data pins as input */
|
/* configure data pins as input */
|
||||||
DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
|
DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
|
||||||
DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
|
DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
|
||||||
|
@ -235,10 +221,10 @@ static uint8_t lcd_read(uint8_t rs)
|
||||||
lcd_e_high();
|
lcd_e_high();
|
||||||
lcd_e_delay();
|
lcd_e_delay();
|
||||||
data = 0;
|
data = 0;
|
||||||
if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x10;
|
if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x10;
|
||||||
if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x20;
|
if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x20;
|
||||||
if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x40;
|
if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x40;
|
||||||
if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x80;
|
if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x80;
|
||||||
lcd_e_low();
|
lcd_e_low();
|
||||||
|
|
||||||
lcd_e_delay(); /* Enable 500ns low */
|
lcd_e_delay(); /* Enable 500ns low */
|
||||||
|
@ -246,21 +232,20 @@ static uint8_t lcd_read(uint8_t rs)
|
||||||
/* read low nibble */
|
/* read low nibble */
|
||||||
lcd_e_high();
|
lcd_e_high();
|
||||||
lcd_e_delay();
|
lcd_e_delay();
|
||||||
if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x01;
|
if (PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN)) data |= 0x01;
|
||||||
if ( PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN) ) data |= 0x02;
|
if (PIN(LCD_DATA1_PORT) & _BV(LCD_DATA1_PIN)) data |= 0x02;
|
||||||
if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x04;
|
if (PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN)) data |= 0x04;
|
||||||
if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x08;
|
if (PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN)) data |= 0x08;
|
||||||
lcd_e_low();
|
lcd_e_low();
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define lcd_read(rs) (rs) ? *(volatile uint8_t*)(LCD_IO_DATA+LCD_IO_READ) : *(volatile uint8_t*)(LCD_IO_FUNCTION+LCD_IO_READ)
|
# define lcd_read(rs) (rs) ? *(volatile uint8_t *)(LCD_IO_DATA + LCD_IO_READ) : *(volatile uint8_t *)(LCD_IO_FUNCTION + LCD_IO_READ)
|
||||||
/* rs==0 -> read instruction from LCD_IO_FUNCTION */
|
/* rs==0 -> read instruction from LCD_IO_FUNCTION */
|
||||||
/* rs==1 -> read data from LCD_IO_DATA */
|
/* rs==1 -> read data from LCD_IO_DATA */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
loops while lcd is busy, returns address counter
|
loops while lcd is busy, returns address counter
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
@ -270,7 +255,8 @@ static uint8_t lcd_waitbusy(void)
|
||||||
register uint8_t c;
|
register uint8_t c;
|
||||||
|
|
||||||
/* wait until busy flag is cleared */
|
/* wait until busy flag is cleared */
|
||||||
while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {}
|
while ((c = lcd_read(0)) & (1 << LCD_BUSY)) {
|
||||||
|
}
|
||||||
|
|
||||||
/* the address counter is updated 4us after the busy flag is cleared */
|
/* the address counter is updated 4us after the busy flag is cleared */
|
||||||
delay(LCD_DELAY_BUSY_FLAG);
|
delay(LCD_DELAY_BUSY_FLAG);
|
||||||
|
@ -278,52 +264,48 @@ static uint8_t lcd_waitbusy(void)
|
||||||
/* 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 */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Move cursor to the start of next line or to the first line if the cursor
|
Move cursor to the start of next line or to the first line if the cursor
|
||||||
is already on the last line.
|
is already on the last line.
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
static inline void lcd_newline(uint8_t pos)
|
static inline void lcd_newline(uint8_t pos) {
|
||||||
{
|
|
||||||
register uint8_t addressCounter;
|
register uint8_t addressCounter;
|
||||||
|
|
||||||
|
#if LCD_LINES == 1
|
||||||
#if LCD_LINES==1
|
|
||||||
addressCounter = 0;
|
addressCounter = 0;
|
||||||
#endif
|
#endif
|
||||||
#if LCD_LINES==2
|
#if LCD_LINES == 2
|
||||||
if ( pos < (LCD_START_LINE2) )
|
if (pos < (LCD_START_LINE2))
|
||||||
addressCounter = LCD_START_LINE2;
|
addressCounter = LCD_START_LINE2;
|
||||||
else
|
else
|
||||||
addressCounter = LCD_START_LINE1;
|
addressCounter = LCD_START_LINE1;
|
||||||
#endif
|
#endif
|
||||||
#if LCD_LINES==4
|
#if LCD_LINES == 4
|
||||||
#if KS0073_4LINES_MODE
|
# if KS0073_4LINES_MODE
|
||||||
if ( pos < LCD_START_LINE2 )
|
if (pos < LCD_START_LINE2)
|
||||||
addressCounter = LCD_START_LINE2;
|
addressCounter = LCD_START_LINE2;
|
||||||
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3) )
|
else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3))
|
||||||
addressCounter = LCD_START_LINE3;
|
addressCounter = LCD_START_LINE3;
|
||||||
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4) )
|
else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4))
|
||||||
addressCounter = LCD_START_LINE4;
|
addressCounter = LCD_START_LINE4;
|
||||||
else
|
else
|
||||||
addressCounter = LCD_START_LINE1;
|
addressCounter = LCD_START_LINE1;
|
||||||
#else
|
# else
|
||||||
if ( pos < LCD_START_LINE3 )
|
if (pos < LCD_START_LINE3)
|
||||||
addressCounter = LCD_START_LINE2;
|
addressCounter = LCD_START_LINE2;
|
||||||
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4) )
|
else if ((pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4))
|
||||||
addressCounter = LCD_START_LINE3;
|
addressCounter = LCD_START_LINE3;
|
||||||
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) )
|
else if ((pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2))
|
||||||
addressCounter = LCD_START_LINE4;
|
addressCounter = LCD_START_LINE4;
|
||||||
else
|
else
|
||||||
addressCounter = LCD_START_LINE1;
|
addressCounter = LCD_START_LINE1;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
lcd_command((1 << LCD_DDRAM) + addressCounter);
|
||||||
lcd_command((1<<LCD_DDRAM)+addressCounter);
|
|
||||||
|
|
||||||
}/* lcd_newline */
|
|
||||||
|
|
||||||
|
} /* lcd_newline */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** PUBLIC FUNCTIONS
|
** PUBLIC FUNCTIONS
|
||||||
|
@ -334,129 +316,104 @@ Send LCD controller instruction command
|
||||||
Input: instruction to send to LCD controller, see HD44780 data sheet
|
Input: instruction to send to LCD controller, see HD44780 data sheet
|
||||||
Returns: none
|
Returns: none
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
void lcd_command(uint8_t cmd)
|
void lcd_command(uint8_t cmd) {
|
||||||
{
|
|
||||||
lcd_waitbusy();
|
lcd_waitbusy();
|
||||||
lcd_write(cmd,0);
|
lcd_write(cmd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Send data byte to LCD controller
|
Send data byte to LCD controller
|
||||||
Input: data to send to LCD controller, see HD44780 data sheet
|
Input: data to send to LCD controller, see HD44780 data sheet
|
||||||
Returns: none
|
Returns: none
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
void lcd_data(uint8_t data)
|
void lcd_data(uint8_t data) {
|
||||||
{
|
|
||||||
lcd_waitbusy();
|
lcd_waitbusy();
|
||||||
lcd_write(data,1);
|
lcd_write(data, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Set cursor to specified position
|
Set cursor to specified position
|
||||||
Input: x horizontal position (0: left most position)
|
Input: x horizontal position (0: left most position)
|
||||||
y vertical position (0: first line)
|
y vertical position (0: first line)
|
||||||
Returns: none
|
Returns: none
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
void lcd_gotoxy(uint8_t x, uint8_t y)
|
void lcd_gotoxy(uint8_t x, uint8_t y) {
|
||||||
{
|
#if LCD_LINES == 1
|
||||||
#if LCD_LINES==1
|
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
|
||||||
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
|
|
||||||
#endif
|
#endif
|
||||||
#if LCD_LINES==2
|
#if LCD_LINES == 2
|
||||||
if ( y==0 )
|
if (y == 0)
|
||||||
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
|
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
|
||||||
else
|
else
|
||||||
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x);
|
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
|
||||||
#endif
|
#endif
|
||||||
#if LCD_LINES==4
|
#if LCD_LINES == 4
|
||||||
if ( y==0 )
|
if (y == 0)
|
||||||
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
|
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE1 + x);
|
||||||
else if ( y==1)
|
else if (y == 1)
|
||||||
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x);
|
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE2 + x);
|
||||||
else if ( y==2)
|
else if (y == 2)
|
||||||
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE3+x);
|
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE3 + x);
|
||||||
else /* y==3 */
|
else /* y==3 */
|
||||||
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE4+x);
|
lcd_command((1 << LCD_DDRAM) + LCD_START_LINE4 + x);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}/* lcd_gotoxy */
|
} /* lcd_gotoxy */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
int lcd_getxy(void)
|
int lcd_getxy(void) { return lcd_waitbusy(); }
|
||||||
{
|
|
||||||
return lcd_waitbusy();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Clear display and set cursor to home position
|
Clear display and set cursor to home position
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
void lcd_clrscr(void)
|
void lcd_clrscr(void) { lcd_command(1 << LCD_CLR); }
|
||||||
{
|
|
||||||
lcd_command(1<<LCD_CLR);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Set cursor to home position
|
Set cursor to home position
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
void lcd_home(void)
|
void lcd_home(void) { lcd_command(1 << LCD_HOME); }
|
||||||
{
|
|
||||||
lcd_command(1<<LCD_HOME);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Display character at current cursor position
|
Display character at current cursor position
|
||||||
Input: character to be displayed
|
Input: character to be displayed
|
||||||
Returns: none
|
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 {
|
||||||
|
#if LCD_WRAP_LINES == 1
|
||||||
|
# if LCD_LINES == 1
|
||||||
|
if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
|
||||||
|
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
|
||||||
}
|
}
|
||||||
else
|
# elif LCD_LINES == 2
|
||||||
{
|
if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
|
||||||
#if LCD_WRAP_LINES==1
|
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
|
||||||
#if LCD_LINES==1
|
} else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
|
||||||
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
|
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
|
||||||
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
|
|
||||||
}
|
}
|
||||||
#elif LCD_LINES==2
|
# elif LCD_LINES == 4
|
||||||
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
|
if (pos == LCD_START_LINE1 + LCD_DISP_LENGTH) {
|
||||||
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
|
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE2, 0);
|
||||||
}else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){
|
} else if (pos == LCD_START_LINE2 + LCD_DISP_LENGTH) {
|
||||||
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
|
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE3, 0);
|
||||||
|
} else if (pos == LCD_START_LINE3 + LCD_DISP_LENGTH) {
|
||||||
|
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE4, 0);
|
||||||
|
} else if (pos == LCD_START_LINE4 + LCD_DISP_LENGTH) {
|
||||||
|
lcd_write((1 << LCD_DDRAM) + LCD_START_LINE1, 0);
|
||||||
}
|
}
|
||||||
#elif LCD_LINES==4
|
# endif
|
||||||
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
|
|
||||||
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
|
|
||||||
}else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
|
|
||||||
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
|
|
||||||
}else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
|
|
||||||
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
|
|
||||||
}else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
|
|
||||||
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
lcd_waitbusy();
|
lcd_waitbusy();
|
||||||
#endif
|
#endif
|
||||||
lcd_write(c, 1);
|
lcd_write(c, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}/* lcd_putc */
|
} /* lcd_putc */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Display string without auto linefeed
|
Display string without auto linefeed
|
||||||
|
@ -468,12 +425,11 @@ void lcd_puts(const char *s)
|
||||||
{
|
{
|
||||||
register char c;
|
register char c;
|
||||||
|
|
||||||
while ( (c = *s++) ) {
|
while ((c = *s++)) {
|
||||||
lcd_putc(c);
|
lcd_putc(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
}/* lcd_puts */
|
} /* lcd_puts */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Display string from program memory without auto linefeed
|
Display string from program memory without auto linefeed
|
||||||
|
@ -485,12 +441,11 @@ void lcd_puts_p(const char *progmem_s)
|
||||||
{
|
{
|
||||||
register char c;
|
register char c;
|
||||||
|
|
||||||
while ( (c = pgm_read_byte(progmem_s++)) ) {
|
while ((c = pgm_read_byte(progmem_s++))) {
|
||||||
lcd_putc(c);
|
lcd_putc(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
}/* lcd_puts_p */
|
} /* lcd_puts_p */
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
Initialize display and select type of cursor
|
Initialize display and select type of cursor
|
||||||
|
@ -500,32 +455,22 @@ Input: dispAttr LCD_DISP_OFF display off
|
||||||
LCD_DISP_CURSOR_BLINK display on, cursor on flashing
|
LCD_DISP_CURSOR_BLINK display on, cursor on flashing
|
||||||
Returns: none
|
Returns: none
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
void lcd_init(uint8_t dispAttr)
|
void lcd_init(uint8_t dispAttr) {
|
||||||
{
|
|
||||||
#if LCD_IO_MODE
|
#if LCD_IO_MODE
|
||||||
/*
|
/*
|
||||||
* Initialize LCD to 4 bit I/O mode
|
* Initialize LCD to 4 bit I/O mode
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
|
if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (&LCD_RS_PORT == &LCD_DATA0_PORT) && (&LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) && (LCD_RS_PIN == 4) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6)) {
|
||||||
&& ( &LCD_RS_PORT == &LCD_DATA0_PORT) && ( &LCD_RW_PORT == &LCD_DATA0_PORT) && (&LCD_E_PORT == &LCD_DATA0_PORT)
|
|
||||||
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)
|
|
||||||
&& (LCD_RS_PIN == 4 ) && (LCD_RW_PIN == 5) && (LCD_E_PIN == 6 ) )
|
|
||||||
{
|
|
||||||
/* configure all port bits as output (all LCD lines on same port) */
|
/* configure all port bits as output (all LCD lines on same port) */
|
||||||
DDR(LCD_DATA0_PORT) |= 0x7F;
|
DDR(LCD_DATA0_PORT) |= 0x7F;
|
||||||
}
|
} else if ((&LCD_DATA0_PORT == &LCD_DATA1_PORT) && (&LCD_DATA1_PORT == &LCD_DATA2_PORT) && (&LCD_DATA2_PORT == &LCD_DATA3_PORT) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3)) {
|
||||||
else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT )
|
|
||||||
&& (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) )
|
|
||||||
{
|
|
||||||
/* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
|
/* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */
|
||||||
DDR(LCD_DATA0_PORT) |= 0x0F;
|
DDR(LCD_DATA0_PORT) |= 0x0F;
|
||||||
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
|
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
|
||||||
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
|
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
|
||||||
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
|
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/* configure all port bits as output (LCD data and control lines on different ports */
|
/* configure all port bits as output (LCD data and control lines on different ports */
|
||||||
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
|
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
|
||||||
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
|
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
|
||||||
|
@ -567,11 +512,11 @@ void lcd_init(uint8_t dispAttr)
|
||||||
|
|
||||||
/* reset LCD */
|
/* reset LCD */
|
||||||
delay(LCD_DELAY_BOOTUP); /* wait 16ms after power-on */
|
delay(LCD_DELAY_BOOTUP); /* wait 16ms after power-on */
|
||||||
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
|
lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
|
||||||
delay(LCD_DELAY_INIT); /* wait 5ms */
|
delay(LCD_DELAY_INIT); /* wait 5ms */
|
||||||
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
|
lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
|
||||||
delay(LCD_DELAY_INIT_REP); /* wait 64us */
|
delay(LCD_DELAY_INIT_REP); /* wait 64us */
|
||||||
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
|
lcd_write(LCD_FUNCTION_8BIT_1LINE, 0); /* function set: 8bit interface */
|
||||||
delay(LCD_DELAY_INIT_REP); /* wait 64us */
|
delay(LCD_DELAY_INIT_REP); /* wait 64us */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -588,5 +533,4 @@ void lcd_init(uint8_t dispAttr)
|
||||||
lcd_command(LCD_MODE_DEFAULT); /* set entry mode */
|
lcd_command(LCD_MODE_DEFAULT); /* set entry mode */
|
||||||
lcd_command(dispAttr); /* display/cursor control */
|
lcd_command(dispAttr); /* display/cursor control */
|
||||||
|
|
||||||
}/* lcd_init */
|
} /* lcd_init */
|
||||||
|
|
||||||
|
|
|
@ -47,10 +47,9 @@
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 405
|
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 405
|
||||||
#error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !"
|
# error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**@{*/
|
/**@{*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -59,16 +58,15 @@
|
||||||
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
|
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
|
||||||
*/
|
*/
|
||||||
#ifdef _LCD_DEFINITIONS_FILE
|
#ifdef _LCD_DEFINITIONS_FILE
|
||||||
#include "lcd_definitions.h"
|
# include "lcd_definitions.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Definition for LCD controller type
|
* @name Definition for LCD controller type
|
||||||
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
|
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
|
||||||
*/
|
*/
|
||||||
#ifndef LCD_CONTROLLER_KS0073
|
#ifndef LCD_CONTROLLER_KS0073
|
||||||
#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
|
# define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,31 +79,30 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifndef LCD_LINES
|
#ifndef LCD_LINES
|
||||||
#define LCD_LINES 2 /**< number of visible lines of the display */
|
# define LCD_LINES 2 /**< number of visible lines of the display */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_DISP_LENGTH
|
#ifndef LCD_DISP_LENGTH
|
||||||
#define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
|
# define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_LINE_LENGTH
|
#ifndef LCD_LINE_LENGTH
|
||||||
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
|
# define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_START_LINE1
|
#ifndef LCD_START_LINE1
|
||||||
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
|
# define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_START_LINE2
|
#ifndef LCD_START_LINE2
|
||||||
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
|
# define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_START_LINE3
|
#ifndef LCD_START_LINE3
|
||||||
#define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
|
# define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_START_LINE4
|
#ifndef LCD_START_LINE4
|
||||||
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
|
# define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_WRAP_LINES
|
#ifndef LCD_WRAP_LINES
|
||||||
#define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
|
# define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Definitions for 4-bit IO mode
|
* @name Definitions for 4-bit IO mode
|
||||||
*
|
*
|
||||||
|
@ -128,68 +125,65 @@
|
||||||
|
|
||||||
#if LCD_IO_MODE
|
#if LCD_IO_MODE
|
||||||
|
|
||||||
#ifndef LCD_PORT
|
# ifndef LCD_PORT
|
||||||
#define LCD_PORT PORTA /**< port for the LCD lines */
|
# define LCD_PORT PORTA /**< port for the LCD lines */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA0_PORT
|
# ifndef LCD_DATA0_PORT
|
||||||
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
|
# define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA1_PORT
|
# ifndef LCD_DATA1_PORT
|
||||||
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
|
# define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA2_PORT
|
# ifndef LCD_DATA2_PORT
|
||||||
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
|
# define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA3_PORT
|
# ifndef LCD_DATA3_PORT
|
||||||
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
|
# define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA0_PIN
|
# ifndef LCD_DATA0_PIN
|
||||||
#define LCD_DATA0_PIN 4 /**< pin for 4bit data bit 0 */
|
# define LCD_DATA0_PIN 4 /**< pin for 4bit data bit 0 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA1_PIN
|
# ifndef LCD_DATA1_PIN
|
||||||
#define LCD_DATA1_PIN 5 /**< pin for 4bit data bit 1 */
|
# define LCD_DATA1_PIN 5 /**< pin for 4bit data bit 1 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA2_PIN
|
# ifndef LCD_DATA2_PIN
|
||||||
#define LCD_DATA2_PIN 6 /**< pin for 4bit data bit 2 */
|
# define LCD_DATA2_PIN 6 /**< pin for 4bit data bit 2 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_DATA3_PIN
|
# ifndef LCD_DATA3_PIN
|
||||||
#define LCD_DATA3_PIN 7 /**< pin for 4bit data bit 3 */
|
# define LCD_DATA3_PIN 7 /**< pin for 4bit data bit 3 */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_RS_PORT
|
# ifndef LCD_RS_PORT
|
||||||
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
|
# define LCD_RS_PORT LCD_PORT /**< port for RS line */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_RS_PIN
|
# ifndef LCD_RS_PIN
|
||||||
#define LCD_RS_PIN 3 /**< pin for RS line */
|
# define LCD_RS_PIN 3 /**< pin for RS line */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_RW_PORT
|
# ifndef LCD_RW_PORT
|
||||||
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
|
# define LCD_RW_PORT LCD_PORT /**< port for RW line */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_RW_PIN
|
# ifndef LCD_RW_PIN
|
||||||
#define LCD_RW_PIN 2 /**< pin for RW line */
|
# define LCD_RW_PIN 2 /**< pin for RW line */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_E_PORT
|
# ifndef LCD_E_PORT
|
||||||
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
|
# define LCD_E_PORT LCD_PORT /**< port for Enable line */
|
||||||
#endif
|
# endif
|
||||||
#ifndef LCD_E_PIN
|
# ifndef LCD_E_PIN
|
||||||
#define LCD_E_PIN 1 /**< pin for Enable line */
|
# define LCD_E_PIN 1 /**< pin for Enable line */
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || \
|
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
|
||||||
defined(__AVR_ATmega8515__)|| defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || \
|
|
||||||
defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
|
|
||||||
/*
|
/*
|
||||||
* memory mapped mode is only supported when the device has an external data memory interface
|
* memory mapped mode is only supported when the device has an external data memory interface
|
||||||
*/
|
*/
|
||||||
#define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */
|
# define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */
|
||||||
#define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */
|
# define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */
|
||||||
#define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */
|
# define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error "external data memory interface not available for this device, use 4-bit IO port mode"
|
# error "external data memory interface not available for this device, use 4-bit IO port mode"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Definitions of delays
|
* @name Definitions of delays
|
||||||
* Used to calculate delay timers.
|
* Used to calculate delay timers.
|
||||||
|
@ -201,25 +195,24 @@
|
||||||
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
|
* All definitions added to the file lcd_definitions.h will override the default definitions from lcd.h
|
||||||
*/
|
*/
|
||||||
#ifndef LCD_DELAY_BOOTUP
|
#ifndef LCD_DELAY_BOOTUP
|
||||||
#define LCD_DELAY_BOOTUP 16000 /**< delay in micro seconds after power-on */
|
# define LCD_DELAY_BOOTUP 16000 /**< delay in micro seconds after power-on */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_DELAY_INIT
|
#ifndef LCD_DELAY_INIT
|
||||||
#define LCD_DELAY_INIT 5000 /**< delay in micro seconds after initialization command sent */
|
# define LCD_DELAY_INIT 5000 /**< delay in micro seconds after initialization command sent */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_DELAY_INIT_REP
|
#ifndef LCD_DELAY_INIT_REP
|
||||||
#define LCD_DELAY_INIT_REP 64 /**< delay in micro seconds after initialization command repeated */
|
# define LCD_DELAY_INIT_REP 64 /**< delay in micro seconds after initialization command repeated */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_DELAY_INIT_4BIT
|
#ifndef LCD_DELAY_INIT_4BIT
|
||||||
#define LCD_DELAY_INIT_4BIT 64 /**< delay in micro seconds after setting 4-bit mode */
|
# define LCD_DELAY_INIT_4BIT 64 /**< delay in micro seconds after setting 4-bit mode */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_DELAY_BUSY_FLAG
|
#ifndef LCD_DELAY_BUSY_FLAG
|
||||||
#define LCD_DELAY_BUSY_FLAG 4 /**< time in micro seconds the address counter is updated after busy flag is cleared */
|
# define LCD_DELAY_BUSY_FLAG 4 /**< time in micro seconds the address counter is updated after busy flag is cleared */
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCD_DELAY_ENABLE_PULSE
|
#ifndef LCD_DELAY_ENABLE_PULSE
|
||||||
#define LCD_DELAY_ENABLE_PULSE 1 /**< enable signal pulse width in micro seconds */
|
# define LCD_DELAY_ENABLE_PULSE 1 /**< enable signal pulse width in micro seconds */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Definitions for LCD command instructions
|
* @name Definitions for LCD command instructions
|
||||||
* The constants define the various LCD controller instructions which can be passed to the
|
* The constants define the various LCD controller instructions which can be passed to the
|
||||||
|
@ -272,16 +265,12 @@
|
||||||
#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
|
#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
|
||||||
#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
|
#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
|
||||||
|
|
||||||
|
#define LCD_MODE_DEFAULT ((1 << LCD_ENTRY_MODE) | (1 << LCD_ENTRY_INC))
|
||||||
#define LCD_MODE_DEFAULT ((1<<LCD_ENTRY_MODE) | (1<<LCD_ENTRY_INC) )
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Functions
|
* @name Functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Initialize display and select type of cursor
|
@brief Initialize display and select type of cursor
|
||||||
@param dispAttr \b LCD_DISP_OFF display off\n
|
@param dispAttr \b LCD_DISP_OFF display off\n
|
||||||
|
@ -292,21 +281,18 @@
|
||||||
*/
|
*/
|
||||||
extern void lcd_init(uint8_t dispAttr);
|
extern void lcd_init(uint8_t dispAttr);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Clear display and set cursor to home position
|
@brief Clear display and set cursor to home position
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
extern void lcd_clrscr(void);
|
extern void lcd_clrscr(void);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Set cursor to home position
|
@brief Set cursor to home position
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
extern void lcd_home(void);
|
extern void lcd_home(void);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Set cursor to specified position
|
@brief Set cursor to specified position
|
||||||
|
|
||||||
|
@ -316,7 +302,6 @@ extern void lcd_home(void);
|
||||||
*/
|
*/
|
||||||
extern void lcd_gotoxy(uint8_t x, uint8_t y);
|
extern void lcd_gotoxy(uint8_t x, uint8_t y);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Display character at current cursor position
|
@brief Display character at current cursor position
|
||||||
@param c character to be displayed
|
@param c character to be displayed
|
||||||
|
@ -324,7 +309,6 @@ extern void lcd_gotoxy(uint8_t x, uint8_t y);
|
||||||
*/
|
*/
|
||||||
extern void lcd_putc(char c);
|
extern void lcd_putc(char c);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Display string without auto linefeed
|
@brief Display string without auto linefeed
|
||||||
@param s string to be displayed
|
@param s string to be displayed
|
||||||
|
@ -332,7 +316,6 @@ extern void lcd_putc(char c);
|
||||||
*/
|
*/
|
||||||
extern void lcd_puts(const char *s);
|
extern void lcd_puts(const char *s);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Display string from program memory without auto linefeed
|
@brief Display string from program memory without auto linefeed
|
||||||
@param progmem_s string from program memory be be displayed
|
@param progmem_s string from program memory be be displayed
|
||||||
|
@ -341,7 +324,6 @@ extern void lcd_puts(const char *s);
|
||||||
*/
|
*/
|
||||||
extern void lcd_puts_p(const char *progmem_s);
|
extern void lcd_puts_p(const char *progmem_s);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Send LCD controller instruction command
|
@brief Send LCD controller instruction command
|
||||||
@param cmd instruction to send to LCD controller, see HD44780 data sheet
|
@param cmd instruction to send to LCD controller, see HD44780 data sheet
|
||||||
|
@ -349,7 +331,6 @@ extern void lcd_puts_p(const char *progmem_s);
|
||||||
*/
|
*/
|
||||||
extern void lcd_command(uint8_t cmd);
|
extern void lcd_command(uint8_t cmd);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Send data byte to LCD controller
|
@brief Send data byte to LCD controller
|
||||||
|
|
||||||
|
@ -359,7 +340,6 @@ extern void lcd_command(uint8_t cmd);
|
||||||
*/
|
*/
|
||||||
extern void lcd_data(uint8_t data);
|
extern void lcd_data(uint8_t data);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief macros for automatically storing string constant in program memory
|
@brief macros for automatically storing string constant in program memory
|
||||||
*/
|
*/
|
||||||
|
@ -367,5 +347,4 @@ extern void lcd_data(uint8_t data);
|
||||||
|
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
#endif //LCD_H
|
#endif // LCD_H
|
||||||
|
|
||||||
|
|
4
drivers/avr/i2c_master.c
Executable file → Normal file
4
drivers/avr/i2c_master.c
Executable file → Normal file
|
@ -34,7 +34,7 @@ void i2c_init(void) {
|
||||||
TWSR = 0; /* no prescaler */
|
TWSR = 0; /* no prescaler */
|
||||||
TWBR = (uint8_t)TWBR_val;
|
TWBR = (uint8_t)TWBR_val;
|
||||||
|
|
||||||
#ifdef __AVR_ATmega32A__
|
#ifdef __AVR_ATmega32A__
|
||||||
// set pull-up resistors on I2C bus pins
|
// set pull-up resistors on I2C bus pins
|
||||||
PORTC |= 0b11;
|
PORTC |= 0b11;
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ void i2c_init(void) {
|
||||||
// enable TWI interrupt and slave address ACK
|
// enable TWI interrupt and slave address ACK
|
||||||
TWCR |= (1 << TWIE);
|
TWCR |= (1 << TWIE);
|
||||||
TWCR |= (1 << TWEA);
|
TWCR |= (1 << TWEA);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_status_t i2c_start(uint8_t address, uint16_t timeout) {
|
i2c_status_t i2c_start(uint8_t address, uint16_t timeout) {
|
||||||
|
|
0
drivers/avr/i2c_master.h
Executable file → Normal file
0
drivers/avr/i2c_master.h
Executable file → Normal file
10
drivers/avr/i2c_slave.c
Executable file → Normal file
10
drivers/avr/i2c_slave.c
Executable file → Normal file
|
@ -29,22 +29,22 @@ volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT];
|
||||||
static volatile uint8_t buffer_address;
|
static volatile uint8_t buffer_address;
|
||||||
static volatile bool slave_has_register_set = false;
|
static volatile bool slave_has_register_set = false;
|
||||||
|
|
||||||
void i2c_slave_init(uint8_t address){
|
void i2c_slave_init(uint8_t address) {
|
||||||
// load address into TWI address register
|
// load address into TWI address register
|
||||||
TWAR = address;
|
TWAR = address;
|
||||||
// set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt
|
// set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt
|
||||||
TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
|
TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void i2c_slave_stop(void){
|
void i2c_slave_stop(void) {
|
||||||
// clear acknowledge and enable bits
|
// clear acknowledge and enable bits
|
||||||
TWCR &= ~((1 << TWEA) | (1 << TWEN));
|
TWCR &= ~((1 << TWEA) | (1 << TWEN));
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(TWI_vect){
|
ISR(TWI_vect) {
|
||||||
uint8_t ack = 1;
|
uint8_t ack = 1;
|
||||||
|
|
||||||
switch(TW_STATUS){
|
switch (TW_STATUS) {
|
||||||
case TW_SR_SLA_ACK:
|
case TW_SR_SLA_ACK:
|
||||||
// The device is now a slave receiver
|
// The device is now a slave receiver
|
||||||
slave_has_register_set = false;
|
slave_has_register_set = false;
|
||||||
|
@ -53,7 +53,7 @@ ISR(TWI_vect){
|
||||||
case TW_SR_DATA_ACK:
|
case TW_SR_DATA_ACK:
|
||||||
// This device is a slave receiver and has received data
|
// This device is a slave receiver and has received data
|
||||||
// First byte is the location then the bytes will be writen in buffer with auto-incriment
|
// First byte is the location then the bytes will be writen in buffer with auto-incriment
|
||||||
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
|
||||||
|
|
0
drivers/avr/i2c_slave.h
Executable file → Normal file
0
drivers/avr/i2c_slave.h
Executable file → Normal file
|
@ -93,11 +93,11 @@
|
||||||
#define NUM_DIGITAL_PINS 30
|
#define NUM_DIGITAL_PINS 30
|
||||||
#define NUM_ANALOG_INPUTS 12
|
#define NUM_ANALOG_INPUTS 12
|
||||||
|
|
||||||
#define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0)
|
#define TX_RX_LED_INIT DDRD |= (1 << 5), DDRB |= (1 << 0)
|
||||||
#define TXLED0 PORTD |= (1<<5)
|
#define TXLED0 PORTD |= (1 << 5)
|
||||||
#define TXLED1 PORTD &= ~(1<<5)
|
#define TXLED1 PORTD &= ~(1 << 5)
|
||||||
#define RXLED0 PORTB |= (1<<0)
|
#define RXLED0 PORTB |= (1 << 0)
|
||||||
#define RXLED1 PORTB &= ~(1<<0)
|
#define RXLED1 PORTB &= ~(1 << 0)
|
||||||
|
|
||||||
static const uint8_t SDA = 2;
|
static const uint8_t SDA = 2;
|
||||||
static const uint8_t SCL = 3;
|
static const uint8_t SCL = 3;
|
||||||
|
@ -127,11 +127,11 @@ static const uint8_t ADC11 = 29; // D12
|
||||||
#define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0))
|
#define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0))
|
||||||
#define digitalPinToPCICRbit(p) 0
|
#define digitalPinToPCICRbit(p) 0
|
||||||
#define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0))
|
#define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0))
|
||||||
#define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4))))))
|
#define digitalPinToPCMSKbit(p) (((p) >= 8 && (p) <= 11) ? (p)-4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4))))))
|
||||||
|
|
||||||
// __AVR_ATmega32U4__ has an unusual mapping of pins to channels
|
// __AVR_ATmega32U4__ has an unusual mapping of pins to channels
|
||||||
extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
|
extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
|
||||||
#define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) )
|
#define analogPinToChannel(P) (pgm_read_byte(analog_pin_to_channel_PGM + (P)))
|
||||||
|
|
||||||
#define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT)))))
|
#define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT)))))
|
||||||
|
|
||||||
|
@ -182,33 +182,15 @@ extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
|
||||||
// appropriate addresses for various functions (e.g. reading
|
// appropriate addresses for various functions (e.g. reading
|
||||||
// and writing)
|
// and writing)
|
||||||
const uint16_t PROGMEM port_to_mode_PGM[] = {
|
const uint16_t PROGMEM port_to_mode_PGM[] = {
|
||||||
NOT_A_PORT,
|
NOT_A_PORT, NOT_A_PORT, (uint16_t)&DDRB, (uint16_t)&DDRC, (uint16_t)&DDRD, (uint16_t)&DDRE, (uint16_t)&DDRF,
|
||||||
NOT_A_PORT,
|
|
||||||
(uint16_t) &DDRB,
|
|
||||||
(uint16_t) &DDRC,
|
|
||||||
(uint16_t) &DDRD,
|
|
||||||
(uint16_t) &DDRE,
|
|
||||||
(uint16_t) &DDRF,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM port_to_output_PGM[] = {
|
const uint16_t PROGMEM port_to_output_PGM[] = {
|
||||||
NOT_A_PORT,
|
NOT_A_PORT, NOT_A_PORT, (uint16_t)&PORTB, (uint16_t)&PORTC, (uint16_t)&PORTD, (uint16_t)&PORTE, (uint16_t)&PORTF,
|
||||||
NOT_A_PORT,
|
|
||||||
(uint16_t) &PORTB,
|
|
||||||
(uint16_t) &PORTC,
|
|
||||||
(uint16_t) &PORTD,
|
|
||||||
(uint16_t) &PORTE,
|
|
||||||
(uint16_t) &PORTF,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t PROGMEM port_to_input_PGM[] = {
|
const uint16_t PROGMEM port_to_input_PGM[] = {
|
||||||
NOT_A_PORT,
|
NOT_A_PORT, NOT_A_PORT, (uint16_t)&PINB, (uint16_t)&PINC, (uint16_t)&PIND, (uint16_t)&PINE, (uint16_t)&PINF,
|
||||||
NOT_A_PORT,
|
|
||||||
(uint16_t) &PINB,
|
|
||||||
(uint16_t) &PINC,
|
|
||||||
(uint16_t) &PIND,
|
|
||||||
(uint16_t) &PINE,
|
|
||||||
(uint16_t) &PINF,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
||||||
|
@ -286,40 +268,20 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
|
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, TIMER0B, /* 3 */
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER, TIMER3A, /* 5 */
|
||||||
NOT_ON_TIMER,
|
|
||||||
TIMER0B, /* 3 */
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
TIMER3A, /* 5 */
|
|
||||||
TIMER4D, /* 6 */
|
TIMER4D, /* 6 */
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER,
|
||||||
|
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER, TIMER1A, /* 9 */
|
||||||
TIMER1A, /* 9 */
|
|
||||||
TIMER1B, /* 10 */
|
TIMER1B, /* 10 */
|
||||||
TIMER0A, /* 11 */
|
TIMER0A, /* 11 */
|
||||||
|
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER, TIMER4A, /* 13 */
|
||||||
TIMER4A, /* 13 */
|
|
||||||
|
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER,
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
|
|
||||||
NOT_ON_TIMER,
|
NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER, NOT_ON_TIMER,
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
NOT_ON_TIMER,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t PROGMEM analog_pin_to_channel_PGM[] = {
|
const uint8_t PROGMEM analog_pin_to_channel_PGM[] = {
|
||||||
|
|
|
@ -1,32 +1,32 @@
|
||||||
#ifdef SSD1306OLED
|
#ifdef SSD1306OLED
|
||||||
|
|
||||||
#include "ssd1306.h"
|
# include "ssd1306.h"
|
||||||
#include "i2c.h"
|
# include "i2c.h"
|
||||||
#include <string.h>
|
# include <string.h>
|
||||||
#include "print.h"
|
# include "print.h"
|
||||||
#include "glcdfont.c"
|
# include "glcdfont.c"
|
||||||
#ifdef ADAFRUIT_BLE_ENABLE
|
# ifdef ADAFRUIT_BLE_ENABLE
|
||||||
#include "adafruit_ble.h"
|
# include "adafruit_ble.h"
|
||||||
#endif
|
# endif
|
||||||
#ifdef PROTOCOL_LUFA
|
# ifdef PROTOCOL_LUFA
|
||||||
#include "lufa.h"
|
# include "lufa.h"
|
||||||
#endif
|
# endif
|
||||||
#include "sendchar.h"
|
# include "sendchar.h"
|
||||||
#include "timer.h"
|
# include "timer.h"
|
||||||
|
|
||||||
// Set this to 1 to help diagnose early startup problems
|
// Set this to 1 to help diagnose early startup problems
|
||||||
// when testing power-on with ble. Turn it off otherwise,
|
// when testing power-on with ble. Turn it off otherwise,
|
||||||
// as the latency of printing most of the debug info messes
|
// as the latency of printing most of the debug info messes
|
||||||
// with the matrix scan, causing keys to drop.
|
// with the matrix scan, causing keys to drop.
|
||||||
#define DEBUG_TO_SCREEN 0
|
# define DEBUG_TO_SCREEN 0
|
||||||
|
|
||||||
//static uint16_t last_battery_update;
|
// static uint16_t last_battery_update;
|
||||||
//static uint32_t vbat;
|
// static uint32_t vbat;
|
||||||
//#define BatteryUpdateInterval 10000 /* milliseconds */
|
//#define BatteryUpdateInterval 10000 /* milliseconds */
|
||||||
#define ScreenOffInterval 300000 /* milliseconds */
|
# define ScreenOffInterval 300000 /* milliseconds */
|
||||||
#if DEBUG_TO_SCREEN
|
# if DEBUG_TO_SCREEN
|
||||||
static uint8_t displaying;
|
static uint8_t displaying;
|
||||||
#endif
|
# endif
|
||||||
static uint16_t last_flush;
|
static uint16_t last_flush;
|
||||||
|
|
||||||
// Write command sequence.
|
// Write command sequence.
|
||||||
|
@ -76,9 +76,18 @@ static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) {
|
||||||
return _send_cmd1(opr2);
|
return _send_cmd1(opr2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;}
|
# define send_cmd1(c) \
|
||||||
#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;}
|
if (!_send_cmd1(c)) { \
|
||||||
#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;}
|
goto done; \
|
||||||
|
}
|
||||||
|
# define send_cmd2(c, o) \
|
||||||
|
if (!_send_cmd2(c, o)) { \
|
||||||
|
goto done; \
|
||||||
|
}
|
||||||
|
# define send_cmd3(c, o1, o2) \
|
||||||
|
if (!_send_cmd3(c, o1, o2)) { \
|
||||||
|
goto done; \
|
||||||
|
}
|
||||||
|
|
||||||
static void clear_display(void) {
|
static void clear_display(void) {
|
||||||
matrix_clear(&display);
|
matrix_clear(&display);
|
||||||
|
@ -107,8 +116,8 @@ done:
|
||||||
i2c_master_stop();
|
i2c_master_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG_TO_SCREEN
|
# if DEBUG_TO_SCREEN
|
||||||
#undef sendchar
|
# undef sendchar
|
||||||
static int8_t capture_sendchar(uint8_t c) {
|
static int8_t capture_sendchar(uint8_t c) {
|
||||||
sendchar(c);
|
sendchar(c);
|
||||||
iota_gfx_write_char(c);
|
iota_gfx_write_char(c);
|
||||||
|
@ -118,7 +127,7 @@ static int8_t capture_sendchar(uint8_t c) {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
bool iota_gfx_init(void) {
|
bool iota_gfx_init(void) {
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
@ -129,21 +138,20 @@ bool iota_gfx_init(void) {
|
||||||
|
|
||||||
send_cmd2(SetDisplayOffset, 0);
|
send_cmd2(SetDisplayOffset, 0);
|
||||||
|
|
||||||
|
|
||||||
send_cmd1(SetStartLine | 0x0);
|
send_cmd1(SetStartLine | 0x0);
|
||||||
send_cmd2(SetChargePump, 0x14 /* Enable */);
|
send_cmd2(SetChargePump, 0x14 /* Enable */);
|
||||||
send_cmd2(SetMemoryMode, 0 /* horizontal addressing */);
|
send_cmd2(SetMemoryMode, 0 /* horizontal addressing */);
|
||||||
|
|
||||||
#ifdef OLED_ROTATE180
|
# ifdef OLED_ROTATE180
|
||||||
// the following Flip the display orientation 180 degrees
|
// the following Flip the display orientation 180 degrees
|
||||||
send_cmd1(SegRemap);
|
send_cmd1(SegRemap);
|
||||||
send_cmd1(ComScanInc);
|
send_cmd1(ComScanInc);
|
||||||
#endif
|
# endif
|
||||||
#ifndef OLED_ROTATE180
|
# ifndef OLED_ROTATE180
|
||||||
// Flips the display orientation 0 degrees
|
// Flips the display orientation 0 degrees
|
||||||
send_cmd1(SegRemap | 0x1);
|
send_cmd1(SegRemap | 0x1);
|
||||||
send_cmd1(ComScanDec);
|
send_cmd1(ComScanDec);
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
send_cmd2(SetComPins, 0x2);
|
send_cmd2(SetComPins, 0x2);
|
||||||
send_cmd2(SetContrast, 0x8f);
|
send_cmd2(SetContrast, 0x8f);
|
||||||
|
@ -162,9 +170,9 @@ bool iota_gfx_init(void) {
|
||||||
|
|
||||||
iota_gfx_flush();
|
iota_gfx_flush();
|
||||||
|
|
||||||
#if DEBUG_TO_SCREEN
|
# if DEBUG_TO_SCREEN
|
||||||
print_set_sendchar(capture_sendchar);
|
print_set_sendchar(capture_sendchar);
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return success;
|
return success;
|
||||||
|
@ -196,8 +204,7 @@ void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
|
||||||
|
|
||||||
if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
|
if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
|
||||||
// We went off the end; scroll the display upwards by one line
|
// We went off the end; scroll the display upwards by one line
|
||||||
memmove(&matrix->display[0], &matrix->display[1],
|
memmove(&matrix->display[0], &matrix->display[1], MatrixCols * (MatrixRows - 1));
|
||||||
MatrixCols * (MatrixRows - 1));
|
|
||||||
matrix->cursor = &matrix->display[MatrixRows - 1][0];
|
matrix->cursor = &matrix->display[MatrixRows - 1][0];
|
||||||
memset(matrix->cursor, ' ', MatrixCols);
|
memset(matrix->cursor, ' ', MatrixCols);
|
||||||
}
|
}
|
||||||
|
@ -220,9 +227,7 @@ 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) {
|
void iota_gfx_write_char(uint8_t c) { matrix_write_char(&display, 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);
|
||||||
|
@ -232,9 +237,7 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void iota_gfx_write(const char *data) {
|
void iota_gfx_write(const char *data) { matrix_write(&display, 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) {
|
||||||
|
@ -247,9 +250,7 @@ void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void iota_gfx_write_P(const char *data) {
|
void iota_gfx_write_P(const char *data) { matrix_write_P(&display, 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,16 +258,14 @@ void matrix_clear(struct CharacterMatrix *matrix) {
|
||||||
matrix->dirty = true;
|
matrix->dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void iota_gfx_clear_screen(void) {
|
void iota_gfx_clear_screen(void) { matrix_clear(&display); }
|
||||||
matrix_clear(&display);
|
|
||||||
}
|
|
||||||
|
|
||||||
void matrix_render(struct CharacterMatrix *matrix) {
|
void matrix_render(struct CharacterMatrix *matrix) {
|
||||||
last_flush = timer_read();
|
last_flush = timer_read();
|
||||||
iota_gfx_on();
|
iota_gfx_on();
|
||||||
#if DEBUG_TO_SCREEN
|
# if DEBUG_TO_SCREEN
|
||||||
++displaying;
|
++displaying;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
// Move to the home position
|
// Move to the home position
|
||||||
send_cmd3(PageAddr, 0, MatrixRows - 1);
|
send_cmd3(PageAddr, 0, MatrixRows - 1);
|
||||||
|
@ -298,18 +297,14 @@ void matrix_render(struct CharacterMatrix *matrix) {
|
||||||
|
|
||||||
done:
|
done:
|
||||||
i2c_master_stop();
|
i2c_master_stop();
|
||||||
#if DEBUG_TO_SCREEN
|
# if DEBUG_TO_SCREEN
|
||||||
--displaying;
|
--displaying;
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void iota_gfx_flush(void) {
|
void iota_gfx_flush(void) { matrix_render(&display); }
|
||||||
matrix_render(&display);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) void iota_gfx_task_user(void) {}
|
||||||
void iota_gfx_task_user(void) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void iota_gfx_task(void) {
|
void iota_gfx_task(void) {
|
||||||
iota_gfx_task_user();
|
iota_gfx_task_user();
|
||||||
|
|
|
@ -49,7 +49,7 @@ enum ssd1306_cmds {
|
||||||
// Controls the SSD1306 128x32 OLED display via i2c
|
// Controls the SSD1306 128x32 OLED display via i2c
|
||||||
|
|
||||||
#ifndef SSD1306_ADDRESS
|
#ifndef SSD1306_ADDRESS
|
||||||
#define SSD1306_ADDRESS 0x3C
|
# define SSD1306_ADDRESS 0x3C
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DisplayHeight 32
|
#define DisplayHeight 32
|
||||||
|
@ -88,6 +88,4 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data);
|
||||||
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
|
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
|
||||||
void matrix_render(struct CharacterMatrix *matrix);
|
void matrix_render(struct CharacterMatrix *matrix);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
/*
|
/*
|
||||||
* light weight WS2812 lib V2.0b
|
* light weight WS2812 lib V2.0b
|
||||||
*
|
*
|
||||||
* Controls WS2811/WS2812/WS2812B RGB-LEDs
|
* Controls WS2811/WS2812/WS2812B RGB-LEDs
|
||||||
* Author: Tim (cpldcpu@gmail.com)
|
* Author: Tim (cpldcpu@gmail.com)
|
||||||
*
|
*
|
||||||
* Jan 18th, 2014 v2.0b Initial Version
|
* Jan 18th, 2014 v2.0b Initial Version
|
||||||
* Nov 29th, 2015 v2.3 Added SK6812RGBW support
|
* Nov 29th, 2015 v2.3 Added SK6812RGBW support
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 2 of the License, or
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ws2812.h"
|
#include "ws2812.h"
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
@ -30,44 +30,40 @@
|
||||||
#if !defined(LED_ARRAY) && defined(RGB_MATRIX_ENABLE)
|
#if !defined(LED_ARRAY) && defined(RGB_MATRIX_ENABLE)
|
||||||
// LED color buffer
|
// LED color buffer
|
||||||
LED_TYPE led[DRIVER_LED_TOTAL];
|
LED_TYPE led[DRIVER_LED_TOTAL];
|
||||||
#define LED_ARRAY led
|
# define LED_ARRAY led
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RGBW_BB_TWI
|
#ifdef RGBW_BB_TWI
|
||||||
|
|
||||||
// Port for the I2C
|
// Port for the I2C
|
||||||
#define I2C_DDR DDRD
|
# define I2C_DDR DDRD
|
||||||
#define I2C_PIN PIND
|
# define I2C_PIN PIND
|
||||||
#define I2C_PORT PORTD
|
# define I2C_PORT PORTD
|
||||||
|
|
||||||
// Pins to be used in the bit banging
|
// Pins to be used in the bit banging
|
||||||
#define I2C_CLK 0
|
# define I2C_CLK 0
|
||||||
#define I2C_DAT 1
|
# define I2C_DAT 1
|
||||||
|
|
||||||
#define I2C_DATA_HI()\
|
# define I2C_DATA_HI() \
|
||||||
I2C_DDR &= ~ (1 << I2C_DAT);\
|
I2C_DDR &= ~(1 << I2C_DAT); \
|
||||||
I2C_PORT |= (1 << I2C_DAT);
|
I2C_PORT |= (1 << I2C_DAT);
|
||||||
#define I2C_DATA_LO()\
|
# define I2C_DATA_LO() \
|
||||||
I2C_DDR |= (1 << I2C_DAT);\
|
I2C_DDR |= (1 << I2C_DAT); \
|
||||||
I2C_PORT &= ~ (1 << I2C_DAT);
|
I2C_PORT &= ~(1 << I2C_DAT);
|
||||||
|
|
||||||
#define I2C_CLOCK_HI()\
|
# define I2C_CLOCK_HI() \
|
||||||
I2C_DDR &= ~ (1 << I2C_CLK);\
|
I2C_DDR &= ~(1 << I2C_CLK); \
|
||||||
I2C_PORT |= (1 << I2C_CLK);
|
I2C_PORT |= (1 << I2C_CLK);
|
||||||
#define I2C_CLOCK_LO()\
|
# define I2C_CLOCK_LO() \
|
||||||
I2C_DDR |= (1 << I2C_CLK);\
|
I2C_DDR |= (1 << I2C_CLK); \
|
||||||
I2C_PORT &= ~ (1 << I2C_CLK);
|
I2C_PORT &= ~(1 << I2C_CLK);
|
||||||
|
|
||||||
#define I2C_DELAY 1
|
# define I2C_DELAY 1
|
||||||
|
|
||||||
void I2C_WriteBit(unsigned char c)
|
void I2C_WriteBit(unsigned char c) {
|
||||||
{
|
if (c > 0) {
|
||||||
if (c > 0)
|
|
||||||
{
|
|
||||||
I2C_DATA_HI();
|
I2C_DATA_HI();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
I2C_DATA_LO();
|
I2C_DATA_LO();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,8 +73,7 @@ void I2C_WriteBit(unsigned char c)
|
||||||
I2C_CLOCK_LO();
|
I2C_CLOCK_LO();
|
||||||
_delay_us(I2C_DELAY);
|
_delay_us(I2C_DELAY);
|
||||||
|
|
||||||
if (c > 0)
|
if (c > 0) {
|
||||||
{
|
|
||||||
I2C_DATA_LO();
|
I2C_DATA_LO();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,9 +82,8 @@ void I2C_WriteBit(unsigned char c)
|
||||||
|
|
||||||
// Inits bitbanging port, must be called before using the functions below
|
// Inits bitbanging port, must be called before using the functions below
|
||||||
//
|
//
|
||||||
void I2C_Init(void)
|
void I2C_Init(void) {
|
||||||
{
|
I2C_PORT &= ~((1 << I2C_DAT) | (1 << I2C_CLK));
|
||||||
I2C_PORT &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK));
|
|
||||||
|
|
||||||
I2C_CLOCK_HI();
|
I2C_CLOCK_HI();
|
||||||
I2C_DATA_HI();
|
I2C_DATA_HI();
|
||||||
|
@ -99,10 +93,9 @@ void I2C_Init(void)
|
||||||
|
|
||||||
// Send a START Condition
|
// Send a START Condition
|
||||||
//
|
//
|
||||||
void I2C_Start(void)
|
void I2C_Start(void) {
|
||||||
{
|
|
||||||
// set both to high at the same time
|
// set both to high at the same time
|
||||||
I2C_DDR &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK));
|
I2C_DDR &= ~((1 << I2C_DAT) | (1 << I2C_CLK));
|
||||||
_delay_us(I2C_DELAY);
|
_delay_us(I2C_DELAY);
|
||||||
|
|
||||||
I2C_DATA_LO();
|
I2C_DATA_LO();
|
||||||
|
@ -114,8 +107,7 @@ void I2C_Start(void)
|
||||||
|
|
||||||
// Send a STOP Condition
|
// Send a STOP Condition
|
||||||
//
|
//
|
||||||
void I2C_Stop(void)
|
void I2C_Stop(void) {
|
||||||
{
|
|
||||||
I2C_CLOCK_HI();
|
I2C_CLOCK_HI();
|
||||||
_delay_us(I2C_DELAY);
|
_delay_us(I2C_DELAY);
|
||||||
|
|
||||||
|
@ -125,40 +117,34 @@ void I2C_Stop(void)
|
||||||
|
|
||||||
// write a byte to the I2C slave device
|
// write a byte to the I2C slave device
|
||||||
//
|
//
|
||||||
unsigned char I2C_Write(unsigned char c)
|
unsigned char I2C_Write(unsigned char c) {
|
||||||
{
|
for (char i = 0; i < 8; i++) {
|
||||||
for (char i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
I2C_WriteBit(c & 128);
|
I2C_WriteBit(c & 128);
|
||||||
|
|
||||||
c <<= 1;
|
c <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
I2C_WriteBit(0);
|
I2C_WriteBit(0);
|
||||||
_delay_us(I2C_DELAY);
|
_delay_us(I2C_DELAY);
|
||||||
_delay_us(I2C_DELAY);
|
_delay_us(I2C_DELAY);
|
||||||
|
|
||||||
// _delay_us(I2C_DELAY);
|
// _delay_us(I2C_DELAY);
|
||||||
//return I2C_ReadBit();
|
// return I2C_ReadBit();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
// Set an led in the buffer to a color
|
// Set an led in the buffer to a color
|
||||||
void inline ws2812_setled(int i, uint8_t r, uint8_t g, uint8_t b)
|
void inline ws2812_setled(int i, uint8_t r, uint8_t g, uint8_t b) {
|
||||||
{
|
|
||||||
led[i].r = r;
|
led[i].r = r;
|
||||||
led[i].g = g;
|
led[i].g = g;
|
||||||
led[i].b = b;
|
led[i].b = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b)
|
void ws2812_setled_all(uint8_t r, uint8_t g, uint8_t b) {
|
||||||
{
|
for (int i = 0; i < sizeof(led) / sizeof(led[0]); i++) {
|
||||||
for (int i = 0; i < sizeof(led)/sizeof(led[0]); i++) {
|
|
||||||
led[i].r = r;
|
led[i].r = r;
|
||||||
led[i].g = g;
|
led[i].g = g;
|
||||||
led[i].b = b;
|
led[i].b = b;
|
||||||
|
@ -167,64 +153,55 @@ void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Setleds for standard RGB
|
// Setleds for standard RGB
|
||||||
void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds)
|
void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {
|
||||||
{
|
|
||||||
// ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
|
// ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
|
||||||
ws2812_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF));
|
ws2812_setleds_pin(ledarray, leds, _BV(RGB_DI_PIN & 0xF));
|
||||||
}
|
}
|
||||||
|
|
||||||
void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask)
|
void inline ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t leds, uint8_t pinmask) {
|
||||||
{
|
|
||||||
// ws2812_DDRREG |= pinmask; // Enable DDR
|
// ws2812_DDRREG |= pinmask; // Enable DDR
|
||||||
// new universal format (DDR)
|
// new universal format (DDR)
|
||||||
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask;
|
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask;
|
||||||
|
|
||||||
ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask);
|
ws2812_sendarray_mask((uint8_t *)ledarray, leds + leds + leds, pinmask);
|
||||||
_delay_us(50);
|
_delay_us(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setleds for SK6812RGBW
|
// Setleds for SK6812RGBW
|
||||||
void inline ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds)
|
void inline ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t leds) {
|
||||||
{
|
#ifdef RGBW_BB_TWI
|
||||||
|
|
||||||
#ifdef RGBW_BB_TWI
|
|
||||||
uint8_t sreg_prev, twcr_prev;
|
uint8_t sreg_prev, twcr_prev;
|
||||||
sreg_prev=SREG;
|
sreg_prev = SREG;
|
||||||
twcr_prev=TWCR;
|
twcr_prev = TWCR;
|
||||||
cli();
|
cli();
|
||||||
TWCR &= ~(1<<TWEN);
|
TWCR &= ~(1 << TWEN);
|
||||||
I2C_Init();
|
I2C_Init();
|
||||||
I2C_Start();
|
I2C_Start();
|
||||||
I2C_Write(0x84);
|
I2C_Write(0x84);
|
||||||
uint16_t datlen = leds<<2;
|
uint16_t datlen = leds << 2;
|
||||||
uint8_t curbyte;
|
uint8_t curbyte;
|
||||||
uint8_t * data = (uint8_t*)ledarray;
|
uint8_t *data = (uint8_t *)ledarray;
|
||||||
while (datlen--) {
|
while (datlen--) {
|
||||||
curbyte=*data++;
|
curbyte = *data++;
|
||||||
I2C_Write(curbyte);
|
I2C_Write(curbyte);
|
||||||
}
|
}
|
||||||
I2C_Stop();
|
I2C_Stop();
|
||||||
SREG=sreg_prev;
|
SREG = sreg_prev;
|
||||||
TWCR=twcr_prev;
|
TWCR = twcr_prev;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
|
// ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
|
||||||
// new universal format (DDR)
|
// new universal format (DDR)
|
||||||
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= _BV(RGB_DI_PIN & 0xF);
|
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= _BV(RGB_DI_PIN & 0xF);
|
||||||
|
|
||||||
ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF));
|
ws2812_sendarray_mask((uint8_t *)ledarray, leds << 2, _BV(RGB_DI_PIN & 0xF));
|
||||||
|
|
||||||
|
#ifndef RGBW_BB_TWI
|
||||||
#ifndef RGBW_BB_TWI
|
|
||||||
_delay_us(80);
|
_delay_us(80);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ws2812_sendarray(uint8_t *data,uint16_t datlen)
|
void ws2812_sendarray(uint8_t *data, uint16_t datlen) { ws2812_sendarray_mask(data, datlen, _BV(RGB_DI_PIN & 0xF)); }
|
||||||
{
|
|
||||||
ws2812_sendarray_mask(data,datlen,_BV(RGB_DI_PIN & 0xF));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This routine writes an array of bytes with RGB values to the Dataout pin
|
This routine writes an array of bytes with RGB values to the Dataout pin
|
||||||
|
@ -242,43 +219,43 @@ void ws2812_sendarray(uint8_t *data,uint16_t datlen)
|
||||||
#define w_fixedtotal 8
|
#define w_fixedtotal 8
|
||||||
|
|
||||||
// Insert NOPs to match the timing, if possible
|
// Insert NOPs to match the timing, if possible
|
||||||
#define w_zerocycles (((F_CPU/1000)*w_zeropulse )/1000000)
|
#define w_zerocycles (((F_CPU / 1000) * w_zeropulse) / 1000000)
|
||||||
#define w_onecycles (((F_CPU/1000)*w_onepulse +500000)/1000000)
|
#define w_onecycles (((F_CPU / 1000) * w_onepulse + 500000) / 1000000)
|
||||||
#define w_totalcycles (((F_CPU/1000)*w_totalperiod +500000)/1000000)
|
#define w_totalcycles (((F_CPU / 1000) * w_totalperiod + 500000) / 1000000)
|
||||||
|
|
||||||
// w1 - nops between rising edge and falling edge - low
|
// w1 - nops between rising edge and falling edge - low
|
||||||
#define w1 (w_zerocycles-w_fixedlow)
|
#define w1 (w_zerocycles - w_fixedlow)
|
||||||
// w2 nops between fe low and fe high
|
// w2 nops between fe low and fe high
|
||||||
#define w2 (w_onecycles-w_fixedhigh-w1)
|
#define w2 (w_onecycles - w_fixedhigh - w1)
|
||||||
// w3 nops to complete loop
|
// w3 nops to complete loop
|
||||||
#define w3 (w_totalcycles-w_fixedtotal-w1-w2)
|
#define w3 (w_totalcycles - w_fixedtotal - w1 - w2)
|
||||||
|
|
||||||
#if w1>0
|
#if w1 > 0
|
||||||
#define w1_nops w1
|
# define w1_nops w1
|
||||||
#else
|
#else
|
||||||
#define w1_nops 0
|
# define w1_nops 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// The only critical timing parameter is the minimum pulse length of the "0"
|
// The only critical timing parameter is the minimum pulse length of the "0"
|
||||||
// Warn or throw error if this timing can not be met with current F_CPU settings.
|
// Warn or throw error if this timing can not be met with current F_CPU settings.
|
||||||
#define w_lowtime ((w1_nops+w_fixedlow)*1000000)/(F_CPU/1000)
|
#define w_lowtime ((w1_nops + w_fixedlow) * 1000000) / (F_CPU / 1000)
|
||||||
#if w_lowtime>550
|
#if w_lowtime > 550
|
||||||
#error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?"
|
# error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?"
|
||||||
#elif w_lowtime>450
|
#elif w_lowtime > 450
|
||||||
#warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)."
|
# warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)."
|
||||||
#warning "Please consider a higher clockspeed, if possible"
|
# warning "Please consider a higher clockspeed, if possible"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if w2>0
|
#if w2 > 0
|
||||||
#define w2_nops w2
|
# define w2_nops w2
|
||||||
#else
|
#else
|
||||||
#define w2_nops 0
|
# define w2_nops 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if w3>0
|
#if w3 > 0
|
||||||
#define w3_nops w3
|
# define w3_nops w3
|
||||||
#else
|
#else
|
||||||
#define w3_nops 0
|
# define w3_nops 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define w_nop1 "nop \n\t"
|
#define w_nop1 "nop \n\t"
|
||||||
|
@ -287,81 +264,78 @@ void ws2812_sendarray(uint8_t *data,uint16_t datlen)
|
||||||
#define w_nop8 w_nop4 w_nop4
|
#define w_nop8 w_nop4 w_nop4
|
||||||
#define w_nop16 w_nop8 w_nop8
|
#define w_nop16 w_nop8 w_nop8
|
||||||
|
|
||||||
void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi)
|
void inline ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t maskhi) {
|
||||||
{
|
uint8_t curbyte, ctr, masklo;
|
||||||
uint8_t curbyte,ctr,masklo;
|
|
||||||
uint8_t sreg_prev;
|
uint8_t sreg_prev;
|
||||||
|
|
||||||
// masklo =~maskhi&ws2812_PORTREG;
|
// masklo =~maskhi&ws2812_PORTREG;
|
||||||
// maskhi |= ws2812_PORTREG;
|
// maskhi |= ws2812_PORTREG;
|
||||||
masklo =~maskhi&_SFR_IO8((RGB_DI_PIN >> 4) + 2);
|
masklo = ~maskhi & _SFR_IO8((RGB_DI_PIN >> 4) + 2);
|
||||||
maskhi |= _SFR_IO8((RGB_DI_PIN >> 4) + 2);
|
maskhi |= _SFR_IO8((RGB_DI_PIN >> 4) + 2);
|
||||||
sreg_prev=SREG;
|
sreg_prev = SREG;
|
||||||
cli();
|
cli();
|
||||||
|
|
||||||
while (datlen--) {
|
while (datlen--) {
|
||||||
curbyte=(*data++);
|
curbyte = (*data++);
|
||||||
|
|
||||||
asm volatile(
|
asm volatile(" ldi %0,8 \n\t"
|
||||||
" 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
|
||||||
#if (w1_nops&2)
|
#if (w1_nops & 2)
|
||||||
w_nop2
|
w_nop2
|
||||||
#endif
|
#endif
|
||||||
#if (w1_nops&4)
|
#if (w1_nops & 4)
|
||||||
w_nop4
|
w_nop4
|
||||||
#endif
|
#endif
|
||||||
#if (w1_nops&8)
|
#if (w1_nops & 8)
|
||||||
w_nop8
|
w_nop8
|
||||||
#endif
|
#endif
|
||||||
#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
|
||||||
#if (w2_nops&2)
|
#if (w2_nops & 2)
|
||||||
w_nop2
|
w_nop2
|
||||||
#endif
|
#endif
|
||||||
#if (w2_nops&4)
|
#if (w2_nops & 4)
|
||||||
w_nop4
|
w_nop4
|
||||||
#endif
|
#endif
|
||||||
#if (w2_nops&8)
|
#if (w2_nops & 8)
|
||||||
w_nop8
|
w_nop8
|
||||||
#endif
|
#endif
|
||||||
#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
|
||||||
#if (w3_nops&2)
|
#if (w3_nops & 2)
|
||||||
w_nop2
|
w_nop2
|
||||||
#endif
|
#endif
|
||||||
#if (w3_nops&4)
|
#if (w3_nops & 4)
|
||||||
w_nop4
|
w_nop4
|
||||||
#endif
|
#endif
|
||||||
#if (w3_nops&8)
|
#if (w3_nops & 8)
|
||||||
w_nop8
|
w_nop8
|
||||||
#endif
|
#endif
|
||||||
#if (w3_nops&16)
|
#if (w3_nops & 16)
|
||||||
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(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r" (maskhi), "r" (masklo)
|
: "r"(curbyte), "I"(_SFR_IO_ADDR(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r"(maskhi), "r"(masklo));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SREG=sreg_prev;
|
SREG = sreg_prev;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,12 +43,12 @@
|
||||||
* - Wait 50<EFBFBD>s to reset the LEDs
|
* - Wait 50<EFBFBD>s to reset the LEDs
|
||||||
*/
|
*/
|
||||||
#ifdef RGB_MATRIX_ENABLE
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
void ws2812_setled (int index, uint8_t r, uint8_t g, uint8_t b);
|
void ws2812_setled(int index, uint8_t r, uint8_t g, uint8_t b);
|
||||||
void ws2812_setled_all (uint8_t r, uint8_t g, uint8_t b);
|
void ws2812_setled_all(uint8_t r, uint8_t g, uint8_t b);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ws2812_setleds (LED_TYPE *ledarray, uint16_t number_of_leds);
|
void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
|
||||||
void ws2812_setleds_pin (LED_TYPE *ledarray, uint16_t number_of_leds,uint8_t pinmask);
|
void ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t number_of_leds, uint8_t pinmask);
|
||||||
void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
|
void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -58,18 +58,17 @@ void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
|
||||||
* The length is the number of bytes to send - three per LED.
|
* The length is the number of bytes to send - three per LED.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ws2812_sendarray (uint8_t *array,uint16_t length);
|
void ws2812_sendarray(uint8_t *array, uint16_t length);
|
||||||
void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask);
|
void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal defines
|
* Internal defines
|
||||||
*/
|
*/
|
||||||
#ifndef CONCAT
|
#ifndef CONCAT
|
||||||
#define CONCAT(a, b) a ## b
|
# define CONCAT(a, b) a##b
|
||||||
#endif
|
#endif
|
||||||
#ifndef CONCAT_EXP
|
#ifndef CONCAT_EXP
|
||||||
#define CONCAT_EXP(a, b) CONCAT(a, b)
|
# define CONCAT_EXP(a, b) CONCAT(a, b)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* LIGHT_WS2812_H_ */
|
#endif /* LIGHT_WS2812_H_ */
|
||||||
|
|
|
@ -23,42 +23,33 @@
|
||||||
* This variable is used by the HAL when initializing the PAL driver.
|
* This variable is used by the HAL when initializing the PAL driver.
|
||||||
*/
|
*/
|
||||||
const PALConfig pal_default_config = {
|
const PALConfig pal_default_config = {
|
||||||
#if STM32_HAS_GPIOA
|
# if STM32_HAS_GPIOA
|
||||||
{VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
|
{VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
|
||||||
VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
|
# endif
|
||||||
#endif
|
# if STM32_HAS_GPIOB
|
||||||
#if STM32_HAS_GPIOB
|
{VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
|
||||||
{VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
|
# endif
|
||||||
VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
|
# if STM32_HAS_GPIOC
|
||||||
#endif
|
{VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
|
||||||
#if STM32_HAS_GPIOC
|
# endif
|
||||||
{VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
|
# if STM32_HAS_GPIOD
|
||||||
VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
|
{VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
|
||||||
#endif
|
# endif
|
||||||
#if STM32_HAS_GPIOD
|
# if STM32_HAS_GPIOE
|
||||||
{VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
|
{VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
|
||||||
VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
|
# endif
|
||||||
#endif
|
# if STM32_HAS_GPIOF
|
||||||
#if STM32_HAS_GPIOE
|
{VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
|
||||||
{VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
|
# endif
|
||||||
VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
|
# if STM32_HAS_GPIOG
|
||||||
#endif
|
{VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
|
||||||
#if STM32_HAS_GPIOF
|
# endif
|
||||||
{VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
|
# if STM32_HAS_GPIOH
|
||||||
VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
|
{VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
|
||||||
#endif
|
# endif
|
||||||
#if STM32_HAS_GPIOG
|
# if STM32_HAS_GPIOI
|
||||||
{VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
|
{VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}
|
||||||
VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
|
# endif
|
||||||
#endif
|
|
||||||
#if STM32_HAS_GPIOH
|
|
||||||
{VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
|
|
||||||
VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
|
|
||||||
#endif
|
|
||||||
#if STM32_HAS_GPIOI
|
|
||||||
{VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
|
|
||||||
VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -79,7 +70,6 @@ void __early_init(void) {
|
||||||
* @brief SDC card detection.
|
* @brief SDC card detection.
|
||||||
*/
|
*/
|
||||||
bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
|
bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
|
||||||
|
|
||||||
(void)sdcp;
|
(void)sdcp;
|
||||||
/* TODO: Fill the implementation.*/
|
/* TODO: Fill the implementation.*/
|
||||||
return true;
|
return true;
|
||||||
|
@ -89,7 +79,6 @@ bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
|
||||||
* @brief SDC card write protection detection.
|
* @brief SDC card write protection detection.
|
||||||
*/
|
*/
|
||||||
bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
|
bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
|
||||||
|
|
||||||
(void)sdcp;
|
(void)sdcp;
|
||||||
/* TODO: Fill the implementation.*/
|
/* TODO: Fill the implementation.*/
|
||||||
return false;
|
return false;
|
||||||
|
@ -101,7 +90,6 @@ bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
|
||||||
* @brief MMC_SPI card detection.
|
* @brief MMC_SPI card detection.
|
||||||
*/
|
*/
|
||||||
bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
|
bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
|
||||||
|
|
||||||
(void)mmcp;
|
(void)mmcp;
|
||||||
/* TODO: Fill the implementation.*/
|
/* TODO: Fill the implementation.*/
|
||||||
return true;
|
return true;
|
||||||
|
@ -111,7 +99,6 @@ bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
|
||||||
* @brief MMC_SPI card write protection detection.
|
* @brief MMC_SPI card write protection detection.
|
||||||
*/
|
*/
|
||||||
bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
|
bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
|
||||||
|
|
||||||
(void)mmcp;
|
(void)mmcp;
|
||||||
/* TODO: Fill the implementation.*/
|
/* TODO: Fill the implementation.*/
|
||||||
return false;
|
return false;
|
||||||
|
@ -122,5 +109,4 @@ bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
|
||||||
* @brief Board-specific initialization code.
|
* @brief Board-specific initialization code.
|
||||||
* @todo Add your board-specific code, if any.
|
* @todo Add your board-specific code, if any.
|
||||||
*/
|
*/
|
||||||
void boardInit(void) {
|
void boardInit(void) {}
|
||||||
}
|
|
||||||
|
|
|
@ -32,13 +32,13 @@
|
||||||
* NOTE: LSE not fitted.
|
* NOTE: LSE not fitted.
|
||||||
*/
|
*/
|
||||||
#if !defined(STM32_LSECLK)
|
#if !defined(STM32_LSECLK)
|
||||||
#define STM32_LSECLK 0U
|
# define STM32_LSECLK 0U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define STM32_LSEDRV (3U << 3U)
|
#define STM32_LSEDRV (3U << 3U)
|
||||||
|
|
||||||
#if !defined(STM32_HSECLK)
|
#if !defined(STM32_HSECLK)
|
||||||
#define STM32_HSECLK 8000000U
|
# define STM32_HSECLK 8000000U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// #define STM32_HSE_BYPASS
|
// #define STM32_HSE_BYPASS
|
||||||
|
@ -201,27 +201,26 @@
|
||||||
|
|
||||||
#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U)
|
#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* I/O ports initial setup, this configuration is established soon after reset
|
* I/O ports initial setup, this configuration is established soon after reset
|
||||||
* in the initialization code.
|
* in the initialization code.
|
||||||
* Please refer to the STM32 Reference Manual for details.
|
* Please refer to the STM32 Reference Manual for details.
|
||||||
*/
|
*/
|
||||||
#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
|
#define PIN_MODE_INPUT(n) (0U << ((n)*2U))
|
||||||
#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
|
#define PIN_MODE_OUTPUT(n) (1U << ((n)*2U))
|
||||||
#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
|
#define PIN_MODE_ALTERNATE(n) (2U << ((n)*2U))
|
||||||
#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
|
#define PIN_MODE_ANALOG(n) (3U << ((n)*2U))
|
||||||
#define PIN_ODR_LOW(n) (0U << (n))
|
#define PIN_ODR_LOW(n) (0U << (n))
|
||||||
#define PIN_ODR_HIGH(n) (1U << (n))
|
#define PIN_ODR_HIGH(n) (1U << (n))
|
||||||
#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
|
#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
|
||||||
#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
|
#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
|
||||||
#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
|
#define PIN_OSPEED_VERYLOW(n) (0U << ((n)*2U))
|
||||||
#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
|
#define PIN_OSPEED_LOW(n) (1U << ((n)*2U))
|
||||||
#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
|
#define PIN_OSPEED_MEDIUM(n) (2U << ((n)*2U))
|
||||||
#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
|
#define PIN_OSPEED_HIGH(n) (3U << ((n)*2U))
|
||||||
#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
|
#define PIN_PUPDR_FLOATING(n) (0U << ((n)*2U))
|
||||||
#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
|
#define PIN_PUPDR_PULLUP(n) (1U << ((n)*2U))
|
||||||
#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
|
#define PIN_PUPDR_PULLDOWN(n) (2U << ((n)*2U))
|
||||||
#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
|
#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -244,102 +243,13 @@
|
||||||
* PA14 - SWCLK (alternate 0).
|
* PA14 - SWCLK (alternate 0).
|
||||||
* PA15 - ROW4
|
* PA15 - ROW4
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \
|
#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | PIN_MODE_ALTERNATE(GPIOA_PIN1) | PIN_MODE_INPUT(GPIOA_PIN2) | PIN_MODE_INPUT(GPIOA_PIN3) | PIN_MODE_INPUT(GPIOA_PIN4) | PIN_MODE_INPUT(GPIOA_PIN5) | PIN_MODE_INPUT(GPIOA_PIN6) | PIN_MODE_INPUT(GPIOA_PIN7) | PIN_MODE_INPUT(GPIOA_PIN8) | PIN_MODE_INPUT(GPIOA_PIN9) | PIN_MODE_INPUT(GPIOA_PIN10) | PIN_MODE_ALTERNATE(GPIOA_USB_DM) | PIN_MODE_ALTERNATE(GPIOA_USB_DP) | PIN_MODE_ALTERNATE(GPIOA_SWDIO) | PIN_MODE_ALTERNATE(GPIOA_SWCLK) | PIN_MODE_INPUT(GPIOA_PIN15))
|
||||||
PIN_MODE_ALTERNATE(GPIOA_PIN1) | \
|
#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOA_PIN2) | \
|
#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | PIN_OSPEED_HIGH(GPIOA_PIN1) | PIN_OSPEED_VERYLOW(GPIOA_PIN2) | PIN_OSPEED_VERYLOW(GPIOA_PIN3) | PIN_OSPEED_VERYLOW(GPIOA_PIN4) | PIN_OSPEED_VERYLOW(GPIOA_PIN5) | PIN_OSPEED_VERYLOW(GPIOA_PIN6) | PIN_OSPEED_VERYLOW(GPIOA_PIN7) | PIN_OSPEED_VERYLOW(GPIOA_PIN8) | PIN_OSPEED_VERYLOW(GPIOA_PIN9) | PIN_OSPEED_VERYLOW(GPIOA_PIN10) | PIN_OSPEED_HIGH(GPIOA_USB_DM) | PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | PIN_OSPEED_HIGH(GPIOA_SWDIO) | PIN_OSPEED_HIGH(GPIOA_SWCLK) | PIN_OSPEED_VERYLOW(GPIOA_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOA_PIN3) | \
|
#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | PIN_PUPDR_FLOATING(GPIOA_PIN1) | PIN_PUPDR_PULLUP(GPIOA_PIN2) | PIN_PUPDR_PULLUP(GPIOA_PIN3) | PIN_PUPDR_PULLUP(GPIOA_PIN4) | PIN_PUPDR_PULLUP(GPIOA_PIN5) | PIN_PUPDR_PULLUP(GPIOA_PIN6) | PIN_PUPDR_FLOATING(GPIOA_PIN7) | PIN_PUPDR_PULLUP(GPIOA_PIN8) | PIN_PUPDR_PULLUP(GPIOA_PIN9) | PIN_PUPDR_PULLUP(GPIOA_PIN10) | PIN_PUPDR_FLOATING(GPIOA_USB_DM) | PIN_PUPDR_FLOATING(GPIOA_USB_DP) | PIN_PUPDR_PULLUP(GPIOA_SWDIO) | PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | PIN_PUPDR_PULLUP(GPIOA_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOA_PIN4) | \
|
#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | PIN_ODR_HIGH(GPIOA_PIN1) | PIN_ODR_HIGH(GPIOA_PIN2) | PIN_ODR_HIGH(GPIOA_PIN3) | PIN_ODR_HIGH(GPIOA_PIN4) | PIN_ODR_HIGH(GPIOA_PIN5) | PIN_ODR_HIGH(GPIOA_PIN6) | PIN_ODR_HIGH(GPIOA_PIN7) | PIN_ODR_HIGH(GPIOA_PIN8) | PIN_ODR_HIGH(GPIOA_PIN9) | PIN_ODR_HIGH(GPIOA_PIN10) | PIN_ODR_HIGH(GPIOA_USB_DM) | PIN_ODR_HIGH(GPIOA_USB_DP) | PIN_ODR_HIGH(GPIOA_SWDIO) | PIN_ODR_HIGH(GPIOA_SWCLK) | PIN_ODR_HIGH(GPIOA_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOA_PIN5) | \
|
#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | PIN_AFIO_AF(GPIOA_PIN1, 1) | PIN_AFIO_AF(GPIOA_PIN2, 0) | PIN_AFIO_AF(GPIOA_PIN3, 0) | PIN_AFIO_AF(GPIOA_PIN4, 0) | PIN_AFIO_AF(GPIOA_PIN5, 5) | PIN_AFIO_AF(GPIOA_PIN6, 5) | PIN_AFIO_AF(GPIOA_PIN7, 5))
|
||||||
PIN_MODE_INPUT(GPIOA_PIN6) | \
|
#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | PIN_AFIO_AF(GPIOA_PIN9, 0) | PIN_AFIO_AF(GPIOA_PIN10, 0) | PIN_AFIO_AF(GPIOA_USB_DM, 14) | PIN_AFIO_AF(GPIOA_USB_DP, 14) | PIN_AFIO_AF(GPIOA_SWDIO, 0) | PIN_AFIO_AF(GPIOA_SWCLK, 0) | PIN_AFIO_AF(GPIOA_PIN15, 0))
|
||||||
PIN_MODE_INPUT(GPIOA_PIN7) | \
|
|
||||||
PIN_MODE_INPUT(GPIOA_PIN8) | \
|
|
||||||
PIN_MODE_INPUT(GPIOA_PIN9) | \
|
|
||||||
PIN_MODE_INPUT(GPIOA_PIN10) | \
|
|
||||||
PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \
|
|
||||||
PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \
|
|
||||||
PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
|
|
||||||
PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
|
|
||||||
PIN_MODE_INPUT(GPIOA_PIN15))
|
|
||||||
#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
|
|
||||||
#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOA_PIN1) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOA_USB_DM) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOA_PIN15))
|
|
||||||
#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOA_PIN1) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOA_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
|
|
||||||
PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOA_PIN15))
|
|
||||||
#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN1) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN6) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN7) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN8) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN9) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN10) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_USB_DM) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_USB_DP) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_SWDIO) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_SWCLK) | \
|
|
||||||
PIN_ODR_HIGH(GPIOA_PIN15))
|
|
||||||
#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN1, 1) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN2, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN4, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN5, 5) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN6, 5) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN7, 5))
|
|
||||||
#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_USB_DM, 14) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_USB_DP, 14) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_SWDIO, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_SWCLK, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOA_PIN15, 0))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOB setup:
|
* GPIOB setup:
|
||||||
|
@ -361,102 +271,13 @@
|
||||||
* PB14 - PIN14 (input pullup).
|
* PB14 - PIN14 (input pullup).
|
||||||
* PB15 - PIN15 (input pullup).
|
* PB15 - PIN15 (input pullup).
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
|
#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | PIN_MODE_INPUT(GPIOB_PIN1) | PIN_MODE_INPUT(GPIOB_PIN2) | PIN_MODE_ALTERNATE(GPIOB_PIN3) | PIN_MODE_INPUT(GPIOB_PIN4) | PIN_MODE_INPUT(GPIOB_PIN5) | PIN_MODE_ALTERNATE(GPIOB_PIN6) | PIN_MODE_OUTPUT(GPIOB_PIN7) | PIN_MODE_INPUT(GPIOB_PIN8) | PIN_MODE_INPUT(GPIOB_PIN9) | PIN_MODE_INPUT(GPIOB_PIN10) | PIN_MODE_INPUT(GPIOB_PIN11) | PIN_MODE_INPUT(GPIOB_PIN12) | PIN_MODE_INPUT(GPIOB_PIN13) | PIN_MODE_INPUT(GPIOB_PIN14) | PIN_MODE_INPUT(GPIOB_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOB_PIN1) | \
|
#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | PIN_OTYPE_PUSHPULL(GPIOB_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOB_PIN2) | \
|
#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | PIN_OSPEED_VERYLOW(GPIOB_PIN1) | PIN_OSPEED_VERYLOW(GPIOB_PIN2) | PIN_OSPEED_HIGH(GPIOB_PIN3) | PIN_OSPEED_VERYLOW(GPIOB_PIN4) | PIN_OSPEED_VERYLOW(GPIOB_PIN5) | PIN_OSPEED_HIGH(GPIOB_PIN6) | PIN_OSPEED_VERYLOW(GPIOB_PIN7) | PIN_OSPEED_VERYLOW(GPIOB_PIN8) | PIN_OSPEED_VERYLOW(GPIOB_PIN9) | PIN_OSPEED_VERYLOW(GPIOB_PIN10) | PIN_OSPEED_VERYLOW(GPIOB_PIN11) | PIN_OSPEED_VERYLOW(GPIOB_PIN12) | PIN_OSPEED_VERYLOW(GPIOB_PIN13) | PIN_OSPEED_VERYLOW(GPIOB_PIN14) | PIN_OSPEED_VERYLOW(GPIOB_PIN15))
|
||||||
PIN_MODE_ALTERNATE(GPIOB_PIN3) | \
|
#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | PIN_PUPDR_PULLUP(GPIOB_PIN1) | PIN_PUPDR_PULLUP(GPIOB_PIN2) | PIN_PUPDR_FLOATING(GPIOB_PIN3) | PIN_PUPDR_PULLUP(GPIOB_PIN4) | PIN_PUPDR_PULLUP(GPIOB_PIN5) | PIN_PUPDR_FLOATING(GPIOB_PIN6) | PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | PIN_PUPDR_PULLUP(GPIOB_PIN8) | PIN_PUPDR_PULLUP(GPIOB_PIN9) | PIN_PUPDR_PULLUP(GPIOB_PIN10) | PIN_PUPDR_PULLUP(GPIOB_PIN11) | PIN_PUPDR_PULLUP(GPIOB_PIN12) | PIN_PUPDR_PULLUP(GPIOB_PIN13) | PIN_PUPDR_PULLUP(GPIOB_PIN14) | PIN_PUPDR_PULLUP(GPIOB_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOB_PIN4) | \
|
#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | PIN_ODR_HIGH(GPIOB_PIN1) | PIN_ODR_HIGH(GPIOB_PIN2) | PIN_ODR_HIGH(GPIOB_PIN3) | PIN_ODR_HIGH(GPIOB_PIN4) | PIN_ODR_HIGH(GPIOB_PIN5) | PIN_ODR_HIGH(GPIOB_PIN6) | PIN_ODR_LOW(GPIOB_PIN7) | PIN_ODR_HIGH(GPIOB_PIN8) | PIN_ODR_HIGH(GPIOB_PIN9) | PIN_ODR_HIGH(GPIOB_PIN10) | PIN_ODR_HIGH(GPIOB_PIN11) | PIN_ODR_HIGH(GPIOB_PIN12) | PIN_ODR_HIGH(GPIOB_PIN13) | PIN_ODR_HIGH(GPIOB_PIN14) | PIN_ODR_HIGH(GPIOB_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOB_PIN5) | \
|
#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | PIN_AFIO_AF(GPIOB_PIN1, 0) | PIN_AFIO_AF(GPIOB_PIN2, 0) | PIN_AFIO_AF(GPIOB_PIN3, 0) | PIN_AFIO_AF(GPIOB_PIN4, 0) | PIN_AFIO_AF(GPIOB_PIN5, 0) | PIN_AFIO_AF(GPIOB_PIN6, 4) | PIN_AFIO_AF(GPIOB_PIN7, 0))
|
||||||
PIN_MODE_ALTERNATE(GPIOB_PIN6) | \
|
#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | PIN_AFIO_AF(GPIOB_PIN9, 0) | PIN_AFIO_AF(GPIOB_PIN10, 0) | PIN_AFIO_AF(GPIOB_PIN11, 0) | PIN_AFIO_AF(GPIOB_PIN12, 0) | PIN_AFIO_AF(GPIOB_PIN13, 0) | PIN_AFIO_AF(GPIOB_PIN14, 0) | PIN_AFIO_AF(GPIOB_PIN15, 0))
|
||||||
PIN_MODE_OUTPUT(GPIOB_PIN7) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN8) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN9) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN10) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN11) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN12) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN13) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN14) | \
|
|
||||||
PIN_MODE_INPUT(GPIOB_PIN15))
|
|
||||||
#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
|
|
||||||
PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOB_PIN15))
|
|
||||||
#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN2) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOB_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOB_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN13) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN14) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOB_PIN15))
|
|
||||||
#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOB_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOB_PIN6) | \
|
|
||||||
PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN13) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN14) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOB_PIN15))
|
|
||||||
#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN1) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN6) | \
|
|
||||||
PIN_ODR_LOW(GPIOB_PIN7) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN8) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN9) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN10) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN11) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN12) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN13) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN14) | \
|
|
||||||
PIN_ODR_HIGH(GPIOB_PIN15))
|
|
||||||
#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN1, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN2, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN4, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN5, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN6, 4) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN7, 0))
|
|
||||||
#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN11, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN12, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN13, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN14, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOB_PIN15, 0))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOC setup:
|
* GPIOC setup:
|
||||||
|
@ -478,102 +299,13 @@
|
||||||
* PC14 - PIN14 (input floating).
|
* PC14 - PIN14 (input floating).
|
||||||
* PC15 - PIN15 (input floating).
|
* PC15 - PIN15 (input floating).
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \
|
#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | PIN_MODE_INPUT(GPIOC_PIN1) | PIN_MODE_INPUT(GPIOC_PIN2) | PIN_MODE_INPUT(GPIOC_PIN3) | PIN_MODE_INPUT(GPIOC_PIN4) | PIN_MODE_INPUT(GPIOC_PIN5) | PIN_MODE_INPUT(GPIOC_PIN6) | PIN_MODE_INPUT(GPIOC_PIN7) | PIN_MODE_INPUT(GPIOC_PIN8) | PIN_MODE_INPUT(GPIOC_PIN9) | PIN_MODE_INPUT(GPIOC_PIN10) | PIN_MODE_INPUT(GPIOC_PIN11) | PIN_MODE_INPUT(GPIOC_PIN12) | PIN_MODE_INPUT(GPIOC_PIN13) | PIN_MODE_INPUT(GPIOC_PIN14) | PIN_MODE_INPUT(GPIOC_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOC_PIN1) | \
|
#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | PIN_OTYPE_PUSHPULL(GPIOC_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOC_PIN2) | \
|
#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | PIN_OSPEED_VERYLOW(GPIOC_PIN1) | PIN_OSPEED_VERYLOW(GPIOC_PIN2) | PIN_OSPEED_VERYLOW(GPIOC_PIN3) | PIN_OSPEED_VERYLOW(GPIOC_PIN4) | PIN_OSPEED_VERYLOW(GPIOC_PIN5) | PIN_OSPEED_VERYLOW(GPIOC_PIN6) | PIN_OSPEED_VERYLOW(GPIOC_PIN7) | PIN_OSPEED_VERYLOW(GPIOC_PIN8) | PIN_OSPEED_VERYLOW(GPIOC_PIN9) | PIN_OSPEED_VERYLOW(GPIOC_PIN10) | PIN_OSPEED_VERYLOW(GPIOC_PIN11) | PIN_OSPEED_VERYLOW(GPIOC_PIN12) | PIN_OSPEED_VERYLOW(GPIOC_PIN13) | PIN_OSPEED_HIGH(GPIOC_PIN14) | PIN_OSPEED_HIGH(GPIOC_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOC_PIN3) | \
|
#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | PIN_PUPDR_PULLUP(GPIOC_PIN1) | PIN_PUPDR_PULLUP(GPIOC_PIN2) | PIN_PUPDR_PULLUP(GPIOC_PIN3) | PIN_PUPDR_PULLUP(GPIOC_PIN4) | PIN_PUPDR_PULLUP(GPIOC_PIN5) | PIN_PUPDR_PULLUP(GPIOC_PIN6) | PIN_PUPDR_PULLUP(GPIOC_PIN7) | PIN_PUPDR_PULLUP(GPIOC_PIN8) | PIN_PUPDR_PULLUP(GPIOC_PIN9) | PIN_PUPDR_PULLUP(GPIOC_PIN10) | PIN_PUPDR_PULLUP(GPIOC_PIN11) | PIN_PUPDR_PULLUP(GPIOC_PIN12) | PIN_PUPDR_PULLUP(GPIOC_PIN13) | PIN_PUPDR_FLOATING(GPIOC_PIN14) | PIN_PUPDR_FLOATING(GPIOC_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOC_PIN4) | \
|
#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | PIN_ODR_HIGH(GPIOC_PIN1) | PIN_ODR_HIGH(GPIOC_PIN2) | PIN_ODR_HIGH(GPIOC_PIN3) | PIN_ODR_HIGH(GPIOC_PIN4) | PIN_ODR_HIGH(GPIOC_PIN5) | PIN_ODR_HIGH(GPIOC_PIN6) | PIN_ODR_HIGH(GPIOC_PIN7) | PIN_ODR_HIGH(GPIOC_PIN8) | PIN_ODR_HIGH(GPIOC_PIN9) | PIN_ODR_HIGH(GPIOC_PIN10) | PIN_ODR_HIGH(GPIOC_PIN11) | PIN_ODR_HIGH(GPIOC_PIN12) | PIN_ODR_HIGH(GPIOC_PIN13) | PIN_ODR_HIGH(GPIOC_PIN14) | PIN_ODR_HIGH(GPIOC_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOC_PIN5) | \
|
#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | PIN_AFIO_AF(GPIOC_PIN1, 0) | PIN_AFIO_AF(GPIOC_PIN2, 0) | PIN_AFIO_AF(GPIOC_PIN3, 0) | PIN_AFIO_AF(GPIOC_PIN4, 0) | PIN_AFIO_AF(GPIOC_PIN5, 0) | PIN_AFIO_AF(GPIOC_PIN6, 0) | PIN_AFIO_AF(GPIOC_PIN7, 0))
|
||||||
PIN_MODE_INPUT(GPIOC_PIN6) | \
|
#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | PIN_AFIO_AF(GPIOC_PIN9, 0) | PIN_AFIO_AF(GPIOC_PIN10, 0) | PIN_AFIO_AF(GPIOC_PIN11, 0) | PIN_AFIO_AF(GPIOC_PIN12, 0) | PIN_AFIO_AF(GPIOC_PIN13, 0) | PIN_AFIO_AF(GPIOC_PIN14, 0) | PIN_AFIO_AF(GPIOC_PIN15, 0))
|
||||||
PIN_MODE_INPUT(GPIOC_PIN7) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN8) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN9) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN10) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN11) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN12) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN13) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN14) | \
|
|
||||||
PIN_MODE_INPUT(GPIOC_PIN15))
|
|
||||||
#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOC_PIN15))
|
|
||||||
#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN7) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN8) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN9) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOC_PIN14) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOC_PIN15))
|
|
||||||
#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN6) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOC_PIN14) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOC_PIN15))
|
|
||||||
#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN1) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN6) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN7) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN8) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN9) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN10) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN11) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN12) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN13) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN14) | \
|
|
||||||
PIN_ODR_HIGH(GPIOC_PIN15))
|
|
||||||
#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN1, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN2, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN4, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN5, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN6, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN7, 0))
|
|
||||||
#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN11, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN12, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN13, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN14, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOC_PIN15, 0))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOD setup:
|
* GPIOD setup:
|
||||||
|
@ -595,102 +327,13 @@
|
||||||
* PD14 - PIN14 (input pullup).
|
* PD14 - PIN14 (input pullup).
|
||||||
* PD15 - PIN15 (input pullup).
|
* PD15 - PIN15 (input pullup).
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
|
#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | PIN_MODE_INPUT(GPIOD_PIN1) | PIN_MODE_INPUT(GPIOD_PIN2) | PIN_MODE_INPUT(GPIOD_PIN3) | PIN_MODE_INPUT(GPIOD_PIN4) | PIN_MODE_INPUT(GPIOD_PIN5) | PIN_MODE_INPUT(GPIOD_PIN6) | PIN_MODE_INPUT(GPIOD_PIN7) | PIN_MODE_INPUT(GPIOD_PIN8) | PIN_MODE_INPUT(GPIOD_PIN9) | PIN_MODE_INPUT(GPIOD_PIN10) | PIN_MODE_INPUT(GPIOD_PIN11) | PIN_MODE_INPUT(GPIOD_PIN12) | PIN_MODE_INPUT(GPIOD_PIN13) | PIN_MODE_INPUT(GPIOD_PIN14) | PIN_MODE_INPUT(GPIOD_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOD_PIN1) | \
|
#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOD_PIN2) | \
|
#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | PIN_OSPEED_VERYLOW(GPIOD_PIN1) | PIN_OSPEED_VERYLOW(GPIOD_PIN2) | PIN_OSPEED_VERYLOW(GPIOD_PIN3) | PIN_OSPEED_VERYLOW(GPIOD_PIN4) | PIN_OSPEED_VERYLOW(GPIOD_PIN5) | PIN_OSPEED_VERYLOW(GPIOD_PIN6) | PIN_OSPEED_VERYLOW(GPIOD_PIN7) | PIN_OSPEED_VERYLOW(GPIOD_PIN8) | PIN_OSPEED_VERYLOW(GPIOD_PIN9) | PIN_OSPEED_VERYLOW(GPIOD_PIN10) | PIN_OSPEED_VERYLOW(GPIOD_PIN11) | PIN_OSPEED_VERYLOW(GPIOD_PIN12) | PIN_OSPEED_VERYLOW(GPIOD_PIN13) | PIN_OSPEED_VERYLOW(GPIOD_PIN14) | PIN_OSPEED_VERYLOW(GPIOD_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOD_PIN3) | \
|
#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | PIN_PUPDR_PULLUP(GPIOD_PIN1) | PIN_PUPDR_PULLUP(GPIOD_PIN2) | PIN_PUPDR_PULLUP(GPIOD_PIN3) | PIN_PUPDR_PULLUP(GPIOD_PIN4) | PIN_PUPDR_PULLUP(GPIOD_PIN5) | PIN_PUPDR_PULLUP(GPIOD_PIN6) | PIN_PUPDR_PULLUP(GPIOD_PIN7) | PIN_PUPDR_PULLUP(GPIOD_PIN8) | PIN_PUPDR_PULLUP(GPIOD_PIN9) | PIN_PUPDR_PULLUP(GPIOD_PIN10) | PIN_PUPDR_PULLUP(GPIOD_PIN11) | PIN_PUPDR_PULLUP(GPIOD_PIN12) | PIN_PUPDR_PULLUP(GPIOD_PIN13) | PIN_PUPDR_PULLUP(GPIOD_PIN14) | PIN_PUPDR_PULLUP(GPIOD_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOD_PIN4) | \
|
#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | PIN_ODR_HIGH(GPIOD_PIN1) | PIN_ODR_HIGH(GPIOD_PIN2) | PIN_ODR_HIGH(GPIOD_PIN3) | PIN_ODR_HIGH(GPIOD_PIN4) | PIN_ODR_HIGH(GPIOD_PIN5) | PIN_ODR_HIGH(GPIOD_PIN6) | PIN_ODR_HIGH(GPIOD_PIN7) | PIN_ODR_HIGH(GPIOD_PIN8) | PIN_ODR_HIGH(GPIOD_PIN9) | PIN_ODR_HIGH(GPIOD_PIN10) | PIN_ODR_HIGH(GPIOD_PIN11) | PIN_ODR_HIGH(GPIOD_PIN12) | PIN_ODR_HIGH(GPIOD_PIN13) | PIN_ODR_HIGH(GPIOD_PIN14) | PIN_ODR_HIGH(GPIOD_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOD_PIN5) | \
|
#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | PIN_AFIO_AF(GPIOD_PIN1, 0) | PIN_AFIO_AF(GPIOD_PIN2, 0) | PIN_AFIO_AF(GPIOD_PIN3, 0) | PIN_AFIO_AF(GPIOD_PIN4, 0) | PIN_AFIO_AF(GPIOD_PIN5, 0) | PIN_AFIO_AF(GPIOD_PIN6, 0) | PIN_AFIO_AF(GPIOD_PIN7, 0))
|
||||||
PIN_MODE_INPUT(GPIOD_PIN6) | \
|
#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | PIN_AFIO_AF(GPIOD_PIN9, 0) | PIN_AFIO_AF(GPIOD_PIN10, 0) | PIN_AFIO_AF(GPIOD_PIN11, 0) | PIN_AFIO_AF(GPIOD_PIN12, 0) | PIN_AFIO_AF(GPIOD_PIN13, 0) | PIN_AFIO_AF(GPIOD_PIN14, 0) | PIN_AFIO_AF(GPIOD_PIN15, 0))
|
||||||
PIN_MODE_INPUT(GPIOD_PIN7) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN8) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN9) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN10) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN11) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN12) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN13) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN14) | \
|
|
||||||
PIN_MODE_INPUT(GPIOD_PIN15))
|
|
||||||
#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
|
|
||||||
#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOD_PIN15))
|
|
||||||
#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOD_PIN15))
|
|
||||||
#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN1) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN6) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN7) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN8) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN9) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN10) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN11) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN12) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN13) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN14) | \
|
|
||||||
PIN_ODR_HIGH(GPIOD_PIN15))
|
|
||||||
#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN1, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN2, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN4, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN5, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN6, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN7, 0))
|
|
||||||
#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN11, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN12, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN13, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN14, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOD_PIN15, 0))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOE setup:
|
* GPIOE setup:
|
||||||
|
@ -712,102 +355,13 @@
|
||||||
* PE14 - PIN14 (output pushpull maximum).
|
* PE14 - PIN14 (output pushpull maximum).
|
||||||
* PE15 - PIN15 (output pushpull maximum).
|
* PE15 - PIN15 (output pushpull maximum).
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
|
#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | PIN_MODE_INPUT(GPIOE_PIN1) | PIN_MODE_INPUT(GPIOE_PIN2) | PIN_MODE_OUTPUT(GPIOE_PIN3) | PIN_MODE_INPUT(GPIOE_PIN4) | PIN_MODE_INPUT(GPIOE_PIN5) | PIN_MODE_INPUT(GPIOE_PIN6) | PIN_MODE_INPUT(GPIOE_PIN7) | PIN_MODE_OUTPUT(GPIOE_PIN8) | PIN_MODE_OUTPUT(GPIOE_PIN9) | PIN_MODE_OUTPUT(GPIOE_PIN10) | PIN_MODE_OUTPUT(GPIOE_PIN11) | PIN_MODE_OUTPUT(GPIOE_PIN12) | PIN_MODE_OUTPUT(GPIOE_PIN13) | PIN_MODE_OUTPUT(GPIOE_PIN14) | PIN_MODE_OUTPUT(GPIOE_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOE_PIN1) | \
|
#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOE_PIN2) |\
|
#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | PIN_OSPEED_VERYLOW(GPIOE_PIN1) | PIN_OSPEED_VERYLOW(GPIOE_PIN2) | PIN_OSPEED_HIGH(GPIOE_PIN3) | PIN_OSPEED_VERYLOW(GPIOE_PIN4) | PIN_OSPEED_VERYLOW(GPIOE_PIN5) | PIN_OSPEED_VERYLOW(GPIOE_PIN6) | PIN_OSPEED_VERYLOW(GPIOE_PIN7) | PIN_OSPEED_HIGH(GPIOE_PIN8) | PIN_OSPEED_HIGH(GPIOE_PIN9) | PIN_OSPEED_HIGH(GPIOE_PIN10) | PIN_OSPEED_HIGH(GPIOE_PIN11) | PIN_OSPEED_HIGH(GPIOE_PIN12) | PIN_OSPEED_HIGH(GPIOE_PIN13) | PIN_OSPEED_HIGH(GPIOE_PIN14) | PIN_OSPEED_HIGH(GPIOE_PIN15))
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN3) | \
|
#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | PIN_PUPDR_PULLUP(GPIOE_PIN1) | PIN_PUPDR_PULLUP(GPIOE_PIN2) | PIN_PUPDR_FLOATING(GPIOE_PIN3) | PIN_PUPDR_PULLUP(GPIOE_PIN4) | PIN_PUPDR_PULLUP(GPIOE_PIN5) | PIN_PUPDR_PULLUP(GPIOE_PIN6) | PIN_PUPDR_PULLUP(GPIOE_PIN7) | PIN_PUPDR_PULLUP(GPIOE_PIN8) | PIN_PUPDR_PULLUP(GPIOE_PIN9) | PIN_PUPDR_PULLUP(GPIOE_PIN10) | PIN_PUPDR_FLOATING(GPIOE_PIN11) | PIN_PUPDR_PULLUP(GPIOE_PIN12) | PIN_PUPDR_FLOATING(GPIOE_PIN13) | PIN_PUPDR_FLOATING(GPIOE_PIN14) | PIN_PUPDR_FLOATING(GPIOE_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOE_PIN4) |\
|
#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | PIN_ODR_HIGH(GPIOE_PIN1) | PIN_ODR_HIGH(GPIOE_PIN2) | PIN_ODR_HIGH(GPIOE_PIN3) | PIN_ODR_HIGH(GPIOE_PIN4) | PIN_ODR_HIGH(GPIOE_PIN5) | PIN_ODR_HIGH(GPIOE_PIN6) | PIN_ODR_HIGH(GPIOE_PIN7) | PIN_ODR_LOW(GPIOE_PIN8) | PIN_ODR_LOW(GPIOE_PIN9) | PIN_ODR_LOW(GPIOE_PIN10) | PIN_ODR_LOW(GPIOE_PIN11) | PIN_ODR_LOW(GPIOE_PIN12) | PIN_ODR_LOW(GPIOE_PIN13) | PIN_ODR_LOW(GPIOE_PIN14) | PIN_ODR_LOW(GPIOE_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOE_PIN5) |\
|
#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | PIN_AFIO_AF(GPIOE_PIN1, 0) | PIN_AFIO_AF(GPIOE_PIN2, 0) | PIN_AFIO_AF(GPIOE_PIN3, 0) | PIN_AFIO_AF(GPIOE_PIN4, 0) | PIN_AFIO_AF(GPIOE_PIN5, 0) | PIN_AFIO_AF(GPIOE_PIN6, 0) | PIN_AFIO_AF(GPIOE_PIN7, 0))
|
||||||
PIN_MODE_INPUT(GPIOE_PIN6) | \
|
#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | PIN_AFIO_AF(GPIOE_PIN9, 0) | PIN_AFIO_AF(GPIOE_PIN10, 0) | PIN_AFIO_AF(GPIOE_PIN11, 0) | PIN_AFIO_AF(GPIOE_PIN12, 0) | PIN_AFIO_AF(GPIOE_PIN13, 0) | PIN_AFIO_AF(GPIOE_PIN14, 0) | PIN_AFIO_AF(GPIOE_PIN15, 0))
|
||||||
PIN_MODE_INPUT(GPIOE_PIN7) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN8) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN9) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN10) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN11) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN12) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN13) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN14) | \
|
|
||||||
PIN_MODE_OUTPUT(GPIOE_PIN15))
|
|
||||||
#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |\
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |\
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN2) |\
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN4) |\
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN5) |\
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN10) |\
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN14) |\
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
|
|
||||||
#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) |\
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOE_PIN1) |\
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOE_PIN2) |\
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOE_PIN4) |\
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOE_PIN5) |\
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN8) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN9) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN10) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN11) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN12) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN13) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN14) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOE_PIN15))
|
|
||||||
#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN2) |\
|
|
||||||
PIN_PUPDR_FLOATING(GPIOE_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN4) |\
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN5) |\
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOE_PIN11) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOE_PIN13) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOE_PIN14) |\
|
|
||||||
PIN_PUPDR_FLOATING(GPIOE_PIN15))
|
|
||||||
#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
|
|
||||||
PIN_ODR_HIGH(GPIOE_PIN1) | \
|
|
||||||
PIN_ODR_HIGH(GPIOE_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOE_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOE_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOE_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOE_PIN6) | \
|
|
||||||
PIN_ODR_HIGH(GPIOE_PIN7) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN8) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN9) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN10) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN11) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN12) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN13) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN14) | \
|
|
||||||
PIN_ODR_LOW(GPIOE_PIN15))
|
|
||||||
#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN1, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN2, 0) |\
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN4, 0) |\
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN5, 0) |\
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN6, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN7, 0))
|
|
||||||
#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN11, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN12, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN13, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN14, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOE_PIN15, 0))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOF setup:
|
* GPIOF setup:
|
||||||
|
@ -829,102 +383,13 @@
|
||||||
* PF14 - PIN14 (input pullup).
|
* PF14 - PIN14 (input pullup).
|
||||||
* PF15 - PIN15 (input pullup).
|
* PF15 - PIN15 (input pullup).
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | \
|
#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | PIN_MODE_INPUT(GPIOF_I2C2_SCL) | PIN_MODE_INPUT(GPIOF_PIN2) | PIN_MODE_INPUT(GPIOF_PIN3) | PIN_MODE_INPUT(GPIOF_PIN4) | PIN_MODE_INPUT(GPIOF_PIN5) | PIN_MODE_INPUT(GPIOF_PIN6) | PIN_MODE_INPUT(GPIOF_PIN7) | PIN_MODE_INPUT(GPIOF_PIN8) | PIN_MODE_INPUT(GPIOF_PIN9) | PIN_MODE_INPUT(GPIOF_PIN10) | PIN_MODE_INPUT(GPIOF_PIN11) | PIN_MODE_INPUT(GPIOF_PIN12) | PIN_MODE_INPUT(GPIOF_PIN13) | PIN_MODE_INPUT(GPIOF_PIN14) | PIN_MODE_INPUT(GPIOF_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOF_I2C2_SCL) | \
|
#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOF_PIN2) | \
|
#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | PIN_OSPEED_VERYLOW(GPIOF_PIN2) | PIN_OSPEED_VERYLOW(GPIOF_PIN3) | PIN_OSPEED_VERYLOW(GPIOF_PIN4) | PIN_OSPEED_VERYLOW(GPIOF_PIN5) | PIN_OSPEED_VERYLOW(GPIOF_PIN6) | PIN_OSPEED_VERYLOW(GPIOF_PIN7) | PIN_OSPEED_VERYLOW(GPIOF_PIN8) | PIN_OSPEED_VERYLOW(GPIOF_PIN9) | PIN_OSPEED_VERYLOW(GPIOF_PIN10) | PIN_OSPEED_VERYLOW(GPIOF_PIN11) | PIN_OSPEED_VERYLOW(GPIOF_PIN12) | PIN_OSPEED_VERYLOW(GPIOF_PIN13) | PIN_OSPEED_VERYLOW(GPIOF_PIN14) | PIN_OSPEED_VERYLOW(GPIOF_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOF_PIN3) | \
|
#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | PIN_PUPDR_PULLUP(GPIOF_PIN2) | PIN_PUPDR_PULLUP(GPIOF_PIN3) | PIN_PUPDR_PULLUP(GPIOF_PIN4) | PIN_PUPDR_PULLUP(GPIOF_PIN5) | PIN_PUPDR_PULLUP(GPIOF_PIN6) | PIN_PUPDR_PULLUP(GPIOF_PIN7) | PIN_PUPDR_PULLUP(GPIOF_PIN8) | PIN_PUPDR_PULLUP(GPIOF_PIN9) | PIN_PUPDR_PULLUP(GPIOF_PIN10) | PIN_PUPDR_PULLUP(GPIOF_PIN11) | PIN_PUPDR_PULLUP(GPIOF_PIN12) | PIN_PUPDR_PULLUP(GPIOF_PIN13) | PIN_PUPDR_PULLUP(GPIOF_PIN14) | PIN_PUPDR_PULLUP(GPIOF_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOF_PIN4) | \
|
#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | PIN_ODR_HIGH(GPIOF_I2C2_SCL) | PIN_ODR_HIGH(GPIOF_PIN2) | PIN_ODR_HIGH(GPIOF_PIN3) | PIN_ODR_HIGH(GPIOF_PIN4) | PIN_ODR_HIGH(GPIOF_PIN5) | PIN_ODR_HIGH(GPIOF_PIN6) | PIN_ODR_HIGH(GPIOF_PIN7) | PIN_ODR_HIGH(GPIOF_PIN8) | PIN_ODR_HIGH(GPIOF_PIN9) | PIN_ODR_HIGH(GPIOF_PIN10) | PIN_ODR_HIGH(GPIOF_PIN11) | PIN_ODR_HIGH(GPIOF_PIN12) | PIN_ODR_HIGH(GPIOF_PIN13) | PIN_ODR_HIGH(GPIOF_PIN14) | PIN_ODR_HIGH(GPIOF_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOF_PIN5) | \
|
#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | PIN_AFIO_AF(GPIOF_PIN2, 0) | PIN_AFIO_AF(GPIOF_PIN3, 0) | PIN_AFIO_AF(GPIOF_PIN4, 0) | PIN_AFIO_AF(GPIOF_PIN5, 0) | PIN_AFIO_AF(GPIOF_PIN6, 0) | PIN_AFIO_AF(GPIOF_PIN7, 0))
|
||||||
PIN_MODE_INPUT(GPIOF_PIN6) | \
|
#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | PIN_AFIO_AF(GPIOF_PIN9, 0) | PIN_AFIO_AF(GPIOF_PIN10, 0) | PIN_AFIO_AF(GPIOF_PIN11, 0) | PIN_AFIO_AF(GPIOF_PIN12, 0) | PIN_AFIO_AF(GPIOF_PIN13, 0) | PIN_AFIO_AF(GPIOF_PIN14, 0) | PIN_AFIO_AF(GPIOF_PIN15, 0))
|
||||||
PIN_MODE_INPUT(GPIOF_PIN7) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN8) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN9) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN10) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN11) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN12) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN13) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN14) | \
|
|
||||||
PIN_MODE_INPUT(GPIOF_PIN15))
|
|
||||||
#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
|
|
||||||
#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | \
|
|
||||||
PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOF_PIN15))
|
|
||||||
#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | \
|
|
||||||
PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOF_PIN15))
|
|
||||||
#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_I2C2_SCL) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN6) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN7) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN8) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN9) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN10) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN11) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN12) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN13) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN14) | \
|
|
||||||
PIN_ODR_HIGH(GPIOF_PIN15))
|
|
||||||
#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN2, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN4, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN5, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN6, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN7, 0))
|
|
||||||
#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN11, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN12, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN13, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN14, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOF_PIN15, 0))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOG setup:
|
* GPIOG setup:
|
||||||
|
@ -946,102 +411,13 @@
|
||||||
* PG14 - PIN14 (input pullup).
|
* PG14 - PIN14 (input pullup).
|
||||||
* PG15 - PIN15 (input pullup).
|
* PG15 - PIN15 (input pullup).
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \
|
#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | PIN_MODE_INPUT(GPIOG_PIN1) | PIN_MODE_INPUT(GPIOG_PIN2) | PIN_MODE_INPUT(GPIOG_PIN3) | PIN_MODE_INPUT(GPIOG_PIN4) | PIN_MODE_INPUT(GPIOG_PIN5) | PIN_MODE_INPUT(GPIOG_PIN6) | PIN_MODE_INPUT(GPIOG_PIN7) | PIN_MODE_INPUT(GPIOG_PIN8) | PIN_MODE_INPUT(GPIOG_PIN9) | PIN_MODE_INPUT(GPIOG_PIN10) | PIN_MODE_INPUT(GPIOG_PIN11) | PIN_MODE_INPUT(GPIOG_PIN12) | PIN_MODE_INPUT(GPIOG_PIN13) | PIN_MODE_INPUT(GPIOG_PIN14) | PIN_MODE_INPUT(GPIOG_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOG_PIN1) | \
|
#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | PIN_OTYPE_PUSHPULL(GPIOG_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOG_PIN2) | \
|
#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | PIN_OSPEED_VERYLOW(GPIOG_PIN1) | PIN_OSPEED_VERYLOW(GPIOG_PIN2) | PIN_OSPEED_VERYLOW(GPIOG_PIN3) | PIN_OSPEED_VERYLOW(GPIOG_PIN4) | PIN_OSPEED_VERYLOW(GPIOG_PIN5) | PIN_OSPEED_VERYLOW(GPIOG_PIN6) | PIN_OSPEED_VERYLOW(GPIOG_PIN7) | PIN_OSPEED_VERYLOW(GPIOG_PIN8) | PIN_OSPEED_VERYLOW(GPIOG_PIN9) | PIN_OSPEED_VERYLOW(GPIOG_PIN10) | PIN_OSPEED_VERYLOW(GPIOG_PIN11) | PIN_OSPEED_VERYLOW(GPIOG_PIN12) | PIN_OSPEED_VERYLOW(GPIOG_PIN13) | PIN_OSPEED_VERYLOW(GPIOG_PIN14) | PIN_OSPEED_VERYLOW(GPIOG_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOG_PIN3) | \
|
#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | PIN_PUPDR_PULLUP(GPIOG_PIN1) | PIN_PUPDR_PULLUP(GPIOG_PIN2) | PIN_PUPDR_PULLUP(GPIOG_PIN3) | PIN_PUPDR_PULLUP(GPIOG_PIN4) | PIN_PUPDR_PULLUP(GPIOG_PIN5) | PIN_PUPDR_PULLUP(GPIOG_PIN6) | PIN_PUPDR_PULLUP(GPIOG_PIN7) | PIN_PUPDR_PULLUP(GPIOG_PIN8) | PIN_PUPDR_PULLUP(GPIOG_PIN9) | PIN_PUPDR_PULLUP(GPIOG_PIN10) | PIN_PUPDR_PULLUP(GPIOG_PIN11) | PIN_PUPDR_PULLUP(GPIOG_PIN12) | PIN_PUPDR_PULLUP(GPIOG_PIN13) | PIN_PUPDR_PULLUP(GPIOG_PIN14) | PIN_PUPDR_PULLUP(GPIOG_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOG_PIN4) | \
|
#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | PIN_ODR_HIGH(GPIOG_PIN1) | PIN_ODR_HIGH(GPIOG_PIN2) | PIN_ODR_HIGH(GPIOG_PIN3) | PIN_ODR_HIGH(GPIOG_PIN4) | PIN_ODR_HIGH(GPIOG_PIN5) | PIN_ODR_HIGH(GPIOG_PIN6) | PIN_ODR_HIGH(GPIOG_PIN7) | PIN_ODR_HIGH(GPIOG_PIN8) | PIN_ODR_HIGH(GPIOG_PIN9) | PIN_ODR_HIGH(GPIOG_PIN10) | PIN_ODR_HIGH(GPIOG_PIN11) | PIN_ODR_HIGH(GPIOG_PIN12) | PIN_ODR_HIGH(GPIOG_PIN13) | PIN_ODR_HIGH(GPIOG_PIN14) | PIN_ODR_HIGH(GPIOG_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOG_PIN5) | \
|
#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | PIN_AFIO_AF(GPIOG_PIN1, 0) | PIN_AFIO_AF(GPIOG_PIN2, 0) | PIN_AFIO_AF(GPIOG_PIN3, 0) | PIN_AFIO_AF(GPIOG_PIN4, 0) | PIN_AFIO_AF(GPIOG_PIN5, 0) | PIN_AFIO_AF(GPIOG_PIN6, 0) | PIN_AFIO_AF(GPIOG_PIN7, 0))
|
||||||
PIN_MODE_INPUT(GPIOG_PIN6) | \
|
#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | PIN_AFIO_AF(GPIOG_PIN9, 0) | PIN_AFIO_AF(GPIOG_PIN10, 0) | PIN_AFIO_AF(GPIOG_PIN11, 0) | PIN_AFIO_AF(GPIOG_PIN12, 0) | PIN_AFIO_AF(GPIOG_PIN13, 0) | PIN_AFIO_AF(GPIOG_PIN14, 0) | PIN_AFIO_AF(GPIOG_PIN15, 0))
|
||||||
PIN_MODE_INPUT(GPIOG_PIN7) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN8) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN9) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN10) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN11) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN12) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN13) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN14) | \
|
|
||||||
PIN_MODE_INPUT(GPIOG_PIN15))
|
|
||||||
#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOG_PIN15))
|
|
||||||
#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN1) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN2) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN4) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN5) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN7) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN8) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN9) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN10) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN11) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN12) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN13) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN14) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOG_PIN15))
|
|
||||||
#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN1) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN2) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN4) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN5) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN6) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN10) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN11) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN12) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN13) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN14) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOG_PIN15))
|
|
||||||
#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN1) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN6) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN7) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN8) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN9) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN10) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN11) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN12) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN13) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN14) | \
|
|
||||||
PIN_ODR_HIGH(GPIOG_PIN15))
|
|
||||||
#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN1, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN2, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN4, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN5, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN6, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN7, 0))
|
|
||||||
#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN11, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN12, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN13, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN14, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOG_PIN15, 0))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIOH setup:
|
* GPIOH setup:
|
||||||
|
@ -1063,103 +439,13 @@
|
||||||
* PH14 - PIN14 (input pullup).
|
* PH14 - PIN14 (input pullup).
|
||||||
* PH15 - PIN15 (input pullup).
|
* PH15 - PIN15 (input pullup).
|
||||||
*/
|
*/
|
||||||
#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | \
|
#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | PIN_MODE_INPUT(GPIOH_PIN1) | PIN_MODE_INPUT(GPIOH_PIN2) | PIN_MODE_INPUT(GPIOH_PIN3) | PIN_MODE_INPUT(GPIOH_PIN4) | PIN_MODE_INPUT(GPIOH_PIN5) | PIN_MODE_INPUT(GPIOH_PIN6) | PIN_MODE_INPUT(GPIOH_PIN7) | PIN_MODE_INPUT(GPIOH_PIN8) | PIN_MODE_INPUT(GPIOH_PIN9) | PIN_MODE_INPUT(GPIOH_PIN10) | PIN_MODE_INPUT(GPIOH_PIN11) | PIN_MODE_INPUT(GPIOH_PIN12) | PIN_MODE_INPUT(GPIOH_PIN13) | PIN_MODE_INPUT(GPIOH_PIN14) | PIN_MODE_INPUT(GPIOH_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOH_PIN1) | \
|
#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | PIN_OTYPE_PUSHPULL(GPIOH_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOH_PIN2) | \
|
#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | PIN_OSPEED_VERYLOW(GPIOH_PIN1) | PIN_OSPEED_VERYLOW(GPIOH_PIN2) | PIN_OSPEED_VERYLOW(GPIOH_PIN3) | PIN_OSPEED_VERYLOW(GPIOH_PIN4) | PIN_OSPEED_VERYLOW(GPIOH_PIN5) | PIN_OSPEED_VERYLOW(GPIOH_PIN6) | PIN_OSPEED_VERYLOW(GPIOH_PIN7) | PIN_OSPEED_VERYLOW(GPIOH_PIN8) | PIN_OSPEED_VERYLOW(GPIOH_PIN9) | PIN_OSPEED_VERYLOW(GPIOH_PIN10) | PIN_OSPEED_VERYLOW(GPIOH_PIN11) | PIN_OSPEED_VERYLOW(GPIOH_PIN12) | PIN_OSPEED_VERYLOW(GPIOH_PIN13) | PIN_OSPEED_VERYLOW(GPIOH_PIN14) | PIN_OSPEED_VERYLOW(GPIOH_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOH_PIN3) | \
|
#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | PIN_PUPDR_PULLUP(GPIOH_PIN1) | PIN_PUPDR_PULLUP(GPIOH_PIN2) | PIN_PUPDR_PULLUP(GPIOH_PIN3) | PIN_PUPDR_PULLUP(GPIOH_PIN4) | PIN_PUPDR_PULLUP(GPIOH_PIN5) | PIN_PUPDR_PULLUP(GPIOH_PIN6) | PIN_PUPDR_PULLUP(GPIOH_PIN7) | PIN_PUPDR_PULLUP(GPIOH_PIN8) | PIN_PUPDR_PULLUP(GPIOH_PIN9) | PIN_PUPDR_PULLUP(GPIOH_PIN10) | PIN_PUPDR_PULLUP(GPIOH_PIN11) | PIN_PUPDR_PULLUP(GPIOH_PIN12) | PIN_PUPDR_PULLUP(GPIOH_PIN13) | PIN_PUPDR_PULLUP(GPIOH_PIN14) | PIN_PUPDR_PULLUP(GPIOH_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOH_PIN4) | \
|
#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | PIN_ODR_HIGH(GPIOH_PIN1) | PIN_ODR_HIGH(GPIOH_PIN2) | PIN_ODR_HIGH(GPIOH_PIN3) | PIN_ODR_HIGH(GPIOH_PIN4) | PIN_ODR_HIGH(GPIOH_PIN5) | PIN_ODR_HIGH(GPIOH_PIN6) | PIN_ODR_HIGH(GPIOH_PIN7) | PIN_ODR_HIGH(GPIOH_PIN8) | PIN_ODR_HIGH(GPIOH_PIN9) | PIN_ODR_HIGH(GPIOH_PIN10) | PIN_ODR_HIGH(GPIOH_PIN11) | PIN_ODR_HIGH(GPIOH_PIN12) | PIN_ODR_HIGH(GPIOH_PIN13) | PIN_ODR_HIGH(GPIOH_PIN14) | PIN_ODR_HIGH(GPIOH_PIN15))
|
||||||
PIN_MODE_INPUT(GPIOH_PIN5) | \
|
#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | PIN_AFIO_AF(GPIOH_PIN1, 0) | PIN_AFIO_AF(GPIOH_PIN2, 0) | PIN_AFIO_AF(GPIOH_PIN3, 0) | PIN_AFIO_AF(GPIOH_PIN4, 0) | PIN_AFIO_AF(GPIOH_PIN5, 0) | PIN_AFIO_AF(GPIOH_PIN6, 0) | PIN_AFIO_AF(GPIOH_PIN7, 0))
|
||||||
PIN_MODE_INPUT(GPIOH_PIN6) | \
|
#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | PIN_AFIO_AF(GPIOH_PIN9, 0) | PIN_AFIO_AF(GPIOH_PIN10, 0) | PIN_AFIO_AF(GPIOH_PIN11, 0) | PIN_AFIO_AF(GPIOH_PIN12, 0) | PIN_AFIO_AF(GPIOH_PIN13, 0) | PIN_AFIO_AF(GPIOH_PIN14, 0) | PIN_AFIO_AF(GPIOH_PIN15, 0))
|
||||||
PIN_MODE_INPUT(GPIOH_PIN7) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN8) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN9) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN10) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN11) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN12) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN13) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN14) | \
|
|
||||||
PIN_MODE_INPUT(GPIOH_PIN15))
|
|
||||||
#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \
|
|
||||||
PIN_OTYPE_PUSHPULL(GPIOH_PIN15))
|
|
||||||
#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN1) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN2) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN3) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN4) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN5) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN6) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN7) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN8) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN9) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN10) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN11) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN12) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN13) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN14) | \
|
|
||||||
PIN_OSPEED_VERYLOW(GPIOH_PIN15))
|
|
||||||
#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN1) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN2) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN3) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN4) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN5) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN6) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN7) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN8) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN9) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN10) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN11) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN12) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN13) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN14) | \
|
|
||||||
PIN_PUPDR_PULLUP(GPIOH_PIN15))
|
|
||||||
#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN1) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN2) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN3) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN4) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN5) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN6) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN7) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN8) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN9) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN10) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN11) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN12) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN13) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN14) | \
|
|
||||||
PIN_ODR_HIGH(GPIOH_PIN15))
|
|
||||||
#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN1, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN2, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN3, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN4, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN5, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN6, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN7, 0))
|
|
||||||
#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN9, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN10, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN11, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN12, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN13, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN14, 0) | \
|
|
||||||
PIN_AFIO_AF(GPIOH_PIN15, 0))
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USB bus activation macro, required by the USB driver.
|
* USB bus activation macro, required by the USB driver.
|
||||||
|
@ -1171,17 +457,19 @@
|
||||||
* USB bus de-activation macro, required by the USB driver.
|
* USB bus de-activation macro, required by the USB driver.
|
||||||
*/
|
*/
|
||||||
// #define usb_lld_disconnect_bus(usbp)
|
// #define usb_lld_disconnect_bus(usbp)
|
||||||
#define usb_lld_disconnect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); palClearPad(GPIOA, GPIOA_USB_DP)
|
#define usb_lld_disconnect_bus(usbp) \
|
||||||
|
(palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); \
|
||||||
|
palClearPad(GPIOA, GPIOA_USB_DP)
|
||||||
// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12)
|
// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12)
|
||||||
|
|
||||||
#if !defined(_FROM_ASM_)
|
#if !defined(_FROM_ASM_)
|
||||||
#ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
# endif
|
||||||
void boardInit(void);
|
void boardInit(void);
|
||||||
#ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
#endif /* _FROM_ASM_ */
|
#endif /* _FROM_ASM_ */
|
||||||
|
|
||||||
#endif /* _BOARD_H_ */
|
#endif /* _BOARD_H_ */
|
||||||
|
|
|
@ -21,9 +21,9 @@
|
||||||
* @details Digital I/O ports static configuration as defined in @p board.h.
|
* @details Digital I/O ports static configuration as defined in @p board.h.
|
||||||
* This variable is used by the HAL when initializing the PAL driver.
|
* This variable is used by the HAL when initializing the PAL driver.
|
||||||
*/
|
*/
|
||||||
const PALConfig pal_default_config =
|
const PALConfig pal_default_config = {
|
||||||
{
|
.ports =
|
||||||
.ports = {
|
{
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* PORTA setup.
|
* PORTA setup.
|
||||||
|
@ -37,18 +37,9 @@ const PALConfig pal_default_config =
|
||||||
* PTA0/3 SWD
|
* PTA0/3 SWD
|
||||||
*/
|
*/
|
||||||
.port = IOPORT1,
|
.port = IOPORT1,
|
||||||
.pads = {
|
.pads =
|
||||||
PAL_MODE_ALTERNATIVE_7, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
{
|
||||||
PAL_MODE_ALTERNATIVE_7, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
PAL_MODE_ALTERNATIVE_7, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_ALTERNATIVE_7, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_INPUT_ANALOG, PAL_MODE_INPUT_ANALOG, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_INPUT_ANALOG, PAL_MODE_INPUT_ANALOG, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -65,18 +56,9 @@ const PALConfig pal_default_config =
|
||||||
* PTB19 - PIN25
|
* PTB19 - PIN25
|
||||||
*/
|
*/
|
||||||
.port = IOPORT2,
|
.port = IOPORT2,
|
||||||
.pads = {
|
.pads =
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
{
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_ALTERNATIVE_3, PAL_MODE_ALTERNATIVE_3, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_ALTERNATIVE_3, PAL_MODE_ALTERNATIVE_3,
|
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -97,18 +79,9 @@ const PALConfig pal_default_config =
|
||||||
* PTC11 - PIN30
|
* PTC11 - PIN30
|
||||||
*/
|
*/
|
||||||
.port = IOPORT3,
|
.port = IOPORT3,
|
||||||
.pads = {
|
.pads =
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
{
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -125,18 +98,9 @@ const PALConfig pal_default_config =
|
||||||
* PTD7 - PIN5
|
* PTD7 - PIN5
|
||||||
*/
|
*/
|
||||||
.port = IOPORT4,
|
.port = IOPORT4,
|
||||||
.pads = {
|
.pads =
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
{
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL,
|
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -147,18 +111,9 @@ const PALConfig pal_default_config =
|
||||||
* PTE1 - PIN26
|
* PTE1 - PIN26
|
||||||
*/
|
*/
|
||||||
.port = IOPORT5,
|
.port = IOPORT5,
|
||||||
.pads = {
|
.pads =
|
||||||
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED,
|
{
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -178,7 +133,8 @@ const PALConfig pal_default_config =
|
||||||
void __early_init(void) {
|
void __early_init(void) {
|
||||||
// This is a dirty hack and should only be used as a temporary fix until this
|
// This is a dirty hack and should only be used as a temporary fix until this
|
||||||
// is upstreamed.
|
// is upstreamed.
|
||||||
while (WDOG_TMROUTL < 2); // Must wait for WDOG timer if already running, before jumping
|
while (WDOG_TMROUTL < 2)
|
||||||
|
; // Must wait for WDOG timer if already running, before jumping
|
||||||
|
|
||||||
k20x_clock_init();
|
k20x_clock_init();
|
||||||
}
|
}
|
||||||
|
@ -187,5 +143,4 @@ void __early_init(void) {
|
||||||
* @brief Board-specific initialization code.
|
* @brief Board-specific initialization code.
|
||||||
* @todo Add your board-specific code, if any.
|
* @todo Add your board-specific code, if any.
|
||||||
*/
|
*/
|
||||||
void boardInit(void) {
|
void boardInit(void) {}
|
||||||
}
|
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#define KINETIS_XTAL_FREQUENCY 16000000UL
|
#define KINETIS_XTAL_FREQUENCY 16000000UL
|
||||||
|
|
||||||
/* Use internal capacitors for the crystal */
|
/* Use internal capacitors for the crystal */
|
||||||
#define KINETIS_BOARD_OSCILLATOR_SETTING OSC_CR_SC8P|OSC_CR_SC2P
|
#define KINETIS_BOARD_OSCILLATOR_SETTING OSC_CR_SC8P | OSC_CR_SC2P
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MCU type
|
* MCU type
|
||||||
|
@ -283,13 +283,13 @@
|
||||||
#define LINE_LED LINE_PIN13
|
#define LINE_LED LINE_PIN13
|
||||||
|
|
||||||
#if !defined(_FROM_ASM_)
|
#if !defined(_FROM_ASM_)
|
||||||
#ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
# endif
|
||||||
void boardInit(void);
|
void boardInit(void);
|
||||||
#ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
#endif /* _FROM_ASM_ */
|
#endif /* _FROM_ASM_ */
|
||||||
|
|
||||||
#endif /* _BOARD_H_ */
|
#endif /* _BOARD_H_ */
|
||||||
|
|
|
@ -20,13 +20,11 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
uint8_t DRV2605L_transfer_buffer[2];
|
uint8_t DRV2605L_transfer_buffer[2];
|
||||||
uint8_t DRV2605L_tx_register[0];
|
uint8_t DRV2605L_tx_register[0];
|
||||||
uint8_t DRV2605L_read_buffer[0];
|
uint8_t DRV2605L_read_buffer[0];
|
||||||
uint8_t DRV2605L_read_register;
|
uint8_t DRV2605L_read_register;
|
||||||
|
|
||||||
|
|
||||||
void DRV_write(uint8_t drv_register, uint8_t settings) {
|
void DRV_write(uint8_t drv_register, uint8_t settings) {
|
||||||
DRV2605L_transfer_buffer[0] = drv_register;
|
DRV2605L_transfer_buffer[0] = drv_register;
|
||||||
DRV2605L_transfer_buffer[1] = settings;
|
DRV2605L_transfer_buffer[1] = settings;
|
||||||
|
@ -35,65 +33,60 @@ void DRV_write(uint8_t drv_register, uint8_t settings) {
|
||||||
|
|
||||||
uint8_t DRV_read(uint8_t regaddress) {
|
uint8_t DRV_read(uint8_t regaddress) {
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
i2c_readReg(DRV2605L_BASE_ADDRESS << 1,
|
i2c_readReg(DRV2605L_BASE_ADDRESS << 1, regaddress, DRV2605L_read_buffer, 1, 100);
|
||||||
regaddress, DRV2605L_read_buffer, 1, 100);
|
|
||||||
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
|
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
|
||||||
#else
|
#else
|
||||||
DRV2605L_tx_register[0] = regaddress;
|
DRV2605L_tx_register[0] = regaddress;
|
||||||
if (MSG_OK != i2c_transmit_receive(DRV2605L_BASE_ADDRESS << 1,
|
if (MSG_OK != i2c_transmit_receive(DRV2605L_BASE_ADDRESS << 1, DRV2605L_tx_register, 1, DRV2605L_read_buffer, 1)) {
|
||||||
DRV2605L_tx_register, 1,
|
|
||||||
DRV2605L_read_buffer, 1
|
|
||||||
)){
|
|
||||||
printf("err reading reg \n");
|
printf("err reading reg \n");
|
||||||
}
|
}
|
||||||
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
|
DRV2605L_read_register = (uint8_t)DRV2605L_read_buffer[0];
|
||||||
#endif
|
#endif
|
||||||
return DRV2605L_read_register;
|
return DRV2605L_read_register;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DRV_init(void)
|
void DRV_init(void) {
|
||||||
{
|
|
||||||
i2c_init();
|
i2c_init();
|
||||||
/* 0x07 sets DRV2605 into calibration mode */
|
/* 0x07 sets DRV2605 into calibration mode */
|
||||||
DRV_write(DRV_MODE,0x07);
|
DRV_write(DRV_MODE, 0x07);
|
||||||
|
|
||||||
// DRV_write(DRV_FEEDBACK_CTRL,0xB6);
|
// DRV_write(DRV_FEEDBACK_CTRL,0xB6);
|
||||||
|
|
||||||
#if FB_ERM_LRA == 0
|
#if FB_ERM_LRA == 0
|
||||||
/* ERM settings */
|
/* ERM settings */
|
||||||
DRV_write(DRV_RATED_VOLT, (RATED_VOLTAGE/21.33)*1000);
|
DRV_write(DRV_RATED_VOLT, (RATED_VOLTAGE / 21.33) * 1000);
|
||||||
#if ERM_OPEN_LOOP == 0
|
# if ERM_OPEN_LOOP == 0
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (((V_PEAK*(DRIVE_TIME+BLANKING_TIME+IDISS_TIME))/0.02133)/(DRIVE_TIME-0.0003)));
|
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (((V_PEAK * (DRIVE_TIME + BLANKING_TIME + IDISS_TIME)) / 0.02133) / (DRIVE_TIME - 0.0003)));
|
||||||
#elif ERM_OPEN_LOOP == 1
|
# elif ERM_OPEN_LOOP == 1
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK/0.02196));
|
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK / 0.02196));
|
||||||
#endif
|
# endif
|
||||||
#elif FB_ERM_LRA == 1
|
#elif FB_ERM_LRA == 1
|
||||||
DRV_write(DRV_RATED_VOLT, ((V_RMS * sqrt(1 - ((4 * ((150+(SAMPLE_TIME*50))*0.000001)) + 0.0003)* F_LRA)/0.02071)));
|
DRV_write(DRV_RATED_VOLT, ((V_RMS * sqrt(1 - ((4 * ((150 + (SAMPLE_TIME * 50)) * 0.000001)) + 0.0003) * F_LRA) / 0.02071)));
|
||||||
#if LRA_OPEN_LOOP == 0
|
# if LRA_OPEN_LOOP == 0
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, ((V_PEAK/sqrt(1-(F_LRA*0.0008))/0.02133)));
|
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, ((V_PEAK / sqrt(1 - (F_LRA * 0.0008)) / 0.02133)));
|
||||||
#elif LRA_OPEN_LOOP == 1
|
# elif LRA_OPEN_LOOP == 1
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK/0.02196));
|
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK / 0.02196));
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DRVREG_FBR FB_SET;
|
DRVREG_FBR FB_SET;
|
||||||
FB_SET.Bits.ERM_LRA = FB_ERM_LRA;
|
FB_SET.Bits.ERM_LRA = FB_ERM_LRA;
|
||||||
FB_SET.Bits.BRAKE_FACTOR = FB_BRAKEFACTOR;
|
FB_SET.Bits.BRAKE_FACTOR = FB_BRAKEFACTOR;
|
||||||
FB_SET.Bits.LOOP_GAIN =FB_LOOPGAIN;
|
FB_SET.Bits.LOOP_GAIN = FB_LOOPGAIN;
|
||||||
FB_SET.Bits.BEMF_GAIN = 0; /* auto-calibration populates this field*/
|
FB_SET.Bits.BEMF_GAIN = 0; /* auto-calibration populates this field*/
|
||||||
DRV_write(DRV_FEEDBACK_CTRL, (uint8_t) FB_SET.Byte);
|
DRV_write(DRV_FEEDBACK_CTRL, (uint8_t)FB_SET.Byte);
|
||||||
DRVREG_CTRL1 C1_SET;
|
DRVREG_CTRL1 C1_SET;
|
||||||
C1_SET.Bits.C1_DRIVE_TIME = DRIVE_TIME;
|
C1_SET.Bits.C1_DRIVE_TIME = DRIVE_TIME;
|
||||||
C1_SET.Bits.C1_AC_COUPLE = AC_COUPLE;
|
C1_SET.Bits.C1_AC_COUPLE = AC_COUPLE;
|
||||||
C1_SET.Bits.C1_STARTUP_BOOST = STARTUP_BOOST;
|
C1_SET.Bits.C1_STARTUP_BOOST = STARTUP_BOOST;
|
||||||
DRV_write(DRV_CTRL_1, (uint8_t) C1_SET.Byte);
|
DRV_write(DRV_CTRL_1, (uint8_t)C1_SET.Byte);
|
||||||
DRVREG_CTRL2 C2_SET;
|
DRVREG_CTRL2 C2_SET;
|
||||||
C2_SET.Bits.C2_BIDIR_INPUT = BIDIR_INPUT;
|
C2_SET.Bits.C2_BIDIR_INPUT = BIDIR_INPUT;
|
||||||
C2_SET.Bits.C2_BRAKE_STAB = BRAKE_STAB;
|
C2_SET.Bits.C2_BRAKE_STAB = BRAKE_STAB;
|
||||||
C2_SET.Bits.C2_SAMPLE_TIME = SAMPLE_TIME;
|
C2_SET.Bits.C2_SAMPLE_TIME = SAMPLE_TIME;
|
||||||
C2_SET.Bits.C2_BLANKING_TIME = BLANKING_TIME;
|
C2_SET.Bits.C2_BLANKING_TIME = BLANKING_TIME;
|
||||||
C2_SET.Bits.C2_IDISS_TIME = IDISS_TIME;
|
C2_SET.Bits.C2_IDISS_TIME = IDISS_TIME;
|
||||||
DRV_write(DRV_CTRL_2, (uint8_t) C2_SET.Byte);
|
DRV_write(DRV_CTRL_2, (uint8_t)C2_SET.Byte);
|
||||||
DRVREG_CTRL3 C3_SET;
|
DRVREG_CTRL3 C3_SET;
|
||||||
C3_SET.Bits.C3_LRA_OPEN_LOOP = LRA_OPEN_LOOP;
|
C3_SET.Bits.C3_LRA_OPEN_LOOP = LRA_OPEN_LOOP;
|
||||||
C3_SET.Bits.C3_N_PWM_ANALOG = N_PWM_ANALOG;
|
C3_SET.Bits.C3_N_PWM_ANALOG = N_PWM_ANALOG;
|
||||||
|
@ -102,27 +95,26 @@ void DRV_init(void)
|
||||||
C3_SET.Bits.C3_SUPPLY_COMP_DIS = SUPPLY_COMP_DIS;
|
C3_SET.Bits.C3_SUPPLY_COMP_DIS = SUPPLY_COMP_DIS;
|
||||||
C3_SET.Bits.C3_ERM_OPEN_LOOP = ERM_OPEN_LOOP;
|
C3_SET.Bits.C3_ERM_OPEN_LOOP = ERM_OPEN_LOOP;
|
||||||
C3_SET.Bits.C3_NG_THRESH = NG_THRESH;
|
C3_SET.Bits.C3_NG_THRESH = NG_THRESH;
|
||||||
DRV_write(DRV_CTRL_3, (uint8_t) C3_SET.Byte);
|
DRV_write(DRV_CTRL_3, (uint8_t)C3_SET.Byte);
|
||||||
DRVREG_CTRL4 C4_SET;
|
DRVREG_CTRL4 C4_SET;
|
||||||
C4_SET.Bits.C4_ZC_DET_TIME = ZC_DET_TIME;
|
C4_SET.Bits.C4_ZC_DET_TIME = ZC_DET_TIME;
|
||||||
C4_SET.Bits.C4_AUTO_CAL_TIME = AUTO_CAL_TIME;
|
C4_SET.Bits.C4_AUTO_CAL_TIME = AUTO_CAL_TIME;
|
||||||
DRV_write(DRV_CTRL_4, (uint8_t) C4_SET.Byte);
|
DRV_write(DRV_CTRL_4, (uint8_t)C4_SET.Byte);
|
||||||
DRV_write(DRV_LIB_SELECTION,LIB_SELECTION);
|
DRV_write(DRV_LIB_SELECTION, LIB_SELECTION);
|
||||||
|
|
||||||
DRV_write(DRV_GO, 0x01);
|
DRV_write(DRV_GO, 0x01);
|
||||||
|
|
||||||
/* 0x00 sets DRV2605 out of standby and to use internal trigger
|
/* 0x00 sets DRV2605 out of standby and to use internal trigger
|
||||||
* 0x01 sets DRV2605 out of standby and to use external trigger */
|
* 0x01 sets DRV2605 out of standby and to use external trigger */
|
||||||
DRV_write(DRV_MODE,0x00);
|
DRV_write(DRV_MODE, 0x00);
|
||||||
|
|
||||||
//Play greeting sequence
|
// Play greeting sequence
|
||||||
DRV_write(DRV_GO, 0x00);
|
DRV_write(DRV_GO, 0x00);
|
||||||
DRV_write(DRV_WAVEFORM_SEQ_1, DRV_GREETING);
|
DRV_write(DRV_WAVEFORM_SEQ_1, DRV_GREETING);
|
||||||
DRV_write(DRV_GO, 0x01);
|
DRV_write(DRV_GO, 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DRV_pulse(uint8_t sequence)
|
void DRV_pulse(uint8_t sequence) {
|
||||||
{
|
|
||||||
DRV_write(DRV_GO, 0x00);
|
DRV_write(DRV_GO, 0x00);
|
||||||
DRV_write(DRV_WAVEFORM_SEQ_1, sequence);
|
DRV_write(DRV_WAVEFORM_SEQ_1, sequence);
|
||||||
DRV_write(DRV_GO, 0x01);
|
DRV_write(DRV_GO, 0x01);
|
||||||
|
|
|
@ -22,111 +22,111 @@
|
||||||
|
|
||||||
* Feedback Control Settings */
|
* Feedback Control Settings */
|
||||||
#ifndef FB_ERM_LRA
|
#ifndef FB_ERM_LRA
|
||||||
#define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/
|
# define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/
|
||||||
#endif
|
#endif
|
||||||
#ifndef FB_BRAKEFACTOR
|
#ifndef FB_BRAKEFACTOR
|
||||||
#define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */
|
# define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */
|
||||||
#endif
|
#endif
|
||||||
#ifndef FB_LOOPGAIN
|
#ifndef FB_LOOPGAIN
|
||||||
#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
|
# define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* LRA specific settings */
|
/* LRA specific settings */
|
||||||
#if FB_ERM_LRA == 1
|
#if FB_ERM_LRA == 1
|
||||||
#ifndef V_RMS
|
# ifndef V_RMS
|
||||||
#define V_RMS 2.0
|
# define V_RMS 2.0
|
||||||
#endif
|
# endif
|
||||||
#ifndef V_PEAK
|
# ifndef V_PEAK
|
||||||
#define V_PEAK 2.1
|
# define V_PEAK 2.1
|
||||||
#endif
|
# endif
|
||||||
#ifndef F_LRA
|
# ifndef F_LRA
|
||||||
#define F_LRA 205
|
# define F_LRA 205
|
||||||
#endif
|
# endif
|
||||||
#ifndef RATED_VOLTAGE
|
# ifndef RATED_VOLTAGE
|
||||||
#define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
|
# define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef RATED_VOLTAGE
|
#ifndef RATED_VOLTAGE
|
||||||
#define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
|
# define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
|
||||||
#endif
|
#endif
|
||||||
#ifndef V_PEAK
|
#ifndef V_PEAK
|
||||||
#define V_PEAK 2.8
|
# define V_PEAK 2.8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Library Selection */
|
/* Library Selection */
|
||||||
#ifndef LIB_SELECTION
|
#ifndef LIB_SELECTION
|
||||||
#if FB_ERM_LRA == 1
|
# if FB_ERM_LRA == 1
|
||||||
#define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */
|
# define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */
|
||||||
#else
|
# else
|
||||||
#define LIB_SELECTION 1
|
# define LIB_SELECTION 1
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DRV_GREETING
|
#ifndef DRV_GREETING
|
||||||
#define DRV_GREETING alert_750ms
|
# define DRV_GREETING alert_750ms
|
||||||
#endif
|
#endif
|
||||||
#ifndef DRV_MODE_DEFAULT
|
#ifndef DRV_MODE_DEFAULT
|
||||||
#define DRV_MODE_DEFAULT strong_click1
|
# define DRV_MODE_DEFAULT strong_click1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Control 1 register settings */
|
/* Control 1 register settings */
|
||||||
#ifndef DRIVE_TIME
|
#ifndef DRIVE_TIME
|
||||||
#define DRIVE_TIME 25
|
# define DRIVE_TIME 25
|
||||||
#endif
|
#endif
|
||||||
#ifndef AC_COUPLE
|
#ifndef AC_COUPLE
|
||||||
#define AC_COUPLE 0
|
# define AC_COUPLE 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef STARTUP_BOOST
|
#ifndef STARTUP_BOOST
|
||||||
#define STARTUP_BOOST 1
|
# define STARTUP_BOOST 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Control 2 Settings */
|
/* Control 2 Settings */
|
||||||
#ifndef BIDIR_INPUT
|
#ifndef BIDIR_INPUT
|
||||||
#define BIDIR_INPUT 1
|
# define BIDIR_INPUT 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef BRAKE_STAB
|
#ifndef BRAKE_STAB
|
||||||
#define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */
|
# define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */
|
||||||
#endif
|
#endif
|
||||||
#ifndef SAMPLE_TIME
|
#ifndef SAMPLE_TIME
|
||||||
#define SAMPLE_TIME 3
|
# define SAMPLE_TIME 3
|
||||||
#endif
|
#endif
|
||||||
#ifndef BLANKING_TIME
|
#ifndef BLANKING_TIME
|
||||||
#define BLANKING_TIME 1
|
# define BLANKING_TIME 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef IDISS_TIME
|
#ifndef IDISS_TIME
|
||||||
#define IDISS_TIME 1
|
# define IDISS_TIME 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Control 3 settings */
|
/* Control 3 settings */
|
||||||
#ifndef NG_THRESH
|
#ifndef NG_THRESH
|
||||||
#define NG_THRESH 2
|
# define NG_THRESH 2
|
||||||
#endif
|
#endif
|
||||||
#ifndef ERM_OPEN_LOOP
|
#ifndef ERM_OPEN_LOOP
|
||||||
#define ERM_OPEN_LOOP 1
|
# define ERM_OPEN_LOOP 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef SUPPLY_COMP_DIS
|
#ifndef SUPPLY_COMP_DIS
|
||||||
#define SUPPLY_COMP_DIS 0
|
# define SUPPLY_COMP_DIS 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef DATA_FORMAT_RTO
|
#ifndef DATA_FORMAT_RTO
|
||||||
#define DATA_FORMAT_RTO 0
|
# define DATA_FORMAT_RTO 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef LRA_DRIVE_MODE
|
#ifndef LRA_DRIVE_MODE
|
||||||
#define LRA_DRIVE_MODE 0
|
# define LRA_DRIVE_MODE 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef N_PWM_ANALOG
|
#ifndef N_PWM_ANALOG
|
||||||
#define N_PWM_ANALOG 0
|
# define N_PWM_ANALOG 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef LRA_OPEN_LOOP
|
#ifndef LRA_OPEN_LOOP
|
||||||
#define LRA_OPEN_LOOP 0
|
# define LRA_OPEN_LOOP 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Control 4 settings */
|
/* Control 4 settings */
|
||||||
#ifndef ZC_DET_TIME
|
#ifndef ZC_DET_TIME
|
||||||
#define ZC_DET_TIME 0
|
# define ZC_DET_TIME 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef AUTO_CAL_TIME
|
#ifndef AUTO_CAL_TIME
|
||||||
#define AUTO_CAL_TIME 3
|
# define AUTO_CAL_TIME 3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* register defines -------------------------------------------------------- */
|
/* register defines -------------------------------------------------------- */
|
||||||
|
@ -172,7 +172,7 @@ void DRV_write(const uint8_t drv_register, const uint8_t settings);
|
||||||
uint8_t DRV_read(const uint8_t regaddress);
|
uint8_t DRV_read(const uint8_t regaddress);
|
||||||
void DRV_pulse(const uint8_t sequence);
|
void DRV_pulse(const uint8_t sequence);
|
||||||
|
|
||||||
typedef enum DRV_EFFECT{
|
typedef enum DRV_EFFECT {
|
||||||
clear_sequence = 0,
|
clear_sequence = 0,
|
||||||
strong_click = 1,
|
strong_click = 1,
|
||||||
strong_click_60 = 2,
|
strong_click_60 = 2,
|
||||||
|
@ -305,100 +305,100 @@ typedef enum DRV_EFFECT{
|
||||||
typedef union DRVREG_STATUS { /* register 0x00 */
|
typedef union DRVREG_STATUS { /* register 0x00 */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t OC_DETECT :1; /* set to 1 when overcurrent event is detected */
|
uint8_t OC_DETECT : 1; /* set to 1 when overcurrent event is detected */
|
||||||
uint8_t OVER_TEMP :1; /* set to 1 when device exceeds temp threshold */
|
uint8_t OVER_TEMP : 1; /* set to 1 when device exceeds temp threshold */
|
||||||
uint8_t FB_STS :1; /* set to 1 when feedback controller has timed out */
|
uint8_t FB_STS : 1; /* set to 1 when feedback controller has timed out */
|
||||||
/* auto-calibration routine and diagnostic result
|
/* auto-calibration routine and diagnostic result
|
||||||
* result | auto-calibation | diagnostic |
|
* result | auto-calibation | diagnostic |
|
||||||
* 0 | passed | actuator func normal |
|
* 0 | passed | actuator func normal |
|
||||||
* 1 | failed | actuator func fault* |
|
* 1 | failed | actuator func fault* |
|
||||||
* * actuator is not present or is shorted, timing out, or giving out–of-range back-EMF */
|
* * actuator is not present or is shorted, timing out, or giving out–of-range back-EMF */
|
||||||
uint8_t DIAG_RESULT :1;
|
uint8_t DIAG_RESULT : 1;
|
||||||
uint8_t :1;
|
uint8_t : 1;
|
||||||
uint8_t DEVICE_ID :3; /* Device IDs 3: DRV2605 4: DRV2604 5: DRV2604L 6: DRV2605L */
|
uint8_t DEVICE_ID : 3; /* Device IDs 3: DRV2605 4: DRV2604 5: DRV2604L 6: DRV2605L */
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_STATUS;
|
} DRVREG_STATUS;
|
||||||
|
|
||||||
typedef union DRVREG_MODE { /* register 0x01 */
|
typedef union DRVREG_MODE { /* register 0x01 */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t MODE :3; /* Mode setting */
|
uint8_t MODE : 3; /* Mode setting */
|
||||||
uint8_t :3;
|
uint8_t : 3;
|
||||||
uint8_t STANDBY :1; /* 0:standby 1:ready */
|
uint8_t STANDBY : 1; /* 0:standby 1:ready */
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_MODE;
|
} DRVREG_MODE;
|
||||||
|
|
||||||
typedef union DRVREG_WAIT {
|
typedef union DRVREG_WAIT {
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t WAIT_MODE :1; /* Set to 1 to interpret as wait for next 7 bits x10ms */
|
uint8_t WAIT_MODE : 1; /* Set to 1 to interpret as wait for next 7 bits x10ms */
|
||||||
uint8_t WAIT_TIME :7;
|
uint8_t WAIT_TIME : 7;
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_WAIT;
|
} DRVREG_WAIT;
|
||||||
|
|
||||||
typedef union DRVREG_FBR{ /* register 0x1A */
|
typedef union DRVREG_FBR { /* register 0x1A */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t BEMF_GAIN :2;
|
uint8_t BEMF_GAIN : 2;
|
||||||
uint8_t LOOP_GAIN :2;
|
uint8_t LOOP_GAIN : 2;
|
||||||
uint8_t BRAKE_FACTOR :3;
|
uint8_t BRAKE_FACTOR : 3;
|
||||||
uint8_t ERM_LRA :1;
|
uint8_t ERM_LRA : 1;
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_FBR;
|
} DRVREG_FBR;
|
||||||
|
|
||||||
typedef union DRVREG_CTRL1{ /* register 0x1B */
|
typedef union DRVREG_CTRL1 { /* register 0x1B */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t C1_DRIVE_TIME :5;
|
uint8_t C1_DRIVE_TIME : 5;
|
||||||
uint8_t C1_AC_COUPLE :1;
|
uint8_t C1_AC_COUPLE : 1;
|
||||||
uint8_t :1;
|
uint8_t : 1;
|
||||||
uint8_t C1_STARTUP_BOOST :1;
|
uint8_t C1_STARTUP_BOOST : 1;
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_CTRL1;
|
} DRVREG_CTRL1;
|
||||||
|
|
||||||
typedef union DRVREG_CTRL2{ /* register 0x1C */
|
typedef union DRVREG_CTRL2 { /* register 0x1C */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t C2_IDISS_TIME :2;
|
uint8_t C2_IDISS_TIME : 2;
|
||||||
uint8_t C2_BLANKING_TIME :2;
|
uint8_t C2_BLANKING_TIME : 2;
|
||||||
uint8_t C2_SAMPLE_TIME :2;
|
uint8_t C2_SAMPLE_TIME : 2;
|
||||||
uint8_t C2_BRAKE_STAB :1;
|
uint8_t C2_BRAKE_STAB : 1;
|
||||||
uint8_t C2_BIDIR_INPUT :1;
|
uint8_t C2_BIDIR_INPUT : 1;
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_CTRL2;
|
} DRVREG_CTRL2;
|
||||||
|
|
||||||
typedef union DRVREG_CTRL3{ /* register 0x1D */
|
typedef union DRVREG_CTRL3 { /* register 0x1D */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t C3_LRA_OPEN_LOOP :1;
|
uint8_t C3_LRA_OPEN_LOOP : 1;
|
||||||
uint8_t C3_N_PWM_ANALOG :1;
|
uint8_t C3_N_PWM_ANALOG : 1;
|
||||||
uint8_t C3_LRA_DRIVE_MODE :1;
|
uint8_t C3_LRA_DRIVE_MODE : 1;
|
||||||
uint8_t C3_DATA_FORMAT_RTO :1;
|
uint8_t C3_DATA_FORMAT_RTO : 1;
|
||||||
uint8_t C3_SUPPLY_COMP_DIS :1;
|
uint8_t C3_SUPPLY_COMP_DIS : 1;
|
||||||
uint8_t C3_ERM_OPEN_LOOP :1;
|
uint8_t C3_ERM_OPEN_LOOP : 1;
|
||||||
uint8_t C3_NG_THRESH :2;
|
uint8_t C3_NG_THRESH : 2;
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_CTRL3;
|
} DRVREG_CTRL3;
|
||||||
|
|
||||||
typedef union DRVREG_CTRL4{ /* register 0x1E */
|
typedef union DRVREG_CTRL4 { /* register 0x1E */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t C4_OTP_PROGRAM :1;
|
uint8_t C4_OTP_PROGRAM : 1;
|
||||||
uint8_t :1;
|
uint8_t : 1;
|
||||||
uint8_t C4_OTP_STATUS :1;
|
uint8_t C4_OTP_STATUS : 1;
|
||||||
uint8_t :1;
|
uint8_t : 1;
|
||||||
uint8_t C4_AUTO_CAL_TIME :2;
|
uint8_t C4_AUTO_CAL_TIME : 2;
|
||||||
uint8_t C4_ZC_DET_TIME :2;
|
uint8_t C4_ZC_DET_TIME : 2;
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_CTRL4;
|
} DRVREG_CTRL4;
|
||||||
|
|
||||||
typedef union DRVREG_CTRL5{ /* register 0x1F */
|
typedef union DRVREG_CTRL5 { /* register 0x1F */
|
||||||
uint8_t Byte;
|
uint8_t Byte;
|
||||||
struct {
|
struct {
|
||||||
uint8_t C5_IDISS_TIME :2;
|
uint8_t C5_IDISS_TIME : 2;
|
||||||
uint8_t C5_BLANKING_TIME :2;
|
uint8_t C5_BLANKING_TIME : 2;
|
||||||
uint8_t C5_PLAYBACK_INTERVAL :1;
|
uint8_t C5_PLAYBACK_INTERVAL : 1;
|
||||||
uint8_t C5_LRA_AUTO_OPEN_LOOP :1;
|
uint8_t C5_LRA_AUTO_OPEN_LOOP : 1;
|
||||||
uint8_t C5_AUTO_OL_CNT :2;
|
uint8_t C5_AUTO_OL_CNT : 2;
|
||||||
} Bits;
|
} Bits;
|
||||||
} DRVREG_CTRL5;
|
} DRVREG_CTRL5;
|
|
@ -19,42 +19,42 @@
|
||||||
#include "progmem.h"
|
#include "progmem.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
#include "DRV2605L.h"
|
# include "DRV2605L.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
#include "solenoid.h"
|
# include "solenoid.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
haptic_config_t haptic_config;
|
haptic_config_t haptic_config;
|
||||||
|
|
||||||
void haptic_init(void) {
|
void haptic_init(void) {
|
||||||
debug_enable = 1; //Debug is ON!
|
debug_enable = 1; // Debug is ON!
|
||||||
if (!eeconfig_is_enabled()) {
|
if (!eeconfig_is_enabled()) {
|
||||||
eeconfig_init();
|
eeconfig_init();
|
||||||
}
|
}
|
||||||
haptic_config.raw = eeconfig_read_haptic();
|
haptic_config.raw = eeconfig_read_haptic();
|
||||||
if (haptic_config.mode < 1){
|
if (haptic_config.mode < 1) {
|
||||||
haptic_config.mode = 1;
|
haptic_config.mode = 1;
|
||||||
}
|
}
|
||||||
if (!haptic_config.mode){
|
if (!haptic_config.mode) {
|
||||||
dprintf("No haptic config found in eeprom, setting default configs\n");
|
dprintf("No haptic config found in eeprom, setting default configs\n");
|
||||||
haptic_reset();
|
haptic_reset();
|
||||||
}
|
}
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
solenoid_setup();
|
solenoid_setup();
|
||||||
dprintf("Solenoid driver initialized\n");
|
dprintf("Solenoid driver initialized\n");
|
||||||
#endif
|
#endif
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
DRV_init();
|
DRV_init();
|
||||||
dprintf("DRV2605 driver initialized\n");
|
dprintf("DRV2605 driver initialized\n");
|
||||||
#endif
|
#endif
|
||||||
eeconfig_debug_haptic();
|
eeconfig_debug_haptic();
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_task(void) {
|
void haptic_task(void) {
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
solenoid_check();
|
solenoid_check();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void eeconfig_debug_haptic(void) {
|
void eeconfig_debug_haptic(void) {
|
||||||
|
@ -76,7 +76,7 @@ void haptic_disable(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_toggle(void) {
|
void haptic_toggle(void) {
|
||||||
if (haptic_config.enable) {
|
if (haptic_config.enable) {
|
||||||
haptic_disable();
|
haptic_disable();
|
||||||
} else {
|
} else {
|
||||||
haptic_enable();
|
haptic_enable();
|
||||||
|
@ -84,10 +84,9 @@ if (haptic_config.enable) {
|
||||||
eeconfig_update_haptic(haptic_config.raw);
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_feedback_toggle(void){
|
void haptic_feedback_toggle(void) {
|
||||||
haptic_config.feedback++;
|
haptic_config.feedback++;
|
||||||
if (haptic_config.feedback >= HAPTIC_FEEDBACK_MAX)
|
if (haptic_config.feedback >= HAPTIC_FEEDBACK_MAX) haptic_config.feedback = KEY_PRESS;
|
||||||
haptic_config.feedback = KEY_PRESS;
|
|
||||||
xprintf("haptic_config.feedback = %u\n", !haptic_config.feedback);
|
xprintf("haptic_config.feedback = %u\n", !haptic_config.feedback);
|
||||||
eeconfig_update_haptic(haptic_config.raw);
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
}
|
}
|
||||||
|
@ -100,58 +99,58 @@ void haptic_buzz_toggle(void) {
|
||||||
|
|
||||||
void haptic_mode_increase(void) {
|
void haptic_mode_increase(void) {
|
||||||
uint8_t mode = haptic_config.mode + 1;
|
uint8_t mode = haptic_config.mode + 1;
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
if (haptic_config.mode >= drv_effect_max) {
|
if (haptic_config.mode >= drv_effect_max) {
|
||||||
mode = 1;
|
mode = 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
haptic_set_mode(mode);
|
haptic_set_mode(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_mode_decrease(void) {
|
void haptic_mode_decrease(void) {
|
||||||
uint8_t mode = haptic_config.mode -1;
|
uint8_t mode = haptic_config.mode - 1;
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
if (haptic_config.mode < 1) {
|
if (haptic_config.mode < 1) {
|
||||||
mode = (drv_effect_max - 1);
|
mode = (drv_effect_max - 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
haptic_set_mode(mode);
|
haptic_set_mode(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_dwell_increase(void) {
|
void haptic_dwell_increase(void) {
|
||||||
uint8_t dwell = haptic_config.dwell + 1;
|
uint8_t dwell = haptic_config.dwell + 1;
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
if (haptic_config.dwell >= SOLENOID_MAX_DWELL) {
|
if (haptic_config.dwell >= SOLENOID_MAX_DWELL) {
|
||||||
dwell = 1;
|
dwell = 1;
|
||||||
}
|
}
|
||||||
solenoid_set_dwell(dwell);
|
solenoid_set_dwell(dwell);
|
||||||
#endif
|
#endif
|
||||||
haptic_set_dwell(dwell);
|
haptic_set_dwell(dwell);
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_dwell_decrease(void) {
|
void haptic_dwell_decrease(void) {
|
||||||
uint8_t dwell = haptic_config.dwell -1;
|
uint8_t dwell = haptic_config.dwell - 1;
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
if (haptic_config.dwell < SOLENOID_MIN_DWELL) {
|
if (haptic_config.dwell < SOLENOID_MIN_DWELL) {
|
||||||
dwell = SOLENOID_MAX_DWELL;
|
dwell = SOLENOID_MAX_DWELL;
|
||||||
}
|
}
|
||||||
solenoid_set_dwell(dwell);
|
solenoid_set_dwell(dwell);
|
||||||
#endif
|
#endif
|
||||||
haptic_set_dwell(dwell);
|
haptic_set_dwell(dwell);
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_reset(void){
|
void haptic_reset(void) {
|
||||||
haptic_config.enable = true;
|
haptic_config.enable = true;
|
||||||
uint8_t feedback = HAPTIC_FEEDBACK_DEFAULT;
|
uint8_t feedback = HAPTIC_FEEDBACK_DEFAULT;
|
||||||
haptic_config.feedback = feedback;
|
haptic_config.feedback = feedback;
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
uint8_t mode = HAPTIC_MODE_DEFAULT;
|
uint8_t mode = HAPTIC_MODE_DEFAULT;
|
||||||
haptic_config.mode = mode;
|
haptic_config.mode = mode;
|
||||||
#endif
|
#endif
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
uint8_t dwell = SOLENOID_DEFAULT_DWELL;
|
uint8_t dwell = SOLENOID_DEFAULT_DWELL;
|
||||||
haptic_config.dwell = dwell;
|
haptic_config.dwell = dwell;
|
||||||
#endif
|
#endif
|
||||||
eeconfig_update_haptic(haptic_config.raw);
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
xprintf("haptic_config.feedback = %u\n", haptic_config.feedback);
|
xprintf("haptic_config.feedback = %u\n", haptic_config.feedback);
|
||||||
xprintf("haptic_config.mode = %u\n", haptic_config.mode);
|
xprintf("haptic_config.mode = %u\n", haptic_config.mode);
|
||||||
|
@ -182,56 +181,76 @@ void haptic_set_dwell(uint8_t dwell) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t haptic_get_mode(void) {
|
uint8_t haptic_get_mode(void) {
|
||||||
if (!haptic_config.enable){
|
if (!haptic_config.enable) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return haptic_config.mode;
|
return haptic_config.mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t haptic_get_feedback(void) {
|
uint8_t haptic_get_feedback(void) {
|
||||||
if (!haptic_config.enable){
|
if (!haptic_config.enable) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return haptic_config.feedback;
|
return haptic_config.feedback;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t haptic_get_dwell(void) {
|
uint8_t haptic_get_dwell(void) {
|
||||||
if (!haptic_config.enable){
|
if (!haptic_config.enable) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return haptic_config.dwell;
|
return haptic_config.dwell;
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_play(void) {
|
void haptic_play(void) {
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
uint8_t play_eff = 0;
|
uint8_t play_eff = 0;
|
||||||
play_eff = haptic_config.mode;
|
play_eff = haptic_config.mode;
|
||||||
DRV_pulse(play_eff);
|
DRV_pulse(play_eff);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
solenoid_fire();
|
solenoid_fire();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool process_haptic(uint16_t keycode, keyrecord_t *record) {
|
bool process_haptic(uint16_t keycode, keyrecord_t *record) {
|
||||||
if (keycode == HPT_ON && record->event.pressed) { haptic_enable(); }
|
if (keycode == HPT_ON && record->event.pressed) {
|
||||||
if (keycode == HPT_OFF && record->event.pressed) { haptic_disable(); }
|
haptic_enable();
|
||||||
if (keycode == HPT_TOG && record->event.pressed) { haptic_toggle(); }
|
}
|
||||||
if (keycode == HPT_RST && record->event.pressed) { haptic_reset(); }
|
if (keycode == HPT_OFF && record->event.pressed) {
|
||||||
if (keycode == HPT_FBK && record->event.pressed) { haptic_feedback_toggle(); }
|
haptic_disable();
|
||||||
if (keycode == HPT_BUZ && record->event.pressed) { haptic_buzz_toggle(); }
|
}
|
||||||
if (keycode == HPT_MODI && record->event.pressed) { haptic_mode_increase(); }
|
if (keycode == HPT_TOG && record->event.pressed) {
|
||||||
if (keycode == HPT_MODD && record->event.pressed) { haptic_mode_decrease(); }
|
haptic_toggle();
|
||||||
if (keycode == HPT_DWLI && record->event.pressed) { haptic_dwell_increase(); }
|
}
|
||||||
if (keycode == HPT_DWLD && record->event.pressed) { haptic_dwell_decrease(); }
|
if (keycode == HPT_RST && record->event.pressed) {
|
||||||
|
haptic_reset();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_FBK && record->event.pressed) {
|
||||||
|
haptic_feedback_toggle();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_BUZ && record->event.pressed) {
|
||||||
|
haptic_buzz_toggle();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_MODI && record->event.pressed) {
|
||||||
|
haptic_mode_increase();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_MODD && record->event.pressed) {
|
||||||
|
haptic_mode_decrease();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_DWLI && record->event.pressed) {
|
||||||
|
haptic_dwell_increase();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_DWLD && record->event.pressed) {
|
||||||
|
haptic_dwell_decrease();
|
||||||
|
}
|
||||||
if (haptic_config.enable) {
|
if (haptic_config.enable) {
|
||||||
if ( record->event.pressed ) {
|
if (record->event.pressed) {
|
||||||
// keypress
|
// keypress
|
||||||
if (haptic_config.feedback < 2) {
|
if (haptic_config.feedback < 2) {
|
||||||
haptic_play();
|
haptic_play();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//keyrelease
|
// keyrelease
|
||||||
if (haptic_config.feedback > 0) {
|
if (haptic_config.feedback > 0) {
|
||||||
haptic_play();
|
haptic_play();
|
||||||
}
|
}
|
||||||
|
@ -241,8 +260,7 @@ bool process_haptic(uint16_t keycode, keyrecord_t *record) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void haptic_shutdown(void) {
|
void haptic_shutdown(void) {
|
||||||
#ifdef SOLENOID_ENABLE
|
#ifdef SOLENOID_ENABLE
|
||||||
solenoid_shutdown();
|
solenoid_shutdown();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,31 +20,30 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
#include "DRV2605L.h"
|
# include "DRV2605L.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef HAPTIC_FEEDBACK_DEFAULT
|
#ifndef HAPTIC_FEEDBACK_DEFAULT
|
||||||
#define HAPTIC_FEEDBACK_DEFAULT 0
|
# define HAPTIC_FEEDBACK_DEFAULT 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef HAPTIC_MODE_DEFAULT
|
#ifndef HAPTIC_MODE_DEFAULT
|
||||||
#define HAPTIC_MODE_DEFAULT DRV_MODE_DEFAULT
|
# define HAPTIC_MODE_DEFAULT DRV_MODE_DEFAULT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* EEPROM config settings */
|
/* EEPROM config settings */
|
||||||
typedef union {
|
typedef union {
|
||||||
uint32_t raw;
|
uint32_t raw;
|
||||||
struct {
|
struct {
|
||||||
bool enable :1;
|
bool enable : 1;
|
||||||
uint8_t feedback :2;
|
uint8_t feedback : 2;
|
||||||
uint8_t mode :7;
|
uint8_t mode : 7;
|
||||||
bool buzz :1;
|
bool buzz : 1;
|
||||||
uint8_t dwell :7;
|
uint8_t dwell : 7;
|
||||||
uint16_t reserved :16;
|
uint16_t reserved : 16;
|
||||||
};
|
};
|
||||||
} haptic_config_t;
|
} haptic_config_t;
|
||||||
|
|
||||||
typedef enum HAPTIC_FEEDBACK{
|
typedef enum HAPTIC_FEEDBACK {
|
||||||
KEY_PRESS,
|
KEY_PRESS,
|
||||||
KEY_PRESS_RELEASE,
|
KEY_PRESS_RELEASE,
|
||||||
KEY_RELEASE,
|
KEY_RELEASE,
|
||||||
|
@ -75,8 +74,3 @@ void haptic_dwell_decrease(void);
|
||||||
|
|
||||||
void haptic_play(void);
|
void haptic_play(void);
|
||||||
void haptic_shutdown(void);
|
void haptic_shutdown(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,19 +26,11 @@ 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) {
|
void solenoid_buzz_off(void) { haptic_set_buzz(0); }
|
||||||
haptic_set_buzz(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
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_dwell_minus(uint8_t solenoid_dwell) {
|
void solenoid_dwell_minus(uint8_t solenoid_dwell) {
|
||||||
if (solenoid_dwell > 0) solenoid_dwell--;
|
if (solenoid_dwell > 0) solenoid_dwell--;
|
||||||
|
@ -48,9 +40,7 @@ void solenoid_dwell_plus(uint8_t solenoid_dwell) {
|
||||||
if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
|
if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void solenoid_set_dwell(uint8_t dwell) {
|
void solenoid_set_dwell(uint8_t dwell) { solenoid_dwell = dwell; }
|
||||||
solenoid_dwell = dwell;
|
|
||||||
}
|
|
||||||
|
|
||||||
void solenoid_stop(void) {
|
void solenoid_stop(void) {
|
||||||
writePinLow(SOLENOID_PIN);
|
writePinLow(SOLENOID_PIN);
|
||||||
|
@ -75,21 +65,20 @@ void solenoid_check(void) {
|
||||||
|
|
||||||
elapsed = timer_elapsed(solenoid_start);
|
elapsed = timer_elapsed(solenoid_start);
|
||||||
|
|
||||||
//Check if it's time to finish this solenoid click cycle
|
// Check if it's time to finish this solenoid click cycle
|
||||||
if (elapsed > solenoid_dwell) {
|
if (elapsed > solenoid_dwell) {
|
||||||
solenoid_stop();
|
solenoid_stop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check whether to buzz the solenoid on and off
|
// Check whether to buzz the solenoid on and off
|
||||||
if (haptic_config.buzz) {
|
if (haptic_config.buzz) {
|
||||||
if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){
|
if (elapsed / SOLENOID_MIN_DWELL % 2 == 0) {
|
||||||
if (!solenoid_buzzing) {
|
if (!solenoid_buzzing) {
|
||||||
solenoid_buzzing = true;
|
solenoid_buzzing = true;
|
||||||
writePinHigh(SOLENOID_PIN);
|
writePinHigh(SOLENOID_PIN);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (solenoid_buzzing) {
|
if (solenoid_buzzing) {
|
||||||
solenoid_buzzing = false;
|
solenoid_buzzing = false;
|
||||||
writePinLow(SOLENOID_PIN);
|
writePinLow(SOLENOID_PIN);
|
||||||
|
@ -103,7 +92,4 @@ void solenoid_setup(void) {
|
||||||
solenoid_fire();
|
solenoid_fire();
|
||||||
}
|
}
|
||||||
|
|
||||||
void solenoid_shutdown(void) {
|
void solenoid_shutdown(void) { writePinLow(SOLENOID_PIN); }
|
||||||
writePinLow(SOLENOID_PIN);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,23 +18,23 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifndef SOLENOID_DEFAULT_DWELL
|
#ifndef SOLENOID_DEFAULT_DWELL
|
||||||
#define SOLENOID_DEFAULT_DWELL 12
|
# define SOLENOID_DEFAULT_DWELL 12
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SOLENOID_MAX_DWELL
|
#ifndef SOLENOID_MAX_DWELL
|
||||||
#define SOLENOID_MAX_DWELL 100
|
# define SOLENOID_MAX_DWELL 100
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SOLENOID_MIN_DWELL
|
#ifndef SOLENOID_MIN_DWELL
|
||||||
#define SOLENOID_MIN_DWELL 4
|
# define SOLENOID_MIN_DWELL 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SOLENOID_ACTIVE
|
#ifndef SOLENOID_ACTIVE
|
||||||
#define SOLENOID_ACTIVE false
|
# define SOLENOID_ACTIVE false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SOLENOID_PIN
|
#ifndef SOLENOID_PIN
|
||||||
#define SOLENOID_PIN F6
|
# define SOLENOID_PIN F6
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void solenoid_buzz_on(void);
|
void solenoid_buzz_on(void);
|
||||||
|
|
|
@ -37,66 +37,60 @@ uint8_t g_twi_transfer_buffer[20];
|
||||||
uint8_t g_pwm_buffer[18];
|
uint8_t g_pwm_buffer[18];
|
||||||
bool g_pwm_buffer_update_required = false;
|
bool g_pwm_buffer_update_required = false;
|
||||||
|
|
||||||
void IS31FL3218_write_register( uint8_t reg, uint8_t data )
|
void IS31FL3218_write_register(uint8_t reg, uint8_t data) {
|
||||||
{
|
|
||||||
g_twi_transfer_buffer[0] = reg;
|
g_twi_transfer_buffer[0] = reg;
|
||||||
g_twi_transfer_buffer[1] = data;
|
g_twi_transfer_buffer[1] = data;
|
||||||
i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
i2c_transmit(ISSI_ADDRESS, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3218_write_pwm_buffer( uint8_t *pwm_buffer )
|
void IS31FL3218_write_pwm_buffer(uint8_t *pwm_buffer) {
|
||||||
{
|
|
||||||
g_twi_transfer_buffer[0] = ISSI_REG_PWM;
|
g_twi_transfer_buffer[0] = ISSI_REG_PWM;
|
||||||
for ( int i=0; i<18; i++ ) {
|
for (int i = 0; i < 18; i++) {
|
||||||
g_twi_transfer_buffer[1+i] = pwm_buffer[i];
|
g_twi_transfer_buffer[1 + i] = pwm_buffer[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 19, ISSI_TIMEOUT);
|
i2c_transmit(ISSI_ADDRESS, g_twi_transfer_buffer, 19, ISSI_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3218_init(void)
|
void IS31FL3218_init(void) {
|
||||||
{
|
|
||||||
// In case we ever want to reinitialize (?)
|
// In case we ever want to reinitialize (?)
|
||||||
IS31FL3218_write_register( ISSI_REG_RESET, 0x00 );
|
IS31FL3218_write_register(ISSI_REG_RESET, 0x00);
|
||||||
|
|
||||||
// Turn off software shutdown
|
// Turn off software shutdown
|
||||||
IS31FL3218_write_register( ISSI_REG_SHUTDOWN, 0x01 );
|
IS31FL3218_write_register(ISSI_REG_SHUTDOWN, 0x01);
|
||||||
|
|
||||||
// Set all PWM values to zero
|
// Set all PWM values to zero
|
||||||
for ( uint8_t i = 0; i < 18; i++ ) {
|
for (uint8_t i = 0; i < 18; i++) {
|
||||||
IS31FL3218_write_register( ISSI_REG_PWM+i, 0x00 );
|
IS31FL3218_write_register(ISSI_REG_PWM + i, 0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable all channels
|
// Enable all channels
|
||||||
for ( uint8_t i = 0; i < 3; i++ ) {
|
for (uint8_t i = 0; i < 3; i++) {
|
||||||
IS31FL3218_write_register( ISSI_REG_CONTROL+i, 0b00111111 );
|
IS31FL3218_write_register(ISSI_REG_CONTROL + i, 0b00111111);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load PWM registers and LED Control register data
|
// Load PWM registers and LED Control register data
|
||||||
IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 );
|
IS31FL3218_write_register(ISSI_REG_UPDATE, 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
|
||||||
g_pwm_buffer[index * 3 + 0] = red;
|
g_pwm_buffer[index * 3 + 0] = red;
|
||||||
g_pwm_buffer[index * 3 + 1] = green;
|
g_pwm_buffer[index * 3 + 1] = green;
|
||||||
g_pwm_buffer[index * 3 + 2] = blue;
|
g_pwm_buffer[index * 3 + 2] = blue;
|
||||||
g_pwm_buffer_update_required = true;
|
g_pwm_buffer_update_required = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
for (int i = 0; i < 6; i++) {
|
||||||
for ( int i = 0; i < 6; i++ ) {
|
IS31FL3218_set_color(i, red, green, blue);
|
||||||
IS31FL3218_set_color( i, red, green, blue );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3218_update_pwm_buffers(void)
|
void IS31FL3218_update_pwm_buffers(void) {
|
||||||
{
|
if (g_pwm_buffer_update_required) {
|
||||||
if ( g_pwm_buffer_update_required ) {
|
IS31FL3218_write_pwm_buffer(g_pwm_buffer);
|
||||||
IS31FL3218_write_pwm_buffer( g_pwm_buffer );
|
|
||||||
// Load PWM registers and LED Control register data
|
// Load PWM registers and LED Control register data
|
||||||
IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 );
|
IS31FL3218_write_register(ISSI_REG_UPDATE, 0x01);
|
||||||
}
|
}
|
||||||
g_pwm_buffer_update_required = false;
|
g_pwm_buffer_update_required = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,6 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
void IS31FL3218_init(void);
|
void IS31FL3218_init(void);
|
||||||
void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
|
||||||
void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
void IS31FL3218_update_pwm_buffers(void);
|
void IS31FL3218_update_pwm_buffers(void);
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include <avr/interrupt.h>
|
# include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <util/delay.h>
|
# include <util/delay.h>
|
||||||
#else
|
#else
|
||||||
#include "wait.h"
|
# include "wait.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -59,11 +59,11 @@
|
||||||
#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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ISSI_PERSISTENCE
|
#ifndef ISSI_PERSISTENCE
|
||||||
#define ISSI_PERSISTENCE 0
|
# define ISSI_PERSISTENCE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Transfer buffer for TWITransmitData()
|
// Transfer buffer for TWITransmitData()
|
||||||
|
@ -79,13 +79,13 @@ bool g_pwm_buffer_update_required = false;
|
||||||
|
|
||||||
/* There's probably a better way to init this... */
|
/* There's probably a better way to init this... */
|
||||||
#if LED_DRIVER_COUNT == 1
|
#if LED_DRIVER_COUNT == 1
|
||||||
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}};
|
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}};
|
||||||
#elif LED_DRIVER_COUNT == 2
|
#elif LED_DRIVER_COUNT == 2
|
||||||
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}};
|
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}};
|
||||||
#elif LED_DRIVER_COUNT == 3
|
#elif LED_DRIVER_COUNT == 3
|
||||||
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}};
|
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}};
|
||||||
#elif LED_DRIVER_COUNT == 4
|
#elif LED_DRIVER_COUNT == 4
|
||||||
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}};
|
uint8_t g_led_control_registers[LED_DRIVER_COUNT][18] = {{0}, {0}, {0}, {0}};
|
||||||
#endif
|
#endif
|
||||||
bool g_led_control_registers_update_required = false;
|
bool g_led_control_registers_update_required = false;
|
||||||
|
|
||||||
|
@ -103,20 +103,19 @@ bool g_led_control_registers_update_required = false;
|
||||||
// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
|
// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
|
||||||
// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
|
// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
|
||||||
|
|
||||||
|
|
||||||
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
|
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
|
||||||
g_twi_transfer_buffer[0] = reg;
|
g_twi_transfer_buffer[0] = reg;
|
||||||
g_twi_transfer_buffer[1] = data;
|
g_twi_transfer_buffer[1] = data;
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) {
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
|
void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
|
||||||
|
@ -136,14 +135,13 @@ void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
|
||||||
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,7 +194,6 @@ void IS31FL3731_init(uint8_t addr) {
|
||||||
// most usage after initialization is just writing PWM buffers in bank 0
|
// most usage after initialization is just writing PWM buffers in bank 0
|
||||||
// as there's not much point in double-buffering
|
// as there's not much point in double-buffering
|
||||||
IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
|
IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_set_value(int index, uint8_t value) {
|
void IS31FL3731_set_value(int index, uint8_t value) {
|
||||||
|
@ -239,7 +236,7 @@ void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index) {
|
||||||
|
|
||||||
void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) {
|
void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) {
|
||||||
if (g_led_control_registers_update_required) {
|
if (g_led_control_registers_update_required) {
|
||||||
for (int i=0; i<18; i++) {
|
for (int i = 0; i < 18; i++) {
|
||||||
IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]);
|
IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,13 +16,11 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef IS31FL3731_DRIVER_H
|
#ifndef IS31FL3731_DRIVER_H
|
||||||
#define IS31FL3731_DRIVER_H
|
#define IS31FL3731_DRIVER_H
|
||||||
|
|
||||||
|
|
||||||
typedef struct is31_led {
|
typedef struct is31_led {
|
||||||
uint8_t driver:2;
|
uint8_t driver : 2;
|
||||||
uint8_t v;
|
uint8_t v;
|
||||||
} __attribute__((packed)) is31_led;
|
} __attribute__((packed)) is31_led;
|
||||||
|
|
||||||
|
@ -206,5 +204,4 @@ void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index);
|
||||||
#define C9_15 0xB2
|
#define C9_15 0xB2
|
||||||
#define C9_16 0xB3
|
#define C9_16 0xB3
|
||||||
|
|
||||||
|
|
||||||
#endif // IS31FL3731_DRIVER_H
|
#endif // IS31FL3731_DRIVER_H
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include <avr/interrupt.h>
|
# include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <util/delay.h>
|
# include <util/delay.h>
|
||||||
#else
|
#else
|
||||||
#include "wait.h"
|
# include "wait.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "is31fl3731.h"
|
#include "is31fl3731.h"
|
||||||
|
@ -55,11 +55,11 @@
|
||||||
#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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ISSI_PERSISTENCE
|
#ifndef ISSI_PERSISTENCE
|
||||||
#define ISSI_PERSISTENCE 0
|
# define ISSI_PERSISTENCE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Transfer buffer for TWITransmitData()
|
// Transfer buffer for TWITransmitData()
|
||||||
|
@ -71,10 +71,10 @@ uint8_t g_twi_transfer_buffer[20];
|
||||||
// buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's
|
// buffers and the transfers in IS31FL3731_write_pwm_buffer() but it's
|
||||||
// probably not worth the extra complexity.
|
// probably not worth the extra complexity.
|
||||||
uint8_t g_pwm_buffer[DRIVER_COUNT][144];
|
uint8_t g_pwm_buffer[DRIVER_COUNT][144];
|
||||||
bool g_pwm_buffer_update_required[DRIVER_COUNT] = { false };
|
bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
|
||||||
|
|
||||||
uint8_t g_led_control_registers[DRIVER_COUNT][18] = { { 0 }, { 0 } };
|
uint8_t g_led_control_registers[DRIVER_COUNT][18] = {{0}, {0}};
|
||||||
bool g_led_control_registers_update_required[DRIVER_COUNT] = { false };
|
bool g_led_control_registers_update_required[DRIVER_COUNT] = {false};
|
||||||
|
|
||||||
// This is the bit pattern in the LED control registers
|
// This is the bit pattern in the LED control registers
|
||||||
// (for matrix A, add one to register for matrix B)
|
// (for matrix A, add one to register for matrix B)
|
||||||
|
@ -90,114 +90,103 @@ bool g_led_control_registers_update_required[DRIVER_COUNT] = { false };
|
||||||
// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
|
// 0x0E - R17,G15,G14,G13,G12,G11,G10,G09
|
||||||
// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
|
// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
|
||||||
|
|
||||||
|
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
|
||||||
void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data )
|
|
||||||
{
|
|
||||||
g_twi_transfer_buffer[0] = reg;
|
g_twi_transfer_buffer[0] = reg;
|
||||||
g_twi_transfer_buffer[1] = data;
|
g_twi_transfer_buffer[1] = data;
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
|
||||||
{
|
|
||||||
// assumes bank is already selected
|
// assumes bank is already selected
|
||||||
|
|
||||||
// transmit PWM registers in 9 transfers of 16 bytes
|
// transmit PWM registers in 9 transfers of 16 bytes
|
||||||
// g_twi_transfer_buffer[] is 20 bytes
|
// g_twi_transfer_buffer[] is 20 bytes
|
||||||
|
|
||||||
// iterate over the pwm_buffer contents at 16 byte intervals
|
// iterate over the pwm_buffer contents at 16 byte intervals
|
||||||
for ( int i = 0; i < 144; i += 16 ) {
|
for (int i = 0; i < 144; i += 16) {
|
||||||
// set the first register, e.g. 0x24, 0x34, 0x44, etc.
|
// set the first register, e.g. 0x24, 0x34, 0x44, etc.
|
||||||
g_twi_transfer_buffer[0] = 0x24 + i;
|
g_twi_transfer_buffer[0] = 0x24 + i;
|
||||||
// copy the data from i to i+15
|
// copy the data from i to i+15
|
||||||
// device will auto-increment register for data after the first byte
|
// device will auto-increment register for data after the first byte
|
||||||
// thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer
|
// thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer
|
||||||
for ( int j = 0; j < 16; j++ ) {
|
for (int j = 0; j < 16; j++) {
|
||||||
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_init( uint8_t addr )
|
void IS31FL3731_init(uint8_t addr) {
|
||||||
{
|
|
||||||
// In order to avoid the LEDs being driven with garbage data
|
// In order to avoid the LEDs being driven with garbage data
|
||||||
// in the LED driver's PWM registers, first enable software shutdown,
|
// in the LED driver's PWM registers, first enable software shutdown,
|
||||||
// then set up the mode and other settings, clear the PWM registers,
|
// then set up the mode and other settings, clear the PWM registers,
|
||||||
// then disable software shutdown.
|
// then disable software shutdown.
|
||||||
|
|
||||||
// select "function register" bank
|
// select "function register" bank
|
||||||
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG );
|
IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
|
||||||
|
|
||||||
// enable software shutdown
|
// enable software shutdown
|
||||||
IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x00 );
|
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x00);
|
||||||
// this delay was copied from other drivers, might not be needed
|
// this delay was copied from other drivers, might not be needed
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
_delay_ms( 10 );
|
_delay_ms(10);
|
||||||
#else
|
#else
|
||||||
wait_ms(10);
|
wait_ms(10);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// picture mode
|
// picture mode
|
||||||
IS31FL3731_write_register( addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE );
|
IS31FL3731_write_register(addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE);
|
||||||
// display frame 0
|
// display frame 0
|
||||||
IS31FL3731_write_register( addr, ISSI_REG_PICTUREFRAME, 0x00 );
|
IS31FL3731_write_register(addr, ISSI_REG_PICTUREFRAME, 0x00);
|
||||||
// audio sync off
|
// audio sync off
|
||||||
IS31FL3731_write_register( addr, ISSI_REG_AUDIOSYNC, 0x00 );
|
IS31FL3731_write_register(addr, ISSI_REG_AUDIOSYNC, 0x00);
|
||||||
|
|
||||||
// select bank 0
|
// select bank 0
|
||||||
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 );
|
IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
|
||||||
|
|
||||||
// turn off all LEDs in the LED control register
|
// turn off all LEDs in the LED control register
|
||||||
for ( int i = 0x00; i <= 0x11; i++ )
|
for (int i = 0x00; i <= 0x11; i++) {
|
||||||
{
|
IS31FL3731_write_register(addr, i, 0x00);
|
||||||
IS31FL3731_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// turn off all LEDs in the blink control register (not really needed)
|
// turn off all LEDs in the blink control register (not really needed)
|
||||||
for ( int i = 0x12; i <= 0x23; i++ )
|
for (int i = 0x12; i <= 0x23; i++) {
|
||||||
{
|
IS31FL3731_write_register(addr, i, 0x00);
|
||||||
IS31FL3731_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set PWM on all LEDs to 0
|
// set PWM on all LEDs to 0
|
||||||
for ( int i = 0x24; i <= 0xB3; i++ )
|
for (int i = 0x24; i <= 0xB3; i++) {
|
||||||
{
|
IS31FL3731_write_register(addr, i, 0x00);
|
||||||
IS31FL3731_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// select "function register" bank
|
// select "function register" bank
|
||||||
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG );
|
IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG);
|
||||||
|
|
||||||
// disable software shutdown
|
// disable software shutdown
|
||||||
IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x01 );
|
IS31FL3731_write_register(addr, ISSI_REG_SHUTDOWN, 0x01);
|
||||||
|
|
||||||
// select bank 0 and leave it selected.
|
// select bank 0 and leave it selected.
|
||||||
// most usage after initialization is just writing PWM buffers in bank 0
|
// most usage after initialization is just writing PWM buffers in bank 0
|
||||||
// as there's not much point in double-buffering
|
// as there's not much point in double-buffering
|
||||||
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 );
|
IS31FL3731_write_register(addr, ISSI_COMMANDREGISTER, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
if (index >= 0 && index < DRIVER_LED_TOTAL) {
|
||||||
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
// Subtract 0x24 to get the second index of g_pwm_buffer
|
// Subtract 0x24 to get the second index of g_pwm_buffer
|
||||||
|
@ -208,16 +197,13 @@ void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_set_color_all( uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
|
||||||
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ )
|
IS31FL3731_set_color(i, red, green, blue);
|
||||||
{
|
|
||||||
IS31FL3731_set_color( i, red, green, blue );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, bool blue )
|
void IS31FL3731_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
|
||||||
{
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
uint8_t control_register_r = (led.r - 0x24) / 8;
|
uint8_t control_register_r = (led.r - 0x24) / 8;
|
||||||
|
@ -227,42 +213,36 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
|
||||||
uint8_t bit_g = (led.g - 0x24) % 8;
|
uint8_t bit_g = (led.g - 0x24) % 8;
|
||||||
uint8_t bit_b = (led.b - 0x24) % 8;
|
uint8_t bit_b = (led.b - 0x24) % 8;
|
||||||
|
|
||||||
if ( red ) {
|
if (red) {
|
||||||
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
||||||
}
|
}
|
||||||
if ( green ) {
|
if (green) {
|
||||||
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
||||||
}
|
}
|
||||||
if ( blue ) {
|
if (blue) {
|
||||||
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_led_control_registers_update_required[led.driver] = true;
|
g_led_control_registers_update_required[led.driver] = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_update_pwm_buffers( uint8_t addr, uint8_t index )
|
void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index) {
|
||||||
{
|
if (g_pwm_buffer_update_required[index]) {
|
||||||
if ( g_pwm_buffer_update_required[index] )
|
IS31FL3731_write_pwm_buffer(addr, g_pwm_buffer[index]);
|
||||||
{
|
|
||||||
IS31FL3731_write_pwm_buffer( addr, g_pwm_buffer[index] );
|
|
||||||
}
|
}
|
||||||
g_pwm_buffer_update_required[index] = false;
|
g_pwm_buffer_update_required[index] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index )
|
void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index) {
|
||||||
{
|
if (g_led_control_registers_update_required[index]) {
|
||||||
if ( g_led_control_registers_update_required[index] )
|
for (int i = 0; i < 18; i++) {
|
||||||
{
|
IS31FL3731_write_register(addr, i, g_led_control_registers[index][i]);
|
||||||
for ( int i=0; i<18; i++ )
|
|
||||||
{
|
|
||||||
IS31FL3731_write_register( addr, i, g_led_control_registers[index][i] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef IS31FL3731_DRIVER_H
|
#ifndef IS31FL3731_DRIVER_H
|
||||||
#define IS31FL3731_DRIVER_H
|
#define IS31FL3731_DRIVER_H
|
||||||
|
|
||||||
|
@ -23,7 +22,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct is31_led {
|
typedef struct is31_led {
|
||||||
uint8_t driver:2;
|
uint8_t driver : 2;
|
||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
|
@ -31,21 +30,21 @@ typedef struct is31_led {
|
||||||
|
|
||||||
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
||||||
|
|
||||||
void IS31FL3731_init( uint8_t addr );
|
void IS31FL3731_init(uint8_t addr);
|
||||||
void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data );
|
void IS31FL3731_write_register(uint8_t addr, uint8_t reg, uint8_t data);
|
||||||
void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer );
|
void IS31FL3731_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
|
||||||
|
|
||||||
void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
|
||||||
void IS31FL3731_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
|
|
||||||
void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, bool blue );
|
void IS31FL3731_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
|
||||||
|
|
||||||
// This should not be called from an interrupt
|
// This should not be called from an interrupt
|
||||||
// (eg. from a timer interrupt).
|
// (eg. from a timer interrupt).
|
||||||
// Call this while idle (in between matrix scans).
|
// Call this while idle (in between matrix scans).
|
||||||
// If the buffer is dirty, it will update the driver with the buffer.
|
// If the buffer is dirty, it will update the driver with the buffer.
|
||||||
void IS31FL3731_update_pwm_buffers( uint8_t addr, uint8_t index );
|
void IS31FL3731_update_pwm_buffers(uint8_t addr, uint8_t index);
|
||||||
void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index );
|
void IS31FL3731_update_led_control_registers(uint8_t addr, uint8_t index);
|
||||||
|
|
||||||
#define C1_1 0x24
|
#define C1_1 0x24
|
||||||
#define C1_2 0x25
|
#define C1_2 0x25
|
||||||
|
@ -209,6 +208,4 @@ void IS31FL3731_update_led_control_registers( uint8_t addr, uint8_t index );
|
||||||
#define C9_15 0xB2
|
#define C9_15 0xB2
|
||||||
#define C9_16 0xB3
|
#define C9_16 0xB3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // IS31FL3731_DRIVER_H
|
#endif // IS31FL3731_DRIVER_H
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include <avr/interrupt.h>
|
# include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <util/delay.h>
|
# include <util/delay.h>
|
||||||
#else
|
#else
|
||||||
#include "wait.h"
|
# include "wait.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "is31fl3733.h"
|
#include "is31fl3733.h"
|
||||||
|
@ -46,23 +46,23 @@
|
||||||
#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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ISSI_PERSISTENCE
|
#ifndef ISSI_PERSISTENCE
|
||||||
#define ISSI_PERSISTENCE 0
|
# define ISSI_PERSISTENCE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Transfer buffer for TWITransmitData()
|
// Transfer buffer for TWITransmitData()
|
||||||
|
@ -75,56 +75,51 @@ uint8_t g_twi_transfer_buffer[20];
|
||||||
// buffers and the transfers in IS31FL3733_write_pwm_buffer() but it's
|
// buffers and the transfers in IS31FL3733_write_pwm_buffer() but it's
|
||||||
// probably not worth the extra complexity.
|
// probably not worth the extra complexity.
|
||||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
||||||
bool g_pwm_buffer_update_required[DRIVER_COUNT] = { false };
|
bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
|
||||||
|
|
||||||
uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 }, { 0 } };
|
uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}, {0}};
|
||||||
bool g_led_control_registers_update_required[DRIVER_COUNT] = { false };
|
bool g_led_control_registers_update_required[DRIVER_COUNT] = {false};
|
||||||
|
|
||||||
void IS31FL3733_write_register( uint8_t addr, uint8_t reg, uint8_t data )
|
void IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
|
||||||
{
|
|
||||||
g_twi_transfer_buffer[0] = reg;
|
g_twi_transfer_buffer[0] = reg;
|
||||||
g_twi_transfer_buffer[1] = data;
|
g_twi_transfer_buffer[1] = data;
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3733_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
void IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
|
||||||
{
|
|
||||||
// assumes PG1 is already selected
|
// assumes PG1 is already selected
|
||||||
|
|
||||||
// transmit PWM registers in 12 transfers of 16 bytes
|
// transmit PWM registers in 12 transfers of 16 bytes
|
||||||
// g_twi_transfer_buffer[] is 20 bytes
|
// g_twi_transfer_buffer[] is 20 bytes
|
||||||
|
|
||||||
// iterate over the pwm_buffer contents at 16 byte intervals
|
// iterate over the pwm_buffer contents at 16 byte intervals
|
||||||
for ( int i = 0; i < 192; i += 16 ) {
|
for (int i = 0; i < 192; i += 16) {
|
||||||
g_twi_transfer_buffer[0] = i;
|
g_twi_transfer_buffer[0] = i;
|
||||||
// copy the data from i to i+15
|
// copy the data from i to i+15
|
||||||
// device will auto-increment register for data after the first byte
|
// device will auto-increment register for data after the first byte
|
||||||
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
|
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
|
||||||
for ( int j = 0; j < 16; j++ ) {
|
for (int j = 0; j < 16; j++) {
|
||||||
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3733_init( uint8_t addr, uint8_t sync)
|
void IS31FL3733_init(uint8_t addr, uint8_t sync) {
|
||||||
{
|
|
||||||
// In order to avoid the LEDs being driven with garbage data
|
// In order to avoid the LEDs being driven with garbage data
|
||||||
// in the LED driver's PWM registers, shutdown is enabled last.
|
// in the LED driver's PWM registers, shutdown is enabled last.
|
||||||
// Set up the mode and other settings, clear the PWM registers,
|
// Set up the mode and other settings, clear the PWM registers,
|
||||||
|
@ -132,49 +127,46 @@ void IS31FL3733_init( uint8_t addr, uint8_t sync)
|
||||||
// Sync is passed so set it according to the datasheet.
|
// Sync is passed so set it according to the datasheet.
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG0
|
// Select PG0
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||||
// Turn off all LEDs.
|
// Turn off all LEDs.
|
||||||
for ( int i = 0x00; i <= 0x17; i++ )
|
for (int i = 0x00; i <= 0x17; i++) {
|
||||||
{
|
IS31FL3733_write_register(addr, i, 0x00);
|
||||||
IS31FL3733_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG1
|
// Select PG1
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||||
// Set PWM on all LEDs to 0
|
// Set PWM on all LEDs to 0
|
||||||
// No need to setup Breath registers to PWM as that is the default.
|
// No need to setup Breath registers to PWM as that is the default.
|
||||||
for ( int i = 0x00; i <= 0xBF; i++ )
|
for (int i = 0x00; i <= 0xBF; i++) {
|
||||||
{
|
IS31FL3733_write_register(addr, i, 0x00);
|
||||||
IS31FL3733_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG3
|
// Select PG3
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
|
||||||
// Set global current to maximum.
|
// Set global current to maximum.
|
||||||
IS31FL3733_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF );
|
IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
|
||||||
// Disable software shutdown.
|
// Disable software shutdown.
|
||||||
IS31FL3733_write_register( addr, ISSI_REG_CONFIGURATION, (sync << 6) | 0x01 );
|
IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, (sync << 6) | 0x01);
|
||||||
|
|
||||||
// Wait 10ms to ensure the device has woken up.
|
// Wait 10ms to ensure the device has woken up.
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
_delay_ms( 10 );
|
_delay_ms(10);
|
||||||
#else
|
#else
|
||||||
wait_ms(10);
|
wait_ms(10);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3733_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
if (index >= 0 && index < DRIVER_LED_TOTAL) {
|
||||||
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
g_pwm_buffer[led.driver][led.r] = red;
|
g_pwm_buffer[led.driver][led.r] = red;
|
||||||
|
@ -184,16 +176,13 @@ void IS31FL3733_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3733_set_color_all( uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
|
||||||
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ )
|
IS31FL3733_set_color(i, red, green, blue);
|
||||||
{
|
|
||||||
IS31FL3733_set_color( i, red, green, blue );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3733_set_led_control_register( uint8_t index, bool red, bool green, bool blue )
|
void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
|
||||||
{
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
uint8_t control_register_r = led.r / 8;
|
uint8_t control_register_r = led.r / 8;
|
||||||
|
@ -203,49 +192,43 @@ void IS31FL3733_set_led_control_register( uint8_t index, bool red, bool green, b
|
||||||
uint8_t bit_g = led.g % 8;
|
uint8_t bit_g = led.g % 8;
|
||||||
uint8_t bit_b = led.b % 8;
|
uint8_t bit_b = led.b % 8;
|
||||||
|
|
||||||
if ( red ) {
|
if (red) {
|
||||||
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
||||||
}
|
}
|
||||||
if ( green ) {
|
if (green) {
|
||||||
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
||||||
}
|
}
|
||||||
if ( blue ) {
|
if (blue) {
|
||||||
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_led_control_registers_update_required[led.driver] = true;
|
g_led_control_registers_update_required[led.driver] = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3733_update_pwm_buffers( uint8_t addr, uint8_t index )
|
void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index) {
|
||||||
{
|
if (g_pwm_buffer_update_required[index]) {
|
||||||
if ( g_pwm_buffer_update_required[index] )
|
|
||||||
{
|
|
||||||
// Firstly we need to unlock the command register and select PG1
|
// Firstly we need to unlock the command register and select PG1
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||||
|
|
||||||
IS31FL3733_write_pwm_buffer( addr, g_pwm_buffer[index] );
|
IS31FL3733_write_pwm_buffer(addr, g_pwm_buffer[index]);
|
||||||
}
|
}
|
||||||
g_pwm_buffer_update_required[index] = false;
|
g_pwm_buffer_update_required[index] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3733_update_led_control_registers( uint8_t addr, uint8_t index )
|
void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index) {
|
||||||
{
|
if (g_led_control_registers_update_required[index]) {
|
||||||
if ( g_led_control_registers_update_required[index] )
|
|
||||||
{
|
|
||||||
// Firstly we need to unlock the command register and select PG0
|
// Firstly we need to unlock the command register and select PG0
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
IS31FL3733_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||||
for ( int i=0; i<24; i++ )
|
for (int i = 0; i < 24; i++) {
|
||||||
{
|
IS31FL3733_write_register(addr, i, g_led_control_registers[index][i]);
|
||||||
IS31FL3733_write_register(addr, i, g_led_control_registers[index][i] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_led_control_registers_update_required[index] = false;
|
g_led_control_registers_update_required[index] = false;
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef IS31FL3733_DRIVER_H
|
#ifndef IS31FL3733_DRIVER_H
|
||||||
#define IS31FL3733_DRIVER_H
|
#define IS31FL3733_DRIVER_H
|
||||||
|
|
||||||
|
@ -24,7 +23,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct is31_led {
|
typedef struct is31_led {
|
||||||
uint8_t driver:2;
|
uint8_t driver : 2;
|
||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
|
@ -32,21 +31,21 @@ typedef struct is31_led {
|
||||||
|
|
||||||
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
||||||
|
|
||||||
void IS31FL3733_init( uint8_t addr, uint8_t sync );
|
void IS31FL3733_init(uint8_t addr, uint8_t sync);
|
||||||
void IS31FL3733_write_register( uint8_t addr, uint8_t reg, uint8_t data );
|
void IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
|
||||||
void IS31FL3733_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer );
|
void IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
|
||||||
|
|
||||||
void IS31FL3733_set_color( int index, uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
|
||||||
void IS31FL3733_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
|
|
||||||
void IS31FL3733_set_led_control_register( uint8_t index, bool red, bool green, bool blue );
|
void IS31FL3733_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
|
||||||
|
|
||||||
// This should not be called from an interrupt
|
// This should not be called from an interrupt
|
||||||
// (eg. from a timer interrupt).
|
// (eg. from a timer interrupt).
|
||||||
// Call this while idle (in between matrix scans).
|
// Call this while idle (in between matrix scans).
|
||||||
// If the buffer is dirty, it will update the driver with the buffer.
|
// If the buffer is dirty, it will update the driver with the buffer.
|
||||||
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 A_1 0x00
|
#define A_1 0x00
|
||||||
#define A_2 0x01
|
#define A_2 0x01
|
||||||
|
|
|
@ -14,13 +14,12 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include <avr/interrupt.h>
|
# include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <util/delay.h>
|
# include <util/delay.h>
|
||||||
#else
|
#else
|
||||||
#include "wait.h"
|
# include "wait.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "is31fl3736.h"
|
#include "is31fl3736.h"
|
||||||
|
@ -28,8 +27,6 @@
|
||||||
#include "i2c_master.h"
|
#include "i2c_master.h"
|
||||||
#include "progmem.h"
|
#include "progmem.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||||
// The address will vary depending on your wiring:
|
// The address will vary depending on your wiring:
|
||||||
|
@ -47,23 +44,23 @@
|
||||||
#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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ISSI_PERSISTENCE
|
#ifndef ISSI_PERSISTENCE
|
||||||
#define ISSI_PERSISTENCE 0
|
# define ISSI_PERSISTENCE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Transfer buffer for TWITransmitData()
|
// Transfer buffer for TWITransmitData()
|
||||||
|
@ -78,103 +75,95 @@ uint8_t g_twi_transfer_buffer[20];
|
||||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
||||||
bool g_pwm_buffer_update_required = false;
|
bool g_pwm_buffer_update_required = false;
|
||||||
|
|
||||||
uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 }, { 0 } };
|
uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}, {0}};
|
||||||
bool g_led_control_registers_update_required = false;
|
bool g_led_control_registers_update_required = false;
|
||||||
|
|
||||||
void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data )
|
void IS31FL3736_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
|
||||||
{
|
|
||||||
g_twi_transfer_buffer[0] = reg;
|
g_twi_transfer_buffer[0] = reg;
|
||||||
g_twi_transfer_buffer[1] = data;
|
g_twi_transfer_buffer[1] = data;
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
void IS31FL3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
|
||||||
{
|
|
||||||
// assumes PG1 is already selected
|
// assumes PG1 is already selected
|
||||||
|
|
||||||
// transmit PWM registers in 12 transfers of 16 bytes
|
// transmit PWM registers in 12 transfers of 16 bytes
|
||||||
// g_twi_transfer_buffer[] is 20 bytes
|
// g_twi_transfer_buffer[] is 20 bytes
|
||||||
|
|
||||||
// iterate over the pwm_buffer contents at 16 byte intervals
|
// iterate over the pwm_buffer contents at 16 byte intervals
|
||||||
for ( int i = 0; i < 192; i += 16 ) {
|
for (int i = 0; i < 192; i += 16) {
|
||||||
g_twi_transfer_buffer[0] = i;
|
g_twi_transfer_buffer[0] = i;
|
||||||
// copy the data from i to i+15
|
// copy the data from i to i+15
|
||||||
// device will auto-increment register for data after the first byte
|
// device will auto-increment register for data after the first byte
|
||||||
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
|
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
|
||||||
for ( int j = 0; j < 16; j++ ) {
|
for (int j = 0; j < 16; j++) {
|
||||||
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_init( uint8_t addr )
|
void IS31FL3736_init(uint8_t addr) {
|
||||||
{
|
|
||||||
// In order to avoid the LEDs being driven with garbage data
|
// In order to avoid the LEDs being driven with garbage data
|
||||||
// in the LED driver's PWM registers, shutdown is enabled last.
|
// in the LED driver's PWM registers, shutdown is enabled last.
|
||||||
// Set up the mode and other settings, clear the PWM registers,
|
// Set up the mode and other settings, clear the PWM registers,
|
||||||
// then disable software shutdown.
|
// then disable software shutdown.
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG0
|
// Select PG0
|
||||||
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||||
// Turn off all LEDs.
|
// Turn off all LEDs.
|
||||||
for ( int i = 0x00; i <= 0x17; i++ )
|
for (int i = 0x00; i <= 0x17; i++) {
|
||||||
{
|
IS31FL3736_write_register(addr, i, 0x00);
|
||||||
IS31FL3736_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG1
|
// Select PG1
|
||||||
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||||
// Set PWM on all LEDs to 0
|
// Set PWM on all LEDs to 0
|
||||||
// No need to setup Breath registers to PWM as that is the default.
|
// No need to setup Breath registers to PWM as that is the default.
|
||||||
for ( int i = 0x00; i <= 0xBF; i++ )
|
for (int i = 0x00; i <= 0xBF; i++) {
|
||||||
{
|
IS31FL3736_write_register(addr, i, 0x00);
|
||||||
IS31FL3736_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG3
|
// Select PG3
|
||||||
IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION );
|
IS31FL3736_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
|
||||||
// Set global current to maximum.
|
// Set global current to maximum.
|
||||||
IS31FL3736_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF );
|
IS31FL3736_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
|
||||||
// Disable software shutdown.
|
// Disable software shutdown.
|
||||||
IS31FL3736_write_register( addr, ISSI_REG_CONFIGURATION, 0x01 );
|
IS31FL3736_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
|
||||||
|
|
||||||
// Wait 10ms to ensure the device has woken up.
|
// Wait 10ms to ensure the device has woken up.
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
_delay_ms( 10 );
|
_delay_ms(10);
|
||||||
#else
|
#else
|
||||||
wait_ms(10);
|
wait_ms(10);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
if (index >= 0 && index < DRIVER_LED_TOTAL) {
|
||||||
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
g_pwm_buffer[led.driver][led.r] = red;
|
g_pwm_buffer[led.driver][led.r] = red;
|
||||||
|
@ -184,16 +173,13 @@ void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
|
||||||
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ )
|
IS31FL3736_set_color(i, red, green, blue);
|
||||||
{
|
|
||||||
IS31FL3736_set_color( i, red, green, blue );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue )
|
void IS31FL3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
|
||||||
{
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
// IS31FL3733
|
// IS31FL3733
|
||||||
|
@ -217,29 +203,27 @@ void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, b
|
||||||
uint8_t bit_g = led.g % 8;
|
uint8_t bit_g = led.g % 8;
|
||||||
uint8_t bit_b = led.b % 8;
|
uint8_t bit_b = led.b % 8;
|
||||||
|
|
||||||
if ( red ) {
|
if (red) {
|
||||||
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
||||||
}
|
}
|
||||||
if ( green ) {
|
if (green) {
|
||||||
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
||||||
}
|
}
|
||||||
if ( blue ) {
|
if (blue) {
|
||||||
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_led_control_registers_update_required = true;
|
g_led_control_registers_update_required = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_mono_set_brightness( int index, uint8_t value )
|
void IS31FL3736_mono_set_brightness(int index, uint8_t value) {
|
||||||
{
|
if (index >= 0 && index < 96) {
|
||||||
if ( index >= 0 && index < 96 ) {
|
|
||||||
// Index in range 0..95 -> A1..A8, B1..B8, etc.
|
// Index in range 0..95 -> A1..A8, B1..B8, etc.
|
||||||
// Map index 0..95 to registers 0x00..0xBE (interleaved)
|
// Map index 0..95 to registers 0x00..0xBE (interleaved)
|
||||||
uint8_t pwm_register = index * 2;
|
uint8_t pwm_register = index * 2;
|
||||||
|
@ -248,16 +232,13 @@ void IS31FL3736_mono_set_brightness( int index, uint8_t value )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_mono_set_brightness_all( uint8_t value )
|
void IS31FL3736_mono_set_brightness_all(uint8_t value) {
|
||||||
{
|
for (int i = 0; i < 96; i++) {
|
||||||
for ( int i = 0; i < 96; i++ )
|
IS31FL3736_mono_set_brightness(i, value);
|
||||||
{
|
|
||||||
IS31FL3736_mono_set_brightness( i, value );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled )
|
void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled) {
|
||||||
{
|
|
||||||
// Index in range 0..95 -> A1..A8, B1..B8, etc.
|
// Index in range 0..95 -> A1..A8, B1..B8, etc.
|
||||||
|
|
||||||
// Map index 0..95 to registers 0x00..0xBE (interleaved)
|
// Map index 0..95 to registers 0x00..0xBE (interleaved)
|
||||||
|
@ -266,7 +247,7 @@ void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled )
|
||||||
uint8_t control_register = pwm_register / 8;
|
uint8_t control_register = pwm_register / 8;
|
||||||
uint8_t bit = pwm_register % 8;
|
uint8_t bit = pwm_register % 8;
|
||||||
|
|
||||||
if ( enabled ) {
|
if (enabled) {
|
||||||
g_led_control_registers[0][control_register] |= (1 << bit);
|
g_led_control_registers[0][control_register] |= (1 << bit);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[0][control_register] &= ~(1 << bit);
|
g_led_control_registers[0][control_register] &= ~(1 << bit);
|
||||||
|
@ -275,32 +256,26 @@ void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled )
|
||||||
g_led_control_registers_update_required = true;
|
g_led_control_registers_update_required = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )
|
void IS31FL3736_update_pwm_buffers(uint8_t addr1, uint8_t addr2) {
|
||||||
{
|
if (g_pwm_buffer_update_required) {
|
||||||
if ( g_pwm_buffer_update_required )
|
|
||||||
{
|
|
||||||
// Firstly we need to unlock the command register and select PG1
|
// Firstly we need to unlock the command register and select PG1
|
||||||
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||||
|
|
||||||
IS31FL3736_write_pwm_buffer( addr1, g_pwm_buffer[0] );
|
IS31FL3736_write_pwm_buffer(addr1, g_pwm_buffer[0]);
|
||||||
//IS31FL3736_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
// IS31FL3736_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
||||||
}
|
}
|
||||||
g_pwm_buffer_update_required = false;
|
g_pwm_buffer_update_required = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 )
|
void IS31FL3736_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
|
||||||
{
|
if (g_led_control_registers_update_required) {
|
||||||
if ( g_led_control_registers_update_required )
|
|
||||||
{
|
|
||||||
// Firstly we need to unlock the command register and select PG0
|
// Firstly we need to unlock the command register and select PG0
|
||||||
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
IS31FL3736_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||||
for ( int i=0; i<24; i++ )
|
for (int i = 0; i < 24; i++) {
|
||||||
{
|
IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i]);
|
||||||
IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i] );
|
// IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i] );
|
||||||
//IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,22 +19,19 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
||||||
// Simple interface option.
|
// Simple interface option.
|
||||||
// If these aren't defined, just define them to make it compile
|
// If these aren't defined, just define them to make it compile
|
||||||
|
|
||||||
|
|
||||||
#ifndef DRIVER_COUNT
|
#ifndef DRIVER_COUNT
|
||||||
#define DRIVER_COUNT 2
|
# define DRIVER_COUNT 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DRIVER_LED_TOTAL
|
#ifndef DRIVER_LED_TOTAL
|
||||||
#define DRIVER_LED_TOTAL 96
|
# define DRIVER_LED_TOTAL 96
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef struct is31_led {
|
typedef struct is31_led {
|
||||||
uint8_t driver:2;
|
uint8_t driver : 2;
|
||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
|
@ -42,25 +39,25 @@ typedef struct is31_led {
|
||||||
|
|
||||||
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
||||||
|
|
||||||
void IS31FL3736_init( uint8_t addr );
|
void IS31FL3736_init(uint8_t addr);
|
||||||
void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data );
|
void IS31FL3736_write_register(uint8_t addr, uint8_t reg, uint8_t data);
|
||||||
void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer );
|
void IS31FL3736_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
|
||||||
|
|
||||||
void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
|
||||||
void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
|
|
||||||
void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue );
|
void IS31FL3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
|
||||||
|
|
||||||
void IS31FL3736_mono_set_brightness( int index, uint8_t value );
|
void IS31FL3736_mono_set_brightness(int index, uint8_t value);
|
||||||
void IS31FL3736_mono_set_brightness_all( uint8_t value );
|
void IS31FL3736_mono_set_brightness_all(uint8_t value);
|
||||||
void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled );
|
void IS31FL3736_mono_set_led_control_register(uint8_t index, bool enabled);
|
||||||
|
|
||||||
// This should not be called from an interrupt
|
// This should not be called from an interrupt
|
||||||
// (eg. from a timer interrupt).
|
// (eg. from a timer interrupt).
|
||||||
// Call this while idle (in between matrix scans).
|
// Call this while idle (in between matrix scans).
|
||||||
// If the buffer is dirty, it will update the driver with the buffer.
|
// If the buffer is dirty, it will update the driver with the buffer.
|
||||||
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 A_1 0x00
|
#define A_1 0x00
|
||||||
#define A_2 0x02
|
#define A_2 0x02
|
||||||
|
@ -169,4 +166,3 @@ void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 );
|
||||||
#define L_6 0xBA
|
#define L_6 0xBA
|
||||||
#define L_7 0xBC
|
#define L_7 0xBC
|
||||||
#define L_8 0xBE
|
#define L_8 0xBE
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include <avr/interrupt.h>
|
# include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <util/delay.h>
|
# include <util/delay.h>
|
||||||
#else
|
#else
|
||||||
#include "wait.h"
|
# include "wait.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -46,23 +46,23 @@
|
||||||
#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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ISSI_PERSISTENCE
|
#ifndef ISSI_PERSISTENCE
|
||||||
#define ISSI_PERSISTENCE 0
|
# define ISSI_PERSISTENCE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Transfer buffer for TWITransmitData()
|
// Transfer buffer for TWITransmitData()
|
||||||
|
@ -77,103 +77,95 @@ uint8_t g_twi_transfer_buffer[20];
|
||||||
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
uint8_t g_pwm_buffer[DRIVER_COUNT][192];
|
||||||
bool g_pwm_buffer_update_required = false;
|
bool g_pwm_buffer_update_required = false;
|
||||||
|
|
||||||
uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 } };
|
uint8_t g_led_control_registers[DRIVER_COUNT][24] = {{0}};
|
||||||
bool g_led_control_registers_update_required = false;
|
bool g_led_control_registers_update_required = false;
|
||||||
|
|
||||||
void IS31FL3737_write_register( uint8_t addr, uint8_t reg, uint8_t data )
|
void IS31FL3737_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
|
||||||
{
|
|
||||||
g_twi_transfer_buffer[0] = reg;
|
g_twi_transfer_buffer[0] = reg;
|
||||||
g_twi_transfer_buffer[1] = data;
|
g_twi_transfer_buffer[1] = data;
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3737_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
void IS31FL3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
|
||||||
{
|
|
||||||
// assumes PG1 is already selected
|
// assumes PG1 is already selected
|
||||||
|
|
||||||
// transmit PWM registers in 12 transfers of 16 bytes
|
// transmit PWM registers in 12 transfers of 16 bytes
|
||||||
// g_twi_transfer_buffer[] is 20 bytes
|
// g_twi_transfer_buffer[] is 20 bytes
|
||||||
|
|
||||||
// iterate over the pwm_buffer contents at 16 byte intervals
|
// iterate over the pwm_buffer contents at 16 byte intervals
|
||||||
for ( int i = 0; i < 192; i += 16 ) {
|
for (int i = 0; i < 192; i += 16) {
|
||||||
g_twi_transfer_buffer[0] = i;
|
g_twi_transfer_buffer[0] = i;
|
||||||
// copy the data from i to i+15
|
// copy the data from i to i+15
|
||||||
// device will auto-increment register for data after the first byte
|
// device will auto-increment register for data after the first byte
|
||||||
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
|
// thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer
|
||||||
for ( int j = 0; j < 16; j++ ) {
|
for (int j = 0; j < 16; j++) {
|
||||||
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ISSI_PERSISTENCE > 0
|
#if ISSI_PERSISTENCE > 0
|
||||||
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3737_init( uint8_t addr )
|
void IS31FL3737_init(uint8_t addr) {
|
||||||
{
|
|
||||||
// In order to avoid the LEDs being driven with garbage data
|
// In order to avoid the LEDs being driven with garbage data
|
||||||
// in the LED driver's PWM registers, shutdown is enabled last.
|
// in the LED driver's PWM registers, shutdown is enabled last.
|
||||||
// Set up the mode and other settings, clear the PWM registers,
|
// Set up the mode and other settings, clear the PWM registers,
|
||||||
// then disable software shutdown.
|
// then disable software shutdown.
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG0
|
// Select PG0
|
||||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||||
// Turn off all LEDs.
|
// Turn off all LEDs.
|
||||||
for ( int i = 0x00; i <= 0x17; i++ )
|
for (int i = 0x00; i <= 0x17; i++) {
|
||||||
{
|
IS31FL3737_write_register(addr, i, 0x00);
|
||||||
IS31FL3737_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG1
|
// Select PG1
|
||||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||||
// Set PWM on all LEDs to 0
|
// Set PWM on all LEDs to 0
|
||||||
// No need to setup Breath registers to PWM as that is the default.
|
// No need to setup Breath registers to PWM as that is the default.
|
||||||
for ( int i = 0x00; i <= 0xBF; i++ )
|
for (int i = 0x00; i <= 0xBF; i++) {
|
||||||
{
|
IS31FL3737_write_register(addr, i, 0x00);
|
||||||
IS31FL3737_write_register( addr, i, 0x00 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlock the command register.
|
// Unlock the command register.
|
||||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
|
|
||||||
// Select PG3
|
// Select PG3
|
||||||
IS31FL3737_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION );
|
IS31FL3737_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
|
||||||
// Set global current to maximum.
|
// Set global current to maximum.
|
||||||
IS31FL3737_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF );
|
IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
|
||||||
// Disable software shutdown.
|
// Disable software shutdown.
|
||||||
IS31FL3737_write_register( addr, ISSI_REG_CONFIGURATION, 0x01 );
|
IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
|
||||||
|
|
||||||
// Wait 10ms to ensure the device has woken up.
|
// Wait 10ms to ensure the device has woken up.
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
_delay_ms( 10 );
|
_delay_ms(10);
|
||||||
#else
|
#else
|
||||||
wait_ms(10);
|
wait_ms(10);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
if (index >= 0 && index < DRIVER_LED_TOTAL) {
|
||||||
if ( index >= 0 && index < DRIVER_LED_TOTAL ) {
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
g_pwm_buffer[led.driver][led.r] = red;
|
g_pwm_buffer[led.driver][led.r] = red;
|
||||||
|
@ -183,16 +175,13 @@ void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3737_set_color_all( uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
|
||||||
{
|
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
|
||||||
for ( int i = 0; i < DRIVER_LED_TOTAL; i++ )
|
IS31FL3737_set_color(i, red, green, blue);
|
||||||
{
|
|
||||||
IS31FL3737_set_color( i, red, green, blue );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, bool blue )
|
void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
|
||||||
{
|
|
||||||
is31_led led = g_is31_leds[index];
|
is31_led led = g_is31_leds[index];
|
||||||
|
|
||||||
uint8_t control_register_r = led.r / 8;
|
uint8_t control_register_r = led.r / 8;
|
||||||
|
@ -202,51 +191,45 @@ void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, b
|
||||||
uint8_t bit_g = led.g % 8;
|
uint8_t bit_g = led.g % 8;
|
||||||
uint8_t bit_b = led.b % 8;
|
uint8_t bit_b = led.b % 8;
|
||||||
|
|
||||||
if ( red ) {
|
if (red) {
|
||||||
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r);
|
||||||
}
|
}
|
||||||
if ( green ) {
|
if (green) {
|
||||||
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g);
|
||||||
}
|
}
|
||||||
if ( blue ) {
|
if (blue) {
|
||||||
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b);
|
||||||
} else {
|
} else {
|
||||||
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_led_control_registers_update_required = true;
|
g_led_control_registers_update_required = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3737_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )
|
void IS31FL3737_update_pwm_buffers(uint8_t addr1, uint8_t addr2) {
|
||||||
{
|
if (g_pwm_buffer_update_required) {
|
||||||
if ( g_pwm_buffer_update_required )
|
|
||||||
{
|
|
||||||
// Firstly we need to unlock the command register and select PG1
|
// Firstly we need to unlock the command register and select PG1
|
||||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM );
|
IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
|
||||||
|
|
||||||
IS31FL3737_write_pwm_buffer( addr1, g_pwm_buffer[0] );
|
IS31FL3737_write_pwm_buffer(addr1, g_pwm_buffer[0]);
|
||||||
//IS31FL3737_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
// IS31FL3737_write_pwm_buffer( addr2, g_pwm_buffer[1] );
|
||||||
}
|
}
|
||||||
g_pwm_buffer_update_required = false;
|
g_pwm_buffer_update_required = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3737_update_led_control_registers( uint8_t addr1, uint8_t addr2 )
|
void IS31FL3737_update_led_control_registers(uint8_t addr1, uint8_t addr2) {
|
||||||
{
|
if (g_led_control_registers_update_required) {
|
||||||
if ( g_led_control_registers_update_required )
|
|
||||||
{
|
|
||||||
// Firstly we need to unlock the command register and select PG0
|
// Firstly we need to unlock the command register and select PG0
|
||||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 );
|
IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
|
||||||
IS31FL3737_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL );
|
IS31FL3737_write_register(addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
|
||||||
for ( int i=0; i<24; i++ )
|
for (int i = 0; i < 24; i++) {
|
||||||
{
|
IS31FL3737_write_register(addr1, i, g_led_control_registers[0][i]);
|
||||||
IS31FL3737_write_register(addr1, i, g_led_control_registers[0][i] );
|
// IS31FL3737_write_register(addr2, i, g_led_control_registers[1][i] );
|
||||||
//IS31FL3737_write_register(addr2, i, g_led_control_registers[1][i] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef IS31FL3737_DRIVER_H
|
#ifndef IS31FL3737_DRIVER_H
|
||||||
#define IS31FL3737_DRIVER_H
|
#define IS31FL3737_DRIVER_H
|
||||||
|
|
||||||
|
@ -24,7 +23,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct is31_led {
|
typedef struct is31_led {
|
||||||
uint8_t driver:2;
|
uint8_t driver : 2;
|
||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
|
@ -32,21 +31,21 @@ typedef struct is31_led {
|
||||||
|
|
||||||
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
|
||||||
|
|
||||||
void IS31FL3737_init( uint8_t addr );
|
void IS31FL3737_init(uint8_t addr);
|
||||||
void IS31FL3737_write_register( uint8_t addr, uint8_t reg, uint8_t data );
|
void IS31FL3737_write_register(uint8_t addr, uint8_t reg, uint8_t data);
|
||||||
void IS31FL3737_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer );
|
void IS31FL3737_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
|
||||||
|
|
||||||
void IS31FL3737_set_color( int index, uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
|
||||||
void IS31FL3737_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
|
void IS31FL3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
|
|
||||||
void IS31FL3737_set_led_control_register( uint8_t index, bool red, bool green, bool blue );
|
void IS31FL3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
|
||||||
|
|
||||||
// This should not be called from an interrupt
|
// This should not be called from an interrupt
|
||||||
// (eg. from a timer interrupt).
|
// (eg. from a timer interrupt).
|
||||||
// Call this while idle (in between matrix scans).
|
// Call this while idle (in between matrix scans).
|
||||||
// If the buffer is dirty, it will update the driver with the buffer.
|
// If the buffer is dirty, it will update the driver with the buffer.
|
||||||
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 A_1 0x00
|
#define A_1 0x00
|
||||||
#define A_2 0x01
|
#define A_2 0x01
|
||||||
|
|
|
@ -1,240 +1,25 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
#elif defined(ESP8266)
|
#elif defined(ESP8266)
|
||||||
#include <pgmspace.h>
|
# include <pgmspace.h>
|
||||||
#else
|
#else
|
||||||
#define PROGMEM
|
# define PROGMEM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Helidox 8x6 font with QMK Firmware Logo
|
// Helidox 8x6 font with QMK Firmware Logo
|
||||||
// Online editor: http://teripom.x0.com/
|
// Online editor: http://teripom.x0.com/
|
||||||
|
|
||||||
static const unsigned char font[] PROGMEM = {
|
static const unsigned char font[] PROGMEM = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, 0x26, 0x29, 0x79, 0x29, 0x26, 0x00, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
|
||||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
|
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
|
||||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
|
0x72, 0x49, 0x49, 0x49, 0x46, 0x00, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
|
||||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
|
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, 0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
|
||||||
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
|
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
|
||||||
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
|
0x00, 0x41, 0x36, 0x08, 0x00, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0xF0, 0xF8, 0xF8, 0xFF, 0x38, 0xFF, 0xF8, 0xF8, 0x3F, 0xF8, 0xF8, 0xFF, 0x38, 0xFF, 0xF8, 0xF8, 0xF0, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xFC, 0x3E,
|
||||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
|
0x1E, 0x06, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, 0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xDF, 0xBF, 0xBF, 0x00, 0xBF, 0xBF, 0xDF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x60, 0x60, 0xE0, 0xBF, 0x1F, 0x00, 0x7F, 0x7F, 0x07, 0x1E, 0x38, 0x1E, 0x07, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x0E, 0x1F, 0x3B, 0x71, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x0C, 0x0C, 0x0C, 0x00, 0x7E, 0x7E, 0x00, 0x7F, 0x7E, 0x03, 0x03, 0x00, 0x7F, 0x7E, 0x03, 0x03, 0x7E, 0x7E, 0x03, 0x03, 0x7F, 0x7E, 0x00, 0x0F,
|
||||||
0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
|
0x3E, 0x70, 0x3C, 0x06, 0x3C, 0x70, 0x3E, 0x0F, 0x00, 0x32, 0x7B, 0x49, 0x49, 0x3F, 0x7E, 0x00, 0x7F, 0x7E, 0x03, 0x03, 0x00, 0x1E, 0x3F, 0x69, 0x69, 0x6F, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3F, 0x3C, 0x78, 0x70, 0x60, 0x00, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00, 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x07, 0x0F, 0x0F, 0x7F, 0x0F, 0x7F, 0x0F, 0x0F, 0x7E, 0x0F, 0x0F, 0x7F, 0x0F, 0x7F, 0x0F, 0x0F, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
|
|
||||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
|
|
||||||
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
|
|
||||||
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
|
|
||||||
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
|
|
||||||
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
|
|
||||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
|
|
||||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
|
|
||||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
|
|
||||||
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
|
|
||||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
|
|
||||||
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
|
|
||||||
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
|
|
||||||
0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
|
|
||||||
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
|
|
||||||
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
|
|
||||||
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
|
|
||||||
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
|
|
||||||
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
|
|
||||||
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
|
|
||||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
|
|
||||||
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
|
|
||||||
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
|
|
||||||
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
|
|
||||||
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
|
|
||||||
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
|
|
||||||
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
|
|
||||||
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
|
|
||||||
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
|
|
||||||
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
|
|
||||||
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
|
|
||||||
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
|
|
||||||
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
|
|
||||||
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
|
|
||||||
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
|
|
||||||
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
|
|
||||||
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
|
|
||||||
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
|
|
||||||
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
|
|
||||||
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
|
|
||||||
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
|
|
||||||
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
|
|
||||||
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
|
|
||||||
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
|
|
||||||
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
|
|
||||||
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
|
|
||||||
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
|
|
||||||
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
|
|
||||||
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
|
|
||||||
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
|
|
||||||
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
|
|
||||||
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
|
|
||||||
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
|
|
||||||
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
|
|
||||||
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
|
||||||
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
|
|
||||||
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
|
|
||||||
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
|
|
||||||
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
|
|
||||||
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
|
|
||||||
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
|
|
||||||
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
|
|
||||||
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
|
|
||||||
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
|
|
||||||
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
|
|
||||||
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
|
|
||||||
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
|
|
||||||
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
|
|
||||||
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
|
|
||||||
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
|
|
||||||
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
|
|
||||||
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
|
|
||||||
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
|
|
||||||
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
|
|
||||||
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
|
|
||||||
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
|
|
||||||
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
|
|
||||||
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
|
|
||||||
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
|
|
||||||
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
|
||||||
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
|
|
||||||
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
|
|
||||||
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
|
|
||||||
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
|
|
||||||
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
|
|
||||||
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
|
|
||||||
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
|
|
||||||
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
|
|
||||||
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
|
|
||||||
0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
|
|
||||||
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
|
|
||||||
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
|
|
||||||
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
|
|
||||||
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
|
|
||||||
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
|
|
||||||
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
|
|
||||||
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
|
|
||||||
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
|
|
||||||
0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
|
|
||||||
0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
|
|
||||||
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
|
|
||||||
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
|
|
||||||
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
|
|
||||||
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
|
|
||||||
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
|
|
||||||
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
|
|
||||||
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
|
|
||||||
0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
|
|
||||||
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
|
|
||||||
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
|
|
||||||
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
|
|
||||||
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x40, 0x40, 0x40, 0xF0, 0xF8, 0xF8,
|
|
||||||
0xFF, 0x38, 0xFF, 0xF8, 0xF8, 0x3F,
|
|
||||||
0xF8, 0xF8, 0xFF, 0x38, 0xFF, 0xF8,
|
|
||||||
0xF8, 0xF0, 0x40, 0x40, 0x40, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
|
|
||||||
0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00,
|
|
||||||
0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00,
|
|
||||||
0x80, 0xC0, 0xC0, 0x00, 0xC0, 0xC0,
|
|
||||||
0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
|
|
||||||
0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0xC0, 0xF0, 0xF8, 0xFC, 0x3E,
|
|
||||||
0x1E, 0x06, 0x01, 0x00, 0x00, 0x00,
|
|
||||||
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
|
||||||
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
|
||||||
0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
|
|
||||||
0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
|
|
||||||
0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
|
|
||||||
0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x49, 0x49, 0x49, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xE0, 0xDF, 0xBF, 0xBF, 0x00,
|
|
||||||
0xBF, 0xBF, 0xDF, 0xE0, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0x49, 0x49, 0x49, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F,
|
|
||||||
0x60, 0x60, 0xE0, 0xBF, 0x1F, 0x00,
|
|
||||||
0x7F, 0x7F, 0x07, 0x1E, 0x38, 0x1E,
|
|
||||||
0x07, 0x7F, 0x7F, 0x00, 0x7F, 0x7F,
|
|
||||||
0x0E, 0x1F, 0x3B, 0x71, 0x60, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F,
|
|
||||||
0x0C, 0x0C, 0x0C, 0x00, 0x7E, 0x7E,
|
|
||||||
0x00, 0x7F, 0x7E, 0x03, 0x03, 0x00,
|
|
||||||
0x7F, 0x7E, 0x03, 0x03, 0x7E, 0x7E,
|
|
||||||
0x03, 0x03, 0x7F, 0x7E, 0x00, 0x0F,
|
|
||||||
0x3E, 0x70, 0x3C, 0x06, 0x3C, 0x70,
|
|
||||||
0x3E, 0x0F, 0x00, 0x32, 0x7B, 0x49,
|
|
||||||
0x49, 0x3F, 0x7E, 0x00, 0x7F, 0x7E,
|
|
||||||
0x03, 0x03, 0x00, 0x1E, 0x3F, 0x69,
|
|
||||||
0x69, 0x6F, 0x26, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x03, 0x0F, 0x1F, 0x3F, 0x3C,
|
|
||||||
0x78, 0x70, 0x60, 0x00, 0x00, 0x00,
|
|
||||||
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
|
||||||
0x7F, 0x41, 0x41, 0x41, 0x7F, 0x00,
|
|
||||||
0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
|
|
||||||
0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
|
|
||||||
0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
|
|
||||||
0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x01, 0x01, 0x07, 0x0F, 0x0F,
|
|
||||||
0x7F, 0x0F, 0x7F, 0x0F, 0x0F, 0x7E,
|
|
||||||
0x0F, 0x0F, 0x7F, 0x0F, 0x7F, 0x0F,
|
|
||||||
0x0F, 0x07, 0x01, 0x01, 0x01, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,13 +23,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
#elif defined(ESP8266)
|
#elif defined(ESP8266)
|
||||||
#include <pgmspace.h>
|
# include <pgmspace.h>
|
||||||
#else // defined(ESP8266)
|
#else // defined(ESP8266)
|
||||||
#define PROGMEM
|
# define PROGMEM
|
||||||
#define memcpy_P(des, src, len) memcpy(des, src, len)
|
# define memcpy_P(des, src, len) memcpy(des, src, len)
|
||||||
#endif // defined(__AVR__)
|
#endif // defined(__AVR__)
|
||||||
|
|
||||||
// Used commands from spec sheet: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
|
// Used commands from spec sheet: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
|
||||||
|
@ -91,11 +91,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#define I2C_CMD 0x00
|
#define I2C_CMD 0x00
|
||||||
#define I2C_DATA 0x40
|
#define I2C_DATA 0x40
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
// already defined on ARM
|
// already defined on ARM
|
||||||
#define I2C_TIMEOUT 100
|
# define I2C_TIMEOUT 100
|
||||||
#define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
# define I2C_TRANSMIT_P(data) i2c_transmit_P((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
||||||
#else // defined(__AVR__)
|
#else // defined(__AVR__)
|
||||||
#define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
# define I2C_TRANSMIT_P(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
||||||
#endif // defined(__AVR__)
|
#endif // defined(__AVR__)
|
||||||
#define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
#define I2C_TRANSMIT(data) i2c_transmit((OLED_DISPLAY_ADDRESS << 1), &data[0], sizeof(data), I2C_TIMEOUT)
|
||||||
#define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, I2C_TIMEOUT)
|
#define I2C_WRITE_REG(mode, data, size) i2c_writeReg((OLED_DISPLAY_ADDRESS << 1), mode, data, size, I2C_TIMEOUT)
|
||||||
|
@ -107,7 +107,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
// parts of the display unusable or don't get cleared correctly
|
// parts of the display unusable or don't get cleared correctly
|
||||||
// and also allows for drawing & inverting
|
// and also allows for drawing & inverting
|
||||||
uint8_t oled_buffer[OLED_MATRIX_SIZE];
|
uint8_t oled_buffer[OLED_MATRIX_SIZE];
|
||||||
uint8_t* oled_cursor;
|
uint8_t * oled_cursor;
|
||||||
OLED_BLOCK_TYPE oled_dirty = 0;
|
OLED_BLOCK_TYPE oled_dirty = 0;
|
||||||
bool oled_initialized = false;
|
bool oled_initialized = false;
|
||||||
bool oled_active = false;
|
bool oled_active = false;
|
||||||
|
@ -115,10 +115,10 @@ bool oled_scrolling = false;
|
||||||
uint8_t oled_rotation = 0;
|
uint8_t oled_rotation = 0;
|
||||||
uint8_t oled_rotation_width = 0;
|
uint8_t oled_rotation_width = 0;
|
||||||
#if OLED_TIMEOUT > 0
|
#if OLED_TIMEOUT > 0
|
||||||
uint32_t oled_timeout;
|
uint32_t oled_timeout;
|
||||||
#endif
|
#endif
|
||||||
#if OLED_SCROLL_TIMEOUT > 0
|
#if OLED_SCROLL_TIMEOUT > 0
|
||||||
uint32_t oled_scroll_timeout;
|
uint32_t oled_scroll_timeout;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Internal variables to reduce math instructions
|
// Internal variables to reduce math instructions
|
||||||
|
@ -126,11 +126,11 @@ uint8_t oled_rotation_width = 0;
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
// identical to i2c_transmit, but for PROGMEM since all initialization is in PROGMEM arrays currently
|
// identical to i2c_transmit, but for PROGMEM since all initialization is in PROGMEM arrays currently
|
||||||
// probably should move this into i2c_master...
|
// probably should move this into i2c_master...
|
||||||
static i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout) {
|
static i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t *data, uint16_t length, uint16_t timeout) {
|
||||||
i2c_status_t status = i2c_start(address | I2C_WRITE, timeout);
|
i2c_status_t status = i2c_start(address | I2C_WRITE, timeout);
|
||||||
|
|
||||||
for (uint16_t i = 0; i < length && status >= 0; i++) {
|
for (uint16_t i = 0; i < length && status >= 0; i++) {
|
||||||
status = i2c_write(pgm_read_byte((const char*)data++), timeout);
|
status = i2c_write(pgm_read_byte((const char *)data++), timeout);
|
||||||
if (status) break;
|
if (status) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,8 +141,7 @@ static i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Flips the rendering bits for a character at the current cursor position
|
// Flips the rendering bits for a character at the current cursor position
|
||||||
static void InvertCharacter(uint8_t *cursor)
|
static void InvertCharacter(uint8_t *cursor) {
|
||||||
{
|
|
||||||
const uint8_t *end = cursor + OLED_FONT_WIDTH;
|
const uint8_t *end = cursor + OLED_FONT_WIDTH;
|
||||||
while (cursor < end) {
|
while (cursor < end) {
|
||||||
*cursor = ~(*cursor);
|
*cursor = ~(*cursor);
|
||||||
|
@ -162,14 +161,19 @@ bool oled_init(uint8_t rotation) {
|
||||||
static const uint8_t PROGMEM display_setup1[] = {
|
static const uint8_t PROGMEM display_setup1[] = {
|
||||||
I2C_CMD,
|
I2C_CMD,
|
||||||
DISPLAY_OFF,
|
DISPLAY_OFF,
|
||||||
DISPLAY_CLOCK, 0x80,
|
DISPLAY_CLOCK,
|
||||||
MULTIPLEX_RATIO, OLED_DISPLAY_HEIGHT - 1,
|
0x80,
|
||||||
DISPLAY_OFFSET, 0x00,
|
MULTIPLEX_RATIO,
|
||||||
|
OLED_DISPLAY_HEIGHT - 1,
|
||||||
|
DISPLAY_OFFSET,
|
||||||
|
0x00,
|
||||||
DISPLAY_START_LINE | 0x00,
|
DISPLAY_START_LINE | 0x00,
|
||||||
CHARGE_PUMP, 0x14,
|
CHARGE_PUMP,
|
||||||
|
0x14,
|
||||||
#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, 0x00, // Horizontal addressing mode
|
MEMORY_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) {
|
||||||
|
@ -178,35 +182,20 @@ bool oled_init(uint8_t rotation) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_180)) {
|
if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_180)) {
|
||||||
static const uint8_t PROGMEM display_normal[] = {
|
static const uint8_t PROGMEM display_normal[] = {I2C_CMD, SEGMENT_REMAP_INV, COM_SCAN_DEC};
|
||||||
I2C_CMD,
|
|
||||||
SEGMENT_REMAP_INV,
|
|
||||||
COM_SCAN_DEC };
|
|
||||||
if (I2C_TRANSMIT_P(display_normal) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_normal) != I2C_STATUS_SUCCESS) {
|
||||||
print("oled_init cmd normal rotation failed\n");
|
print("oled_init cmd normal rotation failed\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
static const uint8_t PROGMEM display_flipped[] = {
|
static const uint8_t PROGMEM display_flipped[] = {I2C_CMD, SEGMENT_REMAP, COM_SCAN_INC};
|
||||||
I2C_CMD,
|
|
||||||
SEGMENT_REMAP,
|
|
||||||
COM_SCAN_INC };
|
|
||||||
if (I2C_TRANSMIT_P(display_flipped) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_flipped) != I2C_STATUS_SUCCESS) {
|
||||||
print("display_flipped failed\n");
|
print("display_flipped failed\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint8_t PROGMEM display_setup2[] = {
|
static const uint8_t PROGMEM display_setup2[] = {I2C_CMD, COM_PINS, OLED_COM_PINS, CONTRAST, 0x8F, PRE_CHARGE_PERIOD, 0xF1, VCOM_DETECT, 0x40, DISPLAY_ALL_ON_RESUME, NORMAL_DISPLAY, DEACTIVATE_SCROLL, DISPLAY_ON};
|
||||||
I2C_CMD,
|
|
||||||
COM_PINS, OLED_COM_PINS,
|
|
||||||
CONTRAST, 0x8F,
|
|
||||||
PRE_CHARGE_PERIOD, 0xF1,
|
|
||||||
VCOM_DETECT, 0x40,
|
|
||||||
DISPLAY_ALL_ON_RESUME,
|
|
||||||
NORMAL_DISPLAY,
|
|
||||||
DEACTIVATE_SCROLL,
|
|
||||||
DISPLAY_ON };
|
|
||||||
if (I2C_TRANSMIT_P(display_setup2) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_setup2) != I2C_STATUS_SUCCESS) {
|
||||||
print("display_setup2 failed\n");
|
print("display_setup2 failed\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -226,10 +215,7 @@ bool oled_init(uint8_t rotation) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((weak))
|
__attribute__((weak)) oled_rotation_t oled_init_user(oled_rotation_t rotation) { return rotation; }
|
||||||
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));
|
||||||
|
@ -237,8 +223,7 @@ void oled_clear(void) {
|
||||||
oled_dirty = -1; // -1 will be max value as long as display_dirty is unsigned type
|
oled_dirty = -1; // -1 will be max value as long as display_dirty is unsigned type
|
||||||
}
|
}
|
||||||
|
|
||||||
static void calc_bounds(uint8_t update_start, uint8_t* cmd_array)
|
static void calc_bounds(uint8_t update_start, uint8_t *cmd_array) {
|
||||||
{
|
|
||||||
// Calculate commands to set memory addressing bounds.
|
// Calculate commands to set memory addressing bounds.
|
||||||
uint8_t start_page = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_WIDTH;
|
uint8_t start_page = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_WIDTH;
|
||||||
uint8_t start_column = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_WIDTH;
|
uint8_t start_column = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_WIDTH;
|
||||||
|
@ -260,23 +245,21 @@ static void calc_bounds(uint8_t update_start, uint8_t* cmd_array)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void calc_bounds_90(uint8_t update_start, uint8_t* cmd_array)
|
static void calc_bounds_90(uint8_t update_start, uint8_t *cmd_array) {
|
||||||
{
|
|
||||||
cmd_array[1] = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_HEIGHT * 8;
|
cmd_array[1] = OLED_BLOCK_SIZE * update_start / OLED_DISPLAY_HEIGHT * 8;
|
||||||
cmd_array[4] = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_HEIGHT;
|
cmd_array[4] = OLED_BLOCK_SIZE * update_start % OLED_DISPLAY_HEIGHT;
|
||||||
cmd_array[2] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) / OLED_DISPLAY_HEIGHT * 8 - 1 + cmd_array[1];;
|
cmd_array[2] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) / OLED_DISPLAY_HEIGHT * 8 - 1 + cmd_array[1];
|
||||||
|
;
|
||||||
cmd_array[5] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) % OLED_DISPLAY_HEIGHT / 8;
|
cmd_array[5] = (OLED_BLOCK_SIZE + OLED_DISPLAY_HEIGHT - 1) % OLED_DISPLAY_HEIGHT / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t crot(uint8_t a, int8_t n)
|
uint8_t crot(uint8_t a, int8_t n) {
|
||||||
{
|
|
||||||
const uint8_t mask = 0x7;
|
const uint8_t mask = 0x7;
|
||||||
n &= mask;
|
n &= mask;
|
||||||
return a << n | a >> (-n & mask);
|
return a << n | a >> (-n & mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rotate_90(const uint8_t* src, uint8_t* dest)
|
static void rotate_90(const uint8_t *src, uint8_t *dest) {
|
||||||
{
|
|
||||||
for (uint8_t i = 0, shift = 7; i < 8; ++i, --shift) {
|
for (uint8_t i = 0, shift = 7; i < 8; ++i, --shift) {
|
||||||
uint8_t selector = (1 << i);
|
uint8_t selector = (1 << i);
|
||||||
for (uint8_t j = 0; j < 8; ++j) {
|
for (uint8_t j = 0; j < 8; ++j) {
|
||||||
|
@ -293,13 +276,12 @@ void oled_render(void) {
|
||||||
|
|
||||||
// Find first dirty block
|
// Find first dirty block
|
||||||
uint8_t update_start = 0;
|
uint8_t update_start = 0;
|
||||||
while (!(oled_dirty & (1 << update_start))) { ++update_start; }
|
while (!(oled_dirty & (1 << update_start))) {
|
||||||
|
++update_start;
|
||||||
|
}
|
||||||
|
|
||||||
// Set column & page position
|
// Set column & page position
|
||||||
static uint8_t display_start[] = {
|
static uint8_t display_start[] = {I2C_CMD, COLUMN_ADDR, 0, OLED_DISPLAY_WIDTH - 1, PAGE_ADDR, 0, OLED_DISPLAY_HEIGHT / 8 - 1};
|
||||||
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 {
|
||||||
|
@ -325,7 +307,7 @@ void oled_render(void) {
|
||||||
|
|
||||||
static uint8_t temp_buffer[OLED_BLOCK_SIZE];
|
static uint8_t temp_buffer[OLED_BLOCK_SIZE];
|
||||||
memset(temp_buffer, 0, sizeof(temp_buffer));
|
memset(temp_buffer, 0, sizeof(temp_buffer));
|
||||||
for(uint8_t i = 0; i < sizeof(source_map); ++i) {
|
for (uint8_t i = 0; i < sizeof(source_map); ++i) {
|
||||||
rotate_90(&oled_buffer[OLED_BLOCK_SIZE * update_start + source_map[i]], &temp_buffer[target_map[i]]);
|
rotate_90(&oled_buffer[OLED_BLOCK_SIZE * update_start + source_map[i]], &temp_buffer[target_map[i]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -363,8 +345,7 @@ 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--)
|
while (remaining--) oled_write_char(' ', false);
|
||||||
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) {
|
||||||
|
@ -471,7 +452,7 @@ bool oled_on(void) {
|
||||||
oled_timeout = timer_read32() + OLED_TIMEOUT;
|
oled_timeout = timer_read32() + OLED_TIMEOUT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const uint8_t PROGMEM display_on[] = { I2C_CMD, DISPLAY_ON };
|
static const uint8_t PROGMEM display_on[] = {I2C_CMD, DISPLAY_ON};
|
||||||
if (!oled_active) {
|
if (!oled_active) {
|
||||||
if (I2C_TRANSMIT_P(display_on) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_on) != I2C_STATUS_SUCCESS) {
|
||||||
print("oled_on cmd failed\n");
|
print("oled_on cmd failed\n");
|
||||||
|
@ -483,7 +464,7 @@ bool oled_on(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool oled_off(void) {
|
bool oled_off(void) {
|
||||||
static const uint8_t PROGMEM display_off[] = { I2C_CMD, DISPLAY_OFF };
|
static const uint8_t PROGMEM display_off[] = {I2C_CMD, DISPLAY_OFF};
|
||||||
if (oled_active) {
|
if (oled_active) {
|
||||||
if (I2C_TRANSMIT_P(display_off) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_off) != I2C_STATUS_SUCCESS) {
|
||||||
print("oled_off cmd failed\n");
|
print("oled_off cmd failed\n");
|
||||||
|
@ -498,8 +479,7 @@ bool oled_scroll_right(void) {
|
||||||
// Dont enable scrolling if we need to update the display
|
// Dont enable scrolling if we need to update the display
|
||||||
// This prevents scrolling of bad data from starting the scroll too early after init
|
// This prevents scrolling of bad data from starting the scroll too early after init
|
||||||
if (!oled_dirty && !oled_scrolling) {
|
if (!oled_dirty && !oled_scrolling) {
|
||||||
static const uint8_t PROGMEM display_scroll_right[] = {
|
static const uint8_t PROGMEM display_scroll_right[] = {I2C_CMD, SCROLL_RIGHT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL};
|
||||||
I2C_CMD, SCROLL_RIGHT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL };
|
|
||||||
if (I2C_TRANSMIT_P(display_scroll_right) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_scroll_right) != I2C_STATUS_SUCCESS) {
|
||||||
print("oled_scroll_right cmd failed\n");
|
print("oled_scroll_right cmd failed\n");
|
||||||
return oled_scrolling;
|
return oled_scrolling;
|
||||||
|
@ -513,8 +493,7 @@ bool oled_scroll_left(void) {
|
||||||
// Dont enable scrolling if we need to update the display
|
// Dont enable scrolling if we need to update the display
|
||||||
// This prevents scrolling of bad data from starting the scroll too early after init
|
// This prevents scrolling of bad data from starting the scroll too early after init
|
||||||
if (!oled_dirty && !oled_scrolling) {
|
if (!oled_dirty && !oled_scrolling) {
|
||||||
static const uint8_t PROGMEM display_scroll_left[] = {
|
static const uint8_t PROGMEM display_scroll_left[] = {I2C_CMD, SCROLL_LEFT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL};
|
||||||
I2C_CMD, SCROLL_LEFT, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xFF, ACTIVATE_SCROLL };
|
|
||||||
if (I2C_TRANSMIT_P(display_scroll_left) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_scroll_left) != I2C_STATUS_SUCCESS) {
|
||||||
print("oled_scroll_left cmd failed\n");
|
print("oled_scroll_left cmd failed\n");
|
||||||
return oled_scrolling;
|
return oled_scrolling;
|
||||||
|
@ -526,7 +505,7 @@ bool oled_scroll_left(void) {
|
||||||
|
|
||||||
bool oled_scroll_off(void) {
|
bool oled_scroll_off(void) {
|
||||||
if (oled_scrolling) {
|
if (oled_scrolling) {
|
||||||
static const uint8_t PROGMEM display_scroll_off[] = { I2C_CMD, DEACTIVATE_SCROLL };
|
static const uint8_t PROGMEM display_scroll_off[] = {I2C_CMD, DEACTIVATE_SCROLL};
|
||||||
if (I2C_TRANSMIT_P(display_scroll_off) != I2C_STATUS_SUCCESS) {
|
if (I2C_TRANSMIT_P(display_scroll_off) != I2C_STATUS_SUCCESS) {
|
||||||
print("oled_scroll_off cmd failed\n");
|
print("oled_scroll_off cmd failed\n");
|
||||||
return oled_scrolling;
|
return oled_scrolling;
|
||||||
|
@ -579,15 +558,13 @@ void oled_task(void) {
|
||||||
|
|
||||||
#if OLED_SCROLL_TIMEOUT > 0
|
#if OLED_SCROLL_TIMEOUT > 0
|
||||||
if (!oled_scrolling && timer_expired32(timer_read32(), oled_scroll_timeout)) {
|
if (!oled_scrolling && timer_expired32(timer_read32(), oled_scroll_timeout)) {
|
||||||
#ifdef OLED_SCROLL_TIMEOUT_RIGHT
|
# ifdef OLED_SCROLL_TIMEOUT_RIGHT
|
||||||
oled_scroll_right();
|
oled_scroll_right();
|
||||||
#else
|
# else
|
||||||
oled_scroll_left();
|
oled_scroll_left();
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((weak))
|
__attribute__((weak)) void oled_task_user(void) {}
|
||||||
void oled_task_user(void) {
|
|
||||||
}
|
|
||||||
|
|
|
@ -24,126 +24,130 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#define OLED_IC_SH1106 1
|
#define OLED_IC_SH1106 1
|
||||||
|
|
||||||
#if defined(OLED_DISPLAY_CUSTOM)
|
#if defined(OLED_DISPLAY_CUSTOM)
|
||||||
// Expected user to implement the necessary defines
|
// Expected user to implement the necessary defines
|
||||||
#elif defined(OLED_DISPLAY_128X64)
|
#elif defined(OLED_DISPLAY_128X64)
|
||||||
// Double height 128x64
|
// Double height 128x64
|
||||||
#ifndef OLED_DISPLAY_WIDTH
|
# ifndef OLED_DISPLAY_WIDTH
|
||||||
#define OLED_DISPLAY_WIDTH 128
|
# define OLED_DISPLAY_WIDTH 128
|
||||||
#endif
|
# endif
|
||||||
#ifndef OLED_DISPLAY_HEIGHT
|
# ifndef OLED_DISPLAY_HEIGHT
|
||||||
#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
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
// For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
|
// For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
|
||||||
// The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
|
// The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
|
||||||
#ifndef OLED_SOURCE_MAP
|
# ifndef OLED_SOURCE_MAP
|
||||||
#define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
|
# define OLED_SOURCE_MAP \
|
||||||
#endif
|
{ 0, 8, 16, 24, 32, 40, 48, 56 }
|
||||||
#ifndef OLED_TARGET_MAP
|
# endif
|
||||||
#define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 }
|
# ifndef OLED_TARGET_MAP
|
||||||
#endif
|
# define OLED_TARGET_MAP \
|
||||||
// If OLED_BLOCK_TYPE is uint32_t, these tables would look like:
|
{ 56, 48, 40, 32, 24, 16, 8, 0 }
|
||||||
// #define OLED_SOURCE_MAP { 32, 40, 48, 56 }
|
# endif
|
||||||
// #define OLED_TARGET_MAP { 24, 16, 8, 0 }
|
// If OLED_BLOCK_TYPE is uint32_t, these tables would look like:
|
||||||
// If OLED_BLOCK_TYPE is uint16_t, these tables would look like:
|
// #define OLED_SOURCE_MAP { 32, 40, 48, 56 }
|
||||||
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
|
// #define OLED_TARGET_MAP { 24, 16, 8, 0 }
|
||||||
// #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 }
|
// If OLED_BLOCK_TYPE is uint16_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, 64, 72, 80, 88, 96, 104, 112, 120 }
|
// #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 }
|
||||||
// #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 }
|
// 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_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
|
||||||
#endif
|
# endif
|
||||||
#ifndef OLED_DISPLAY_HEIGHT
|
# ifndef OLED_DISPLAY_HEIGHT
|
||||||
#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
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
// For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
|
// For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
|
||||||
// The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
|
// The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
|
||||||
#ifndef OLED_SOURCE_MAP
|
# ifndef OLED_SOURCE_MAP
|
||||||
#define OLED_SOURCE_MAP { 0, 8, 16, 24 }
|
# define OLED_SOURCE_MAP \
|
||||||
#endif
|
{ 0, 8, 16, 24 }
|
||||||
#ifndef OLED_TARGET_MAP
|
# endif
|
||||||
#define OLED_TARGET_MAP { 24, 16, 8, 0 }
|
# ifndef OLED_TARGET_MAP
|
||||||
#endif
|
# define OLED_TARGET_MAP \
|
||||||
// If OLED_BLOCK_TYPE is uint8_t, these tables would look like:
|
{ 24, 16, 8, 0 }
|
||||||
// #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
|
# endif
|
||||||
// #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 }
|
// 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_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
|
||||||
#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
|
||||||
#if !defined(OLED_COLUMN_OFFSET)
|
#if !defined(OLED_COLUMN_OFFSET)
|
||||||
#define OLED_COLUMN_OFFSET 0
|
# define OLED_COLUMN_OFFSET 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Address to use for the i2c oled communication
|
// Address to use for the i2c oled communication
|
||||||
#if !defined(OLED_DISPLAY_ADDRESS)
|
#if !defined(OLED_DISPLAY_ADDRESS)
|
||||||
#define OLED_DISPLAY_ADDRESS 0x3C
|
# define OLED_DISPLAY_ADDRESS 0x3C
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Custom font file to use
|
// Custom font file to use
|
||||||
#if !defined(OLED_FONT_H)
|
#if !defined(OLED_FONT_H)
|
||||||
#define OLED_FONT_H "glcdfont.c"
|
# define OLED_FONT_H "glcdfont.c"
|
||||||
#endif
|
#endif
|
||||||
// unsigned char value of the first character in the font file
|
// unsigned char value of the first character in the font file
|
||||||
#if !defined(OLED_FONT_START)
|
#if !defined(OLED_FONT_START)
|
||||||
#define OLED_FONT_START 0
|
# define OLED_FONT_START 0
|
||||||
#endif
|
#endif
|
||||||
// unsigned char value of the last character in the font file
|
// unsigned char value of the last character in the font file
|
||||||
#if !defined(OLED_FONT_END)
|
#if !defined(OLED_FONT_END)
|
||||||
#define OLED_FONT_END 224
|
# define OLED_FONT_END 224
|
||||||
#endif
|
#endif
|
||||||
// Font render width
|
// Font render width
|
||||||
#if !defined(OLED_FONT_WIDTH)
|
#if !defined(OLED_FONT_WIDTH)
|
||||||
#define OLED_FONT_WIDTH 6
|
# define OLED_FONT_WIDTH 6
|
||||||
#endif
|
#endif
|
||||||
// Font render height
|
// Font render height
|
||||||
#if !defined(OLED_FONT_HEIGHT)
|
#if !defined(OLED_FONT_HEIGHT)
|
||||||
#define OLED_FONT_HEIGHT 8
|
# define OLED_FONT_HEIGHT 8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(OLED_TIMEOUT)
|
#if !defined(OLED_TIMEOUT)
|
||||||
#if defined(OLED_DISABLE_TIMEOUT)
|
# if defined(OLED_DISABLE_TIMEOUT)
|
||||||
#define OLED_TIMEOUT 0
|
# define OLED_TIMEOUT 0
|
||||||
#else
|
# else
|
||||||
#define OLED_TIMEOUT 60000
|
# define OLED_TIMEOUT 60000
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// OLED Rotation enum values are flags
|
// OLED Rotation enum values are flags
|
||||||
|
@ -208,14 +212,14 @@ void oled_write_P(const char *data, bool invert);
|
||||||
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
|
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
|
||||||
void oled_write_ln_P(const char *data, bool invert);
|
void oled_write_ln_P(const char *data, bool invert);
|
||||||
#else
|
#else
|
||||||
// Writes a string to the buffer at current cursor position
|
// Writes a string to the buffer at current cursor position
|
||||||
// Advances the cursor while writing, inverts the pixels if true
|
// Advances the cursor while writing, inverts the pixels if true
|
||||||
#define oled_write_P(data, invert) oled_write(data, invert)
|
# define oled_write_P(data, invert) oled_write(data, invert)
|
||||||
|
|
||||||
// Writes a string to the buffer at current cursor position
|
// Writes a string to the buffer at current cursor position
|
||||||
// Advances the cursor while writing, inverts the pixels if true
|
// Advances the cursor while writing, inverts the pixels if true
|
||||||
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
|
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
|
||||||
#define oled_write_ln_P(data, invert) oled_write(data, invert)
|
# define oled_write_ln_P(data, invert) oled_write(data, invert)
|
||||||
#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
|
||||||
|
|
|
@ -35,16 +35,21 @@
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
#define TOTALFONTS 2
|
#define TOTALFONTS 2
|
||||||
const unsigned char * fonts_pointer[]= { font5x7, font8x16 };
|
const unsigned char* fonts_pointer[] = {font5x7, font8x16};
|
||||||
|
|
||||||
uint8_t foreColor,drawMode,fontWidth, fontHeight, fontType, fontStartChar, fontTotalChar, cursorX, cursorY;
|
uint8_t foreColor, drawMode, fontWidth, fontHeight, fontType, fontStartChar, fontTotalChar, cursorX, cursorY;
|
||||||
uint16_t fontMapWidth;
|
uint16_t fontMapWidth;
|
||||||
|
|
||||||
#define _BV(x) (1 << (x))
|
#define _BV(x) (1 << (x))
|
||||||
#define swap(a, b) { uint8_t t = a; a = b; b = t; }
|
#define swap(a, b) \
|
||||||
|
{ \
|
||||||
|
uint8_t t = a; \
|
||||||
|
a = b; \
|
||||||
|
b = t; \
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t micro_oled_transfer_buffer[20];
|
uint8_t micro_oled_transfer_buffer[20];
|
||||||
static uint8_t micro_oled_screen_current[LCDWIDTH*LCDWIDTH/8] = { 0 };
|
static uint8_t micro_oled_screen_current[LCDWIDTH * LCDWIDTH / 8] = {0};
|
||||||
|
|
||||||
/* LCD Memory organised in 64 horizontal pixel and 6 rows of byte
|
/* LCD Memory organised in 64 horizontal pixel and 6 rows of byte
|
||||||
B B .............B -----
|
B B .............B -----
|
||||||
|
@ -64,256 +69,39 @@ static uint8_t micro_oled_screen_current[LCDWIDTH*LCDWIDTH/8] = { 0 };
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if LCDWIDTH == 64
|
#if LCDWIDTH == 64
|
||||||
#if LCDWIDTH == 48
|
# if LCDWIDTH == 48
|
||||||
static uint8_t micro_oled_screen_buffer[] = {
|
static uint8_t micro_oled_screen_buffer[] = {
|
||||||
// QMK Logo - generated at http://www.majer.ch/lcd/adf_bitmap.php
|
// QMK Logo - generated at http://www.majer.ch/lcd/adf_bitmap.php
|
||||||
//64x48 image
|
// 64x48 image
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0xF8, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xF8, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x8C, 0x8C, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x8C, 0x8C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF1, 0xE3, 0xE7, 0xCF, 0xCF, 0xCF, 0xCF, 0x00, 0x00, 0xCF, 0xCF, 0xCF, 0xC7, 0xE7, 0xE3, 0xF1, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x1F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x00,
|
# endif
|
||||||
0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60,
|
|
||||||
0xF8, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE,
|
|
||||||
0xFE, 0xF8, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x8C, 0x8C, 0x8C, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
|
||||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x8C, 0x8C, 0x8C,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF1, 0xE3, 0xE7, 0xCF,
|
|
||||||
0xCF, 0xCF, 0xCF, 0x00, 0x00, 0xCF, 0xCF, 0xCF, 0xC7, 0xE7,
|
|
||||||
0xE3, 0xF1, 0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0x31, 0x31, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06,
|
|
||||||
0x06, 0x06, 0x1F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0x7F, 0x7F, 0x1F, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
|
|
||||||
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
|
|
||||||
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
#elif LCDWIDTH == 128
|
#elif LCDWIDTH == 128
|
||||||
#if LCDHEIGHT == 32
|
# if LCDHEIGHT == 32
|
||||||
static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = {
|
static uint8_t micro_oled_screen_buffer[LCDWIDTH * LCDWIDTH / 8] = {
|
||||||
//128x32 qmk image
|
// 128x32 qmk image
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xFC, 0xFC, 0xE0, 0xFC, 0xFC, 0xE0, 0xF0, 0xFC, 0xE0, 0xE0, 0xFC, 0xE0, 0xE0, 0xFC, 0xFC, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x30, 0xE0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xB2, 0xB2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xB2, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x02, 0x03, 0x01, 0x00, 0x06, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x06, 0x00, 0x03, 0x1E, 0x18, 0x0F, 0x01, 0x0F, 0x18, 0x1E, 0x01, 0x00, 0x0F, 0x1F, 0x12, 0x02, 0x12, 0x13, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x12, 0x02, 0x12, 0x13, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xFC, 0xFC, 0xE0, 0xFC, 0xFC,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x4D, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF9, 0xF3, 0xF3, 0xC0, 0x80, 0xF3, 0xF3, 0xF3, 0xF9, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0xC0, 0x00, 0x70, 0xC0, 0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x1C, 0xF0, 0x00, 0x00, 0xFC, 0x0C, 0x38, 0xE0, 0x00, 0x00, 0xC0, 0x38, 0x0C, 0xFC, 0x00, 0x00, 0xFC, 0xFC, 0x60, 0x90, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0xE0, 0xF0, 0xFC, 0xE0, 0xE0, 0xFC, 0xE0, 0xE0, 0xFC, 0xFC,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x3F, 0x3F, 0x07, 0x3F, 0x3F, 0x07, 0x0F, 0x3F, 0x07, 0x07, 0x3F, 0x07, 0x07, 0x3F, 0x3F, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06, 0x04, 0x04, 0x07, 0x01, 0x00, 0x00, 0x13, 0x1E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x04, 0x04, 0x04, 0x04, 0x07, 0x0D, 0x08, 0x00, 0x07, 0x00, 0x00, 0x01, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x07, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
# elif LCDHEIGHT == 64
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
static uint8_t micro_oled_screen_buffer[LCDWIDTH * LCDWIDTH / 8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0xF0, 0x10, 0x10, 0x30, 0xE0, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0x7F, 0x7E, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x7F, 0x7F, 0xFE, 0xFE, 0xFF, 0xFF, 0xFE, 0x7E, 0x7F, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF3, 0xF3, 0xE7, 0xE7, 0x00, 0x00, 0xE7, 0xE7, 0xF3, 0xF3, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x1F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x80, 0x03, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x80, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x70, 0x88, 0x04, 0x04, 0x04, 0xF8, 0x00, 0x00, 0x3C, 0xE0, 0xC0, 0x38, 0x1C, 0xE0, 0x80, 0x70, 0x0C, 0x00, 0xF8, 0xAC, 0x24, 0x24, 0x3C, 0x30, 0x00, 0x00, 0xFC, 0x0C, 0x04, 0x00, 0xF8, 0xAC, 0x24, 0x24, 0x2C, 0x30, 0x00, 0x70, 0xDC, 0x04, 0x04, 0x88, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x8C, 0x04, 0x04, 0xF8, 0x00, 0x04, 0x3C, 0xE0, 0x80, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x83, 0x01, 0x01, 0x01, 0x81, 0xFE, 0x3C, 0x00, 0x00, 0xFF, 0x03, 0x0E, 0x70, 0xC0, 0xE0, 0x38, 0x06, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x18, 0x38, 0x66, 0xC3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xB2, 0xB2, 0xFF,
|
// TODO: generate bitmap of QMK logo here
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0x03,
|
# endif
|
||||||
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xB7, 0xB2, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x1F, 0x02, 0x02, 0x03, 0x01, 0x00, 0x06, 0x1F, 0x10,
|
|
||||||
0x10, 0x10, 0x1F, 0x06, 0x00, 0x03, 0x1E, 0x18, 0x0F, 0x01,
|
|
||||||
0x0F, 0x18, 0x1E, 0x01, 0x00, 0x0F, 0x1F, 0x12, 0x02, 0x12,
|
|
||||||
0x13, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0x12,
|
|
||||||
0x02, 0x12, 0x13, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x1F,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x48, 0x4D, 0x4D, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFE, 0xF8, 0xF9, 0xF3, 0xF3, 0xC0, 0x80, 0xF3,
|
|
||||||
0xF3, 0xF3, 0xF9, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED,
|
|
||||||
0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0xC0, 0x00, 0x70, 0xC0,
|
|
||||||
0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0C,
|
|
||||||
0x04, 0x04, 0x04, 0x04, 0x1C, 0xF0, 0x00, 0x00, 0xFC, 0x0C,
|
|
||||||
0x38, 0xE0, 0x00, 0x00, 0xC0, 0x38, 0x0C, 0xFC, 0x00, 0x00,
|
|
||||||
0xFC, 0xFC, 0x60, 0x90, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x3F,
|
|
||||||
0x3F, 0x07, 0x3F, 0x3F, 0x07, 0x0F, 0x3F, 0x07, 0x07, 0x3F,
|
|
||||||
0x07, 0x07, 0x3F, 0x3F, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
|
|
||||||
0x06, 0x04, 0x04, 0x07, 0x01, 0x00, 0x00, 0x13, 0x1E, 0x03,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x04, 0x04,
|
|
||||||
0x04, 0x04, 0x07, 0x0D, 0x08, 0x00, 0x07, 0x00, 0x00, 0x01,
|
|
||||||
0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x07,
|
|
||||||
0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00
|
|
||||||
};
|
|
||||||
#elif LCDHEIGHT == 64
|
|
||||||
static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
|
|
||||||
0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00,
|
|
||||||
0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0xC0, 0xC0, 0xC0, 0xC0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF,
|
|
||||||
0x7F, 0x7E, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x7F, 0x7F, 0xFE,
|
|
||||||
0xFE, 0xFF, 0xFF, 0xFE, 0x7E, 0x7F, 0xFF, 0xFE, 0xFE, 0xFC,
|
|
||||||
0xFC, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x88, 0x88, 0x88, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xDD, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x99, 0x99, 0x99, 0x99, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF3, 0xF3, 0xE7, 0xE7, 0x00,
|
|
||||||
0x00, 0xE7, 0xE7, 0xF3, 0xF3, 0xF0, 0xF8, 0xFE, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x1F, 0x3F,
|
|
||||||
0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F,
|
|
||||||
0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF, 0x3F, 0x3F, 0xFF, 0xFF,
|
|
||||||
0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00,
|
|
||||||
0x80, 0x03, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x80, 0x01,
|
|
||||||
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0xFF, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x70,
|
|
||||||
0x88, 0x04, 0x04, 0x04, 0xF8, 0x00, 0x00, 0x3C, 0xE0, 0xC0,
|
|
||||||
0x38, 0x1C, 0xE0, 0x80, 0x70, 0x0C, 0x00, 0xF8, 0xAC, 0x24,
|
|
||||||
0x24, 0x3C, 0x30, 0x00, 0x00, 0xFC, 0x0C, 0x04, 0x00, 0xF8,
|
|
||||||
0xAC, 0x24, 0x24, 0x2C, 0x30, 0x00, 0x70, 0xDC, 0x04, 0x04,
|
|
||||||
0x88, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
|
|
||||||
0x8C, 0x04, 0x04, 0xF8, 0x00, 0x04, 0x3C, 0xE0, 0x80, 0xF0,
|
|
||||||
0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x83, 0x01, 0x01,
|
|
||||||
0x01, 0x81, 0xFE, 0x3C, 0x00, 0x00, 0xFF, 0x03, 0x0E, 0x70,
|
|
||||||
0xC0, 0xE0, 0x38, 0x06, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x18,
|
|
||||||
0x38, 0x66, 0xC3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
|
|
||||||
0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
|
|
||||||
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01,
|
|
||||||
0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
|
||||||
0x01, 0x01, 0x01, 0x01, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00,
|
|
||||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
||||||
};
|
|
||||||
//TODO: generate bitmap of QMK logo here
|
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
//catchall for custom screen szies
|
// catchall for custom screen szies
|
||||||
static uint8_t micro_oled_screen_buffer[LCDWIDTH*LCDWIDTH/8] = {0};
|
static uint8_t micro_oled_screen_buffer[LCDWIDTH * LCDWIDTH / 8] = {0};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void micro_oled_init(void) {
|
void micro_oled_init(void) {
|
||||||
i2c_init();
|
i2c_init();
|
||||||
i2c_start(I2C_ADDRESS_SA0_1);
|
i2c_start(I2C_ADDRESS_SA0_1);
|
||||||
|
@ -338,11 +126,11 @@ void micro_oled_init(void) {
|
||||||
send_command(NORMALDISPLAY); // 0xA6
|
send_command(NORMALDISPLAY); // 0xA6
|
||||||
send_command(DISPLAYALLONRESUME); // 0xA4
|
send_command(DISPLAYALLONRESUME); // 0xA4
|
||||||
|
|
||||||
//display at regular orientation
|
// display at regular orientation
|
||||||
send_command(SEGREMAP | 0x1);
|
send_command(SEGREMAP | 0x1);
|
||||||
send_command(COMSCANDEC);
|
send_command(COMSCANDEC);
|
||||||
|
|
||||||
//rotate display 180
|
// rotate display 180
|
||||||
#ifdef micro_oled_rotate_180
|
#ifdef micro_oled_rotate_180
|
||||||
send_command(SEGREMAP);
|
send_command(SEGREMAP);
|
||||||
send_command(COMSCANINC);
|
send_command(COMSCANINC);
|
||||||
|
@ -352,11 +140,11 @@ void micro_oled_init(void) {
|
||||||
send_command(0x10);
|
send_command(0x10);
|
||||||
|
|
||||||
send_command(SETCOMPINS); // 0xDA
|
send_command(SETCOMPINS); // 0xDA
|
||||||
if (LCDHEIGHT > 32) {
|
if (LCDHEIGHT > 32) {
|
||||||
send_command(0x12);
|
send_command(0x12);
|
||||||
} else {
|
} else {
|
||||||
send_command(0x02);
|
send_command(0x02);
|
||||||
}
|
}
|
||||||
send_command(SETCONTRAST); // 0x81
|
send_command(SETCONTRAST); // 0x81
|
||||||
send_command(0x8F);
|
send_command(0x8F);
|
||||||
|
|
||||||
|
@ -395,18 +183,18 @@ void set_page_address(uint8_t address) {
|
||||||
Send column address command and address to the SSD1306 OLED controller.
|
Send column address command and address to the SSD1306 OLED controller.
|
||||||
*/
|
*/
|
||||||
void set_column_address(uint8_t address) {
|
void set_column_address(uint8_t address) {
|
||||||
send_command( ( 0x10 | (address >> 4) ) + ((128 - LCDWIDTH) >> 8) );
|
send_command((0x10 | (address >> 4)) + ((128 - LCDWIDTH) >> 8));
|
||||||
send_command( 0x0F & address );
|
send_command(0x0F & address);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief Clear SSD1306's memory.
|
/** \brief Clear SSD1306's memory.
|
||||||
To clear GDRAM inside the LCD controller.
|
To clear GDRAM inside the LCD controller.
|
||||||
*/
|
*/
|
||||||
void clear_screen(void) {
|
void clear_screen(void) {
|
||||||
for (int i=0;i<8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
set_page_address(i);
|
set_page_address(i);
|
||||||
set_column_address(0);
|
set_column_address(0);
|
||||||
for (int j=0; j<0x80; j++) {
|
for (int j = 0; j < 0x80; j++) {
|
||||||
send_data(0);
|
send_data(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -416,8 +204,8 @@ void clear_screen(void) {
|
||||||
To clear GDRAM inside the LCD controller.
|
To clear GDRAM inside the LCD controller.
|
||||||
*/
|
*/
|
||||||
void clear_buffer(void) {
|
void clear_buffer(void) {
|
||||||
//384
|
// 384
|
||||||
memset(micro_oled_screen_buffer, 0, LCDWIDTH*LCDWIDTH/8);
|
memset(micro_oled_screen_buffer, 0, LCDWIDTH * LCDWIDTH / 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief Invert display.
|
/** \brief Invert display.
|
||||||
|
@ -446,18 +234,18 @@ void send_buffer(void) {
|
||||||
uint8_t i, j;
|
uint8_t i, j;
|
||||||
|
|
||||||
uint8_t page_addr = 0xFF;
|
uint8_t page_addr = 0xFF;
|
||||||
for (i = 0; i < LCDHEIGHT/8; i++) {
|
for (i = 0; i < LCDHEIGHT / 8; i++) {
|
||||||
uint8_t col_addr = 0xFF;
|
uint8_t col_addr = 0xFF;
|
||||||
for (j = 0; j < LCDWIDTH; j++) {
|
for (j = 0; j < LCDWIDTH; j++) {
|
||||||
if (micro_oled_screen_buffer[i*LCDWIDTH+j] != micro_oled_screen_current[i*LCDWIDTH+j]) {
|
if (micro_oled_screen_buffer[i * LCDWIDTH + j] != micro_oled_screen_current[i * LCDWIDTH + j]) {
|
||||||
if (page_addr != i) {
|
if (page_addr != i) {
|
||||||
set_page_address(i);
|
set_page_address(i);
|
||||||
}
|
}
|
||||||
if (col_addr != j) {
|
if (col_addr != j) {
|
||||||
set_column_address(j);
|
set_column_address(j);
|
||||||
}
|
}
|
||||||
send_data(micro_oled_screen_buffer[i*LCDWIDTH+j]);
|
send_data(micro_oled_screen_buffer[i * LCDWIDTH + j]);
|
||||||
micro_oled_screen_current[i*LCDWIDTH+j] = micro_oled_screen_buffer[i*LCDWIDTH+j];
|
micro_oled_screen_current[i * LCDWIDTH + j] = micro_oled_screen_buffer[i * LCDWIDTH + j];
|
||||||
col_addr = j + 1;
|
col_addr = j + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -468,17 +256,15 @@ void send_buffer(void) {
|
||||||
Draw color pixel in the screen buffer's x,y position with NORM or XOR draw mode.
|
Draw color pixel in the screen buffer's x,y position with NORM or XOR draw mode.
|
||||||
*/
|
*/
|
||||||
void draw_pixel(uint8_t x, uint8_t y, uint8_t color, uint8_t mode) {
|
void draw_pixel(uint8_t x, uint8_t y, uint8_t color, uint8_t mode) {
|
||||||
if ((x<0) || (x>=LCDWIDTH) || (y<0) || (y>=LCDHEIGHT))
|
if ((x < 0) || (x >= LCDWIDTH) || (y < 0) || (y >= LCDHEIGHT)) return;
|
||||||
return;
|
|
||||||
|
|
||||||
if (mode == XOR) {
|
if (mode == XOR) {
|
||||||
if (color == PIXEL_ON)
|
if (color == PIXEL_ON) micro_oled_screen_buffer[x + (y / 8) * LCDWIDTH] ^= _BV((y % 8));
|
||||||
micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] ^= _BV((y%8));
|
|
||||||
} else {
|
} else {
|
||||||
if (color == PIXEL_ON)
|
if (color == PIXEL_ON)
|
||||||
micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] |= _BV((y%8));
|
micro_oled_screen_buffer[x + (y / 8) * LCDWIDTH] |= _BV((y % 8));
|
||||||
else
|
else
|
||||||
micro_oled_screen_buffer[x + (y/8)*LCDWIDTH] &= ~_BV((y%8));
|
micro_oled_screen_buffer[x + (y / 8) * LCDWIDTH] &= ~_BV((y % 8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,9 +293,10 @@ void draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color, ui
|
||||||
if (y0 < y1) {
|
if (y0 < y1) {
|
||||||
ystep = 1;
|
ystep = 1;
|
||||||
} else {
|
} else {
|
||||||
ystep = -1;}
|
ystep = -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (; x0<x1; x0++) {
|
for (; x0 < x1; x0++) {
|
||||||
if (steep) {
|
if (steep) {
|
||||||
draw_pixel(y0, x0, color, mode);
|
draw_pixel(y0, x0, color, mode);
|
||||||
} else {
|
} else {
|
||||||
|
@ -526,16 +313,12 @@ void draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t color, ui
|
||||||
/** \brief Draw horizontal line with color and mode.
|
/** \brief Draw horizontal line with color and mode.
|
||||||
Draw horizontal line using color and mode from x,y to x+width,y of the screen buffer.
|
Draw horizontal line using color and mode from x,y to x+width,y of the screen buffer.
|
||||||
*/
|
*/
|
||||||
void draw_line_hori(uint8_t x, uint8_t y, uint8_t width, uint8_t color, uint8_t mode) {
|
void draw_line_hori(uint8_t x, uint8_t y, uint8_t width, uint8_t color, uint8_t mode) { draw_line(x, y, x + width, y, color, mode); }
|
||||||
draw_line(x,y,x+width,y,color,mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Draw vertical line.
|
/** \brief Draw vertical line.
|
||||||
Draw vertical line using current fore color and current draw mode from x,y to x,y+height of the screen buffer.
|
Draw vertical line using current fore color and current draw mode from x,y to x,y+height of the screen buffer.
|
||||||
*/
|
*/
|
||||||
void draw_line_vert(uint8_t x, uint8_t y, uint8_t height, bool color, uint8_t mode) {
|
void draw_line_vert(uint8_t x, uint8_t y, uint8_t height, bool color, uint8_t mode) { draw_line(x, y, x, y + height, color, mode); }
|
||||||
draw_line(x,y,x,y+height,color,mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Draw rectangle with color and mode.
|
/** \brief Draw rectangle with color and mode.
|
||||||
Draw rectangle using color and mode from x,y to x+width,y+height of the screen buffer.
|
Draw rectangle using color and mode from x,y to x+width,y+height of the screen buffer.
|
||||||
|
@ -543,17 +326,17 @@ Draw rectangle using color and mode from x,y to x+width,y+height of the screen b
|
||||||
void draw_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
void draw_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
||||||
uint8_t tempHeight;
|
uint8_t tempHeight;
|
||||||
|
|
||||||
draw_line_hori(x,y, width, color, mode);
|
draw_line_hori(x, y, width, color, mode);
|
||||||
draw_line_hori(x,y+height-1, width, color, mode);
|
draw_line_hori(x, y + height - 1, width, color, mode);
|
||||||
|
|
||||||
tempHeight=height-2;
|
tempHeight = height - 2;
|
||||||
|
|
||||||
// skip drawing vertical lines to avoid overlapping of pixel that will
|
// skip drawing vertical lines to avoid overlapping of pixel that will
|
||||||
// affect XOR plot if no pixel in between horizontal lines
|
// affect XOR plot if no pixel in between horizontal lines
|
||||||
if (tempHeight<1) return;
|
if (tempHeight < 1) return;
|
||||||
|
|
||||||
draw_line_vert(x,y+1, tempHeight, color, mode);
|
draw_line_vert(x, y + 1, tempHeight, color, mode);
|
||||||
draw_line_vert(x+width-1, y+1, tempHeight, color, mode);
|
draw_line_vert(x + width - 1, y + 1, tempHeight, color, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief Draw rectangle with color and mode.
|
/** \brief Draw rectangle with color and mode.
|
||||||
|
@ -562,17 +345,17 @@ Draw rectangle using color and mode from x,y to x+width,y+height of the screen b
|
||||||
void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
||||||
uint8_t tempHeight;
|
uint8_t tempHeight;
|
||||||
|
|
||||||
draw_line_hori(x+1,y, width-2, color, mode);
|
draw_line_hori(x + 1, y, width - 2, color, mode);
|
||||||
draw_line_hori(x+1,y+height-1, width-2, color, mode);
|
draw_line_hori(x + 1, y + height - 1, width - 2, color, mode);
|
||||||
|
|
||||||
tempHeight=height-2;
|
tempHeight = height - 2;
|
||||||
|
|
||||||
// skip drawing vertical lines to avoid overlapping of pixel that will
|
// skip drawing vertical lines to avoid overlapping of pixel that will
|
||||||
// affect XOR plot if no pixel in between horizontal lines
|
// affect XOR plot if no pixel in between horizontal lines
|
||||||
if (tempHeight<1) return;
|
if (tempHeight < 1) return;
|
||||||
|
|
||||||
draw_line_vert(x,y+1, tempHeight, color, mode);
|
draw_line_vert(x, y + 1, tempHeight, color, mode);
|
||||||
draw_line_vert(x+width-1, y+1, tempHeight, color, mode);
|
draw_line_vert(x + width - 1, y + 1, tempHeight, color, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief Draw filled rectangle with color and mode.
|
/** \brief Draw filled rectangle with color and mode.
|
||||||
|
@ -580,8 +363,8 @@ Draw filled rectangle using color and mode from x,y to x+width,y+height of the s
|
||||||
*/
|
*/
|
||||||
void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
||||||
// TODO - need to optimise the memory map draw so that this function will not call pixel one by one
|
// TODO - need to optimise the memory map draw so that this function will not call pixel one by one
|
||||||
for (int i=x; i<x+width;i++) {
|
for (int i = x; i < x + width; i++) {
|
||||||
draw_line_vert(i,y, height, color, mode);
|
draw_line_vert(i, y, height, color, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -590,9 +373,9 @@ Draw filled rectangle using color and mode from x,y to x+width,y+height of the s
|
||||||
*/
|
*/
|
||||||
void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode) {
|
||||||
// TODO - need to optimise the memory map draw so that this function will not call pixel one by one
|
// TODO - need to optimise the memory map draw so that this function will not call pixel one by one
|
||||||
for (int i=x; i<x+width;i++) {
|
for (int i = x; i < x + width; i++) {
|
||||||
if (i == x || i == (x + width - 1))
|
if (i == x || i == (x + width - 1))
|
||||||
draw_line_vert(i, y+1, height-2, color, mode);
|
draw_line_vert(i, y + 1, height - 2, color, mode);
|
||||||
else
|
else
|
||||||
draw_line_vert(i, y, height, color, mode);
|
draw_line_vert(i, y, height, color, mode);
|
||||||
}
|
}
|
||||||
|
@ -604,46 +387,44 @@ void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height,
|
||||||
void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font) {
|
void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font) {
|
||||||
// TODO - New routine to take font of any height, at the moment limited to font height in multiple of 8 pixels
|
// TODO - New routine to take font of any height, at the moment limited to font height in multiple of 8 pixels
|
||||||
|
|
||||||
uint8_t rowsToDraw,row, tempC;
|
uint8_t rowsToDraw, row, tempC;
|
||||||
uint8_t i,j,temp;
|
uint8_t i, j, temp;
|
||||||
uint16_t charPerBitmapRow,charColPositionOnBitmap,charRowPositionOnBitmap,charBitmapStartPosition;
|
uint16_t charPerBitmapRow, charColPositionOnBitmap, charRowPositionOnBitmap, charBitmapStartPosition;
|
||||||
|
|
||||||
if ((font>=TOTALFONTS) || (font<0))
|
if ((font >= TOTALFONTS) || (font < 0)) return;
|
||||||
return;
|
|
||||||
|
|
||||||
uint8_t fontType = font;
|
uint8_t fontType = font;
|
||||||
uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType]+0);
|
uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType] + 0);
|
||||||
uint8_t fontHeight = pgm_read_byte(fonts_pointer[fontType]+1);
|
uint8_t fontHeight = pgm_read_byte(fonts_pointer[fontType] + 1);
|
||||||
uint8_t fontStartChar = pgm_read_byte(fonts_pointer[fontType]+2);
|
uint8_t fontStartChar = pgm_read_byte(fonts_pointer[fontType] + 2);
|
||||||
uint8_t fontTotalChar = pgm_read_byte(fonts_pointer[fontType]+3);
|
uint8_t fontTotalChar = pgm_read_byte(fonts_pointer[fontType] + 3);
|
||||||
uint16_t fontMapWidth = (pgm_read_byte(fonts_pointer[fontType]+4)*100)+pgm_read_byte(fonts_pointer[fontType]+5); // two bytes values into integer 16
|
uint16_t fontMapWidth = (pgm_read_byte(fonts_pointer[fontType] + 4) * 100) + pgm_read_byte(fonts_pointer[fontType] + 5); // two bytes values into integer 16
|
||||||
|
|
||||||
if ((c<fontStartChar) || (c>(fontStartChar+fontTotalChar-1))) // no bitmap for the required c
|
if ((c < fontStartChar) || (c > (fontStartChar + fontTotalChar - 1))) // no bitmap for the required c
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tempC=c-fontStartChar;
|
tempC = c - fontStartChar;
|
||||||
|
|
||||||
// each row (in datasheet is call page) is 8 bits high, 16 bit high character will have 2 rows to be drawn
|
// each row (in datasheet is call page) is 8 bits high, 16 bit high character will have 2 rows to be drawn
|
||||||
rowsToDraw=fontHeight/8; // 8 is LCD's page size, see SSD1306 datasheet
|
rowsToDraw = fontHeight / 8; // 8 is LCD's page size, see SSD1306 datasheet
|
||||||
if (rowsToDraw<=1) rowsToDraw=1;
|
if (rowsToDraw <= 1) rowsToDraw = 1;
|
||||||
|
|
||||||
// the following draw function can draw anywhere on the screen, but SLOW pixel by pixel draw
|
// the following draw function can draw anywhere on the screen, but SLOW pixel by pixel draw
|
||||||
if (rowsToDraw==1) {
|
if (rowsToDraw == 1) {
|
||||||
for (i=0;i<fontWidth+1;i++) {
|
for (i = 0; i < fontWidth + 1; i++) {
|
||||||
if (i==fontWidth) // this is done in a weird way because for 5x7 font, there is no margin, this code add a margin after col 5
|
if (i == fontWidth) // this is done in a weird way because for 5x7 font, there is no margin, this code add a margin after col 5
|
||||||
temp=0;
|
temp = 0;
|
||||||
else
|
else
|
||||||
temp=pgm_read_byte(fonts_pointer[fontType]+FONTHEADERSIZE+(tempC*fontWidth)+i);
|
temp = pgm_read_byte(fonts_pointer[fontType] + FONTHEADERSIZE + (tempC * fontWidth) + i);
|
||||||
|
|
||||||
for (j=0;j<8;j++) { // 8 is the LCD's page height (see datasheet for explanation)
|
for (j = 0; j < 8; j++) { // 8 is the LCD's page height (see datasheet for explanation)
|
||||||
if (temp & 0x1) {
|
if (temp & 0x1) {
|
||||||
draw_pixel(x+i, y+j, color,mode);
|
draw_pixel(x + i, y + j, color, mode);
|
||||||
}
|
} else {
|
||||||
else {
|
draw_pixel(x + i, y + j, !color, mode);
|
||||||
draw_pixel(x+i, y+j, !color,mode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
temp >>=1;
|
temp >>= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -651,41 +432,36 @@ void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uin
|
||||||
|
|
||||||
// font height over 8 bit
|
// font height over 8 bit
|
||||||
// take character "0" ASCII 48 as example
|
// take character "0" ASCII 48 as example
|
||||||
charPerBitmapRow = fontMapWidth/fontWidth; // 256/8 =32 char per row
|
charPerBitmapRow = fontMapWidth / fontWidth; // 256/8 =32 char per row
|
||||||
charColPositionOnBitmap = tempC % charPerBitmapRow; // =16
|
charColPositionOnBitmap = tempC % charPerBitmapRow; // =16
|
||||||
charRowPositionOnBitmap = (int)(tempC/charPerBitmapRow); // =1
|
charRowPositionOnBitmap = (int)(tempC / charPerBitmapRow); // =1
|
||||||
charBitmapStartPosition = (charRowPositionOnBitmap * fontMapWidth * (fontHeight/8)) + (charColPositionOnBitmap * fontWidth) ;
|
charBitmapStartPosition = (charRowPositionOnBitmap * fontMapWidth * (fontHeight / 8)) + (charColPositionOnBitmap * fontWidth);
|
||||||
|
|
||||||
// each row on LCD is 8 bit height (see datasheet for explanation)
|
// each row on LCD is 8 bit height (see datasheet for explanation)
|
||||||
for(row=0;row<rowsToDraw;row++) {
|
for (row = 0; row < rowsToDraw; row++) {
|
||||||
for (i=0; i<fontWidth;i++) {
|
for (i = 0; i < fontWidth; i++) {
|
||||||
temp=pgm_read_byte(fonts_pointer[fontType]+FONTHEADERSIZE+(charBitmapStartPosition+i+(row*fontMapWidth)));
|
temp = pgm_read_byte(fonts_pointer[fontType] + FONTHEADERSIZE + (charBitmapStartPosition + i + (row * fontMapWidth)));
|
||||||
for (j=0;j<8;j++) { // 8 is the LCD's page height (see datasheet for explanation)
|
for (j = 0; j < 8; j++) { // 8 is the LCD's page height (see datasheet for explanation)
|
||||||
if (temp & 0x1) {
|
if (temp & 0x1) {
|
||||||
draw_pixel(x+i,y+j+(row*8), color, mode);
|
draw_pixel(x + i, y + j + (row * 8), color, mode);
|
||||||
|
} else {
|
||||||
|
draw_pixel(x + i, y + j + (row * 8), !color, mode);
|
||||||
}
|
}
|
||||||
else {
|
temp >>= 1;
|
||||||
draw_pixel(x+i,y+j+(row*8), !color, mode);
|
|
||||||
}
|
|
||||||
temp >>=1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mode, uint8_t font) {
|
void draw_string(uint8_t x, uint8_t y, char* string, uint8_t color, uint8_t mode, uint8_t font) {
|
||||||
|
if ((font >= TOTALFONTS) || (font < 0)) return;
|
||||||
if ((font>=TOTALFONTS) || (font<0))
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint8_t fontType = font;
|
uint8_t fontType = font;
|
||||||
uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType]+0);
|
uint8_t fontWidth = pgm_read_byte(fonts_pointer[fontType] + 0);
|
||||||
|
|
||||||
uint8_t cur_x = x;
|
uint8_t cur_x = x;
|
||||||
for (int i = 0; i < strlen(string); i++) {
|
for (int i = 0; i < strlen(string); i++) {
|
||||||
draw_char(cur_x, y, string[i], color, mode, font);
|
draw_char(cur_x, y, string[i], color, mode, font);
|
||||||
cur_x += fontWidth + 1;
|
cur_x += fontWidth + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,11 +49,11 @@ void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t
|
||||||
void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode);
|
void draw_rect_filled(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode);
|
||||||
void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode);
|
void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color, uint8_t mode);
|
||||||
void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font);
|
void draw_char(uint8_t x, uint8_t y, uint8_t c, uint8_t color, uint8_t mode, uint8_t font);
|
||||||
void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mode, uint8_t font);
|
void draw_string(uint8_t x, uint8_t y, char* string, uint8_t color, uint8_t mode, uint8_t font);
|
||||||
|
|
||||||
#define I2C_ADDRESS_SA0_0 0b0111100
|
#define I2C_ADDRESS_SA0_0 0b0111100
|
||||||
#ifndef I2C_ADDRESS_SA0_1
|
#ifndef I2C_ADDRESS_SA0_1
|
||||||
#define I2C_ADDRESS_SA0_1 0b0111101
|
# define I2C_ADDRESS_SA0_1 0b0111101
|
||||||
#endif
|
#endif
|
||||||
#define I2C_COMMAND 0x00
|
#define I2C_COMMAND 0x00
|
||||||
#define I2C_DATA 0x40
|
#define I2C_DATA 0x40
|
||||||
|
@ -61,10 +61,10 @@ void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mod
|
||||||
#define PIXEL_ON 1
|
#define PIXEL_ON 1
|
||||||
|
|
||||||
#ifndef LCDWIDTH
|
#ifndef LCDWIDTH
|
||||||
#define LCDWIDTH 64
|
# define LCDWIDTH 64
|
||||||
#endif
|
#endif
|
||||||
#ifndef LCDWIDTH
|
#ifndef LCDWIDTH
|
||||||
#define LCDHEIGHT 48
|
# define LCDHEIGHT 48
|
||||||
#endif
|
#endif
|
||||||
#define FONTHEADERSIZE 6
|
#define FONTHEADERSIZE 6
|
||||||
|
|
||||||
|
@ -112,23 +112,23 @@ void draw_string(uint8_t x, uint8_t y, char * string, uint8_t color, uint8_t mod
|
||||||
#define VERTICALLEFTHORIZONTALSCROLL 0x2A
|
#define VERTICALLEFTHORIZONTALSCROLL 0x2A
|
||||||
|
|
||||||
typedef enum CMD {
|
typedef enum CMD {
|
||||||
CMD_CLEAR, //0
|
CMD_CLEAR, // 0
|
||||||
CMD_INVERT, //1
|
CMD_INVERT, // 1
|
||||||
CMD_CONTRAST, //2
|
CMD_CONTRAST, // 2
|
||||||
CMD_DISPLAY, //3
|
CMD_DISPLAY, // 3
|
||||||
CMD_SETCURSOR, //4
|
CMD_SETCURSOR, // 4
|
||||||
CMD_PIXEL, //5
|
CMD_PIXEL, // 5
|
||||||
CMD_LINE, //6
|
CMD_LINE, // 6
|
||||||
CMD_LINEH, //7
|
CMD_LINEH, // 7
|
||||||
CMD_LINEV, //8
|
CMD_LINEV, // 8
|
||||||
CMD_RECT, //9
|
CMD_RECT, // 9
|
||||||
CMD_RECTFILL, //10
|
CMD_RECTFILL, // 10
|
||||||
CMD_CIRCLE, //11
|
CMD_CIRCLE, // 11
|
||||||
CMD_CIRCLEFILL, //12
|
CMD_CIRCLEFILL, // 12
|
||||||
CMD_DRAWCHAR, //13
|
CMD_DRAWCHAR, // 13
|
||||||
CMD_DRAWBITMAP, //14
|
CMD_DRAWBITMAP, // 14
|
||||||
CMD_GETLCDWIDTH, //15
|
CMD_GETLCDWIDTH, // 15
|
||||||
CMD_GETLCDHEIGHT, //16
|
CMD_GETLCDHEIGHT, // 16
|
||||||
CMD_SETCOLOR, //17
|
CMD_SETCOLOR, // 17
|
||||||
CMD_SETDRAWMODE //18
|
CMD_SETDRAWMODE // 18
|
||||||
} commCommand_t;
|
} commCommand_t;
|
|
@ -16,16 +16,16 @@
|
||||||
#include "qwiic.h"
|
#include "qwiic.h"
|
||||||
|
|
||||||
void qwiic_init(void) {
|
void qwiic_init(void) {
|
||||||
#ifdef QWIIC_JOYSTIIC_ENABLE
|
#ifdef QWIIC_JOYSTIIC_ENABLE
|
||||||
joystiic_init();
|
joystiic_init();
|
||||||
#endif
|
#endif
|
||||||
#ifdef QWIIC_MICRO_OLED_ENABLE
|
#ifdef QWIIC_MICRO_OLED_ENABLE
|
||||||
micro_oled_init();
|
micro_oled_init();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void qwiic_task(void) {
|
void qwiic_task(void) {
|
||||||
#ifdef QWIIC_JOYSTIIC_ENABLE
|
#ifdef QWIIC_JOYSTIIC_ENABLE
|
||||||
joystiic_task();
|
joystiic_task();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,10 +18,10 @@
|
||||||
#include "i2c_master.h"
|
#include "i2c_master.h"
|
||||||
|
|
||||||
#ifdef QWIIC_JOYSTIIC_ENABLE
|
#ifdef QWIIC_JOYSTIIC_ENABLE
|
||||||
#include "joystiic.h"
|
# include "joystiic.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef QWIIC_MICRO_OLED_ENABLE
|
#ifdef QWIIC_MICRO_OLED_ENABLE
|
||||||
#include "micro_oled.h"
|
# include "micro_oled.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void qwiic_init(void);
|
void qwiic_init(void);
|
||||||
|
|
|
@ -29,260 +29,11 @@ https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/
|
||||||
// Standard ASCII 5x7 font
|
// Standard ASCII 5x7 font
|
||||||
static const unsigned char font5x7[] PROGMEM = {
|
static const unsigned char font5x7[] PROGMEM = {
|
||||||
// first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256)
|
// first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256)
|
||||||
5,8,0,255,12,75,
|
5, 8, 0, 255, 12, 75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x30, 0x38, 0x3E, 0x38, 0x30,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
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,
|
||||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
|
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,
|
||||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
|
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,
|
||||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
|
0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 0x21, 0x54, 0x54, 0x78, 0x41, 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, 0xF0, 0x29, 0x24, 0x29, 0xF0, 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, 0x32, 0x48, 0x48, 0x48, 0x32, 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x39, 0x44, 0x44, 0x44, 0x39, 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,
|
||||||
0x18, 0x3C, 0x7E, 0x3C, 0x18,
|
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, 0xAA, 0x00, 0x55, 0x00, 0xAA, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 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,
|
||||||
0x1C, 0x57, 0x7D, 0x57, 0x1C,
|
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, 0x7C,
|
||||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
|
0x2A, 0x2A, 0x3E, 0x14, 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};
|
||||||
0x00, 0x18, 0x3C, 0x18, 0x00,
|
|
||||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
|
|
||||||
0x00, 0x18, 0x24, 0x18, 0x00,
|
|
||||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
|
|
||||||
0x30, 0x48, 0x3A, 0x06, 0x0E,
|
|
||||||
0x26, 0x29, 0x79, 0x29, 0x26,
|
|
||||||
0x40, 0x7F, 0x05, 0x05, 0x07,
|
|
||||||
0x40, 0x7F, 0x05, 0x25, 0x3F,
|
|
||||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
|
|
||||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
|
|
||||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
|
|
||||||
0x14, 0x22, 0x7F, 0x22, 0x14,
|
|
||||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
|
|
||||||
0x06, 0x09, 0x7F, 0x01, 0x7F,
|
|
||||||
0x00, 0x66, 0x89, 0x95, 0x6A,
|
|
||||||
0x60, 0x60, 0x60, 0x60, 0x60,
|
|
||||||
0x94, 0xA2, 0xFF, 0xA2, 0x94,
|
|
||||||
0x08, 0x04, 0x7E, 0x04, 0x08,
|
|
||||||
0x10, 0x20, 0x7E, 0x20, 0x10,
|
|
||||||
0x08, 0x08, 0x2A, 0x1C, 0x08,
|
|
||||||
0x08, 0x1C, 0x2A, 0x08, 0x08,
|
|
||||||
0x1E, 0x10, 0x10, 0x10, 0x10,
|
|
||||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
|
|
||||||
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,
|
|
||||||
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,
|
|
||||||
0x21, 0x54, 0x54, 0x78, 0x41,
|
|
||||||
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,
|
|
||||||
0xF0, 0x29, 0x24, 0x29, 0xF0,
|
|
||||||
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,
|
|
||||||
0x32, 0x48, 0x48, 0x48, 0x32,
|
|
||||||
0x32, 0x4A, 0x48, 0x48, 0x30,
|
|
||||||
0x3A, 0x41, 0x41, 0x21, 0x7A,
|
|
||||||
0x3A, 0x42, 0x40, 0x20, 0x78,
|
|
||||||
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
|
|
||||||
0x39, 0x44, 0x44, 0x44, 0x39,
|
|
||||||
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,
|
|
||||||
0xAA, 0x00, 0x55, 0x00, 0xAA,
|
|
||||||
0xAA, 0x55, 0xAA, 0x55, 0xAA,
|
|
||||||
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,
|
|
||||||
0x7C, 0x2A, 0x2A, 0x3E, 0x14,
|
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
|
@ -27,101 +27,13 @@ https://github.com/emil01/SparkFun_Micro_OLED_Arduino_Library/
|
||||||
|
|
||||||
static const unsigned char font8x16[] PROGMEM = {
|
static const unsigned char font8x16[] PROGMEM = {
|
||||||
// first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256)
|
// first row defines - FONTWIDTH, FONTHEIGHT, ASCII START CHAR, TOTAL CHARACTERS, FONT MAP WIDTH HIGH, FONT MAP WIDTH LOW (2,56 meaning 256)
|
||||||
8,16,32,96,2,56,
|
8, 16, 32, 96, 2, 56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xBE, 0x90, 0xD0, 0xBE, 0x90, 0x00, 0x00, 0x1C, 0x62, 0xFF, 0xC2, 0x80, 0x00, 0x00, 0x0C, 0x12, 0x92, 0x4C, 0xB0, 0x88, 0x06, 0x00, 0x80, 0x7C, 0x62, 0xB2, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x24, 0x18, 0x7E, 0x18, 0x24, 0x00, 0x00, 0x80, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x06, 0x00, 0x00, 0xF8, 0x04, 0xC2, 0x32, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x04, 0x04, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x82, 0x42, 0x22,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00,
|
0x1C, 0x00, 0x00, 0x00, 0x02, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, 0xC0, 0xA0, 0x98, 0x84, 0xFE, 0x80, 0x80, 0x00, 0x00, 0x1E, 0x12, 0x12, 0x22, 0xC2, 0x00, 0x00, 0xF8, 0x44, 0x22, 0x22, 0x22, 0xC0, 0x00, 0x00, 0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x8C, 0x52, 0x22, 0x52, 0x8C, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x26, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x0F, 0x04, 0x03, 0x00, 0x00, 0x04, 0x02, 0x01, 0x03, 0x04, 0x04, 0x03, 0x00,
|
||||||
0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xBE, 0x90, 0xD0, 0xBE, 0x90, 0x00,
|
0x03, 0x04, 0x04, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04,
|
||||||
0x00, 0x1C, 0x62, 0xFF, 0xC2, 0x80, 0x00, 0x00, 0x0C, 0x12, 0x92, 0x4C, 0xB0, 0x88, 0x06, 0x00,
|
0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x04, 0x72, 0x8A, 0xFA, 0x84, 0x78, 0x00, 0x00, 0xC0, 0x38, 0x06, 0x38, 0xC0, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x22, 0xE2, 0x00, 0x00, 0xFE, 0x20, 0x20, 0x20, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0xFE, 0x40, 0xB0, 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x80, 0x7C, 0x62, 0xB2, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0xFE, 0x0C, 0x70, 0x80, 0x70, 0x0C, 0xFE, 0x00, 0xFE, 0x0C, 0x30, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0xFE, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0x42, 0x42, 0xA2, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x42, 0x42, 0x80, 0x00, 0x00, 0x02, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x02, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x06, 0x38, 0xC0, 0x00, 0xC0, 0x38, 0x06, 0x00, 0x3E, 0xC0, 0xF0, 0x0E, 0xF0, 0xC0, 0x3E, 0x00, 0x00, 0x06, 0x98, 0x60, 0x98, 0x06, 0x00, 0x00, 0x00, 0x06, 0x18, 0xE0, 0x18, 0x06, 0x00, 0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x06, 0x18, 0x60, 0x80, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x40, 0x30, 0x0C, 0x0C, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
||||||
0x00, 0xE0, 0x18, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00,
|
0x02, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0C, 0x12, 0x11, 0x10, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,
|
||||||
0x00, 0x24, 0x18, 0x7E, 0x18, 0x24, 0x00, 0x00, 0x80, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00,
|
0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xFE, 0x00, 0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0xE0, 0x00, 0x00, 0x00, 0x20, 0xFC, 0x22, 0x22, 0x22, 0x02,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0xF0, 0x20, 0x10, 0xF0, 0x00, 0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0x10, 0x70, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0xFC, 0x20, 0x20, 0x20, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x80, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x30, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x30, 0xC0, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x10,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x06, 0x00, 0x00,
|
0x10, 0x90, 0x50, 0x30, 0x00, 0x00, 0x00, 0x80, 0x80, 0x7E, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x7E, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x24, 0x24, 0x22, 0x1F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00,
|
||||||
0xF8, 0x04, 0xC2, 0x32, 0x0C, 0xF8, 0x00, 0x00, 0x00, 0x04, 0x04, 0xFE, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x3F, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x01, 0x06, 0x01, 0x00, 0x00, 0x06, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x20, 0x20, 0x31, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00,
|
|
||||||
0xC0, 0xA0, 0x98, 0x84, 0xFE, 0x80, 0x80, 0x00, 0x00, 0x1E, 0x12, 0x12, 0x22, 0xC2, 0x00, 0x00,
|
|
||||||
0xF8, 0x44, 0x22, 0x22, 0x22, 0xC0, 0x00, 0x00, 0x00, 0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00,
|
|
||||||
0x00, 0x8C, 0x52, 0x22, 0x52, 0x8C, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x26, 0xF8, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00,
|
|
||||||
0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x02, 0x82, 0x42, 0x22, 0x1C, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x04, 0x04, 0x0F, 0x04, 0x03, 0x00, 0x00, 0x04, 0x02, 0x01, 0x03, 0x04, 0x04, 0x03, 0x00,
|
|
||||||
0x03, 0x04, 0x04, 0x04, 0x05, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x03, 0x06, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x06, 0x03, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x03, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00,
|
|
||||||
0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
|
|
||||||
0x01, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
|
|
||||||
0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0xF8, 0x04, 0x72, 0x8A, 0xFA, 0x84, 0x78, 0x00, 0x00, 0xC0, 0x38, 0x06, 0x38, 0xC0, 0x00, 0x00,
|
|
||||||
0x00, 0xFE, 0x22, 0x22, 0x22, 0xDC, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00,
|
|
||||||
0xFE, 0x02, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
|
|
||||||
0x00, 0xFE, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x22, 0xE2, 0x00, 0x00,
|
|
||||||
0xFE, 0x20, 0x20, 0x20, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0xFE, 0x40, 0xB0, 0x08, 0x04, 0x02, 0x00, 0x00,
|
|
||||||
0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0C, 0x70, 0x80, 0x70, 0x0C, 0xFE, 0x00,
|
|
||||||
0xFE, 0x0C, 0x30, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00,
|
|
||||||
0xFE, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x04, 0xF8, 0x00, 0x00,
|
|
||||||
0x00, 0xFE, 0x42, 0x42, 0xA2, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x42, 0x42, 0x80, 0x00, 0x00,
|
|
||||||
0x02, 0x02, 0x02, 0xFE, 0x02, 0x02, 0x02, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
|
|
||||||
0x06, 0x38, 0xC0, 0x00, 0xC0, 0x38, 0x06, 0x00, 0x3E, 0xC0, 0xF0, 0x0E, 0xF0, 0xC0, 0x3E, 0x00,
|
|
||||||
0x00, 0x06, 0x98, 0x60, 0x98, 0x06, 0x00, 0x00, 0x00, 0x06, 0x18, 0xE0, 0x18, 0x06, 0x00, 0x00,
|
|
||||||
0x02, 0x02, 0xC2, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x02, 0x00,
|
|
||||||
0x00, 0x06, 0x18, 0x60, 0x80, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00,
|
|
||||||
0x40, 0x30, 0x0C, 0x0C, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x02, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x00,
|
|
||||||
0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
|
|
||||||
0x07, 0x04, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
|
|
||||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00,
|
|
||||||
0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00,
|
|
||||||
0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00,
|
|
||||||
0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00,
|
|
||||||
0x07, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00,
|
|
||||||
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0C, 0x12, 0x11, 0x10, 0x00,
|
|
||||||
0x00, 0x07, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
|
|
||||||
0x00, 0x06, 0x01, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x06, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00,
|
|
||||||
0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
|
|
||||||
0x00, 0xE0, 0x10, 0x10, 0x10, 0xFE, 0x00, 0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0xE0, 0x00, 0x00,
|
|
||||||
0x00, 0x20, 0xFC, 0x22, 0x22, 0x22, 0x02, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00,
|
|
||||||
0x00, 0xFE, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x10, 0x10, 0x10, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00,
|
|
||||||
0x00, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x20, 0x10, 0xF0, 0x20, 0x10, 0xF0, 0x00,
|
|
||||||
0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xE0, 0x00, 0x00,
|
|
||||||
0x00, 0xF0, 0x20, 0x10, 0x10, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00,
|
|
||||||
0x00, 0xF0, 0x20, 0x10, 0x10, 0x70, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x20, 0x00, 0x00,
|
|
||||||
0x00, 0x20, 0x20, 0xFC, 0x20, 0x20, 0x20, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00,
|
|
||||||
0x00, 0x70, 0x80, 0x00, 0x80, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x30, 0xC0, 0x00, 0xF0, 0x00,
|
|
||||||
0x00, 0x30, 0xC0, 0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x80, 0x70, 0x00, 0x00,
|
|
||||||
0x00, 0x10, 0x10, 0x90, 0x50, 0x30, 0x00, 0x00, 0x00, 0x80, 0x80, 0x7E, 0x02, 0x02, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x7E, 0x80, 0x80, 0x00, 0x00,
|
|
||||||
0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00,
|
|
||||||
0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
|
|
||||||
0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x24, 0x24, 0x22, 0x1F, 0x00, 0x00,
|
|
||||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x00,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x02, 0x04, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x07, 0x04, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00,
|
|
||||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
|
|
||||||
0x00, 0x3F, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x3F, 0x00, 0x00,
|
|
||||||
0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x03, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x00, 0x00, 0x03, 0x04, 0x04, 0x02, 0x07, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x00, 0x01, 0x06, 0x01, 0x00,
|
|
||||||
0x00, 0x06, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x20, 0x20, 0x31, 0x0E, 0x03, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x06, 0x05, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
||||||
};
|
|
||||||
|
|
|
@ -35,35 +35,34 @@ static const uint8_t led_mask[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// The address of the LED
|
// The address of the LED
|
||||||
#define LA(c, r) (c + r * 16 )
|
#define LA(c, r) (c + r * 16)
|
||||||
// Need to be an address that is not mapped, but inside the range of the controller matrix
|
// Need to be an address that is not mapped, but inside the range of the controller matrix
|
||||||
#define NA LA(8, 8)
|
#define NA LA(8, 8)
|
||||||
|
|
||||||
// The numbers in the comments are the led numbers DXX on the PCB
|
// The numbers in the comments are the led numbers DXX on the PCB
|
||||||
// The mapping is taken from the schematic of left hand side
|
// The mapping is taken from the schematic of left hand side
|
||||||
static const uint8_t led_mapping[GDISP_SCREEN_HEIGHT][GDISP_SCREEN_WIDTH] = {
|
static const uint8_t led_mapping[GDISP_SCREEN_HEIGHT][GDISP_SCREEN_WIDTH] = {
|
||||||
// 45 44 43 42 41 40 39
|
// 45 44 43 42 41 40 39
|
||||||
{ LA(1, 1), LA(1, 0), LA(0, 4), LA(0, 3), LA(0, 2), LA(0, 1), LA(0, 0)},
|
{LA(1, 1), LA(1, 0), LA(0, 4), LA(0, 3), LA(0, 2), LA(0, 1), LA(0, 0)},
|
||||||
// 52 51 50 49 48 47 46
|
// 52 51 50 49 48 47 46
|
||||||
{ LA(2, 3), LA(2, 2), LA(2, 1), LA(2, 0), LA(1, 4), LA(1, 3), LA(1, 2) },
|
{LA(2, 3), LA(2, 2), LA(2, 1), LA(2, 0), LA(1, 4), LA(1, 3), LA(1, 2)},
|
||||||
// 58 57 56 55 54 53 N/A
|
// 58 57 56 55 54 53 N/A
|
||||||
{ LA(3, 4), LA(3, 3), LA(3, 2), LA(3, 1), LA(3, 0), LA(2, 4), NA },
|
{LA(3, 4), LA(3, 3), LA(3, 2), LA(3, 1), LA(3, 0), LA(2, 4), NA},
|
||||||
// 67 66 65 64 63 62 61
|
// 67 66 65 64 63 62 61
|
||||||
{ LA(5, 3), LA(5, 2), LA(5, 1), LA(5, 0), LA(4, 4), LA(4, 3), LA(4, 2) },
|
{LA(5, 3), LA(5, 2), LA(5, 1), LA(5, 0), LA(4, 4), LA(4, 3), LA(4, 2)},
|
||||||
// 76 75 74 73 72 60 59
|
// 76 75 74 73 72 60 59
|
||||||
{ LA(7, 3), LA(7, 2), LA(7, 1), LA(7, 0), LA(6, 3), LA(4, 1), LA(4, 0) },
|
{LA(7, 3), LA(7, 2), LA(7, 1), LA(7, 0), LA(6, 3), LA(4, 1), LA(4, 0)},
|
||||||
// N/A N/A N/A N/A N/A N/A 68
|
// N/A N/A N/A N/A N/A N/A 68
|
||||||
{ NA, NA, NA, NA, NA, NA, LA(5, 4) },
|
{NA, NA, NA, NA, NA, NA, LA(5, 4)},
|
||||||
// N/A N/A N/A N/A 71 70 69
|
// N/A N/A N/A N/A 71 70 69
|
||||||
{ NA, NA, NA, NA, LA(6, 2), LA(6, 1), LA(6, 0) },
|
{NA, NA, NA, NA, LA(6, 2), LA(6, 1), LA(6, 0)},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define IS31_ADDR_DEFAULT 0x74 // AD connected to GND
|
#define IS31_ADDR_DEFAULT 0x74 // AD connected to GND
|
||||||
#define IS31_TIMEOUT 5000
|
#define IS31_TIMEOUT 5000
|
||||||
|
|
||||||
static GFXINLINE void init_board(GDisplay *g) {
|
static GFXINLINE void init_board(GDisplay* g) {
|
||||||
(void) g;
|
(void)g;
|
||||||
/* I2C pins */
|
/* I2C pins */
|
||||||
palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL
|
palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATIVE_2); // PTB0/I2C0/SCL
|
||||||
palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA
|
palSetPadMode(GPIOB, 1, PAL_MODE_ALTERNATIVE_2); // PTB1/I2C0/SDA
|
||||||
|
@ -77,33 +76,29 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||||
I2CD1.i2c->FLT = 4;
|
I2CD1.i2c->FLT = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void post_init_board(GDisplay *g) {
|
static GFXINLINE void post_init_board(GDisplay* g) { (void)g; }
|
||||||
(void) g;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GFXINLINE const uint8_t* get_led_mask(GDisplay* g) {
|
static GFXINLINE const uint8_t* get_led_mask(GDisplay* g) {
|
||||||
(void) g;
|
(void)g;
|
||||||
return led_mask;
|
return led_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE uint8_t get_led_address(GDisplay* g, uint16_t x, uint16_t y)
|
static GFXINLINE uint8_t get_led_address(GDisplay* g, uint16_t x, uint16_t y) {
|
||||||
{
|
(void)g;
|
||||||
(void) g;
|
|
||||||
return led_mapping[y][x];
|
return led_mapping[y][x];
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void set_hardware_shutdown(GDisplay* g, bool shutdown) {
|
static GFXINLINE void set_hardware_shutdown(GDisplay* g, bool shutdown) {
|
||||||
(void) g;
|
(void)g;
|
||||||
if(!shutdown) {
|
if (!shutdown) {
|
||||||
palSetPad(GPIOB, 16);
|
palSetPad(GPIOB, 16);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
palClearPad(GPIOB, 16);
|
palClearPad(GPIOB, 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) {
|
static GFXINLINE void write_data(GDisplay* g, uint8_t* data, uint16_t length) {
|
||||||
(void) g;
|
(void)g;
|
||||||
i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, data, length, 0, 0, US2ST(IS31_TIMEOUT));
|
i2cMasterTransmitTimeout(&I2CD1, IS31_ADDR_DEFAULT, data, length, 0, 0, US2ST(IS31_TIMEOUT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,15 +19,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#if GFX_USE_GDISP
|
#if GFX_USE_GDISP
|
||||||
|
|
||||||
#define GDISP_DRIVER_VMT GDISPVMT_IS31FL3731C_QMK
|
# define GDISP_DRIVER_VMT GDISPVMT_IS31FL3731C_QMK
|
||||||
#define GDISP_SCREEN_HEIGHT LED_HEIGHT
|
# define GDISP_SCREEN_HEIGHT LED_HEIGHT
|
||||||
#define GDISP_SCREEN_WIDTH LED_WIDTH
|
# define GDISP_SCREEN_WIDTH LED_WIDTH
|
||||||
|
|
||||||
#include "gdisp_lld_config.h"
|
# include "gdisp_lld_config.h"
|
||||||
#include "src/gdisp/gdisp_driver.h"
|
# include "src/gdisp/gdisp_driver.h"
|
||||||
|
|
||||||
#include "board_is31fl3731c.h"
|
|
||||||
|
|
||||||
|
# include "board_is31fl3731c.h"
|
||||||
|
|
||||||
// Can't include led_tables from here
|
// Can't include led_tables from here
|
||||||
extern const uint8_t CIE1931_CURVE[];
|
extern const uint8_t CIE1931_CURVE[];
|
||||||
|
@ -36,96 +35,96 @@ extern const uint8_t CIE1931_CURVE[];
|
||||||
/* Driver local definitions. */
|
/* Driver local definitions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#ifndef GDISP_INITIAL_CONTRAST
|
# ifndef GDISP_INITIAL_CONTRAST
|
||||||
#define GDISP_INITIAL_CONTRAST 0
|
# define GDISP_INITIAL_CONTRAST 0
|
||||||
#endif
|
# endif
|
||||||
#ifndef GDISP_INITIAL_BACKLIGHT
|
# ifndef GDISP_INITIAL_BACKLIGHT
|
||||||
#define GDISP_INITIAL_BACKLIGHT 0
|
# define GDISP_INITIAL_BACKLIGHT 0
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER<<0)
|
# define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER << 0)
|
||||||
|
|
||||||
#define IS31_ADDR_DEFAULT 0x74
|
# define IS31_ADDR_DEFAULT 0x74
|
||||||
|
|
||||||
#define IS31_REG_CONFIG 0x00
|
# define IS31_REG_CONFIG 0x00
|
||||||
// bits in reg
|
// bits in reg
|
||||||
#define IS31_REG_CONFIG_PICTUREMODE 0x00
|
# define IS31_REG_CONFIG_PICTUREMODE 0x00
|
||||||
#define IS31_REG_CONFIG_AUTOPLAYMODE 0x08
|
# define IS31_REG_CONFIG_AUTOPLAYMODE 0x08
|
||||||
#define IS31_REG_CONFIG_AUDIOPLAYMODE 0x18
|
# define IS31_REG_CONFIG_AUDIOPLAYMODE 0x18
|
||||||
// D2:D0 bits are starting frame for autoplay mode
|
// D2:D0 bits are starting frame for autoplay mode
|
||||||
|
|
||||||
#define IS31_REG_PICTDISP 0x01 // D2:D0 frame select for picture mode
|
# define IS31_REG_PICTDISP 0x01 // D2:D0 frame select for picture mode
|
||||||
|
|
||||||
#define IS31_REG_AUTOPLAYCTRL1 0x02
|
# define IS31_REG_AUTOPLAYCTRL1 0x02
|
||||||
// D6:D4 number of loops (000=infty)
|
// D6:D4 number of loops (000=infty)
|
||||||
// D2:D0 number of frames to be used
|
// D2:D0 number of frames to be used
|
||||||
|
|
||||||
#define IS31_REG_AUTOPLAYCTRL2 0x03 // D5:D0 delay time (*11ms)
|
# define IS31_REG_AUTOPLAYCTRL2 0x03 // D5:D0 delay time (*11ms)
|
||||||
|
|
||||||
#define IS31_REG_DISPLAYOPT 0x05
|
# define IS31_REG_DISPLAYOPT 0x05
|
||||||
#define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames
|
# define IS31_REG_DISPLAYOPT_INTENSITY_SAME 0x20 // same intensity for all frames
|
||||||
#define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x8
|
# define IS31_REG_DISPLAYOPT_BLINK_ENABLE 0x8
|
||||||
// D2:D0 bits blink period time (*0.27s)
|
// D2:D0 bits blink period time (*0.27s)
|
||||||
|
|
||||||
#define IS31_REG_AUDIOSYNC 0x06
|
# define IS31_REG_AUDIOSYNC 0x06
|
||||||
#define IS31_REG_AUDIOSYNC_ENABLE 0x1
|
# define IS31_REG_AUDIOSYNC_ENABLE 0x1
|
||||||
|
|
||||||
#define IS31_REG_FRAMESTATE 0x07
|
# define IS31_REG_FRAMESTATE 0x07
|
||||||
|
|
||||||
#define IS31_REG_BREATHCTRL1 0x08
|
# define IS31_REG_BREATHCTRL1 0x08
|
||||||
// D6:D4 fade out time (26ms*2^i)
|
// D6:D4 fade out time (26ms*2^i)
|
||||||
// D2:D0 fade in time (26ms*2^i)
|
// D2:D0 fade in time (26ms*2^i)
|
||||||
|
|
||||||
#define IS31_REG_BREATHCTRL2 0x09
|
# define IS31_REG_BREATHCTRL2 0x09
|
||||||
#define IS31_REG_BREATHCTRL2_ENABLE 0x10
|
# define IS31_REG_BREATHCTRL2_ENABLE 0x10
|
||||||
// D2:D0 extinguish time (3.5ms*2^i)
|
// D2:D0 extinguish time (3.5ms*2^i)
|
||||||
|
|
||||||
#define IS31_REG_SHUTDOWN 0x0A
|
# define IS31_REG_SHUTDOWN 0x0A
|
||||||
#define IS31_REG_SHUTDOWN_OFF 0x0
|
# define IS31_REG_SHUTDOWN_OFF 0x0
|
||||||
#define IS31_REG_SHUTDOWN_ON 0x1
|
# define IS31_REG_SHUTDOWN_ON 0x1
|
||||||
|
|
||||||
#define IS31_REG_AGCCTRL 0x0B
|
# define IS31_REG_AGCCTRL 0x0B
|
||||||
#define IS31_REG_ADCRATE 0x0C
|
# define IS31_REG_ADCRATE 0x0C
|
||||||
|
|
||||||
#define IS31_COMMANDREGISTER 0xFD
|
# define IS31_COMMANDREGISTER 0xFD
|
||||||
#define IS31_FUNCTIONREG 0x0B // helpfully called 'page nine'
|
# define IS31_FUNCTIONREG 0x0B // helpfully called 'page nine'
|
||||||
#define IS31_FUNCTIONREG_SIZE 0xD
|
# define IS31_FUNCTIONREG_SIZE 0xD
|
||||||
|
|
||||||
#define IS31_FRAME_SIZE 0xB4
|
# define IS31_FRAME_SIZE 0xB4
|
||||||
|
|
||||||
#define IS31_PWM_REG 0x24
|
# define IS31_PWM_REG 0x24
|
||||||
#define IS31_PWM_SIZE 0x90
|
# define IS31_PWM_SIZE 0x90
|
||||||
|
|
||||||
#define IS31_LED_MASK_SIZE 0x12
|
# define IS31_LED_MASK_SIZE 0x12
|
||||||
|
|
||||||
#define IS31
|
# define IS31
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver local functions. */
|
/* Driver local functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
typedef struct{
|
typedef struct {
|
||||||
uint8_t write_buffer_offset;
|
uint8_t write_buffer_offset;
|
||||||
uint8_t write_buffer[IS31_FRAME_SIZE];
|
uint8_t write_buffer[IS31_FRAME_SIZE];
|
||||||
uint8_t frame_buffer[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH];
|
uint8_t frame_buffer[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH];
|
||||||
uint8_t page;
|
uint8_t page;
|
||||||
}__attribute__((__packed__)) PrivData;
|
} __attribute__((__packed__)) PrivData;
|
||||||
|
|
||||||
// Some common routines and macros
|
// Some common routines and macros
|
||||||
#define PRIV(g) ((PrivData*)g->priv)
|
# define PRIV(g) ((PrivData *)g->priv)
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver exported functions. */
|
/* Driver exported functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
static GFXINLINE void write_page(GDisplay* g, uint8_t page) {
|
static GFXINLINE void write_page(GDisplay *g, uint8_t page) {
|
||||||
uint8_t tx[2] __attribute__((aligned(2)));
|
uint8_t tx[2] __attribute__((aligned(2)));
|
||||||
tx[0] = IS31_COMMANDREGISTER;
|
tx[0] = IS31_COMMANDREGISTER;
|
||||||
tx[1] = page;
|
tx[1] = page;
|
||||||
write_data(g, tx, 2);
|
write_data(g, tx, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void write_register(GDisplay* g, uint8_t page, uint8_t reg, uint8_t data) {
|
static GFXINLINE void write_register(GDisplay *g, uint8_t page, uint8_t reg, uint8_t data) {
|
||||||
uint8_t tx[2] __attribute__((aligned(2)));
|
uint8_t tx[2] __attribute__((aligned(2)));
|
||||||
tx[0] = reg;
|
tx[0] = reg;
|
||||||
tx[1] = data;
|
tx[1] = data;
|
||||||
|
@ -136,7 +135,7 @@ static GFXINLINE void write_register(GDisplay* g, uint8_t page, uint8_t reg, uin
|
||||||
static GFXINLINE void write_ram(GDisplay *g, uint8_t page, uint16_t offset, uint16_t length) {
|
static GFXINLINE void write_ram(GDisplay *g, uint8_t page, uint16_t offset, uint16_t length) {
|
||||||
PRIV(g)->write_buffer_offset = offset;
|
PRIV(g)->write_buffer_offset = offset;
|
||||||
write_page(g, page);
|
write_page(g, page);
|
||||||
write_data(g, (uint8_t*)PRIV(g), length + 1);
|
write_data(g, (uint8_t *)PRIV(g), length + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
|
@ -160,10 +159,9 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
write_ram(g, IS31_FUNCTIONREG, 0, IS31_FUNCTIONREG_SIZE);
|
write_ram(g, IS31_FUNCTIONREG, 0, IS31_FUNCTIONREG_SIZE);
|
||||||
gfxSleepMilliseconds(10);
|
gfxSleepMilliseconds(10);
|
||||||
|
|
||||||
|
|
||||||
// zero all LED registers on all 8 pages, and enable the mask
|
// zero all LED registers on all 8 pages, and enable the mask
|
||||||
__builtin_memcpy(PRIV(g)->write_buffer, get_led_mask(g), IS31_LED_MASK_SIZE);
|
__builtin_memcpy(PRIV(g)->write_buffer, get_led_mask(g), IS31_LED_MASK_SIZE);
|
||||||
for(uint8_t i=0; i<8; i++) {
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
write_ram(g, i, 0, IS31_FRAME_SIZE);
|
write_ram(g, i, 0, IS31_FRAME_SIZE);
|
||||||
gfxSleepMilliseconds(1);
|
gfxSleepMilliseconds(1);
|
||||||
}
|
}
|
||||||
|
@ -185,11 +183,10 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GDISP_HARDWARE_FLUSH
|
# if GDISP_HARDWARE_FLUSH
|
||||||
LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
||||||
// Don't flush if we don't need it.
|
// Don't flush if we don't need it.
|
||||||
if (!(g->flags & GDISP_FLG_NEEDFLUSH))
|
if (!(g->flags & GDISP_FLG_NEEDFLUSH)) return;
|
||||||
return;
|
|
||||||
|
|
||||||
PRIV(g)->page++;
|
PRIV(g)->page++;
|
||||||
PRIV(g)->page %= 2;
|
PRIV(g)->page %= 2;
|
||||||
|
@ -197,11 +194,11 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
// We should run only one physical page at a time
|
// We should run only one physical page at a time
|
||||||
// This way we don't need to send so much data, and
|
// This way we don't need to send so much data, and
|
||||||
// we could use slightly less memory
|
// we could use slightly less memory
|
||||||
uint8_t* src = PRIV(g)->frame_buffer;
|
uint8_t *src = PRIV(g)->frame_buffer;
|
||||||
for (int y=0;y<GDISP_SCREEN_HEIGHT;y++) {
|
for (int y = 0; y < GDISP_SCREEN_HEIGHT; y++) {
|
||||||
for (int x=0;x<GDISP_SCREEN_WIDTH;x++) {
|
for (int x = 0; x < GDISP_SCREEN_WIDTH; x++) {
|
||||||
uint8_t val = (uint16_t)*src * g->g.Backlight / 100;
|
uint8_t val = (uint16_t)*src * g->g.Backlight / 100;
|
||||||
PRIV(g)->write_buffer[get_led_address(g, x, y)]=CIE1931_CURVE[val];
|
PRIV(g)->write_buffer[get_led_address(g, x, y)] = CIE1931_CURVE[val];
|
||||||
++src;
|
++src;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -210,55 +207,54 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
write_register(g, IS31_FUNCTIONREG, IS31_REG_PICTDISP, PRIV(g)->page);
|
write_register(g, IS31_FUNCTIONREG, IS31_REG_PICTDISP, PRIV(g)->page);
|
||||||
|
|
||||||
g->flags &= ~GDISP_FLG_NEEDFLUSH;
|
g->flags &= ~GDISP_FLG_NEEDFLUSH;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if GDISP_HARDWARE_DRAWPIXEL
|
# if GDISP_HARDWARE_DRAWPIXEL
|
||||||
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
||||||
coord_t x, y;
|
coord_t x, y;
|
||||||
|
|
||||||
switch(g->g.Orientation) {
|
switch (g->g.Orientation) {
|
||||||
default:
|
default:
|
||||||
case GDISP_ROTATE_0:
|
case GDISP_ROTATE_0:
|
||||||
x = g->p.x;
|
x = g->p.x;
|
||||||
y = g->p.y;
|
y = g->p.y;
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_180:
|
case GDISP_ROTATE_180:
|
||||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
|
||||||
y = g->p.y;
|
y = g->p.y;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x] = gdispColor2Native(g->p.color);
|
PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x] = gdispColor2Native(g->p.color);
|
||||||
g->flags |= GDISP_FLG_NEEDFLUSH;
|
g->flags |= GDISP_FLG_NEEDFLUSH;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if GDISP_HARDWARE_PIXELREAD
|
# if GDISP_HARDWARE_PIXELREAD
|
||||||
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
|
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
|
||||||
coord_t x, y;
|
coord_t x, y;
|
||||||
|
|
||||||
switch(g->g.Orientation) {
|
switch (g->g.Orientation) {
|
||||||
default:
|
default:
|
||||||
case GDISP_ROTATE_0:
|
case GDISP_ROTATE_0:
|
||||||
x = g->p.x;
|
x = g->p.x;
|
||||||
y = g->p.y;
|
y = g->p.y;
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_180:
|
case GDISP_ROTATE_180:
|
||||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
|
||||||
y = g->p.y;
|
y = g->p.y;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return gdispNative2Color(PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x]);
|
return gdispNative2Color(PRIV(g)->frame_buffer[y * GDISP_SCREEN_WIDTH + x]);
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
|
# if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
|
||||||
LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
||||||
switch(g->p.x) {
|
switch (g->p.x) {
|
||||||
case GDISP_CONTROL_POWER:
|
case GDISP_CONTROL_POWER:
|
||||||
if (g->g.Powermode == (powermode_t)g->p.ptr)
|
if (g->g.Powermode == (powermode_t)g->p.ptr) return;
|
||||||
return;
|
switch ((powermode_t)g->p.ptr) {
|
||||||
switch((powermode_t)g->p.ptr) {
|
|
||||||
case powerOff:
|
case powerOff:
|
||||||
case powerSleep:
|
case powerSleep:
|
||||||
case powerDeepSleep:
|
case powerDeepSleep:
|
||||||
|
@ -274,9 +270,8 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case GDISP_CONTROL_ORIENTATION:
|
case GDISP_CONTROL_ORIENTATION:
|
||||||
if (g->g.Orientation == (orientation_t)g->p.ptr)
|
if (g->g.Orientation == (orientation_t)g->p.ptr) return;
|
||||||
return;
|
switch ((orientation_t)g->p.ptr) {
|
||||||
switch((orientation_t)g->p.ptr) {
|
|
||||||
/* Rotation is handled by the drawing routines */
|
/* Rotation is handled by the drawing routines */
|
||||||
case GDISP_ROTATE_0:
|
case GDISP_ROTATE_0:
|
||||||
case GDISP_ROTATE_180:
|
case GDISP_ROTATE_180:
|
||||||
|
@ -295,14 +290,13 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case GDISP_CONTROL_BACKLIGHT:
|
case GDISP_CONTROL_BACKLIGHT:
|
||||||
if (g->g.Backlight == (unsigned)g->p.ptr)
|
if (g->g.Backlight == (unsigned)g->p.ptr) return;
|
||||||
return;
|
|
||||||
unsigned val = (unsigned)g->p.ptr;
|
unsigned val = (unsigned)g->p.ptr;
|
||||||
g->g.Backlight = val > 100 ? 100 : val;
|
g->g.Backlight = val > 100 ? 100 : val;
|
||||||
g->flags |= GDISP_FLG_NEEDFLUSH;
|
g->flags |= GDISP_FLG_NEEDFLUSH;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // GDISP_NEED_CONTROL
|
# endif // GDISP_NEED_CONTROL
|
||||||
|
|
||||||
#endif // GFX_USE_GDISP
|
#endif // GFX_USE_GDISP
|
||||||
|
|
|
@ -24,12 +24,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
/* Driver hardware support. */
|
/* Driver hardware support. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
|
# define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
|
||||||
#define GDISP_HARDWARE_DRAWPIXEL TRUE
|
# define GDISP_HARDWARE_DRAWPIXEL TRUE
|
||||||
#define GDISP_HARDWARE_PIXELREAD TRUE
|
# define GDISP_HARDWARE_PIXELREAD TRUE
|
||||||
#define GDISP_HARDWARE_CONTROL TRUE
|
# define GDISP_HARDWARE_CONTROL TRUE
|
||||||
|
|
||||||
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_GRAY256
|
# define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_GRAY256
|
||||||
|
|
||||||
#endif /* GFX_USE_GDISP */
|
#endif /* GFX_USE_GDISP */
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_9 // actually 6
|
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_9 // actually 6
|
||||||
#define ST7565_ADC ST7565_ADC_NORMAL
|
#define ST7565_ADC ST7565_ADC_NORMAL
|
||||||
#define ST7565_COM_SCAN ST7565_COM_SCAN_DEC
|
#define ST7565_COM_SCAN ST7565_COM_SCAN_DEC
|
||||||
#define ST7565_PAGE_ORDER 0,1,2,3
|
#define ST7565_PAGE_ORDER 0, 1, 2, 3
|
||||||
/*
|
/*
|
||||||
* Custom page order for several LCD boards, e.g. HEM12864-99
|
* Custom page order for several LCD boards, e.g. HEM12864-99
|
||||||
* #define ST7565_PAGE_ORDER 4,5,6,7,0,1,2,3
|
* #define ST7565_PAGE_ORDER 4,5,6,7,0,1,2,3
|
||||||
|
@ -25,11 +25,9 @@
|
||||||
#define ST7565_SLCK_PIN 5
|
#define ST7565_SLCK_PIN 5
|
||||||
#define ST7565_SS_PIN 4
|
#define ST7565_SS_PIN 4
|
||||||
|
|
||||||
#define palSetPadModeRaw(portname, bits) \
|
#define palSetPadModeRaw(portname, bits) ST7565_PORT->PCR[ST7565_##portname##_PIN] = bits
|
||||||
ST7565_PORT->PCR[ST7565_##portname##_PIN] = bits
|
|
||||||
|
|
||||||
#define palSetPadModeNamed(portname, portmode) \
|
#define palSetPadModeNamed(portname, portmode) palSetPadMode(ST7565_GPIOPORT, ST7565_##portname##_PIN, portmode)
|
||||||
palSetPadMode(ST7565_GPIOPORT, ST7565_##portname##_PIN, portmode)
|
|
||||||
|
|
||||||
#define ST7565_SPI_MODE PORTx_PCRn_DSE | PORTx_PCRn_MUX(2)
|
#define ST7565_SPI_MODE PORTx_PCRn_DSE | PORTx_PCRn_MUX(2)
|
||||||
// DSPI Clock and Transfer Attributes
|
// DSPI Clock and Transfer Attributes
|
||||||
|
@ -39,13 +37,12 @@
|
||||||
static const SPIConfig spi1config = {
|
static const SPIConfig spi1config = {
|
||||||
// Operation complete callback or @p NULL.
|
// Operation complete callback or @p NULL.
|
||||||
.end_cb = NULL,
|
.end_cb = NULL,
|
||||||
//The chip select line port - when not using pcs.
|
// The chip select line port - when not using pcs.
|
||||||
.ssport = ST7565_GPIOPORT,
|
.ssport = ST7565_GPIOPORT,
|
||||||
// brief The chip select line pad number - when not using pcs.
|
// brief The chip select line pad number - when not using pcs.
|
||||||
.sspad=ST7565_SS_PIN,
|
.sspad = ST7565_SS_PIN,
|
||||||
// SPI initialization data.
|
// SPI initialization data.
|
||||||
.tar0 =
|
.tar0 = SPIx_CTARn_FMSZ(7) // Frame size = 8 bytes
|
||||||
SPIx_CTARn_FMSZ(7) // Frame size = 8 bytes
|
|
||||||
| SPIx_CTARn_ASC(1) // After SCK Delay Scaler (min 50 ns) = 55.56ns
|
| SPIx_CTARn_ASC(1) // After SCK Delay Scaler (min 50 ns) = 55.56ns
|
||||||
| SPIx_CTARn_DT(0) // Delay After Transfer Scaler (no minimum)= 27.78ns
|
| SPIx_CTARn_DT(0) // Delay After Transfer Scaler (no minimum)= 27.78ns
|
||||||
| SPIx_CTARn_CSSCK(0) // PCS to SCK Delay Scaler (min 20 ns) = 27.78ns
|
| SPIx_CTARn_CSSCK(0) // PCS to SCK Delay Scaler (min 20 ns) = 27.78ns
|
||||||
|
@ -54,21 +51,21 @@ static const SPIConfig spi1config = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static GFXINLINE void acquire_bus(GDisplay *g) {
|
static GFXINLINE void acquire_bus(GDisplay *g) {
|
||||||
(void) g;
|
(void)g;
|
||||||
// Only the LCD is using the SPI bus, so no need to acquire
|
// Only the LCD is using the SPI bus, so no need to acquire
|
||||||
// spiAcquireBus(&SPID1);
|
// spiAcquireBus(&SPID1);
|
||||||
spiSelect(&SPID1);
|
spiSelect(&SPID1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void release_bus(GDisplay *g) {
|
static GFXINLINE void release_bus(GDisplay *g) {
|
||||||
(void) g;
|
(void)g;
|
||||||
// Only the LCD is using the SPI bus, so no need to release
|
// Only the LCD is using the SPI bus, so no need to release
|
||||||
//spiReleaseBus(&SPID1);
|
// spiReleaseBus(&SPID1);
|
||||||
spiUnselect(&SPID1);
|
spiUnselect(&SPID1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void init_board(GDisplay *g) {
|
static GFXINLINE void init_board(GDisplay *g) {
|
||||||
(void) g;
|
(void)g;
|
||||||
palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL);
|
palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL);
|
||||||
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
||||||
palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL);
|
palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL);
|
||||||
|
@ -82,31 +79,23 @@ static GFXINLINE void init_board(GDisplay *g) {
|
||||||
release_bus(g);
|
release_bus(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void post_init_board(GDisplay *g) {
|
static GFXINLINE void post_init_board(GDisplay *g) { (void)g; }
|
||||||
(void) g;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) {
|
static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) {
|
||||||
(void) g;
|
(void)g;
|
||||||
if (state) {
|
if (state) {
|
||||||
palClearPad(ST7565_GPIOPORT, ST7565_RST_PIN);
|
palClearPad(ST7565_GPIOPORT, ST7565_RST_PIN);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
|
palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GFXINLINE void enter_data_mode(GDisplay *g) {
|
static GFXINLINE void enter_data_mode(GDisplay *g) { palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); }
|
||||||
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GFXINLINE void enter_cmd_mode(GDisplay *g) {
|
static GFXINLINE void enter_cmd_mode(GDisplay *g) { palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN); }
|
||||||
palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
static GFXINLINE void write_data(GDisplay *g, uint8_t *data, uint16_t length) {
|
||||||
static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) {
|
(void)g;
|
||||||
(void) g;
|
|
||||||
spiSend(&SPID1, length, data);
|
spiSend(&SPID1, length, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,82 +9,89 @@
|
||||||
|
|
||||||
#if GFX_USE_GDISP
|
#if GFX_USE_GDISP
|
||||||
|
|
||||||
#define GDISP_DRIVER_VMT GDISPVMT_ST7565_QMK
|
# define GDISP_DRIVER_VMT GDISPVMT_ST7565_QMK
|
||||||
#include "gdisp_lld_config.h"
|
# include "gdisp_lld_config.h"
|
||||||
#include "src/gdisp/gdisp_driver.h"
|
# include "src/gdisp/gdisp_driver.h"
|
||||||
|
|
||||||
#include "board_st7565.h"
|
# include "board_st7565.h"
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver local definitions. */
|
/* Driver local definitions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#ifndef GDISP_SCREEN_HEIGHT
|
# ifndef GDISP_SCREEN_HEIGHT
|
||||||
#define GDISP_SCREEN_HEIGHT LCD_HEIGHT
|
# define GDISP_SCREEN_HEIGHT LCD_HEIGHT
|
||||||
#endif
|
# endif
|
||||||
#ifndef GDISP_SCREEN_WIDTH
|
# ifndef GDISP_SCREEN_WIDTH
|
||||||
#define GDISP_SCREEN_WIDTH LCD_WIDTH
|
# define GDISP_SCREEN_WIDTH LCD_WIDTH
|
||||||
#endif
|
# endif
|
||||||
#ifndef GDISP_INITIAL_CONTRAST
|
# ifndef GDISP_INITIAL_CONTRAST
|
||||||
#define GDISP_INITIAL_CONTRAST 35
|
# define GDISP_INITIAL_CONTRAST 35
|
||||||
#endif
|
# endif
|
||||||
#ifndef GDISP_INITIAL_BACKLIGHT
|
# ifndef GDISP_INITIAL_BACKLIGHT
|
||||||
#define GDISP_INITIAL_BACKLIGHT 100
|
# define GDISP_INITIAL_BACKLIGHT 100
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER<<0)
|
# define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER << 0)
|
||||||
|
|
||||||
#include "st7565.h"
|
# include "st7565.h"
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver config defaults for backward compatibility. */
|
/* Driver config defaults for backward compatibility. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
#ifndef ST7565_LCD_BIAS
|
# ifndef ST7565_LCD_BIAS
|
||||||
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_7
|
# define ST7565_LCD_BIAS ST7565_LCD_BIAS_7
|
||||||
#endif
|
# endif
|
||||||
#ifndef ST7565_ADC
|
# ifndef ST7565_ADC
|
||||||
#define ST7565_ADC ST7565_ADC_NORMAL
|
# define ST7565_ADC ST7565_ADC_NORMAL
|
||||||
#endif
|
# endif
|
||||||
#ifndef ST7565_COM_SCAN
|
# ifndef ST7565_COM_SCAN
|
||||||
#define ST7565_COM_SCAN ST7565_COM_SCAN_INC
|
# define ST7565_COM_SCAN ST7565_COM_SCAN_INC
|
||||||
#endif
|
# endif
|
||||||
#ifndef ST7565_PAGE_ORDER
|
# ifndef ST7565_PAGE_ORDER
|
||||||
#define ST7565_PAGE_ORDER 0,1,2,3
|
# define ST7565_PAGE_ORDER 0, 1, 2, 3
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver local functions. */
|
/* Driver local functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
typedef struct{
|
typedef struct {
|
||||||
bool_t buffer2;
|
bool_t buffer2;
|
||||||
uint8_t data_pos;
|
uint8_t data_pos;
|
||||||
uint8_t data[16];
|
uint8_t data[16];
|
||||||
uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8];
|
uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8];
|
||||||
}PrivData;
|
} PrivData;
|
||||||
|
|
||||||
// Some common routines and macros
|
// Some common routines and macros
|
||||||
#define PRIV(g) ((PrivData*)g->priv)
|
# define PRIV(g) ((PrivData *)g->priv)
|
||||||
#define RAM(g) (PRIV(g)->ram)
|
# define RAM(g) (PRIV(g)->ram)
|
||||||
|
|
||||||
static GFXINLINE void write_cmd(GDisplay* g, uint8_t cmd) {
|
static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) { PRIV(g)->data[PRIV(g)->data_pos++] = cmd; }
|
||||||
PRIV(g)->data[PRIV(g)->data_pos++] = cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GFXINLINE void flush_cmd(GDisplay* g) {
|
static GFXINLINE void flush_cmd(GDisplay *g) {
|
||||||
write_data(g, PRIV(g)->data, PRIV(g)->data_pos);
|
write_data(g, PRIV(g)->data, PRIV(g)->data_pos);
|
||||||
PRIV(g)->data_pos = 0;
|
PRIV(g)->data_pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define write_cmd2(g, cmd1, cmd2) { write_cmd(g, cmd1); write_cmd(g, cmd2); }
|
# define write_cmd2(g, cmd1, cmd2) \
|
||||||
#define write_cmd3(g, cmd1, cmd2, cmd3) { write_cmd(g, cmd1); write_cmd(g, cmd2); write_cmd(g, cmd3); }
|
{ \
|
||||||
|
write_cmd(g, cmd1); \
|
||||||
|
write_cmd(g, cmd2); \
|
||||||
|
}
|
||||||
|
# define write_cmd3(g, cmd1, cmd2, cmd3) \
|
||||||
|
{ \
|
||||||
|
write_cmd(g, cmd1); \
|
||||||
|
write_cmd(g, cmd2); \
|
||||||
|
write_cmd(g, cmd3); \
|
||||||
|
}
|
||||||
|
|
||||||
// Some common routines and macros
|
// Some common routines and macros
|
||||||
#define delay(us) gfxSleepMicroseconds(us)
|
# define delay(us) gfxSleepMicroseconds(us)
|
||||||
#define delay_ms(ms) gfxSleepMilliseconds(ms)
|
# define delay_ms(ms) gfxSleepMilliseconds(ms)
|
||||||
|
|
||||||
#define xyaddr(x, y) ((x) + ((y)>>3)*GDISP_SCREEN_WIDTH)
|
# define xyaddr(x, y) ((x) + ((y) >> 3) * GDISP_SCREEN_WIDTH)
|
||||||
#define xybit(y) (1<<((y)&7))
|
# define xybit(y) (1 << ((y)&7))
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver exported functions. */
|
/* Driver exported functions. */
|
||||||
|
@ -148,13 +155,12 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GDISP_HARDWARE_FLUSH
|
# if GDISP_HARDWARE_FLUSH
|
||||||
LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
||||||
unsigned p;
|
unsigned p;
|
||||||
|
|
||||||
// Don't flush if we don't need it.
|
// Don't flush if we don't need it.
|
||||||
if (!(g->flags & GDISP_FLG_NEEDFLUSH))
|
if (!(g->flags & GDISP_FLG_NEEDFLUSH)) return;
|
||||||
return;
|
|
||||||
|
|
||||||
acquire_bus(g);
|
acquire_bus(g);
|
||||||
enter_cmd_mode(g);
|
enter_cmd_mode(g);
|
||||||
|
@ -166,7 +172,7 @@ LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
||||||
write_cmd(g, ST7565_RMW);
|
write_cmd(g, ST7565_RMW);
|
||||||
flush_cmd(g);
|
flush_cmd(g);
|
||||||
enter_data_mode(g);
|
enter_data_mode(g);
|
||||||
write_data(g, RAM(g) + (p*GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH);
|
write_data(g, RAM(g) + (p * GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH);
|
||||||
enter_cmd_mode(g);
|
enter_cmd_mode(g);
|
||||||
}
|
}
|
||||||
unsigned line = (PRIV(g)->buffer2 ? 32 : 0);
|
unsigned line = (PRIV(g)->buffer2 ? 32 : 0);
|
||||||
|
@ -177,13 +183,13 @@ LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
||||||
|
|
||||||
g->flags &= ~GDISP_FLG_NEEDFLUSH;
|
g->flags &= ~GDISP_FLG_NEEDFLUSH;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if GDISP_HARDWARE_DRAWPIXEL
|
# if GDISP_HARDWARE_DRAWPIXEL
|
||||||
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
||||||
coord_t x, y;
|
coord_t x, y;
|
||||||
|
|
||||||
switch(g->g.Orientation) {
|
switch (g->g.Orientation) {
|
||||||
default:
|
default:
|
||||||
case GDISP_ROTATE_0:
|
case GDISP_ROTATE_0:
|
||||||
x = g->p.x;
|
x = g->p.x;
|
||||||
|
@ -191,14 +197,14 @@ LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_90:
|
case GDISP_ROTATE_90:
|
||||||
x = g->p.y;
|
x = g->p.y;
|
||||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
|
y = GDISP_SCREEN_HEIGHT - 1 - g->p.x;
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_180:
|
case GDISP_ROTATE_180:
|
||||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
|
||||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
y = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_270:
|
case GDISP_ROTATE_270:
|
||||||
x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
x = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
|
||||||
y = g->p.x;
|
y = g->p.x;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -208,13 +214,13 @@ LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
||||||
RAM(g)[xyaddr(x, y)] &= ~xybit(y);
|
RAM(g)[xyaddr(x, y)] &= ~xybit(y);
|
||||||
g->flags |= GDISP_FLG_NEEDFLUSH;
|
g->flags |= GDISP_FLG_NEEDFLUSH;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if GDISP_HARDWARE_PIXELREAD
|
# if GDISP_HARDWARE_PIXELREAD
|
||||||
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
|
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
|
||||||
coord_t x, y;
|
coord_t x, y;
|
||||||
|
|
||||||
switch(g->g.Orientation) {
|
switch (g->g.Orientation) {
|
||||||
default:
|
default:
|
||||||
case GDISP_ROTATE_0:
|
case GDISP_ROTATE_0:
|
||||||
x = g->p.x;
|
x = g->p.x;
|
||||||
|
@ -222,23 +228,23 @@ LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_90:
|
case GDISP_ROTATE_90:
|
||||||
x = g->p.y;
|
x = g->p.y;
|
||||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
|
y = GDISP_SCREEN_HEIGHT - 1 - g->p.x;
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_180:
|
case GDISP_ROTATE_180:
|
||||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
x = GDISP_SCREEN_WIDTH - 1 - g->p.x;
|
||||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
y = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
|
||||||
break;
|
break;
|
||||||
case GDISP_ROTATE_270:
|
case GDISP_ROTATE_270:
|
||||||
x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
x = GDISP_SCREEN_HEIGHT - 1 - g->p.y;
|
||||||
y = g->p.x;
|
y = g->p.x;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black;
|
return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
|
LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
|
||||||
uint8_t* buffer = (uint8_t*)g->p.ptr;
|
uint8_t *buffer = (uint8_t *)g->p.ptr;
|
||||||
int linelength = g->p.cx;
|
int linelength = g->p.cx;
|
||||||
for (int i = 0; i < g->p.cy; i++) {
|
for (int i = 0; i < g->p.cy; i++) {
|
||||||
unsigned dstx = g->p.x;
|
unsigned dstx = g->p.x;
|
||||||
|
@ -246,15 +252,14 @@ LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
|
||||||
unsigned srcx = g->p.x1;
|
unsigned srcx = g->p.x1;
|
||||||
unsigned srcy = g->p.y1 + i;
|
unsigned srcy = g->p.y1 + i;
|
||||||
unsigned srcbit = srcy * g->p.x2 + srcx;
|
unsigned srcbit = srcy * g->p.x2 + srcx;
|
||||||
for(int j=0; j < linelength; j++) {
|
for (int j = 0; j < linelength; j++) {
|
||||||
uint8_t src = buffer[srcbit / 8];
|
uint8_t src = buffer[srcbit / 8];
|
||||||
uint8_t bit = 7-(srcbit % 8);
|
uint8_t bit = 7 - (srcbit % 8);
|
||||||
uint8_t bitset = (src >> bit) & 1;
|
uint8_t bitset = (src >> bit) & 1;
|
||||||
uint8_t* dst = &(RAM(g)[xyaddr(dstx, dsty)]);
|
uint8_t *dst = &(RAM(g)[xyaddr(dstx, dsty)]);
|
||||||
if (bitset) {
|
if (bitset) {
|
||||||
*dst |= xybit(dsty);
|
*dst |= xybit(dsty);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
*dst &= ~xybit(dsty);
|
*dst &= ~xybit(dsty);
|
||||||
}
|
}
|
||||||
dstx++;
|
dstx++;
|
||||||
|
@ -264,13 +269,12 @@ LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
|
||||||
g->flags |= GDISP_FLG_NEEDFLUSH;
|
g->flags |= GDISP_FLG_NEEDFLUSH;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
|
# if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
|
||||||
LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
||||||
switch(g->p.x) {
|
switch (g->p.x) {
|
||||||
case GDISP_CONTROL_POWER:
|
case GDISP_CONTROL_POWER:
|
||||||
if (g->g.Powermode == (powermode_t)g->p.ptr)
|
if (g->g.Powermode == (powermode_t)g->p.ptr) return;
|
||||||
return;
|
switch ((powermode_t)g->p.ptr) {
|
||||||
switch((powermode_t)g->p.ptr) {
|
|
||||||
case powerOff:
|
case powerOff:
|
||||||
case powerSleep:
|
case powerSleep:
|
||||||
case powerDeepSleep:
|
case powerDeepSleep:
|
||||||
|
@ -294,9 +298,8 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case GDISP_CONTROL_ORIENTATION:
|
case GDISP_CONTROL_ORIENTATION:
|
||||||
if (g->g.Orientation == (orientation_t)g->p.ptr)
|
if (g->g.Orientation == (orientation_t)g->p.ptr) return;
|
||||||
return;
|
switch ((orientation_t)g->p.ptr) {
|
||||||
switch((orientation_t)g->p.ptr) {
|
|
||||||
/* Rotation is handled by the drawing routines */
|
/* Rotation is handled by the drawing routines */
|
||||||
case GDISP_ROTATE_0:
|
case GDISP_ROTATE_0:
|
||||||
case GDISP_ROTATE_180:
|
case GDISP_ROTATE_180:
|
||||||
|
@ -324,6 +327,6 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // GDISP_NEED_CONTROL
|
# endif // GDISP_NEED_CONTROL
|
||||||
|
|
||||||
#endif // GFX_USE_GDISP
|
#endif // GFX_USE_GDISP
|
||||||
|
|
|
@ -14,13 +14,13 @@
|
||||||
/* Driver hardware support. */
|
/* Driver hardware support. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
|
# define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
|
||||||
#define GDISP_HARDWARE_DRAWPIXEL TRUE
|
# define GDISP_HARDWARE_DRAWPIXEL TRUE
|
||||||
#define GDISP_HARDWARE_PIXELREAD TRUE
|
# define GDISP_HARDWARE_PIXELREAD TRUE
|
||||||
#define GDISP_HARDWARE_CONTROL TRUE
|
# define GDISP_HARDWARE_CONTROL TRUE
|
||||||
#define GDISP_HARDWARE_BITFILLS TRUE
|
# define GDISP_HARDWARE_BITFILLS TRUE
|
||||||
|
|
||||||
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO
|
# define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO
|
||||||
|
|
||||||
#endif /* GFX_USE_GDISP */
|
#endif /* GFX_USE_GDISP */
|
||||||
|
|
||||||
|
|
|
@ -17,40 +17,28 @@
|
||||||
#include "api.h"
|
#include "api.h"
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
void dword_to_bytes(uint32_t dword, uint8_t * bytes) {
|
void dword_to_bytes(uint32_t dword, uint8_t* bytes) {
|
||||||
bytes[0] = (dword >> 24) & 0xFF;
|
bytes[0] = (dword >> 24) & 0xFF;
|
||||||
bytes[1] = (dword >> 16) & 0xFF;
|
bytes[1] = (dword >> 16) & 0xFF;
|
||||||
bytes[2] = (dword >> 8) & 0xFF;
|
bytes[2] = (dword >> 8) & 0xFF;
|
||||||
bytes[3] = (dword >> 0) & 0xFF;
|
bytes[3] = (dword >> 0) & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index) {
|
uint32_t bytes_to_dword(uint8_t* bytes, uint8_t index) { return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3]; }
|
||||||
return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3];
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) bool process_api_quantum(uint8_t length, uint8_t* data) { return process_api_keyboard(length, data); }
|
||||||
bool process_api_quantum(uint8_t length, uint8_t * data) {
|
|
||||||
return process_api_keyboard(length, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) bool process_api_keyboard(uint8_t length, uint8_t* data) { return process_api_user(length, data); }
|
||||||
bool process_api_keyboard(uint8_t length, uint8_t * data) {
|
|
||||||
return process_api_user(length, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) bool process_api_user(uint8_t length, uint8_t* data) { return true; }
|
||||||
bool process_api_user(uint8_t length, uint8_t * data) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void process_api(uint16_t length, uint8_t * data) {
|
void process_api(uint16_t length, uint8_t* data) {
|
||||||
// SEND_STRING("\nRX: ");
|
// SEND_STRING("\nRX: ");
|
||||||
// for (uint8_t i = 0; i < length; i++) {
|
// for (uint8_t i = 0; i < length; i++) {
|
||||||
// send_byte(data[i]);
|
// send_byte(data[i]);
|
||||||
// SEND_STRING(" ");
|
// SEND_STRING(" ");
|
||||||
// }
|
// }
|
||||||
if (!process_api_quantum(length, data))
|
if (!process_api_quantum(length, data)) return;
|
||||||
return;
|
|
||||||
|
|
||||||
switch (data[0]) {
|
switch (data[0]) {
|
||||||
case MT_SET_DATA:
|
case MT_SET_DATA:
|
||||||
|
@ -65,10 +53,10 @@ void process_api(uint16_t length, uint8_t * data) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DT_RGBLIGHT: {
|
case DT_RGBLIGHT: {
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
uint32_t rgblight = bytes_to_dword(data, 2);
|
uint32_t rgblight = bytes_to_dword(data, 2);
|
||||||
eeconfig_update_rgblight(rgblight);
|
eeconfig_update_rgblight(rgblight);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,12 +67,12 @@ void process_api(uint16_t length, uint8_t * data) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DT_DEBUG: {
|
case DT_DEBUG: {
|
||||||
uint8_t debug_bytes[1] = { eeprom_read_byte(EECONFIG_DEBUG) };
|
uint8_t debug_bytes[1] = {eeprom_read_byte(EECONFIG_DEBUG)};
|
||||||
MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1);
|
MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DT_DEFAULT_LAYER: {
|
case DT_DEFAULT_LAYER: {
|
||||||
uint8_t default_bytes[1] = { eeprom_read_byte(EECONFIG_DEFAULT_LAYER) };
|
uint8_t default_bytes[1] = {eeprom_read_byte(EECONFIG_DEFAULT_LAYER)};
|
||||||
MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1);
|
MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -95,35 +83,35 @@ void process_api(uint16_t length, uint8_t * data) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DT_AUDIO: {
|
case DT_AUDIO: {
|
||||||
#ifdef AUDIO_ENABLE
|
#ifdef AUDIO_ENABLE
|
||||||
uint8_t audio_bytes[1] = { eeprom_read_byte(EECONFIG_AUDIO) };
|
uint8_t audio_bytes[1] = {eeprom_read_byte(EECONFIG_AUDIO)};
|
||||||
MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1);
|
MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1);
|
||||||
#else
|
#else
|
||||||
MT_GET_DATA_ACK(DT_AUDIO, NULL, 0);
|
MT_GET_DATA_ACK(DT_AUDIO, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DT_BACKLIGHT: {
|
case DT_BACKLIGHT: {
|
||||||
#ifdef BACKLIGHT_ENABLE
|
#ifdef BACKLIGHT_ENABLE
|
||||||
uint8_t backlight_bytes[1] = { eeprom_read_byte(EECONFIG_BACKLIGHT) };
|
uint8_t backlight_bytes[1] = {eeprom_read_byte(EECONFIG_BACKLIGHT)};
|
||||||
MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1);
|
MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1);
|
||||||
#else
|
#else
|
||||||
MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0);
|
MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DT_RGBLIGHT: {
|
case DT_RGBLIGHT: {
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
uint8_t rgblight_bytes[4];
|
uint8_t rgblight_bytes[4];
|
||||||
dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes);
|
dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes);
|
||||||
MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4);
|
MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4);
|
||||||
#else
|
#else
|
||||||
MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0);
|
MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DT_KEYMAP_OPTIONS: {
|
case DT_KEYMAP_OPTIONS: {
|
||||||
uint8_t keymap_bytes[1] = { eeconfig_read_keymap() };
|
uint8_t keymap_bytes[1] = {eeconfig_read_keymap()};
|
||||||
MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1);
|
MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -172,7 +160,7 @@ void process_api(uint16_t length, uint8_t * data) {
|
||||||
break;
|
break;
|
||||||
case MT_TYPE_ERROR:
|
case MT_TYPE_ERROR:
|
||||||
break;
|
break;
|
||||||
default: ; // command not recognised
|
default:; // command not recognised
|
||||||
SEND_BYTES(MT_TYPE_ERROR, DT_NONE, data, length);
|
SEND_BYTES(MT_TYPE_ERROR, DT_NONE, data, length);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -191,5 +179,4 @@ void process_api(uint16_t length, uint8_t * data) {
|
||||||
// break;
|
// break;
|
||||||
// #endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#define _API_H_
|
#define _API_H_
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#include "lufa.h"
|
# include "lufa.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum MESSAGE_TYPE {
|
enum MESSAGE_TYPE {
|
||||||
|
@ -29,30 +29,14 @@ enum MESSAGE_TYPE {
|
||||||
MT_SEND_DATA = 0x30, // Sending data/action from keyboard
|
MT_SEND_DATA = 0x30, // Sending data/action from keyboard
|
||||||
MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK)
|
MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK)
|
||||||
MT_EXE_ACTION = 0x40, // executing actions on keyboard
|
MT_EXE_ACTION = 0x40, // executing actions on keyboard
|
||||||
MT_EXE_ACTION_ACK =0x41, // return confirmation/value (ACK)
|
MT_EXE_ACTION_ACK = 0x41, // return confirmation/value (ACK)
|
||||||
MT_TYPE_ERROR = 0x80 // type not recognised (ACK)
|
MT_TYPE_ERROR = 0x80 // type not recognised (ACK)
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DATA_TYPE {
|
enum DATA_TYPE { DT_NONE = 0x00, DT_HANDSHAKE, DT_DEFAULT_LAYER, DT_CURRENT_LAYER, DT_KEYMAP_OPTIONS, DT_BACKLIGHT, DT_RGBLIGHT, DT_UNICODE, DT_DEBUG, DT_AUDIO, DT_QUANTUM_ACTION, DT_KEYBOARD_ACTION, DT_USER_ACTION, DT_KEYMAP_SIZE, DT_KEYMAP };
|
||||||
DT_NONE = 0x00,
|
|
||||||
DT_HANDSHAKE,
|
|
||||||
DT_DEFAULT_LAYER,
|
|
||||||
DT_CURRENT_LAYER,
|
|
||||||
DT_KEYMAP_OPTIONS,
|
|
||||||
DT_BACKLIGHT,
|
|
||||||
DT_RGBLIGHT,
|
|
||||||
DT_UNICODE,
|
|
||||||
DT_DEBUG,
|
|
||||||
DT_AUDIO,
|
|
||||||
DT_QUANTUM_ACTION,
|
|
||||||
DT_KEYBOARD_ACTION,
|
|
||||||
DT_USER_ACTION,
|
|
||||||
DT_KEYMAP_SIZE,
|
|
||||||
DT_KEYMAP
|
|
||||||
};
|
|
||||||
|
|
||||||
void dword_to_bytes(uint32_t dword, uint8_t * bytes);
|
void dword_to_bytes(uint32_t dword, uint8_t* bytes);
|
||||||
uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index);
|
uint32_t bytes_to_dword(uint8_t* bytes, uint8_t index);
|
||||||
|
|
||||||
#define MT_GET_DATA(data_type, data, length) SEND_BYTES(MT_GET_DATA, data_type, data, length)
|
#define MT_GET_DATA(data_type, data, length) SEND_BYTES(MT_GET_DATA, data_type, data, length)
|
||||||
#define MT_GET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_GET_DATA_ACK, data_type, data, length)
|
#define MT_GET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_GET_DATA_ACK, data_type, data, length)
|
||||||
|
@ -63,15 +47,12 @@ uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index);
|
||||||
#define MT_EXE_ACTION(data_type, data, length) SEND_BYTES(MT_EXE_ACTION, data_type, data, length)
|
#define MT_EXE_ACTION(data_type, data, length) SEND_BYTES(MT_EXE_ACTION, data_type, data, length)
|
||||||
#define MT_EXE_ACTION_ACK(data_type, data, length) SEND_BYTES(MT_EXE_ACTION_ACK, data_type, data, length)
|
#define MT_EXE_ACTION_ACK(data_type, data, length) SEND_BYTES(MT_EXE_ACTION_ACK, data_type, data, length)
|
||||||
|
|
||||||
void process_api(uint16_t length, uint8_t * data);
|
void process_api(uint16_t length, uint8_t* data);
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) bool process_api_quantum(uint8_t length, uint8_t* data);
|
||||||
bool process_api_quantum(uint8_t length, uint8_t * data);
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) bool process_api_keyboard(uint8_t length, uint8_t* data);
|
||||||
bool process_api_keyboard(uint8_t length, uint8_t * data);
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) bool process_api_user(uint8_t length, uint8_t* data);
|
||||||
bool process_api_user(uint8_t length, uint8_t * data);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
#include "qmk_midi.h"
|
#include "qmk_midi.h"
|
||||||
|
|
||||||
void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length) {
|
void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t* bytes, uint16_t length) {
|
||||||
// SEND_STRING("\nTX: ");
|
// SEND_STRING("\nTX: ");
|
||||||
// for (uint8_t i = 0; i < length; i++) {
|
// for (uint8_t i = 0; i < length; i++) {
|
||||||
// send_byte(bytes[i]);
|
// send_byte(bytes[i]);
|
||||||
|
@ -29,7 +29,6 @@ void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// The buffer size required is calculated as the following
|
// The buffer size required is calculated as the following
|
||||||
// API_SYSEX_MAX_SIZE is the maximum length
|
// API_SYSEX_MAX_SIZE is the maximum length
|
||||||
// In addition to that we have a two byte message header consisting of the message_type and data_type
|
// In addition to that we have a two byte message header consisting of the message_type and data_type
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
#include "api.h"
|
#include "api.h"
|
||||||
|
|
||||||
void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length);
|
void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t* bytes, uint16_t length);
|
||||||
|
|
||||||
#define SEND_BYTES(mt, dt, b, l) send_bytes_sysex(mt, dt, b, l)
|
#define SEND_BYTES(mt, dt, b, l) send_bytes_sysex(mt, dt, b, l)
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
//#include <math.h>
|
//#include <math.h>
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
#include <avr/interrupt.h>
|
# include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#endif
|
#endif
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
@ -35,84 +35,83 @@
|
||||||
// Timer Abstractions
|
// Timer Abstractions
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
//Currently we support timers 1 and 3 used at the sime time, channels A-C,
|
// Currently we support timers 1 and 3 used at the sime time, channels A-C,
|
||||||
//pins PB5, PB6, PB7, PC4, PC5, and PC6
|
// pins PB5, PB6, PB7, PC4, PC5, and PC6
|
||||||
#if defined(C6_AUDIO)
|
#if defined(C6_AUDIO)
|
||||||
#define CPIN_AUDIO
|
# define CPIN_AUDIO
|
||||||
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC6);
|
# define CPIN_SET_DIRECTION DDRC |= _BV(PORTC6);
|
||||||
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
# define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
||||||
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
|
# define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
|
||||||
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
|
# define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
|
||||||
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
|
# define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
|
||||||
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
|
# define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
|
||||||
#define TIMER_3_PERIOD ICR3
|
# define TIMER_3_PERIOD ICR3
|
||||||
#define TIMER_3_DUTY_CYCLE OCR3A
|
# define TIMER_3_DUTY_CYCLE OCR3A
|
||||||
#define TIMER3_AUDIO_vect TIMER3_COMPA_vect
|
# define TIMER3_AUDIO_vect TIMER3_COMPA_vect
|
||||||
#endif
|
#endif
|
||||||
#if defined(C5_AUDIO)
|
#if defined(C5_AUDIO)
|
||||||
#define CPIN_AUDIO
|
# define CPIN_AUDIO
|
||||||
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC5);
|
# define CPIN_SET_DIRECTION DDRC |= _BV(PORTC5);
|
||||||
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3B1) | (0 << COM3B0) | (1 << WGM31) | (0 << WGM30);
|
# define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3B1) | (0 << COM3B0) | (1 << WGM31) | (0 << WGM30);
|
||||||
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3B)
|
# define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3B)
|
||||||
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3B)
|
# define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3B)
|
||||||
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3B1);
|
# define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3B1);
|
||||||
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3B1) | _BV(COM3B0));
|
# define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3B1) | _BV(COM3B0));
|
||||||
#define TIMER_3_PERIOD ICR3
|
# define TIMER_3_PERIOD ICR3
|
||||||
#define TIMER_3_DUTY_CYCLE OCR3B
|
# define TIMER_3_DUTY_CYCLE OCR3B
|
||||||
#define TIMER3_AUDIO_vect TIMER3_COMPB_vect
|
# define TIMER3_AUDIO_vect TIMER3_COMPB_vect
|
||||||
#endif
|
#endif
|
||||||
#if defined(C4_AUDIO)
|
#if defined(C4_AUDIO)
|
||||||
#define CPIN_AUDIO
|
# define CPIN_AUDIO
|
||||||
#define CPIN_SET_DIRECTION DDRC |= _BV(PORTC4);
|
# define CPIN_SET_DIRECTION DDRC |= _BV(PORTC4);
|
||||||
#define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3C1) | (0 << COM3C0) | (1 << WGM31) | (0 << WGM30);
|
# define INIT_AUDIO_COUNTER_3 TCCR3A = (0 << COM3C1) | (0 << COM3C0) | (1 << WGM31) | (0 << WGM30);
|
||||||
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3C)
|
# define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3C)
|
||||||
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3C)
|
# define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3C)
|
||||||
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3C1);
|
# define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3C1);
|
||||||
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3C1) | _BV(COM3C0));
|
# define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3C1) | _BV(COM3C0));
|
||||||
#define TIMER_3_PERIOD ICR3
|
# define TIMER_3_PERIOD ICR3
|
||||||
#define TIMER_3_DUTY_CYCLE OCR3C
|
# define TIMER_3_DUTY_CYCLE OCR3C
|
||||||
#define TIMER3_AUDIO_vect TIMER3_COMPC_vect
|
# define TIMER3_AUDIO_vect TIMER3_COMPC_vect
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(B5_AUDIO)
|
#if defined(B5_AUDIO)
|
||||||
#define BPIN_AUDIO
|
# define BPIN_AUDIO
|
||||||
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB5);
|
# define BPIN_SET_DIRECTION DDRB |= _BV(PORTB5);
|
||||||
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
|
# define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
|
||||||
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A)
|
# define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1A)
|
||||||
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A)
|
# define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1A)
|
||||||
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1);
|
# define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1A1);
|
||||||
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0));
|
# define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0));
|
||||||
#define TIMER_1_PERIOD ICR1
|
# define TIMER_1_PERIOD ICR1
|
||||||
#define TIMER_1_DUTY_CYCLE OCR1A
|
# define TIMER_1_DUTY_CYCLE OCR1A
|
||||||
#define TIMER1_AUDIO_vect TIMER1_COMPA_vect
|
# define TIMER1_AUDIO_vect TIMER1_COMPA_vect
|
||||||
#endif
|
#endif
|
||||||
#if defined(B6_AUDIO)
|
#if defined(B6_AUDIO)
|
||||||
#define BPIN_AUDIO
|
# define BPIN_AUDIO
|
||||||
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB6);
|
# define BPIN_SET_DIRECTION DDRB |= _BV(PORTB6);
|
||||||
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10);
|
# define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1B1) | (0 << COM1B0) | (1 << WGM11) | (0 << WGM10);
|
||||||
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1B)
|
# define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1B)
|
||||||
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1B)
|
# define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1B)
|
||||||
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1B1);
|
# define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1B1);
|
||||||
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1B1) | _BV(COM1B0));
|
# define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1B1) | _BV(COM1B0));
|
||||||
#define TIMER_1_PERIOD ICR1
|
# define TIMER_1_PERIOD ICR1
|
||||||
#define TIMER_1_DUTY_CYCLE OCR1B
|
# define TIMER_1_DUTY_CYCLE OCR1B
|
||||||
#define TIMER1_AUDIO_vect TIMER1_COMPB_vect
|
# define TIMER1_AUDIO_vect TIMER1_COMPB_vect
|
||||||
#endif
|
#endif
|
||||||
#if defined(B7_AUDIO)
|
#if defined(B7_AUDIO)
|
||||||
#define BPIN_AUDIO
|
# define BPIN_AUDIO
|
||||||
#define BPIN_SET_DIRECTION DDRB |= _BV(PORTB7);
|
# define BPIN_SET_DIRECTION DDRB |= _BV(PORTB7);
|
||||||
#define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1C1) | (0 << COM1C0) | (1 << WGM11) | (0 << WGM10);
|
# define INIT_AUDIO_COUNTER_1 TCCR1A = (0 << COM1C1) | (0 << COM1C0) | (1 << WGM11) | (0 << WGM10);
|
||||||
#define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1C)
|
# define ENABLE_AUDIO_COUNTER_1_ISR TIMSK1 |= _BV(OCIE1C)
|
||||||
#define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1C)
|
# define DISABLE_AUDIO_COUNTER_1_ISR TIMSK1 &= ~_BV(OCIE1C)
|
||||||
#define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1C1);
|
# define ENABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A |= _BV(COM1C1);
|
||||||
#define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1C1) | _BV(COM1C0));
|
# define DISABLE_AUDIO_COUNTER_1_OUTPUT TCCR1A &= ~(_BV(COM1C1) | _BV(COM1C0));
|
||||||
#define TIMER_1_PERIOD ICR1
|
# define TIMER_1_PERIOD ICR1
|
||||||
#define TIMER_1_DUTY_CYCLE OCR1C
|
# define TIMER_1_DUTY_CYCLE OCR1C
|
||||||
#define TIMER1_AUDIO_vect TIMER1_COMPC_vect
|
# define TIMER1_AUDIO_vect TIMER1_COMPC_vect
|
||||||
#endif
|
#endif
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
int voices = 0;
|
int voices = 0;
|
||||||
int voice_place = 0;
|
int voice_place = 0;
|
||||||
float frequency = 0;
|
float frequency = 0;
|
||||||
|
@ -126,7 +125,7 @@ bool sliding = false;
|
||||||
|
|
||||||
float place = 0;
|
float place = 0;
|
||||||
|
|
||||||
uint8_t * sample;
|
uint8_t* sample;
|
||||||
uint16_t sample_length = 0;
|
uint16_t sample_length = 0;
|
||||||
|
|
||||||
bool playing_notes = false;
|
bool playing_notes = false;
|
||||||
|
@ -136,7 +135,7 @@ float note_length = 0;
|
||||||
uint8_t note_tempo = TEMPO_DEFAULT;
|
uint8_t note_tempo = TEMPO_DEFAULT;
|
||||||
float note_timbre = TIMBRE_DEFAULT;
|
float note_timbre = TIMBRE_DEFAULT;
|
||||||
uint16_t note_position = 0;
|
uint16_t note_position = 0;
|
||||||
float (* notes_pointer)[][2];
|
float (*notes_pointer)[][2];
|
||||||
uint16_t notes_count;
|
uint16_t notes_count;
|
||||||
bool notes_repeat;
|
bool notes_repeat;
|
||||||
bool note_resting = false;
|
bool note_resting = false;
|
||||||
|
@ -160,70 +159,66 @@ uint16_t envelope_index = 0;
|
||||||
bool glissando = true;
|
bool glissando = true;
|
||||||
|
|
||||||
#ifndef STARTUP_SONG
|
#ifndef STARTUP_SONG
|
||||||
#define STARTUP_SONG SONG(STARTUP_SOUND)
|
# define STARTUP_SONG SONG(STARTUP_SOUND)
|
||||||
#endif
|
#endif
|
||||||
#ifndef AUDIO_ON_SONG
|
#ifndef AUDIO_ON_SONG
|
||||||
#define AUDIO_ON_SONG SONG(AUDIO_ON_SOUND)
|
# define AUDIO_ON_SONG SONG(AUDIO_ON_SOUND)
|
||||||
#endif
|
#endif
|
||||||
#ifndef AUDIO_OFF_SONG
|
#ifndef AUDIO_OFF_SONG
|
||||||
#define AUDIO_OFF_SONG SONG(AUDIO_OFF_SOUND)
|
# define AUDIO_OFF_SONG SONG(AUDIO_OFF_SOUND)
|
||||||
#endif
|
#endif
|
||||||
float startup_song[][2] = STARTUP_SONG;
|
float startup_song[][2] = STARTUP_SONG;
|
||||||
float audio_on_song[][2] = AUDIO_ON_SONG;
|
float audio_on_song[][2] = AUDIO_ON_SONG;
|
||||||
float audio_off_song[][2] = AUDIO_OFF_SONG;
|
float audio_off_song[][2] = AUDIO_OFF_SONG;
|
||||||
|
|
||||||
void audio_init()
|
void audio_init() {
|
||||||
{
|
|
||||||
|
|
||||||
// Check EEPROM
|
// Check EEPROM
|
||||||
if (!eeconfig_is_enabled())
|
if (!eeconfig_is_enabled()) {
|
||||||
{
|
|
||||||
eeconfig_init();
|
eeconfig_init();
|
||||||
}
|
}
|
||||||
audio_config.raw = eeconfig_read_audio();
|
audio_config.raw = eeconfig_read_audio();
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
|
// Set audio ports as output
|
||||||
// Set audio ports as output
|
#ifdef CPIN_AUDIO
|
||||||
#ifdef CPIN_AUDIO
|
|
||||||
CPIN_SET_DIRECTION
|
CPIN_SET_DIRECTION
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#endif
|
#endif
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
BPIN_SET_DIRECTION
|
BPIN_SET_DIRECTION
|
||||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B
|
// TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B
|
||||||
// Compare Output Mode (COM3An and COM1An) = 0b00 = Normal port operation
|
// Compare Output Mode (COM3An and COM1An) = 0b00 = Normal port operation
|
||||||
// OC3A -- PC6
|
// OC3A -- PC6
|
||||||
// OC3B -- PC5
|
// OC3B -- PC5
|
||||||
// OC3C -- PC4
|
// OC3C -- PC4
|
||||||
// OC1A -- PB5
|
// OC1A -- PB5
|
||||||
// OC1B -- PB6
|
// OC1B -- PB6
|
||||||
// OC1C -- PB7
|
// OC1C -- PB7
|
||||||
|
|
||||||
// Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14. Period = ICR3, Duty Cycle OCR3A)
|
// Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14. Period = ICR3, Duty Cycle OCR3A)
|
||||||
// OCR3A - PC6
|
// OCR3A - PC6
|
||||||
// OCR3B - PC5
|
// OCR3B - PC5
|
||||||
// OCR3C - PC4
|
// OCR3C - PC4
|
||||||
// OCR1A - PB5
|
// OCR1A - PB5
|
||||||
// OCR1B - PB6
|
// OCR1B - PB6
|
||||||
// OCR1C - PB7
|
// OCR1C - PB7
|
||||||
|
|
||||||
// Clock Select (CS3n) = 0b010 = Clock / 8
|
// Clock Select (CS3n) = 0b010 = Clock / 8
|
||||||
#ifdef CPIN_AUDIO
|
#ifdef CPIN_AUDIO
|
||||||
INIT_AUDIO_COUNTER_3
|
INIT_AUDIO_COUNTER_3
|
||||||
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
||||||
TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
|
TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
|
||||||
TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
|
TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
|
||||||
#endif
|
#endif
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
INIT_AUDIO_COUNTER_1
|
INIT_AUDIO_COUNTER_1
|
||||||
TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10);
|
TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10);
|
||||||
TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
|
TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER));
|
||||||
TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
|
TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_initialized = true;
|
audio_initialized = true;
|
||||||
}
|
}
|
||||||
|
@ -231,11 +226,9 @@ void audio_init()
|
||||||
if (audio_config.enable) {
|
if (audio_config.enable) {
|
||||||
PLAY_SONG(startup_song);
|
PLAY_SONG(startup_song);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop_all_notes()
|
void stop_all_notes() {
|
||||||
{
|
|
||||||
dprintf("audio stop all notes");
|
dprintf("audio stop all notes");
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
|
@ -243,15 +236,15 @@ void stop_all_notes()
|
||||||
}
|
}
|
||||||
voices = 0;
|
voices = 0;
|
||||||
|
|
||||||
#ifdef CPIN_AUDIO
|
#ifdef CPIN_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||||
DISABLE_AUDIO_COUNTER_1_OUTPUT;
|
DISABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
playing_notes = false;
|
playing_notes = false;
|
||||||
playing_note = false;
|
playing_note = false;
|
||||||
|
@ -259,15 +252,13 @@ void stop_all_notes()
|
||||||
frequency_alt = 0;
|
frequency_alt = 0;
|
||||||
volume = 0;
|
volume = 0;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 8; i++)
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
{
|
|
||||||
frequencies[i] = 0;
|
frequencies[i] = 0;
|
||||||
volumes[i] = 0;
|
volumes[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop_note(float freq)
|
void stop_note(float freq) {
|
||||||
{
|
|
||||||
dprintf("audio stop note freq=%d", (int)freq);
|
dprintf("audio stop note freq=%d", (int)freq);
|
||||||
|
|
||||||
if (playing_note) {
|
if (playing_note) {
|
||||||
|
@ -279,29 +270,28 @@ void stop_note(float freq)
|
||||||
frequencies[i] = 0;
|
frequencies[i] = 0;
|
||||||
volumes[i] = 0;
|
volumes[i] = 0;
|
||||||
for (int j = i; (j < 7); j++) {
|
for (int j = i; (j < 7); j++) {
|
||||||
frequencies[j] = frequencies[j+1];
|
frequencies[j] = frequencies[j + 1];
|
||||||
frequencies[j+1] = 0;
|
frequencies[j + 1] = 0;
|
||||||
volumes[j] = volumes[j+1];
|
volumes[j] = volumes[j + 1];
|
||||||
volumes[j+1] = 0;
|
volumes[j + 1] = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
voices--;
|
voices--;
|
||||||
if (voices < 0)
|
if (voices < 0) voices = 0;
|
||||||
voices = 0;
|
|
||||||
if (voice_place >= voices) {
|
if (voice_place >= voices) {
|
||||||
voice_place = 0;
|
voice_place = 0;
|
||||||
}
|
}
|
||||||
if (voices == 0) {
|
if (voices == 0) {
|
||||||
#ifdef CPIN_AUDIO
|
#ifdef CPIN_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||||
DISABLE_AUDIO_COUNTER_1_OUTPUT;
|
DISABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
frequency = 0;
|
frequency = 0;
|
||||||
frequency_alt = 0;
|
frequency_alt = 0;
|
||||||
volume = 0;
|
volume = 0;
|
||||||
|
@ -312,41 +302,38 @@ void stop_note(float freq)
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
#ifdef VIBRATO_ENABLE
|
||||||
|
|
||||||
float mod(float a, int b)
|
float mod(float a, int b) {
|
||||||
{
|
|
||||||
float r = fmod(a, b);
|
float r = fmod(a, b);
|
||||||
return r < 0 ? r + b : r;
|
return r < 0 ? r + b : r;
|
||||||
}
|
}
|
||||||
|
|
||||||
float vibrato(float average_freq) {
|
float vibrato(float average_freq) {
|
||||||
#ifdef VIBRATO_STRENGTH_ENABLE
|
# ifdef VIBRATO_STRENGTH_ENABLE
|
||||||
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
|
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
|
||||||
#else
|
# else
|
||||||
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
|
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
|
||||||
#endif
|
# endif
|
||||||
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
|
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH);
|
||||||
return vibrated_freq;
|
return vibrated_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CPIN_AUDIO
|
#ifdef CPIN_AUDIO
|
||||||
ISR(TIMER3_AUDIO_vect)
|
ISR(TIMER3_AUDIO_vect) {
|
||||||
{
|
|
||||||
float freq;
|
float freq;
|
||||||
|
|
||||||
if (playing_note) {
|
if (playing_note) {
|
||||||
if (voices > 0) {
|
if (voices > 0) {
|
||||||
|
# ifdef BPIN_AUDIO
|
||||||
#ifdef BPIN_AUDIO
|
|
||||||
float freq_alt = 0;
|
float freq_alt = 0;
|
||||||
if (voices > 1) {
|
if (voices > 1) {
|
||||||
if (polyphony_rate == 0) {
|
if (polyphony_rate == 0) {
|
||||||
if (glissando) {
|
if (glissando) {
|
||||||
if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) {
|
if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440 / frequencies[voices - 2] / 12 / 2)) {
|
||||||
frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2);
|
frequency_alt = frequency_alt * pow(2, 440 / frequency_alt / 12 / 2);
|
||||||
} else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) {
|
} else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440 / frequencies[voices - 2] / 12 / 2)) {
|
||||||
frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2);
|
frequency_alt = frequency_alt * pow(2, -440 / frequency_alt / 12 / 2);
|
||||||
} else {
|
} else {
|
||||||
frequency_alt = frequencies[voices - 2];
|
frequency_alt = frequencies[voices - 2];
|
||||||
}
|
}
|
||||||
|
@ -354,15 +341,15 @@ ISR(TIMER3_AUDIO_vect)
|
||||||
frequency_alt = frequencies[voices - 2];
|
frequency_alt = frequencies[voices - 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq_alt = vibrato(frequency_alt);
|
freq_alt = vibrato(frequency_alt);
|
||||||
} else {
|
} else {
|
||||||
freq_alt = frequency_alt;
|
freq_alt = frequency_alt;
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
freq_alt = frequency_alt;
|
freq_alt = frequency_alt;
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
|
@ -378,7 +365,7 @@ ISR(TIMER3_AUDIO_vect)
|
||||||
TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq_alt * CPU_PRESCALER));
|
TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (freq_alt * CPU_PRESCALER));
|
||||||
TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq_alt * CPU_PRESCALER)) * note_timbre);
|
TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq_alt * CPU_PRESCALER)) * note_timbre);
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
if (polyphony_rate > 0) {
|
if (polyphony_rate > 0) {
|
||||||
if (voices > 1) {
|
if (voices > 1) {
|
||||||
|
@ -389,21 +376,21 @@ ISR(TIMER3_AUDIO_vect)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequencies[voice_place]);
|
freq = vibrato(frequencies[voice_place]);
|
||||||
} else {
|
} else {
|
||||||
freq = frequencies[voice_place];
|
freq = frequencies[voice_place];
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
freq = frequencies[voice_place];
|
freq = frequencies[voice_place];
|
||||||
#endif
|
# endif
|
||||||
} else {
|
} else {
|
||||||
if (glissando) {
|
if (glissando) {
|
||||||
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
|
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, 440/frequency/12/2);
|
frequency = frequency * pow(2, 440 / frequency / 12 / 2);
|
||||||
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
|
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, -440/frequency/12/2);
|
frequency = frequency * pow(2, -440 / frequency / 12 / 2);
|
||||||
} else {
|
} else {
|
||||||
frequency = frequencies[voices - 1];
|
frequency = frequencies[voices - 1];
|
||||||
}
|
}
|
||||||
|
@ -411,15 +398,15 @@ ISR(TIMER3_AUDIO_vect)
|
||||||
frequency = frequencies[voices - 1];
|
frequency = frequencies[voices - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequency);
|
freq = vibrato(frequency);
|
||||||
} else {
|
} else {
|
||||||
freq = frequency;
|
freq = frequency;
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
freq = frequency;
|
freq = frequency;
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
|
@ -439,15 +426,15 @@ ISR(TIMER3_AUDIO_vect)
|
||||||
|
|
||||||
if (playing_notes) {
|
if (playing_notes) {
|
||||||
if (note_frequency > 0) {
|
if (note_frequency > 0) {
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(note_frequency);
|
freq = vibrato(note_frequency);
|
||||||
} else {
|
} else {
|
||||||
freq = note_frequency;
|
freq = note_frequency;
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
freq = note_frequency;
|
freq = note_frequency;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
envelope_index++;
|
envelope_index++;
|
||||||
|
@ -513,9 +500,8 @@ ISR(TIMER3_AUDIO_vect)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
ISR(TIMER1_AUDIO_vect)
|
ISR(TIMER1_AUDIO_vect) {
|
||||||
{
|
# if defined(BPIN_AUDIO) && !defined(CPIN_AUDIO)
|
||||||
#if defined(BPIN_AUDIO) && !defined(CPIN_AUDIO)
|
|
||||||
float freq = 0;
|
float freq = 0;
|
||||||
|
|
||||||
if (playing_note) {
|
if (playing_note) {
|
||||||
|
@ -529,21 +515,21 @@ ISR(TIMER1_AUDIO_vect)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequencies[voice_place]);
|
freq = vibrato(frequencies[voice_place]);
|
||||||
} else {
|
} else {
|
||||||
freq = frequencies[voice_place];
|
freq = frequencies[voice_place];
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
freq = frequencies[voice_place];
|
freq = frequencies[voice_place];
|
||||||
#endif
|
# endif
|
||||||
} else {
|
} else {
|
||||||
if (glissando) {
|
if (glissando) {
|
||||||
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
|
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, 440/frequency/12/2);
|
frequency = frequency * pow(2, 440 / frequency / 12 / 2);
|
||||||
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
|
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, -440/frequency/12/2);
|
frequency = frequency * pow(2, -440 / frequency / 12 / 2);
|
||||||
} else {
|
} else {
|
||||||
frequency = frequencies[voices - 1];
|
frequency = frequencies[voices - 1];
|
||||||
}
|
}
|
||||||
|
@ -551,15 +537,15 @@ ISR(TIMER1_AUDIO_vect)
|
||||||
frequency = frequencies[voices - 1];
|
frequency = frequencies[voices - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequency);
|
freq = vibrato(frequency);
|
||||||
} else {
|
} else {
|
||||||
freq = frequency;
|
freq = frequency;
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
freq = frequency;
|
freq = frequency;
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
|
@ -579,15 +565,15 @@ ISR(TIMER1_AUDIO_vect)
|
||||||
|
|
||||||
if (playing_notes) {
|
if (playing_notes) {
|
||||||
if (note_frequency > 0) {
|
if (note_frequency > 0) {
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(note_frequency);
|
freq = vibrato(note_frequency);
|
||||||
} else {
|
} else {
|
||||||
freq = note_frequency;
|
freq = note_frequency;
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
freq = note_frequency;
|
freq = note_frequency;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
envelope_index++;
|
envelope_index++;
|
||||||
|
@ -649,12 +635,11 @@ ISR(TIMER1_AUDIO_vect)
|
||||||
playing_notes = false;
|
playing_notes = false;
|
||||||
playing_note = false;
|
playing_note = false;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void play_note(float freq, int vol) {
|
void play_note(float freq, int vol) {
|
||||||
|
|
||||||
dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
|
dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
|
@ -662,16 +647,15 @@ void play_note(float freq, int vol) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_config.enable && voices < 8) {
|
if (audio_config.enable && voices < 8) {
|
||||||
#ifdef CPIN_AUDIO
|
#ifdef CPIN_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#endif
|
#endif
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Cancel notes if notes are playing
|
// Cancel notes if notes are playing
|
||||||
if (playing_notes)
|
if (playing_notes) stop_all_notes();
|
||||||
stop_all_notes();
|
|
||||||
|
|
||||||
playing_note = true;
|
playing_note = true;
|
||||||
|
|
||||||
|
@ -683,44 +667,39 @@ void play_note(float freq, int vol) {
|
||||||
voices++;
|
voices++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CPIN_AUDIO
|
#ifdef CPIN_AUDIO
|
||||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||||
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
#ifdef CPIN_AUDIO
|
# ifdef CPIN_AUDIO
|
||||||
if (voices > 1) {
|
if (voices > 1) {
|
||||||
ENABLE_AUDIO_COUNTER_1_ISR;
|
ENABLE_AUDIO_COUNTER_1_ISR;
|
||||||
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
ENABLE_AUDIO_COUNTER_1_ISR;
|
ENABLE_AUDIO_COUNTER_1_ISR;
|
||||||
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
|
||||||
{
|
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
audio_init();
|
audio_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_config.enable) {
|
if (audio_config.enable) {
|
||||||
|
#ifdef CPIN_AUDIO
|
||||||
#ifdef CPIN_AUDIO
|
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#endif
|
#endif
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_1_ISR;
|
DISABLE_AUDIO_COUNTER_1_ISR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Cancel note if a note is playing
|
// Cancel note if a note is playing
|
||||||
if (playing_note)
|
if (playing_note) stop_all_notes();
|
||||||
stop_all_notes();
|
|
||||||
|
|
||||||
playing_notes = true;
|
playing_notes = true;
|
||||||
|
|
||||||
|
@ -735,34 +714,27 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat)
|
||||||
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
|
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
|
||||||
note_position = 0;
|
note_position = 0;
|
||||||
|
|
||||||
|
#ifdef CPIN_AUDIO
|
||||||
#ifdef CPIN_AUDIO
|
|
||||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||||
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
#ifdef BPIN_AUDIO
|
#ifdef BPIN_AUDIO
|
||||||
#ifndef CPIN_AUDIO
|
# ifndef CPIN_AUDIO
|
||||||
ENABLE_AUDIO_COUNTER_1_ISR;
|
ENABLE_AUDIO_COUNTER_1_ISR;
|
||||||
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
ENABLE_AUDIO_COUNTER_1_OUTPUT;
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_playing_notes(void) {
|
bool is_playing_notes(void) { return playing_notes; }
|
||||||
return playing_notes;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_audio_on(void) {
|
bool is_audio_on(void) { return (audio_config.enable != 0); }
|
||||||
return (audio_config.enable != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void audio_toggle(void) {
|
void audio_toggle(void) {
|
||||||
audio_config.enable ^= 1;
|
audio_config.enable ^= 1;
|
||||||
eeconfig_update_audio(audio_config.raw);
|
eeconfig_update_audio(audio_config.raw);
|
||||||
if (audio_config.enable)
|
if (audio_config.enable) audio_on_user();
|
||||||
audio_on_user();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void audio_on(void) {
|
void audio_on(void) {
|
||||||
|
@ -784,73 +756,45 @@ void audio_off(void) {
|
||||||
|
|
||||||
// Vibrato rate functions
|
// Vibrato rate functions
|
||||||
|
|
||||||
void set_vibrato_rate(float rate) {
|
void set_vibrato_rate(float rate) { vibrato_rate = rate; }
|
||||||
vibrato_rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_vibrato_rate(float change) {
|
void increase_vibrato_rate(float change) { vibrato_rate *= change; }
|
||||||
vibrato_rate *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_vibrato_rate(float change) {
|
void decrease_vibrato_rate(float change) { vibrato_rate /= change; }
|
||||||
vibrato_rate /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef VIBRATO_STRENGTH_ENABLE
|
# ifdef VIBRATO_STRENGTH_ENABLE
|
||||||
|
|
||||||
void set_vibrato_strength(float strength) {
|
void set_vibrato_strength(float strength) { vibrato_strength = strength; }
|
||||||
vibrato_strength = strength;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_vibrato_strength(float change) {
|
void increase_vibrato_strength(float change) { vibrato_strength *= change; }
|
||||||
vibrato_strength *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_vibrato_strength(float change) {
|
void decrease_vibrato_strength(float change) { vibrato_strength /= change; }
|
||||||
vibrato_strength /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* VIBRATO_STRENGTH_ENABLE */
|
# endif /* VIBRATO_STRENGTH_ENABLE */
|
||||||
|
|
||||||
#endif /* VIBRATO_ENABLE */
|
#endif /* VIBRATO_ENABLE */
|
||||||
|
|
||||||
// Polyphony functions
|
// Polyphony functions
|
||||||
|
|
||||||
void set_polyphony_rate(float rate) {
|
void set_polyphony_rate(float rate) { polyphony_rate = rate; }
|
||||||
polyphony_rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void enable_polyphony() {
|
void enable_polyphony() { polyphony_rate = 5; }
|
||||||
polyphony_rate = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
void disable_polyphony() {
|
void disable_polyphony() { polyphony_rate = 0; }
|
||||||
polyphony_rate = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_polyphony_rate(float change) {
|
void increase_polyphony_rate(float change) { polyphony_rate *= change; }
|
||||||
polyphony_rate *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_polyphony_rate(float change) {
|
void decrease_polyphony_rate(float change) { polyphony_rate /= change; }
|
||||||
polyphony_rate /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timbre function
|
// Timbre function
|
||||||
|
|
||||||
void set_timbre(float timbre) {
|
void set_timbre(float timbre) { note_timbre = timbre; }
|
||||||
note_timbre = timbre;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tempo functions
|
// Tempo functions
|
||||||
|
|
||||||
void set_tempo(uint8_t tempo) {
|
void set_tempo(uint8_t tempo) { note_tempo = tempo; }
|
||||||
note_tempo = tempo;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_tempo(uint8_t tempo_change) {
|
void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; }
|
||||||
note_tempo += tempo_change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_tempo(uint8_t tempo_change) {
|
void increase_tempo(uint8_t tempo_change) {
|
||||||
if (note_tempo - tempo_change < 10) {
|
if (note_tempo - tempo_change < 10) {
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#endif
|
#endif
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "musical_notes.h"
|
#include "musical_notes.h"
|
||||||
|
@ -39,9 +39,9 @@
|
||||||
typedef union {
|
typedef union {
|
||||||
uint8_t raw;
|
uint8_t raw;
|
||||||
struct {
|
struct {
|
||||||
bool enable :1;
|
bool enable : 1;
|
||||||
bool clicky_enable :1;
|
bool clicky_enable : 1;
|
||||||
uint8_t level :6;
|
uint8_t level : 6;
|
||||||
};
|
};
|
||||||
} audio_config_t;
|
} audio_config_t;
|
||||||
|
|
||||||
|
@ -58,13 +58,13 @@ void set_vibrato_rate(float rate);
|
||||||
void increase_vibrato_rate(float change);
|
void increase_vibrato_rate(float change);
|
||||||
void decrease_vibrato_rate(float change);
|
void decrease_vibrato_rate(float change);
|
||||||
|
|
||||||
#ifdef VIBRATO_STRENGTH_ENABLE
|
# ifdef VIBRATO_STRENGTH_ENABLE
|
||||||
|
|
||||||
void set_vibrato_strength(float strength);
|
void set_vibrato_strength(float strength);
|
||||||
void increase_vibrato_strength(float change);
|
void increase_vibrato_strength(float change);
|
||||||
void decrease_vibrato_strength(float change);
|
void decrease_vibrato_strength(float change);
|
||||||
|
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -85,25 +85,23 @@ void decrease_tempo(uint8_t tempo_change);
|
||||||
void audio_init(void);
|
void audio_init(void);
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
void play_sample(uint8_t * s, uint16_t l, bool r);
|
void play_sample(uint8_t* s, uint16_t l, bool r);
|
||||||
#endif
|
#endif
|
||||||
void play_note(float freq, int vol);
|
void play_note(float freq, int vol);
|
||||||
void stop_note(float freq);
|
void stop_note(float freq);
|
||||||
void stop_all_notes(void);
|
void stop_all_notes(void);
|
||||||
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat);
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat);
|
||||||
|
|
||||||
#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
|
#define SCALE \
|
||||||
0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
|
(int8_t[]) { 0 + (12 * 0), 2 + (12 * 0), 4 + (12 * 0), 5 + (12 * 0), 7 + (12 * 0), 9 + (12 * 0), 11 + (12 * 0), 0 + (12 * 1), 2 + (12 * 1), 4 + (12 * 1), 5 + (12 * 1), 7 + (12 * 1), 9 + (12 * 1), 11 + (12 * 1), 0 + (12 * 2), 2 + (12 * 2), 4 + (12 * 2), 5 + (12 * 2), 7 + (12 * 2), 9 + (12 * 2), 11 + (12 * 2), 0 + (12 * 3), 2 + (12 * 3), 4 + (12 * 3), 5 + (12 * 3), 7 + (12 * 3), 9 + (12 * 3), 11 + (12 * 3), 0 + (12 * 4), 2 + (12 * 4), 4 + (12 * 4), 5 + (12 * 4), 7 + (12 * 4), 9 + (12 * 4), 11 + (12 * 4), }
|
||||||
0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
|
|
||||||
0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
|
|
||||||
0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
|
|
||||||
|
|
||||||
// These macros are used to allow play_notes to play an array of indeterminate
|
// These macros are used to allow play_notes to play an array of indeterminate
|
||||||
// length. This works around the limitation of C's sizeof operation on pointers.
|
// length. This works around the limitation of C's sizeof operation on pointers.
|
||||||
// The global float array for the song must be used here.
|
// The global float array for the song must be used here.
|
||||||
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
|
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
|
||||||
#define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \
|
#define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) \
|
||||||
_Pragma ("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"")
|
play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \
|
||||||
|
_Pragma("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"")
|
||||||
#define PLAY_SONG(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), false)
|
#define PLAY_SONG(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), false)
|
||||||
#define PLAY_LOOP(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), true)
|
#define PLAY_LOOP(note_array) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), true)
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ bool sliding = false;
|
||||||
|
|
||||||
float place = 0;
|
float place = 0;
|
||||||
|
|
||||||
uint8_t * sample;
|
uint8_t *sample;
|
||||||
uint16_t sample_length = 0;
|
uint16_t sample_length = 0;
|
||||||
|
|
||||||
bool playing_notes = false;
|
bool playing_notes = false;
|
||||||
|
@ -49,7 +49,7 @@ float note_length = 0;
|
||||||
uint8_t note_tempo = TEMPO_DEFAULT;
|
uint8_t note_tempo = TEMPO_DEFAULT;
|
||||||
float note_timbre = TIMBRE_DEFAULT;
|
float note_timbre = TIMBRE_DEFAULT;
|
||||||
uint16_t note_position = 0;
|
uint16_t note_position = 0;
|
||||||
float (* notes_pointer)[][2];
|
float (*notes_pointer)[][2];
|
||||||
uint16_t notes_count;
|
uint16_t notes_count;
|
||||||
bool notes_repeat;
|
bool notes_repeat;
|
||||||
bool note_resting = false;
|
bool note_resting = false;
|
||||||
|
@ -73,7 +73,7 @@ uint16_t envelope_index = 0;
|
||||||
bool glissando = true;
|
bool glissando = true;
|
||||||
|
|
||||||
#ifndef STARTUP_SONG
|
#ifndef STARTUP_SONG
|
||||||
#define STARTUP_SONG SONG(STARTUP_SOUND)
|
# define STARTUP_SONG SONG(STARTUP_SOUND)
|
||||||
#endif
|
#endif
|
||||||
float startup_song[][2] = STARTUP_SONG;
|
float startup_song[][2] = STARTUP_SONG;
|
||||||
|
|
||||||
|
@ -81,27 +81,32 @@ static void gpt_cb8(GPTDriver *gptp);
|
||||||
|
|
||||||
#define DAC_BUFFER_SIZE 100
|
#define DAC_BUFFER_SIZE 100
|
||||||
#ifndef DAC_SAMPLE_MAX
|
#ifndef DAC_SAMPLE_MAX
|
||||||
#define DAC_SAMPLE_MAX 65535U
|
# define DAC_SAMPLE_MAX 65535U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \
|
#define START_CHANNEL_1() \
|
||||||
|
gptStart(&GPTD6, &gpt6cfg1); \
|
||||||
gptStartContinuous(&GPTD6, 2U)
|
gptStartContinuous(&GPTD6, 2U)
|
||||||
#define START_CHANNEL_2() gptStart(&GPTD7, &gpt7cfg1); \
|
#define START_CHANNEL_2() \
|
||||||
|
gptStart(&GPTD7, &gpt7cfg1); \
|
||||||
gptStartContinuous(&GPTD7, 2U)
|
gptStartContinuous(&GPTD7, 2U)
|
||||||
#define STOP_CHANNEL_1() gptStopTimer(&GPTD6)
|
#define STOP_CHANNEL_1() gptStopTimer(&GPTD6)
|
||||||
#define STOP_CHANNEL_2() gptStopTimer(&GPTD7)
|
#define STOP_CHANNEL_2() gptStopTimer(&GPTD7)
|
||||||
#define RESTART_CHANNEL_1() STOP_CHANNEL_1(); \
|
#define RESTART_CHANNEL_1() \
|
||||||
|
STOP_CHANNEL_1(); \
|
||||||
START_CHANNEL_1()
|
START_CHANNEL_1()
|
||||||
#define RESTART_CHANNEL_2() STOP_CHANNEL_2(); \
|
#define RESTART_CHANNEL_2() \
|
||||||
|
STOP_CHANNEL_2(); \
|
||||||
START_CHANNEL_2()
|
START_CHANNEL_2()
|
||||||
#define UPDATE_CHANNEL_1_FREQ(freq) gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \
|
#define UPDATE_CHANNEL_1_FREQ(freq) \
|
||||||
|
gpt6cfg1.frequency = freq * DAC_BUFFER_SIZE; \
|
||||||
RESTART_CHANNEL_1()
|
RESTART_CHANNEL_1()
|
||||||
#define UPDATE_CHANNEL_2_FREQ(freq) gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \
|
#define UPDATE_CHANNEL_2_FREQ(freq) \
|
||||||
|
gpt7cfg1.frequency = freq * DAC_BUFFER_SIZE; \
|
||||||
RESTART_CHANNEL_2()
|
RESTART_CHANNEL_2()
|
||||||
#define GET_CHANNEL_1_FREQ (uint16_t)(gpt6cfg1.frequency * DAC_BUFFER_SIZE)
|
#define GET_CHANNEL_1_FREQ (uint16_t)(gpt6cfg1.frequency * DAC_BUFFER_SIZE)
|
||||||
#define GET_CHANNEL_2_FREQ (uint16_t)(gpt7cfg1.frequency * DAC_BUFFER_SIZE)
|
#define GET_CHANNEL_2_FREQ (uint16_t)(gpt7cfg1.frequency * DAC_BUFFER_SIZE)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPT6 configuration.
|
* GPT6 configuration.
|
||||||
*/
|
*/
|
||||||
|
@ -112,27 +117,20 @@ static void gpt_cb8(GPTDriver *gptp);
|
||||||
// .dier = 0U
|
// .dier = 0U
|
||||||
// };
|
// };
|
||||||
|
|
||||||
GPTConfig gpt6cfg1 = {
|
GPTConfig gpt6cfg1 = {.frequency = 440U * DAC_BUFFER_SIZE,
|
||||||
.frequency = 440U*DAC_BUFFER_SIZE,
|
|
||||||
.callback = NULL,
|
.callback = NULL,
|
||||||
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
|
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
|
||||||
.dier = 0U
|
.dier = 0U};
|
||||||
};
|
|
||||||
|
|
||||||
GPTConfig gpt7cfg1 = {
|
GPTConfig gpt7cfg1 = {.frequency = 440U * DAC_BUFFER_SIZE,
|
||||||
.frequency = 440U*DAC_BUFFER_SIZE,
|
|
||||||
.callback = NULL,
|
.callback = NULL,
|
||||||
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
|
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
|
||||||
.dier = 0U
|
.dier = 0U};
|
||||||
};
|
|
||||||
|
|
||||||
GPTConfig gpt8cfg1 = {
|
GPTConfig gpt8cfg1 = {.frequency = 10,
|
||||||
.frequency = 10,
|
|
||||||
.callback = gpt_cb8,
|
.callback = gpt_cb8,
|
||||||
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
|
.cr2 = TIM_CR2_MMS_1, /* MMS = 010 = TRGO on Update Event. */
|
||||||
.dier = 0U
|
.dier = 0U};
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DAC test buffer (sine wave).
|
* DAC test buffer (sine wave).
|
||||||
|
@ -206,15 +204,15 @@ GPTConfig gpt8cfg1 = {
|
||||||
// squarewave
|
// squarewave
|
||||||
static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
|
static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
|
||||||
// First half is max, second half is 0
|
// First half is max, second half is 0
|
||||||
[0 ... DAC_BUFFER_SIZE/2-1] = DAC_SAMPLE_MAX,
|
[0 ... DAC_BUFFER_SIZE / 2 - 1] = DAC_SAMPLE_MAX,
|
||||||
[DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = 0,
|
[DAC_BUFFER_SIZE / 2 ... DAC_BUFFER_SIZE - 1] = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
// squarewave
|
// squarewave
|
||||||
static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
|
static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
|
||||||
// opposite of dac_buffer above
|
// opposite of dac_buffer above
|
||||||
[0 ... DAC_BUFFER_SIZE/2-1] = 0,
|
[0 ... DAC_BUFFER_SIZE / 2 - 1] = 0,
|
||||||
[DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = DAC_SAMPLE_MAX,
|
[DAC_BUFFER_SIZE / 2 ... DAC_BUFFER_SIZE - 1] = DAC_SAMPLE_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -222,14 +220,12 @@ static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = {
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0, nz = 0;
|
size_t nx = 0, ny = 0, nz = 0;
|
||||||
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
|
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
|
||||||
|
|
||||||
(void)dacp;
|
(void)dacp;
|
||||||
|
|
||||||
nz++;
|
nz++;
|
||||||
if (dac_buffer == buffer) {
|
if (dac_buffer == buffer) {
|
||||||
nx += n;
|
nx += n;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
ny += n;
|
ny += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,54 +238,36 @@ static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
|
||||||
* DAC error callback.
|
* DAC error callback.
|
||||||
*/
|
*/
|
||||||
static void error_cb1(DACDriver *dacp, dacerror_t err) {
|
static void error_cb1(DACDriver *dacp, dacerror_t err) {
|
||||||
|
|
||||||
(void)dacp;
|
(void)dacp;
|
||||||
(void)err;
|
(void)err;
|
||||||
|
|
||||||
chSysHalt("DAC failure");
|
chSysHalt("DAC failure");
|
||||||
}
|
}
|
||||||
|
|
||||||
static const DACConfig dac1cfg1 = {
|
static const DACConfig dac1cfg1 = {.init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT};
|
||||||
.init = DAC_SAMPLE_MAX,
|
|
||||||
.datamode = DAC_DHRM_12BIT_RIGHT
|
|
||||||
};
|
|
||||||
|
|
||||||
static const DACConversionGroup dacgrpcfg1 = {
|
static const DACConversionGroup dacgrpcfg1 = {.num_channels = 1U, .end_cb = end_cb1, .error_cb = error_cb1, .trigger = DAC_TRG(0)};
|
||||||
.num_channels = 1U,
|
|
||||||
.end_cb = end_cb1,
|
|
||||||
.error_cb = error_cb1,
|
|
||||||
.trigger = DAC_TRG(0)
|
|
||||||
};
|
|
||||||
|
|
||||||
static const DACConfig dac1cfg2 = {
|
static const DACConfig dac1cfg2 = {.init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT};
|
||||||
.init = DAC_SAMPLE_MAX,
|
|
||||||
.datamode = DAC_DHRM_12BIT_RIGHT
|
|
||||||
};
|
|
||||||
|
|
||||||
static const DACConversionGroup dacgrpcfg2 = {
|
static const DACConversionGroup dacgrpcfg2 = {.num_channels = 1U, .end_cb = end_cb1, .error_cb = error_cb1, .trigger = DAC_TRG(0)};
|
||||||
.num_channels = 1U,
|
|
||||||
.end_cb = end_cb1,
|
|
||||||
.error_cb = error_cb1,
|
|
||||||
.trigger = DAC_TRG(0)
|
|
||||||
};
|
|
||||||
|
|
||||||
void audio_init() {
|
void audio_init() {
|
||||||
|
|
||||||
if (audio_initialized) {
|
if (audio_initialized) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check EEPROM
|
// Check EEPROM
|
||||||
#if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE)
|
#if defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE)
|
||||||
if (!eeconfig_is_enabled()) {
|
if (!eeconfig_is_enabled()) {
|
||||||
eeconfig_init();
|
eeconfig_init();
|
||||||
}
|
}
|
||||||
audio_config.raw = eeconfig_read_audio();
|
audio_config.raw = eeconfig_read_audio();
|
||||||
#else // ARM EEPROM
|
#else // ARM EEPROM
|
||||||
audio_config.enable = true;
|
audio_config.enable = true;
|
||||||
#ifdef AUDIO_CLICKY_ON
|
# ifdef AUDIO_CLICKY_ON
|
||||||
audio_config.clicky_enable = true;
|
audio_config.clicky_enable = true;
|
||||||
#endif
|
# endif
|
||||||
#endif // ARM EEPROM
|
#endif // ARM EEPROM
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -320,7 +298,6 @@ void audio_init() {
|
||||||
} else {
|
} else {
|
||||||
stop_all_notes();
|
stop_all_notes();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop_all_notes() {
|
void stop_all_notes() {
|
||||||
|
@ -341,8 +318,7 @@ void stop_all_notes() {
|
||||||
frequency_alt = 0;
|
frequency_alt = 0;
|
||||||
volume = 0;
|
volume = 0;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 8; i++)
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
{
|
|
||||||
frequencies[i] = 0;
|
frequencies[i] = 0;
|
||||||
volumes[i] = 0;
|
volumes[i] = 0;
|
||||||
}
|
}
|
||||||
|
@ -360,10 +336,10 @@ void stop_note(float freq) {
|
||||||
frequencies[i] = 0;
|
frequencies[i] = 0;
|
||||||
volumes[i] = 0;
|
volumes[i] = 0;
|
||||||
for (int j = i; (j < 7); j++) {
|
for (int j = i; (j < 7); j++) {
|
||||||
frequencies[j] = frequencies[j+1];
|
frequencies[j] = frequencies[j + 1];
|
||||||
frequencies[j+1] = 0;
|
frequencies[j + 1] = 0;
|
||||||
volumes[j] = volumes[j+1];
|
volumes[j] = volumes[j + 1];
|
||||||
volumes[j+1] = 0;
|
volumes[j + 1] = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -395,12 +371,12 @@ float mod(float a, int b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float vibrato(float average_freq) {
|
float vibrato(float average_freq) {
|
||||||
#ifdef VIBRATO_STRENGTH_ENABLE
|
# ifdef VIBRATO_STRENGTH_ENABLE
|
||||||
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
|
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
|
||||||
#else
|
# else
|
||||||
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
|
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
|
||||||
#endif
|
# endif
|
||||||
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
|
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH);
|
||||||
return vibrated_freq;
|
return vibrated_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,15 +387,14 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
|
|
||||||
if (playing_note) {
|
if (playing_note) {
|
||||||
if (voices > 0) {
|
if (voices > 0) {
|
||||||
|
|
||||||
float freq_alt = 0;
|
float freq_alt = 0;
|
||||||
if (voices > 1) {
|
if (voices > 1) {
|
||||||
if (polyphony_rate == 0) {
|
if (polyphony_rate == 0) {
|
||||||
if (glissando) {
|
if (glissando) {
|
||||||
if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440/frequencies[voices - 2]/12/2)) {
|
if (frequency_alt != 0 && frequency_alt < frequencies[voices - 2] && frequency_alt < frequencies[voices - 2] * pow(2, -440 / frequencies[voices - 2] / 12 / 2)) {
|
||||||
frequency_alt = frequency_alt * pow(2, 440/frequency_alt/12/2);
|
frequency_alt = frequency_alt * pow(2, 440 / frequency_alt / 12 / 2);
|
||||||
} else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440/frequencies[voices - 2]/12/2)) {
|
} else if (frequency_alt != 0 && frequency_alt > frequencies[voices - 2] && frequency_alt > frequencies[voices - 2] * pow(2, 440 / frequencies[voices - 2] / 12 / 2)) {
|
||||||
frequency_alt = frequency_alt * pow(2, -440/frequency_alt/12/2);
|
frequency_alt = frequency_alt * pow(2, -440 / frequency_alt / 12 / 2);
|
||||||
} else {
|
} else {
|
||||||
frequency_alt = frequencies[voices - 2];
|
frequency_alt = frequencies[voices - 2];
|
||||||
}
|
}
|
||||||
|
@ -427,15 +402,15 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
frequency_alt = frequencies[voices - 2];
|
frequency_alt = frequencies[voices - 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
#ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq_alt = vibrato(frequency_alt);
|
freq_alt = vibrato(frequency_alt);
|
||||||
} else {
|
} else {
|
||||||
freq_alt = frequency_alt;
|
freq_alt = frequency_alt;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
freq_alt = frequency_alt;
|
freq_alt = frequency_alt;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
|
@ -453,7 +428,7 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
} else {
|
} else {
|
||||||
RESTART_CHANNEL_2();
|
RESTART_CHANNEL_2();
|
||||||
}
|
}
|
||||||
//note_timbre;
|
// note_timbre;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (polyphony_rate > 0) {
|
if (polyphony_rate > 0) {
|
||||||
|
@ -465,21 +440,21 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
#ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequencies[voice_place]);
|
freq = vibrato(frequencies[voice_place]);
|
||||||
} else {
|
} else {
|
||||||
freq = frequencies[voice_place];
|
freq = frequencies[voice_place];
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
freq = frequencies[voice_place];
|
freq = frequencies[voice_place];
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (glissando) {
|
if (glissando) {
|
||||||
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
|
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, 440/frequency/12/2);
|
frequency = frequency * pow(2, 440 / frequency / 12 / 2);
|
||||||
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
|
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, -440/frequency/12/2);
|
frequency = frequency * pow(2, -440 / frequency / 12 / 2);
|
||||||
} else {
|
} else {
|
||||||
frequency = frequencies[voices - 1];
|
frequency = frequencies[voices - 1];
|
||||||
}
|
}
|
||||||
|
@ -487,15 +462,15 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
frequency = frequencies[voices - 1];
|
frequency = frequencies[voices - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
#ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequency);
|
freq = vibrato(frequency);
|
||||||
} else {
|
} else {
|
||||||
freq = frequency;
|
freq = frequency;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
freq = frequency;
|
freq = frequency;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
|
@ -508,39 +483,37 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
freq = 30.52;
|
freq = 30.52;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
|
if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
|
||||||
UPDATE_CHANNEL_1_FREQ(freq);
|
UPDATE_CHANNEL_1_FREQ(freq);
|
||||||
} else {
|
} else {
|
||||||
RESTART_CHANNEL_1();
|
RESTART_CHANNEL_1();
|
||||||
}
|
}
|
||||||
//note_timbre;
|
// note_timbre;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playing_notes) {
|
if (playing_notes) {
|
||||||
if (note_frequency > 0) {
|
if (note_frequency > 0) {
|
||||||
#ifdef VIBRATO_ENABLE
|
#ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(note_frequency);
|
freq = vibrato(note_frequency);
|
||||||
} else {
|
} else {
|
||||||
freq = note_frequency;
|
freq = note_frequency;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
freq = note_frequency;
|
freq = note_frequency;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (envelope_index < 65535) {
|
if (envelope_index < 65535) {
|
||||||
envelope_index++;
|
envelope_index++;
|
||||||
}
|
}
|
||||||
freq = voice_envelope(freq);
|
freq = voice_envelope(freq);
|
||||||
|
|
||||||
|
|
||||||
if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
|
if (GET_CHANNEL_1_FREQ != (uint16_t)freq) {
|
||||||
UPDATE_CHANNEL_1_FREQ(freq);
|
UPDATE_CHANNEL_1_FREQ(freq);
|
||||||
UPDATE_CHANNEL_2_FREQ(freq);
|
UPDATE_CHANNEL_2_FREQ(freq);
|
||||||
}
|
}
|
||||||
//note_timbre;
|
// note_timbre;
|
||||||
} else {
|
} else {
|
||||||
// gptStopTimer(&GPTD6);
|
// gptStopTimer(&GPTD6);
|
||||||
// gptStopTimer(&GPTD7);
|
// gptStopTimer(&GPTD7);
|
||||||
|
@ -550,11 +523,11 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
bool end_of_note = false;
|
bool end_of_note = false;
|
||||||
if (GET_CHANNEL_1_FREQ > 0) {
|
if (GET_CHANNEL_1_FREQ > 0) {
|
||||||
if (!note_resting)
|
if (!note_resting)
|
||||||
end_of_note = (note_position >= (note_length*8 - 1));
|
end_of_note = (note_position >= (note_length * 8 - 1));
|
||||||
else
|
else
|
||||||
end_of_note = (note_position >= (note_length*8));
|
end_of_note = (note_position >= (note_length * 8));
|
||||||
} else {
|
} else {
|
||||||
end_of_note = (note_position >= (note_length*8));
|
end_of_note = (note_position >= (note_length * 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end_of_note) {
|
if (end_of_note) {
|
||||||
|
@ -598,7 +571,6 @@ static void gpt_cb8(GPTDriver *gptp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void play_note(float freq, int vol) {
|
void play_note(float freq, int vol) {
|
||||||
|
|
||||||
dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
|
dprintf("audio play note freq=%d vol=%d", (int)freq, vol);
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
|
@ -606,7 +578,6 @@ void play_note(float freq, int vol) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_config.enable && voices < 8) {
|
if (audio_config.enable && voices < 8) {
|
||||||
|
|
||||||
// Cancel notes if notes are playing
|
// Cancel notes if notes are playing
|
||||||
if (playing_notes) {
|
if (playing_notes) {
|
||||||
stop_all_notes();
|
stop_all_notes();
|
||||||
|
@ -627,17 +598,14 @@ void play_note(float freq, int vol) {
|
||||||
RESTART_CHANNEL_1();
|
RESTART_CHANNEL_1();
|
||||||
RESTART_CHANNEL_2();
|
RESTART_CHANNEL_2();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
audio_init();
|
audio_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_config.enable) {
|
if (audio_config.enable) {
|
||||||
|
|
||||||
// Cancel note if a note is playing
|
// Cancel note if a note is playing
|
||||||
if (playing_note) {
|
if (playing_note) {
|
||||||
stop_all_notes();
|
stop_all_notes();
|
||||||
|
@ -663,13 +631,9 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_playing_notes(void) {
|
bool is_playing_notes(void) { return playing_notes; }
|
||||||
return playing_notes;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_audio_on(void) {
|
bool is_audio_on(void) { return (audio_config.enable != 0); }
|
||||||
return (audio_config.enable != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void audio_toggle(void) {
|
void audio_toggle(void) {
|
||||||
audio_config.enable ^= 1;
|
audio_config.enable ^= 1;
|
||||||
|
@ -695,73 +659,45 @@ void audio_off(void) {
|
||||||
|
|
||||||
// Vibrato rate functions
|
// Vibrato rate functions
|
||||||
|
|
||||||
void set_vibrato_rate(float rate) {
|
void set_vibrato_rate(float rate) { vibrato_rate = rate; }
|
||||||
vibrato_rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_vibrato_rate(float change) {
|
void increase_vibrato_rate(float change) { vibrato_rate *= change; }
|
||||||
vibrato_rate *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_vibrato_rate(float change) {
|
void decrease_vibrato_rate(float change) { vibrato_rate /= change; }
|
||||||
vibrato_rate /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef VIBRATO_STRENGTH_ENABLE
|
# ifdef VIBRATO_STRENGTH_ENABLE
|
||||||
|
|
||||||
void set_vibrato_strength(float strength) {
|
void set_vibrato_strength(float strength) { vibrato_strength = strength; }
|
||||||
vibrato_strength = strength;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_vibrato_strength(float change) {
|
void increase_vibrato_strength(float change) { vibrato_strength *= change; }
|
||||||
vibrato_strength *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_vibrato_strength(float change) {
|
void decrease_vibrato_strength(float change) { vibrato_strength /= change; }
|
||||||
vibrato_strength /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* VIBRATO_STRENGTH_ENABLE */
|
# endif /* VIBRATO_STRENGTH_ENABLE */
|
||||||
|
|
||||||
#endif /* VIBRATO_ENABLE */
|
#endif /* VIBRATO_ENABLE */
|
||||||
|
|
||||||
// Polyphony functions
|
// Polyphony functions
|
||||||
|
|
||||||
void set_polyphony_rate(float rate) {
|
void set_polyphony_rate(float rate) { polyphony_rate = rate; }
|
||||||
polyphony_rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void enable_polyphony() {
|
void enable_polyphony() { polyphony_rate = 5; }
|
||||||
polyphony_rate = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
void disable_polyphony() {
|
void disable_polyphony() { polyphony_rate = 0; }
|
||||||
polyphony_rate = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_polyphony_rate(float change) {
|
void increase_polyphony_rate(float change) { polyphony_rate *= change; }
|
||||||
polyphony_rate *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_polyphony_rate(float change) {
|
void decrease_polyphony_rate(float change) { polyphony_rate /= change; }
|
||||||
polyphony_rate /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timbre function
|
// Timbre function
|
||||||
|
|
||||||
void set_timbre(float timbre) {
|
void set_timbre(float timbre) { note_timbre = timbre; }
|
||||||
note_timbre = timbre;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tempo functions
|
// Tempo functions
|
||||||
|
|
||||||
void set_tempo(uint8_t tempo) {
|
void set_tempo(uint8_t tempo) { note_tempo = tempo; }
|
||||||
note_tempo = tempo;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_tempo(uint8_t tempo_change) {
|
void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; }
|
||||||
note_tempo += tempo_change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_tempo(uint8_t tempo_change) {
|
void increase_tempo(uint8_t tempo_change) {
|
||||||
if (note_tempo - tempo_change < 10) {
|
if (note_tempo - tempo_change < 10) {
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
|
|
||||||
#define CPU_PRESCALER 8
|
#define CPU_PRESCALER 8
|
||||||
|
|
||||||
|
|
||||||
// Timer Abstractions
|
// Timer Abstractions
|
||||||
|
|
||||||
// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
|
// TIMSK3 - Timer/Counter #3 Interrupt Mask Register
|
||||||
|
@ -37,30 +36,27 @@
|
||||||
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
|
#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A)
|
||||||
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
|
#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A)
|
||||||
|
|
||||||
|
|
||||||
// TCCR3A: Timer/Counter #3 Control Register
|
// TCCR3A: Timer/Counter #3 Control Register
|
||||||
// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
|
// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6
|
||||||
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
|
#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1);
|
||||||
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
|
#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0));
|
||||||
|
|
||||||
|
|
||||||
#define NOTE_PERIOD ICR3
|
#define NOTE_PERIOD ICR3
|
||||||
#define NOTE_DUTY_CYCLE OCR3A
|
#define NOTE_DUTY_CYCLE OCR3A
|
||||||
|
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
#include "wave.h"
|
# include "wave.h"
|
||||||
#define SAMPLE_DIVIDER 39
|
# define SAMPLE_DIVIDER 39
|
||||||
#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
|
# define SAMPLE_RATE (2000000.0 / SAMPLE_DIVIDER / 2048)
|
||||||
// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
|
// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
|
||||||
|
|
||||||
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
uint16_t place_int = 0;
|
uint16_t place_int = 0;
|
||||||
bool repeat = true;
|
bool repeat = true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void delay_us(int count) {
|
void delay_us(int count) {
|
||||||
while(count--) {
|
while (count--) {
|
||||||
_delay_us(1);
|
_delay_us(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,7 +73,7 @@ bool sliding = false;
|
||||||
|
|
||||||
float place = 0;
|
float place = 0;
|
||||||
|
|
||||||
uint8_t * sample;
|
uint8_t* sample;
|
||||||
uint16_t sample_length = 0;
|
uint16_t sample_length = 0;
|
||||||
// float freq = 0;
|
// float freq = 0;
|
||||||
|
|
||||||
|
@ -88,7 +84,7 @@ float note_length = 0;
|
||||||
uint8_t note_tempo = TEMPO_DEFAULT;
|
uint8_t note_tempo = TEMPO_DEFAULT;
|
||||||
float note_timbre = TIMBRE_DEFAULT;
|
float note_timbre = TIMBRE_DEFAULT;
|
||||||
uint16_t note_position = 0;
|
uint16_t note_position = 0;
|
||||||
float (* notes_pointer)[][2];
|
float (*notes_pointer)[][2];
|
||||||
uint16_t notes_count;
|
uint16_t notes_count;
|
||||||
bool notes_repeat;
|
bool notes_repeat;
|
||||||
float notes_rest;
|
float notes_rest;
|
||||||
|
@ -112,19 +108,18 @@ audio_config_t audio_config;
|
||||||
uint16_t envelope_index = 0;
|
uint16_t envelope_index = 0;
|
||||||
|
|
||||||
void audio_init() {
|
void audio_init() {
|
||||||
|
|
||||||
// Check EEPROM
|
// Check EEPROM
|
||||||
if (!eeconfig_is_enabled())
|
if (!eeconfig_is_enabled()) {
|
||||||
{
|
|
||||||
eeconfig_init();
|
eeconfig_init();
|
||||||
}
|
}
|
||||||
audio_config.raw = eeconfig_read_audio();
|
audio_config.raw = eeconfig_read_audio();
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
|
|
||||||
PLLFRQ = _BV(PDIV2);
|
PLLFRQ = _BV(PDIV2);
|
||||||
PLLCSR = _BV(PLLE);
|
PLLCSR = _BV(PLLE);
|
||||||
while(!(PLLCSR & _BV(PLOCK)));
|
while (!(PLLCSR & _BV(PLOCK)))
|
||||||
|
;
|
||||||
PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
|
PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
|
||||||
|
|
||||||
/* Init a fast PWM on Timer4 */
|
/* Init a fast PWM on Timer4 */
|
||||||
|
@ -141,7 +136,7 @@ void audio_init() {
|
||||||
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
|
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
|
||||||
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
|
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// Set port PC6 (OC3A and /OC4A) as output
|
// Set port PC6 (OC3A and /OC4A) as output
|
||||||
DDRC |= _BV(PORTC6);
|
DDRC |= _BV(PORTC6);
|
||||||
|
@ -155,7 +150,7 @@ void audio_init() {
|
||||||
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
|
||||||
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_initialized = true;
|
audio_initialized = true;
|
||||||
}
|
}
|
||||||
|
@ -165,60 +160,57 @@ void stop_all_notes() {
|
||||||
audio_init();
|
audio_init();
|
||||||
}
|
}
|
||||||
voices = 0;
|
voices = 0;
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#else
|
#else
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
playing_notes = false;
|
playing_notes = false;
|
||||||
playing_note = false;
|
playing_note = false;
|
||||||
frequency = 0;
|
frequency = 0;
|
||||||
volume = 0;
|
volume = 0;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 8; i++)
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
{
|
|
||||||
frequencies[i] = 0;
|
frequencies[i] = 0;
|
||||||
volumes[i] = 0;
|
volumes[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop_note(float freq)
|
void stop_note(float freq) {
|
||||||
{
|
|
||||||
if (playing_note) {
|
if (playing_note) {
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
audio_init();
|
audio_init();
|
||||||
}
|
}
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
freq = freq / SAMPLE_RATE;
|
freq = freq / SAMPLE_RATE;
|
||||||
#endif
|
#endif
|
||||||
for (int i = 7; i >= 0; i--) {
|
for (int i = 7; i >= 0; i--) {
|
||||||
if (frequencies[i] == freq) {
|
if (frequencies[i] == freq) {
|
||||||
frequencies[i] = 0;
|
frequencies[i] = 0;
|
||||||
volumes[i] = 0;
|
volumes[i] = 0;
|
||||||
for (int j = i; (j < 7); j++) {
|
for (int j = i; (j < 7); j++) {
|
||||||
frequencies[j] = frequencies[j+1];
|
frequencies[j] = frequencies[j + 1];
|
||||||
frequencies[j+1] = 0;
|
frequencies[j + 1] = 0;
|
||||||
volumes[j] = volumes[j+1];
|
volumes[j] = volumes[j + 1];
|
||||||
volumes[j+1] = 0;
|
volumes[j + 1] = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
voices--;
|
voices--;
|
||||||
if (voices < 0)
|
if (voices < 0) voices = 0;
|
||||||
voices = 0;
|
|
||||||
if (voice_place >= voices) {
|
if (voice_place >= voices) {
|
||||||
voice_place = 0;
|
voice_place = 0;
|
||||||
}
|
}
|
||||||
if (voices == 0) {
|
if (voices == 0) {
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#else
|
#else
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
frequency = 0;
|
frequency = 0;
|
||||||
volume = 0;
|
volume = 0;
|
||||||
playing_note = false;
|
playing_note = false;
|
||||||
|
@ -228,28 +220,26 @@ void stop_note(float freq)
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
#ifdef VIBRATO_ENABLE
|
||||||
|
|
||||||
float mod(float a, int b)
|
float mod(float a, int b) {
|
||||||
{
|
|
||||||
float r = fmod(a, b);
|
float r = fmod(a, b);
|
||||||
return r < 0 ? r + b : r;
|
return r < 0 ? r + b : r;
|
||||||
}
|
}
|
||||||
|
|
||||||
float vibrato(float average_freq) {
|
float vibrato(float average_freq) {
|
||||||
#ifdef VIBRATO_STRENGTH_ENABLE
|
# ifdef VIBRATO_STRENGTH_ENABLE
|
||||||
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
|
float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength);
|
||||||
#else
|
# else
|
||||||
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
|
float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter];
|
||||||
#endif
|
# endif
|
||||||
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
|
vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0 / average_freq)), VIBRATO_LUT_LENGTH);
|
||||||
return vibrated_freq;
|
return vibrated_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ISR(TIMER3_COMPA_vect)
|
ISR(TIMER3_COMPA_vect) {
|
||||||
{
|
|
||||||
if (playing_note) {
|
if (playing_note) {
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
if (voices == 1) {
|
if (voices == 1) {
|
||||||
// SINE
|
// SINE
|
||||||
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
|
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
|
||||||
|
@ -273,8 +263,7 @@ ISR(TIMER3_COMPA_vect)
|
||||||
|
|
||||||
place += frequency;
|
place += frequency;
|
||||||
|
|
||||||
if (place >= SINE_LENGTH)
|
if (place >= SINE_LENGTH) place -= SINE_LENGTH;
|
||||||
place -= SINE_LENGTH;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
|
@ -291,12 +280,11 @@ ISR(TIMER3_COMPA_vect)
|
||||||
|
|
||||||
places[i] += frequencies[i];
|
places[i] += frequencies[i];
|
||||||
|
|
||||||
if (places[i] >= SINE_LENGTH)
|
if (places[i] >= SINE_LENGTH) places[i] -= SINE_LENGTH;
|
||||||
places[i] -= SINE_LENGTH;
|
|
||||||
}
|
}
|
||||||
OCR4A = sum;
|
OCR4A = sum;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (voices > 0) {
|
if (voices > 0) {
|
||||||
float freq;
|
float freq;
|
||||||
if (polyphony_rate > 0) {
|
if (polyphony_rate > 0) {
|
||||||
|
@ -307,32 +295,31 @@ ISR(TIMER3_COMPA_vect)
|
||||||
place = 0.0;
|
place = 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequencies[voice_place]);
|
freq = vibrato(frequencies[voice_place]);
|
||||||
} else {
|
} else {
|
||||||
#else
|
# else
|
||||||
{
|
{
|
||||||
#endif
|
# endif
|
||||||
freq = frequencies[voice_place];
|
freq = frequencies[voice_place];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
|
if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, 440/frequency/12/2);
|
frequency = frequency * pow(2, 440 / frequency / 12 / 2);
|
||||||
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
|
} else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440 / frequencies[voices - 1] / 12 / 2)) {
|
||||||
frequency = frequency * pow(2, -440/frequency/12/2);
|
frequency = frequency * pow(2, -440 / frequency / 12 / 2);
|
||||||
} else {
|
} else {
|
||||||
frequency = frequencies[voices - 1];
|
frequency = frequencies[voices - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifdef VIBRATO_ENABLE
|
||||||
#ifdef VIBRATO_ENABLE
|
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(frequency);
|
freq = vibrato(frequency);
|
||||||
} else {
|
} else {
|
||||||
#else
|
# else
|
||||||
{
|
{
|
||||||
#endif
|
# endif
|
||||||
freq = frequency;
|
freq = frequency;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,12 +329,11 @@ ISR(TIMER3_COMPA_vect)
|
||||||
}
|
}
|
||||||
freq = voice_envelope(freq);
|
freq = voice_envelope(freq);
|
||||||
|
|
||||||
if (freq < 30.517578125)
|
if (freq < 30.517578125) freq = 30.52;
|
||||||
freq = 30.52;
|
|
||||||
NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
|
NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
|
||||||
NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
|
NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// SAMPLE
|
// SAMPLE
|
||||||
|
@ -361,25 +347,23 @@ ISR(TIMER3_COMPA_vect)
|
||||||
// else
|
// else
|
||||||
// DISABLE_AUDIO_COUNTER_3_ISR;
|
// DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
|
|
||||||
|
|
||||||
if (playing_notes) {
|
if (playing_notes) {
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
|
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
|
||||||
|
|
||||||
place += note_frequency;
|
place += note_frequency;
|
||||||
if (place >= SINE_LENGTH)
|
if (place >= SINE_LENGTH) place -= SINE_LENGTH;
|
||||||
place -= SINE_LENGTH;
|
#else
|
||||||
#else
|
|
||||||
if (note_frequency > 0) {
|
if (note_frequency > 0) {
|
||||||
float freq;
|
float freq;
|
||||||
|
|
||||||
#ifdef VIBRATO_ENABLE
|
# ifdef VIBRATO_ENABLE
|
||||||
if (vibrato_strength > 0) {
|
if (vibrato_strength > 0) {
|
||||||
freq = vibrato(note_frequency);
|
freq = vibrato(note_frequency);
|
||||||
} else {
|
} else {
|
||||||
#else
|
# else
|
||||||
{
|
{
|
||||||
#endif
|
# endif
|
||||||
freq = note_frequency;
|
freq = note_frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,8 +378,7 @@ ISR(TIMER3_COMPA_vect)
|
||||||
NOTE_PERIOD = 0;
|
NOTE_PERIOD = 0;
|
||||||
NOTE_DUTY_CYCLE = 0;
|
NOTE_DUTY_CYCLE = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
note_position++;
|
note_position++;
|
||||||
bool end_of_note = false;
|
bool end_of_note = false;
|
||||||
|
@ -409,12 +392,12 @@ ISR(TIMER3_COMPA_vect)
|
||||||
if (notes_repeat) {
|
if (notes_repeat) {
|
||||||
current_note = 0;
|
current_note = 0;
|
||||||
} else {
|
} else {
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#else
|
#else
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
DISABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
playing_notes = false;
|
playing_notes = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -426,18 +409,17 @@ ISR(TIMER3_COMPA_vect)
|
||||||
current_note--;
|
current_note--;
|
||||||
} else {
|
} else {
|
||||||
note_resting = false;
|
note_resting = false;
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
||||||
note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
|
note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
|
||||||
#else
|
#else
|
||||||
envelope_index = 0;
|
envelope_index = 0;
|
||||||
note_frequency = (*notes_pointer)[current_note][0];
|
note_frequency = (*notes_pointer)[current_note][0];
|
||||||
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
|
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
note_position = 0;
|
note_position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!audio_config.enable) {
|
if (!audio_config.enable) {
|
||||||
|
@ -447,7 +429,6 @@ ISR(TIMER3_COMPA_vect)
|
||||||
}
|
}
|
||||||
|
|
||||||
void play_note(float freq, int vol) {
|
void play_note(float freq, int vol) {
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
audio_init();
|
audio_init();
|
||||||
}
|
}
|
||||||
|
@ -456,46 +437,40 @@ void play_note(float freq, int vol) {
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
|
|
||||||
// Cancel notes if notes are playing
|
// Cancel notes if notes are playing
|
||||||
if (playing_notes)
|
if (playing_notes) stop_all_notes();
|
||||||
stop_all_notes();
|
|
||||||
|
|
||||||
playing_note = true;
|
playing_note = true;
|
||||||
|
|
||||||
envelope_index = 0;
|
envelope_index = 0;
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
freq = freq / SAMPLE_RATE;
|
freq = freq / SAMPLE_RATE;
|
||||||
#endif
|
#endif
|
||||||
if (freq > 0) {
|
if (freq > 0) {
|
||||||
frequencies[voices] = freq;
|
frequencies[voices] = freq;
|
||||||
volumes[voices] = vol;
|
volumes[voices] = vol;
|
||||||
voices++;
|
voices++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#else
|
#else
|
||||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||||
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
|
void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) {
|
||||||
{
|
|
||||||
|
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
audio_init();
|
audio_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_config.enable) {
|
if (audio_config.enable) {
|
||||||
|
|
||||||
DISABLE_AUDIO_COUNTER_3_ISR;
|
DISABLE_AUDIO_COUNTER_3_ISR;
|
||||||
|
|
||||||
// Cancel note if a note is playing
|
// Cancel note if a note is playing
|
||||||
if (playing_note)
|
if (playing_note) stop_all_notes();
|
||||||
stop_all_notes();
|
|
||||||
|
|
||||||
playing_notes = true;
|
playing_notes = true;
|
||||||
|
|
||||||
|
@ -507,28 +482,26 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest)
|
||||||
place = 0;
|
place = 0;
|
||||||
current_note = 0;
|
current_note = 0;
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
|
||||||
note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
|
note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100);
|
||||||
#else
|
#else
|
||||||
note_frequency = (*notes_pointer)[current_note][0];
|
note_frequency = (*notes_pointer)[current_note][0];
|
||||||
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
|
note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100);
|
||||||
#endif
|
#endif
|
||||||
note_position = 0;
|
note_position = 0;
|
||||||
|
|
||||||
|
#ifdef PWM_AUDIO
|
||||||
#ifdef PWM_AUDIO
|
|
||||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||||
#else
|
#else
|
||||||
ENABLE_AUDIO_COUNTER_3_ISR;
|
ENABLE_AUDIO_COUNTER_3_ISR;
|
||||||
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
ENABLE_AUDIO_COUNTER_3_OUTPUT;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PWM_AUDIO
|
#ifdef PWM_AUDIO
|
||||||
void play_sample(uint8_t * s, uint16_t l, bool r) {
|
void play_sample(uint8_t* s, uint16_t l, bool r) {
|
||||||
if (!audio_initialized) {
|
if (!audio_initialized) {
|
||||||
audio_init();
|
audio_init();
|
||||||
}
|
}
|
||||||
|
@ -546,7 +519,6 @@ void play_sample(uint8_t * s, uint16_t l, bool r) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void audio_toggle(void) {
|
void audio_toggle(void) {
|
||||||
audio_config.enable ^= 1;
|
audio_config.enable ^= 1;
|
||||||
eeconfig_update_audio(audio_config.raw);
|
eeconfig_update_audio(audio_config.raw);
|
||||||
|
@ -566,73 +538,45 @@ void audio_off(void) {
|
||||||
|
|
||||||
// Vibrato rate functions
|
// Vibrato rate functions
|
||||||
|
|
||||||
void set_vibrato_rate(float rate) {
|
void set_vibrato_rate(float rate) { vibrato_rate = rate; }
|
||||||
vibrato_rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_vibrato_rate(float change) {
|
void increase_vibrato_rate(float change) { vibrato_rate *= change; }
|
||||||
vibrato_rate *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_vibrato_rate(float change) {
|
void decrease_vibrato_rate(float change) { vibrato_rate /= change; }
|
||||||
vibrato_rate /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef VIBRATO_STRENGTH_ENABLE
|
# ifdef VIBRATO_STRENGTH_ENABLE
|
||||||
|
|
||||||
void set_vibrato_strength(float strength) {
|
void set_vibrato_strength(float strength) { vibrato_strength = strength; }
|
||||||
vibrato_strength = strength;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_vibrato_strength(float change) {
|
void increase_vibrato_strength(float change) { vibrato_strength *= change; }
|
||||||
vibrato_strength *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_vibrato_strength(float change) {
|
void decrease_vibrato_strength(float change) { vibrato_strength /= change; }
|
||||||
vibrato_strength /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* VIBRATO_STRENGTH_ENABLE */
|
# endif /* VIBRATO_STRENGTH_ENABLE */
|
||||||
|
|
||||||
#endif /* VIBRATO_ENABLE */
|
#endif /* VIBRATO_ENABLE */
|
||||||
|
|
||||||
// Polyphony functions
|
// Polyphony functions
|
||||||
|
|
||||||
void set_polyphony_rate(float rate) {
|
void set_polyphony_rate(float rate) { polyphony_rate = rate; }
|
||||||
polyphony_rate = rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void enable_polyphony() {
|
void enable_polyphony() { polyphony_rate = 5; }
|
||||||
polyphony_rate = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
void disable_polyphony() {
|
void disable_polyphony() { polyphony_rate = 0; }
|
||||||
polyphony_rate = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_polyphony_rate(float change) {
|
void increase_polyphony_rate(float change) { polyphony_rate *= change; }
|
||||||
polyphony_rate *= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_polyphony_rate(float change) {
|
void decrease_polyphony_rate(float change) { polyphony_rate /= change; }
|
||||||
polyphony_rate /= change;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timbre function
|
// Timbre function
|
||||||
|
|
||||||
void set_timbre(float timbre) {
|
void set_timbre(float timbre) { note_timbre = timbre; }
|
||||||
note_timbre = timbre;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tempo functions
|
// Tempo functions
|
||||||
|
|
||||||
void set_tempo(uint8_t tempo) {
|
void set_tempo(uint8_t tempo) { note_tempo = tempo; }
|
||||||
note_tempo = tempo;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decrease_tempo(uint8_t tempo_change) {
|
void decrease_tempo(uint8_t tempo_change) { note_tempo += tempo_change; }
|
||||||
note_tempo += tempo_change;
|
|
||||||
}
|
|
||||||
|
|
||||||
void increase_tempo(uint8_t tempo_change) {
|
void increase_tempo(uint8_t tempo_change) {
|
||||||
if (note_tempo - tempo_change < 10) {
|
if (note_tempo - tempo_change < 10) {
|
||||||
|
@ -642,17 +586,10 @@ void increase_tempo(uint8_t tempo_change) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Override these functions in your keymap file to play different tunes on
|
// Override these functions in your keymap file to play different tunes on
|
||||||
// startup and bootloader jump
|
// startup and bootloader jump
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) void play_startup_tone() {}
|
||||||
void play_startup_tone()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) void play_goodbye_tone() {}
|
||||||
void play_goodbye_tone()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
|
@ -16,380 +16,12 @@
|
||||||
|
|
||||||
#include "luts.h"
|
#include "luts.h"
|
||||||
|
|
||||||
const float vibrato_lut[VIBRATO_LUT_LENGTH] =
|
const float vibrato_lut[VIBRATO_LUT_LENGTH] = {
|
||||||
{
|
1.0022336811487, 1.0042529943610, 1.0058584256028, 1.0068905285205, 1.0072464122237, 1.0068905285205, 1.0058584256028, 1.0042529943610, 1.0022336811487, 1.0000000000000, 0.9977712970630, 0.9957650169978, 0.9941756956510, 0.9931566259436, 0.9928057204913, 0.9931566259436, 0.9941756956510, 0.9957650169978, 0.9977712970630, 1.0000000000000,
|
||||||
1.0022336811487,
|
|
||||||
1.0042529943610,
|
|
||||||
1.0058584256028,
|
|
||||||
1.0068905285205,
|
|
||||||
1.0072464122237,
|
|
||||||
1.0068905285205,
|
|
||||||
1.0058584256028,
|
|
||||||
1.0042529943610,
|
|
||||||
1.0022336811487,
|
|
||||||
1.0000000000000,
|
|
||||||
0.9977712970630,
|
|
||||||
0.9957650169978,
|
|
||||||
0.9941756956510,
|
|
||||||
0.9931566259436,
|
|
||||||
0.9928057204913,
|
|
||||||
0.9931566259436,
|
|
||||||
0.9941756956510,
|
|
||||||
0.9957650169978,
|
|
||||||
0.9977712970630,
|
|
||||||
1.0000000000000,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] =
|
const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] = {
|
||||||
{
|
0x8E0B, 0x8C02, 0x8A00, 0x8805, 0x8612, 0x8426, 0x8241, 0x8063, 0x7E8C, 0x7CBB, 0x7AF2, 0x792E, 0x7772, 0x75BB, 0x740B, 0x7261, 0x70BD, 0x6F20, 0x6D88, 0x6BF6, 0x6A69, 0x68E3, 0x6762, 0x65E6, 0x6470, 0x6300, 0x6194, 0x602E, 0x5ECD, 0x5D71, 0x5C1A, 0x5AC8, 0x597B, 0x5833, 0x56EF, 0x55B0, 0x5475, 0x533F, 0x520E, 0x50E1, 0x4FB8, 0x4E93, 0x4D73, 0x4C57, 0x4B3E, 0x4A2A, 0x491A, 0x480E, 0x4705, 0x4601, 0x4500, 0x4402, 0x4309, 0x4213, 0x4120, 0x4031, 0x3F46, 0x3E5D, 0x3D79, 0x3C97, 0x3BB9, 0x3ADD, 0x3A05, 0x3930, 0x385E, 0x3790, 0x36C4, 0x35FB, 0x3534, 0x3471, 0x33B1, 0x32F3, 0x3238, 0x3180, 0x30CA, 0x3017, 0x2F66, 0x2EB8, 0x2E0D, 0x2D64, 0x2CBD, 0x2C19, 0x2B77, 0x2AD8, 0x2A3A, 0x299F, 0x2907, 0x2870, 0x27DC, 0x2749, 0x26B9, 0x262B, 0x259F, 0x2515, 0x248D, 0x2407, 0x2382, 0x2300, 0x2280, 0x2201, 0x2184, 0x2109, 0x2090, 0x2018, 0x1FA3, 0x1F2E, 0x1EBC, 0x1E4B, 0x1DDC, 0x1D6E, 0x1D02, 0x1C98, 0x1C2F, 0x1BC8, 0x1B62, 0x1AFD, 0x1A9A,
|
||||||
0x8E0B,
|
0x1A38, 0x19D8, 0x1979, 0x191C, 0x18C0, 0x1865, 0x180B, 0x17B3, 0x175C, 0x1706, 0x16B2, 0x165E, 0x160C, 0x15BB, 0x156C, 0x151D, 0x14CF, 0x1483, 0x1438, 0x13EE, 0x13A4, 0x135C, 0x1315, 0x12CF, 0x128A, 0x1246, 0x1203, 0x11C1, 0x1180, 0x1140, 0x1100, 0x10C2, 0x1084, 0x1048, 0x100C, 0xFD1, 0xF97, 0xF5E, 0xF25, 0xEEE, 0xEB7, 0xE81, 0xE4C, 0xE17, 0xDE4, 0xDB1, 0xD7E, 0xD4D, 0xD1C, 0xCEC, 0xCBC, 0xC8E, 0xC60, 0xC32, 0xC05, 0xBD9, 0xBAE, 0xB83, 0xB59, 0xB2F, 0xB06, 0xADD, 0xAB6, 0xA8E, 0xA67, 0xA41, 0xA1C, 0x9F7, 0x9D2, 0x9AE, 0x98A, 0x967, 0x945, 0x923, 0x901, 0x8E0, 0x8C0, 0x8A0, 0x880, 0x861, 0x842, 0x824, 0x806, 0x7E8, 0x7CB, 0x7AF, 0x792, 0x777, 0x75B, 0x740, 0x726, 0x70B, 0x6F2, 0x6D8, 0x6BF, 0x6A6, 0x68E, 0x676, 0x65E, 0x647, 0x630, 0x619, 0x602, 0x5EC, 0x5D7, 0x5C1, 0x5AC, 0x597, 0x583, 0x56E, 0x55B, 0x547, 0x533, 0x520, 0x50E, 0x4FB, 0x4E9,
|
||||||
0x8C02,
|
0x4D7, 0x4C5, 0x4B3, 0x4A2, 0x491, 0x480, 0x470, 0x460, 0x450, 0x440, 0x430, 0x421, 0x412, 0x403, 0x3F4, 0x3E5, 0x3D7, 0x3C9, 0x3BB, 0x3AD, 0x3A0, 0x393, 0x385, 0x379, 0x36C, 0x35F, 0x353, 0x347, 0x33B, 0x32F, 0x323, 0x318, 0x30C, 0x301, 0x2F6, 0x2EB, 0x2E0, 0x2D6, 0x2CB, 0x2C1, 0x2B7, 0x2AD, 0x2A3, 0x299, 0x290, 0x287, 0x27D, 0x274, 0x26B, 0x262, 0x259, 0x251, 0x248, 0x240, 0x238, 0x230, 0x228, 0x220, 0x218, 0x210, 0x209, 0x201, 0x1FA, 0x1F2, 0x1EB, 0x1E4, 0x1DD, 0x1D6, 0x1D0, 0x1C9, 0x1C2, 0x1BC, 0x1B6, 0x1AF, 0x1A9, 0x1A3, 0x19D, 0x197, 0x191, 0x18C, 0x186, 0x180, 0x17B, 0x175, 0x170, 0x16B, 0x165, 0x160, 0x15B, 0x156, 0x151, 0x14C, 0x148, 0x143, 0x13E, 0x13A, 0x135, 0x131, 0x12C, 0x128, 0x124, 0x120, 0x11C, 0x118, 0x114, 0x110, 0x10C, 0x108, 0x104, 0x100, 0xFD, 0xF9, 0xF5, 0xF2, 0xEE,
|
||||||
0x8A00,
|
|
||||||
0x8805,
|
|
||||||
0x8612,
|
|
||||||
0x8426,
|
|
||||||
0x8241,
|
|
||||||
0x8063,
|
|
||||||
0x7E8C,
|
|
||||||
0x7CBB,
|
|
||||||
0x7AF2,
|
|
||||||
0x792E,
|
|
||||||
0x7772,
|
|
||||||
0x75BB,
|
|
||||||
0x740B,
|
|
||||||
0x7261,
|
|
||||||
0x70BD,
|
|
||||||
0x6F20,
|
|
||||||
0x6D88,
|
|
||||||
0x6BF6,
|
|
||||||
0x6A69,
|
|
||||||
0x68E3,
|
|
||||||
0x6762,
|
|
||||||
0x65E6,
|
|
||||||
0x6470,
|
|
||||||
0x6300,
|
|
||||||
0x6194,
|
|
||||||
0x602E,
|
|
||||||
0x5ECD,
|
|
||||||
0x5D71,
|
|
||||||
0x5C1A,
|
|
||||||
0x5AC8,
|
|
||||||
0x597B,
|
|
||||||
0x5833,
|
|
||||||
0x56EF,
|
|
||||||
0x55B0,
|
|
||||||
0x5475,
|
|
||||||
0x533F,
|
|
||||||
0x520E,
|
|
||||||
0x50E1,
|
|
||||||
0x4FB8,
|
|
||||||
0x4E93,
|
|
||||||
0x4D73,
|
|
||||||
0x4C57,
|
|
||||||
0x4B3E,
|
|
||||||
0x4A2A,
|
|
||||||
0x491A,
|
|
||||||
0x480E,
|
|
||||||
0x4705,
|
|
||||||
0x4601,
|
|
||||||
0x4500,
|
|
||||||
0x4402,
|
|
||||||
0x4309,
|
|
||||||
0x4213,
|
|
||||||
0x4120,
|
|
||||||
0x4031,
|
|
||||||
0x3F46,
|
|
||||||
0x3E5D,
|
|
||||||
0x3D79,
|
|
||||||
0x3C97,
|
|
||||||
0x3BB9,
|
|
||||||
0x3ADD,
|
|
||||||
0x3A05,
|
|
||||||
0x3930,
|
|
||||||
0x385E,
|
|
||||||
0x3790,
|
|
||||||
0x36C4,
|
|
||||||
0x35FB,
|
|
||||||
0x3534,
|
|
||||||
0x3471,
|
|
||||||
0x33B1,
|
|
||||||
0x32F3,
|
|
||||||
0x3238,
|
|
||||||
0x3180,
|
|
||||||
0x30CA,
|
|
||||||
0x3017,
|
|
||||||
0x2F66,
|
|
||||||
0x2EB8,
|
|
||||||
0x2E0D,
|
|
||||||
0x2D64,
|
|
||||||
0x2CBD,
|
|
||||||
0x2C19,
|
|
||||||
0x2B77,
|
|
||||||
0x2AD8,
|
|
||||||
0x2A3A,
|
|
||||||
0x299F,
|
|
||||||
0x2907,
|
|
||||||
0x2870,
|
|
||||||
0x27DC,
|
|
||||||
0x2749,
|
|
||||||
0x26B9,
|
|
||||||
0x262B,
|
|
||||||
0x259F,
|
|
||||||
0x2515,
|
|
||||||
0x248D,
|
|
||||||
0x2407,
|
|
||||||
0x2382,
|
|
||||||
0x2300,
|
|
||||||
0x2280,
|
|
||||||
0x2201,
|
|
||||||
0x2184,
|
|
||||||
0x2109,
|
|
||||||
0x2090,
|
|
||||||
0x2018,
|
|
||||||
0x1FA3,
|
|
||||||
0x1F2E,
|
|
||||||
0x1EBC,
|
|
||||||
0x1E4B,
|
|
||||||
0x1DDC,
|
|
||||||
0x1D6E,
|
|
||||||
0x1D02,
|
|
||||||
0x1C98,
|
|
||||||
0x1C2F,
|
|
||||||
0x1BC8,
|
|
||||||
0x1B62,
|
|
||||||
0x1AFD,
|
|
||||||
0x1A9A,
|
|
||||||
0x1A38,
|
|
||||||
0x19D8,
|
|
||||||
0x1979,
|
|
||||||
0x191C,
|
|
||||||
0x18C0,
|
|
||||||
0x1865,
|
|
||||||
0x180B,
|
|
||||||
0x17B3,
|
|
||||||
0x175C,
|
|
||||||
0x1706,
|
|
||||||
0x16B2,
|
|
||||||
0x165E,
|
|
||||||
0x160C,
|
|
||||||
0x15BB,
|
|
||||||
0x156C,
|
|
||||||
0x151D,
|
|
||||||
0x14CF,
|
|
||||||
0x1483,
|
|
||||||
0x1438,
|
|
||||||
0x13EE,
|
|
||||||
0x13A4,
|
|
||||||
0x135C,
|
|
||||||
0x1315,
|
|
||||||
0x12CF,
|
|
||||||
0x128A,
|
|
||||||
0x1246,
|
|
||||||
0x1203,
|
|
||||||
0x11C1,
|
|
||||||
0x1180,
|
|
||||||
0x1140,
|
|
||||||
0x1100,
|
|
||||||
0x10C2,
|
|
||||||
0x1084,
|
|
||||||
0x1048,
|
|
||||||
0x100C,
|
|
||||||
0xFD1,
|
|
||||||
0xF97,
|
|
||||||
0xF5E,
|
|
||||||
0xF25,
|
|
||||||
0xEEE,
|
|
||||||
0xEB7,
|
|
||||||
0xE81,
|
|
||||||
0xE4C,
|
|
||||||
0xE17,
|
|
||||||
0xDE4,
|
|
||||||
0xDB1,
|
|
||||||
0xD7E,
|
|
||||||
0xD4D,
|
|
||||||
0xD1C,
|
|
||||||
0xCEC,
|
|
||||||
0xCBC,
|
|
||||||
0xC8E,
|
|
||||||
0xC60,
|
|
||||||
0xC32,
|
|
||||||
0xC05,
|
|
||||||
0xBD9,
|
|
||||||
0xBAE,
|
|
||||||
0xB83,
|
|
||||||
0xB59,
|
|
||||||
0xB2F,
|
|
||||||
0xB06,
|
|
||||||
0xADD,
|
|
||||||
0xAB6,
|
|
||||||
0xA8E,
|
|
||||||
0xA67,
|
|
||||||
0xA41,
|
|
||||||
0xA1C,
|
|
||||||
0x9F7,
|
|
||||||
0x9D2,
|
|
||||||
0x9AE,
|
|
||||||
0x98A,
|
|
||||||
0x967,
|
|
||||||
0x945,
|
|
||||||
0x923,
|
|
||||||
0x901,
|
|
||||||
0x8E0,
|
|
||||||
0x8C0,
|
|
||||||
0x8A0,
|
|
||||||
0x880,
|
|
||||||
0x861,
|
|
||||||
0x842,
|
|
||||||
0x824,
|
|
||||||
0x806,
|
|
||||||
0x7E8,
|
|
||||||
0x7CB,
|
|
||||||
0x7AF,
|
|
||||||
0x792,
|
|
||||||
0x777,
|
|
||||||
0x75B,
|
|
||||||
0x740,
|
|
||||||
0x726,
|
|
||||||
0x70B,
|
|
||||||
0x6F2,
|
|
||||||
0x6D8,
|
|
||||||
0x6BF,
|
|
||||||
0x6A6,
|
|
||||||
0x68E,
|
|
||||||
0x676,
|
|
||||||
0x65E,
|
|
||||||
0x647,
|
|
||||||
0x630,
|
|
||||||
0x619,
|
|
||||||
0x602,
|
|
||||||
0x5EC,
|
|
||||||
0x5D7,
|
|
||||||
0x5C1,
|
|
||||||
0x5AC,
|
|
||||||
0x597,
|
|
||||||
0x583,
|
|
||||||
0x56E,
|
|
||||||
0x55B,
|
|
||||||
0x547,
|
|
||||||
0x533,
|
|
||||||
0x520,
|
|
||||||
0x50E,
|
|
||||||
0x4FB,
|
|
||||||
0x4E9,
|
|
||||||
0x4D7,
|
|
||||||
0x4C5,
|
|
||||||
0x4B3,
|
|
||||||
0x4A2,
|
|
||||||
0x491,
|
|
||||||
0x480,
|
|
||||||
0x470,
|
|
||||||
0x460,
|
|
||||||
0x450,
|
|
||||||
0x440,
|
|
||||||
0x430,
|
|
||||||
0x421,
|
|
||||||
0x412,
|
|
||||||
0x403,
|
|
||||||
0x3F4,
|
|
||||||
0x3E5,
|
|
||||||
0x3D7,
|
|
||||||
0x3C9,
|
|
||||||
0x3BB,
|
|
||||||
0x3AD,
|
|
||||||
0x3A0,
|
|
||||||
0x393,
|
|
||||||
0x385,
|
|
||||||
0x379,
|
|
||||||
0x36C,
|
|
||||||
0x35F,
|
|
||||||
0x353,
|
|
||||||
0x347,
|
|
||||||
0x33B,
|
|
||||||
0x32F,
|
|
||||||
0x323,
|
|
||||||
0x318,
|
|
||||||
0x30C,
|
|
||||||
0x301,
|
|
||||||
0x2F6,
|
|
||||||
0x2EB,
|
|
||||||
0x2E0,
|
|
||||||
0x2D6,
|
|
||||||
0x2CB,
|
|
||||||
0x2C1,
|
|
||||||
0x2B7,
|
|
||||||
0x2AD,
|
|
||||||
0x2A3,
|
|
||||||
0x299,
|
|
||||||
0x290,
|
|
||||||
0x287,
|
|
||||||
0x27D,
|
|
||||||
0x274,
|
|
||||||
0x26B,
|
|
||||||
0x262,
|
|
||||||
0x259,
|
|
||||||
0x251,
|
|
||||||
0x248,
|
|
||||||
0x240,
|
|
||||||
0x238,
|
|
||||||
0x230,
|
|
||||||
0x228,
|
|
||||||
0x220,
|
|
||||||
0x218,
|
|
||||||
0x210,
|
|
||||||
0x209,
|
|
||||||
0x201,
|
|
||||||
0x1FA,
|
|
||||||
0x1F2,
|
|
||||||
0x1EB,
|
|
||||||
0x1E4,
|
|
||||||
0x1DD,
|
|
||||||
0x1D6,
|
|
||||||
0x1D0,
|
|
||||||
0x1C9,
|
|
||||||
0x1C2,
|
|
||||||
0x1BC,
|
|
||||||
0x1B6,
|
|
||||||
0x1AF,
|
|
||||||
0x1A9,
|
|
||||||
0x1A3,
|
|
||||||
0x19D,
|
|
||||||
0x197,
|
|
||||||
0x191,
|
|
||||||
0x18C,
|
|
||||||
0x186,
|
|
||||||
0x180,
|
|
||||||
0x17B,
|
|
||||||
0x175,
|
|
||||||
0x170,
|
|
||||||
0x16B,
|
|
||||||
0x165,
|
|
||||||
0x160,
|
|
||||||
0x15B,
|
|
||||||
0x156,
|
|
||||||
0x151,
|
|
||||||
0x14C,
|
|
||||||
0x148,
|
|
||||||
0x143,
|
|
||||||
0x13E,
|
|
||||||
0x13A,
|
|
||||||
0x135,
|
|
||||||
0x131,
|
|
||||||
0x12C,
|
|
||||||
0x128,
|
|
||||||
0x124,
|
|
||||||
0x120,
|
|
||||||
0x11C,
|
|
||||||
0x118,
|
|
||||||
0x114,
|
|
||||||
0x110,
|
|
||||||
0x10C,
|
|
||||||
0x108,
|
|
||||||
0x104,
|
|
||||||
0x100,
|
|
||||||
0xFD,
|
|
||||||
0xF9,
|
|
||||||
0xF5,
|
|
||||||
0xF2,
|
|
||||||
0xEE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,20 +15,20 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
# include <avr/interrupt.h>
|
||||||
#include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
#else
|
#else
|
||||||
#include "ch.h"
|
# include "ch.h"
|
||||||
#include "hal.h"
|
# include "hal.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LUTS_H
|
#ifndef LUTS_H
|
||||||
#define LUTS_H
|
# define LUTS_H
|
||||||
|
|
||||||
#define VIBRATO_LUT_LENGTH 20
|
# define VIBRATO_LUT_LENGTH 20
|
||||||
|
|
||||||
#define FREQUENCY_LUT_LENGTH 349
|
# define FREQUENCY_LUT_LENGTH 349
|
||||||
|
|
||||||
extern const float vibrato_lut[VIBRATO_LUT_LENGTH];
|
extern const float vibrato_lut[VIBRATO_LUT_LENGTH];
|
||||||
extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH];
|
extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH];
|
||||||
|
|
|
@ -1,52 +1,8 @@
|
||||||
#include "muse.h"
|
#include "muse.h"
|
||||||
|
|
||||||
enum {
|
enum { MUSE_OFF, MUSE_ON, MUSE_C_1_2, MUSE_C1, MUSE_C2, MUSE_C4, MUSE_C8, MUSE_C3, MUSE_C6, MUSE_B1, MUSE_B2, MUSE_B3, MUSE_B4, MUSE_B5, MUSE_B6, MUSE_B7, MUSE_B8, MUSE_B9, MUSE_B10, MUSE_B11, MUSE_B12, MUSE_B13, MUSE_B14, MUSE_B15, MUSE_B16, MUSE_B17, MUSE_B18, MUSE_B19, MUSE_B20, MUSE_B21, MUSE_B22, MUSE_B23, MUSE_B24, MUSE_B25, MUSE_B26, MUSE_B27, MUSE_B28, MUSE_B29, MUSE_B30, MUSE_B31 };
|
||||||
MUSE_OFF,
|
|
||||||
MUSE_ON,
|
|
||||||
MUSE_C_1_2,
|
|
||||||
MUSE_C1,
|
|
||||||
MUSE_C2,
|
|
||||||
MUSE_C4,
|
|
||||||
MUSE_C8,
|
|
||||||
MUSE_C3,
|
|
||||||
MUSE_C6,
|
|
||||||
MUSE_B1,
|
|
||||||
MUSE_B2,
|
|
||||||
MUSE_B3,
|
|
||||||
MUSE_B4,
|
|
||||||
MUSE_B5,
|
|
||||||
MUSE_B6,
|
|
||||||
MUSE_B7,
|
|
||||||
MUSE_B8,
|
|
||||||
MUSE_B9,
|
|
||||||
MUSE_B10,
|
|
||||||
MUSE_B11,
|
|
||||||
MUSE_B12,
|
|
||||||
MUSE_B13,
|
|
||||||
MUSE_B14,
|
|
||||||
MUSE_B15,
|
|
||||||
MUSE_B16,
|
|
||||||
MUSE_B17,
|
|
||||||
MUSE_B18,
|
|
||||||
MUSE_B19,
|
|
||||||
MUSE_B20,
|
|
||||||
MUSE_B21,
|
|
||||||
MUSE_B22,
|
|
||||||
MUSE_B23,
|
|
||||||
MUSE_B24,
|
|
||||||
MUSE_B25,
|
|
||||||
MUSE_B26,
|
|
||||||
MUSE_B27,
|
|
||||||
MUSE_B28,
|
|
||||||
MUSE_B29,
|
|
||||||
MUSE_B30,
|
|
||||||
MUSE_B31
|
|
||||||
};
|
|
||||||
|
|
||||||
bool number_of_ones_to_bool[16] = {
|
bool number_of_ones_to_bool[16] = {1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1};
|
||||||
1, 0, 0, 1, 0, 1, 1, 0,
|
|
||||||
0, 1, 1, 0, 1, 0, 0, 1
|
|
||||||
};
|
|
||||||
|
|
||||||
uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28};
|
uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28};
|
||||||
uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17};
|
uint8_t muse_theme[4] = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17};
|
||||||
|
@ -83,13 +39,7 @@ bool bit_for_value(uint8_t value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t muse_clock_pulse(void) {
|
uint8_t muse_clock_pulse(void) {
|
||||||
|
bool top = number_of_ones_to_bool[bit_for_value(muse_theme[0]) + (bit_for_value(muse_theme[1]) << 1) + (bit_for_value(muse_theme[2]) << 2) + (bit_for_value(muse_theme[3]) << 3)];
|
||||||
bool top = number_of_ones_to_bool[
|
|
||||||
bit_for_value(muse_theme[0]) +
|
|
||||||
(bit_for_value(muse_theme[1]) << 1) +
|
|
||||||
(bit_for_value(muse_theme[2]) << 2) +
|
|
||||||
(bit_for_value(muse_theme[3]) << 3)
|
|
||||||
];
|
|
||||||
|
|
||||||
if (muse_timer_1bit == 0) {
|
if (muse_timer_1bit == 0) {
|
||||||
if (muse_timer_2bit_counter == 0) {
|
if (muse_timer_2bit_counter == 0) {
|
||||||
|
@ -102,10 +52,5 @@ uint8_t muse_clock_pulse(void) {
|
||||||
|
|
||||||
muse_timer_1bit = (muse_timer_1bit + 1) % 2;
|
muse_timer_1bit = (muse_timer_1bit + 1) % 2;
|
||||||
|
|
||||||
return
|
return bit_for_value(muse_interval[0]) + (bit_for_value(muse_interval[1]) << 1) + (bit_for_value(muse_interval[2]) << 2) + (bit_for_value(muse_interval[3]) << 3);
|
||||||
bit_for_value(muse_interval[0]) +
|
|
||||||
(bit_for_value(muse_interval[1]) << 1) +
|
|
||||||
(bit_for_value(muse_interval[2]) << 2) +
|
|
||||||
(bit_for_value(muse_interval[3]) << 3);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,12 +20,12 @@
|
||||||
// Tempo Placeholder
|
// Tempo Placeholder
|
||||||
#define TEMPO_DEFAULT 100
|
#define TEMPO_DEFAULT 100
|
||||||
|
|
||||||
|
#define SONG(notes...) \
|
||||||
#define SONG(notes...) { notes }
|
{ notes }
|
||||||
|
|
||||||
|
|
||||||
// Note Types
|
// Note Types
|
||||||
#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration}
|
#define MUSICAL_NOTE(note, duration) \
|
||||||
|
{ (NOTE##note), duration }
|
||||||
#define BREVE_NOTE(note) MUSICAL_NOTE(note, 128)
|
#define BREVE_NOTE(note) MUSICAL_NOTE(note, 128)
|
||||||
#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64)
|
#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64)
|
||||||
#define HALF_NOTE(note) MUSICAL_NOTE(note, 32)
|
#define HALF_NOTE(note) MUSICAL_NOTE(note, 32)
|
||||||
|
@ -33,12 +33,12 @@
|
||||||
#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8)
|
#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8)
|
||||||
#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4)
|
#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4)
|
||||||
|
|
||||||
#define BREVE_DOT_NOTE(note) MUSICAL_NOTE(note, 128+64)
|
#define BREVE_DOT_NOTE(note) MUSICAL_NOTE(note, 128 + 64)
|
||||||
#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32)
|
#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64 + 32)
|
||||||
#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16)
|
#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32 + 16)
|
||||||
#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8)
|
#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16 + 8)
|
||||||
#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4)
|
#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8 + 4)
|
||||||
#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2)
|
#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4 + 2)
|
||||||
|
|
||||||
// Note Type Shortcuts
|
// Note Type Shortcuts
|
||||||
#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration)
|
#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration)
|
||||||
|
@ -66,9 +66,9 @@
|
||||||
// Notes - # = Octave
|
// Notes - # = Octave
|
||||||
|
|
||||||
#ifdef __arm__
|
#ifdef __arm__
|
||||||
#define NOTE_REST 1.00f
|
# define NOTE_REST 1.00f
|
||||||
#else
|
#else
|
||||||
#define NOTE_REST 0.00f
|
# define NOTE_REST 0.00f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* These notes are currently bugged
|
/* These notes are currently bugged
|
||||||
|
@ -230,5 +230,4 @@
|
||||||
#define NOTE_AF8 NOTE_GS8
|
#define NOTE_AF8 NOTE_GS8
|
||||||
#define NOTE_BF8 NOTE_AS8
|
#define NOTE_BF8 NOTE_AS8
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,25 +26,15 @@
|
||||||
* Author: Friedrich Schiller
|
* Author: Friedrich Schiller
|
||||||
+ License: Public Domain
|
+ License: Public Domain
|
||||||
*/
|
*/
|
||||||
#define ODE_TO_JOY \
|
#define ODE_TO_JOY Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
|
||||||
Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \
|
|
||||||
Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \
|
|
||||||
Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \
|
|
||||||
QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
|
|
||||||
|
|
||||||
/* Rock-a-bye Baby
|
/* Rock-a-bye Baby
|
||||||
* Author: Unknown
|
* Author: Unknown
|
||||||
+ License: Public Domain
|
+ License: Public Domain
|
||||||
*/
|
*/
|
||||||
#define ROCK_A_BYE_BABY \
|
#define ROCK_A_BYE_BABY QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), H__NOTE(_A5), Q__NOTE(_G5), QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), H__NOTE(_FS5),
|
||||||
QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \
|
|
||||||
H__NOTE(_A5), Q__NOTE(_G5), \
|
|
||||||
QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \
|
|
||||||
H__NOTE(_FS5),
|
|
||||||
|
|
||||||
|
#define CLUEBOARD_SOUND HD_NOTE(_C3), HD_NOTE(_D3), HD_NOTE(_E3), HD_NOTE(_F3), HD_NOTE(_G3), HD_NOTE(_A4), HD_NOTE(_B4), HD_NOTE(_C4)
|
||||||
#define CLUEBOARD_SOUND \
|
|
||||||
HD_NOTE(_C3), HD_NOTE(_D3), HD_NOTE(_E3), HD_NOTE(_F3), HD_NOTE(_G3), HD_NOTE(_A4), HD_NOTE(_B4), HD_NOTE(_C4)
|
|
||||||
/*
|
/*
|
||||||
HD_NOTE(_G3), HD_NOTE(_E3), HD_NOTE(_C3), \
|
HD_NOTE(_G3), HD_NOTE(_E3), HD_NOTE(_C3), \
|
||||||
Q__NOTE(_E3), Q__NOTE(_C3), Q__NOTE(_G3), \
|
Q__NOTE(_E3), Q__NOTE(_C3), Q__NOTE(_G3), \
|
||||||
|
@ -56,258 +46,93 @@
|
||||||
Q__NOTE(_F3)
|
Q__NOTE(_F3)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define STARTUP_SOUND \
|
#define STARTUP_SOUND E__NOTE(_E6), E__NOTE(_A6), ED_NOTE(_E7),
|
||||||
E__NOTE(_E6), \
|
|
||||||
E__NOTE(_A6), \
|
|
||||||
ED_NOTE(_E7),
|
|
||||||
|
|
||||||
#define GOODBYE_SOUND \
|
#define GOODBYE_SOUND E__NOTE(_E7), E__NOTE(_A6), ED_NOTE(_E6),
|
||||||
E__NOTE(_E7), \
|
|
||||||
E__NOTE(_A6), \
|
|
||||||
ED_NOTE(_E6),
|
|
||||||
|
|
||||||
#define PLANCK_SOUND \
|
#define PLANCK_SOUND ED_NOTE(_E7), E__NOTE(_CS7), E__NOTE(_E6), E__NOTE(_A6), M__NOTE(_CS7, 20),
|
||||||
ED_NOTE(_E7 ), \
|
|
||||||
E__NOTE(_CS7), \
|
|
||||||
E__NOTE(_E6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
M__NOTE(_CS7, 20),
|
|
||||||
|
|
||||||
#define PREONIC_SOUND \
|
#define PREONIC_SOUND M__NOTE(_B5, 20), E__NOTE(_B6), M__NOTE(_DS6, 20), E__NOTE(_B6),
|
||||||
M__NOTE(_B5, 20), \
|
|
||||||
E__NOTE(_B6), \
|
|
||||||
M__NOTE(_DS6, 20), \
|
|
||||||
E__NOTE(_B6),
|
|
||||||
|
|
||||||
#define QWERTY_SOUND \
|
#define QWERTY_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), Q__NOTE(_E7),
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
Q__NOTE(_E7 ),
|
|
||||||
|
|
||||||
#define COLEMAK_SOUND \
|
#define COLEMAK_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_E7), S__NOTE(_REST), ED_NOTE(_GS7),
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_E7 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_GS7 ),
|
|
||||||
|
|
||||||
#define DVORAK_SOUND \
|
#define DVORAK_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), E__NOTE(_E7), S__NOTE(_REST), E__NOTE(_FS7), S__NOTE(_REST), E__NOTE(_E7),
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
E__NOTE(_E7 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
E__NOTE(_FS7 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
E__NOTE(_E7 ),
|
|
||||||
|
|
||||||
#define WORKMAN_SOUND \
|
#define WORKMAN_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_FS7), S__NOTE(_REST), ED_NOTE(_A7),
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_FS7 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_A7 ),
|
|
||||||
|
|
||||||
#define PLOVER_SOUND \
|
#define PLOVER_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_E7), S__NOTE(_REST), ED_NOTE(_A7),
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_E7 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_A7 ),
|
|
||||||
|
|
||||||
#define PLOVER_GOODBYE_SOUND \
|
#define PLOVER_GOODBYE_SOUND E__NOTE(_GS6), E__NOTE(_A6), S__NOTE(_REST), ED_NOTE(_A7), S__NOTE(_REST), ED_NOTE(_E7),
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_A7 ), \
|
|
||||||
S__NOTE(_REST), \
|
|
||||||
ED_NOTE(_E7 ),
|
|
||||||
|
|
||||||
#define MUSIC_ON_SOUND \
|
#define MUSIC_ON_SOUND E__NOTE(_A5), E__NOTE(_B5), E__NOTE(_CS6), E__NOTE(_D6), E__NOTE(_E6), E__NOTE(_FS6), E__NOTE(_GS6), E__NOTE(_A6),
|
||||||
E__NOTE(_A5 ), \
|
|
||||||
E__NOTE(_B5 ), \
|
|
||||||
E__NOTE(_CS6), \
|
|
||||||
E__NOTE(_D6 ), \
|
|
||||||
E__NOTE(_E6 ), \
|
|
||||||
E__NOTE(_FS6), \
|
|
||||||
E__NOTE(_GS6), \
|
|
||||||
E__NOTE(_A6 ),
|
|
||||||
|
|
||||||
#define AUDIO_ON_SOUND \
|
#define AUDIO_ON_SOUND E__NOTE(_A5), E__NOTE(_A6),
|
||||||
E__NOTE(_A5 ), \
|
|
||||||
E__NOTE(_A6 ),
|
|
||||||
|
|
||||||
#define AUDIO_OFF_SOUND \
|
#define AUDIO_OFF_SOUND E__NOTE(_A6), E__NOTE(_A5),
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
E__NOTE(_A5 ),
|
|
||||||
|
|
||||||
#define MUSIC_SCALE_SOUND MUSIC_ON_SOUND
|
#define MUSIC_SCALE_SOUND MUSIC_ON_SOUND
|
||||||
|
|
||||||
#define MUSIC_OFF_SOUND \
|
#define MUSIC_OFF_SOUND E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), E__NOTE(_E6), E__NOTE(_D6), E__NOTE(_CS6), E__NOTE(_B5), E__NOTE(_A5),
|
||||||
E__NOTE(_A6 ), \
|
|
||||||
E__NOTE(_GS6 ), \
|
|
||||||
E__NOTE(_FS6), \
|
|
||||||
E__NOTE(_E6 ), \
|
|
||||||
E__NOTE(_D6 ), \
|
|
||||||
E__NOTE(_CS6), \
|
|
||||||
E__NOTE(_B5), \
|
|
||||||
E__NOTE(_A5 ),
|
|
||||||
|
|
||||||
#define VOICE_CHANGE_SOUND \
|
#define VOICE_CHANGE_SOUND Q__NOTE(_A5), Q__NOTE(_CS6), Q__NOTE(_E6), Q__NOTE(_A6),
|
||||||
Q__NOTE(_A5 ), \
|
|
||||||
Q__NOTE(_CS6), \
|
|
||||||
Q__NOTE(_E6 ), \
|
|
||||||
Q__NOTE(_A6 ),
|
|
||||||
|
|
||||||
#define CHROMATIC_SOUND \
|
#define CHROMATIC_SOUND Q__NOTE(_A5), Q__NOTE(_AS5), Q__NOTE(_B5), Q__NOTE(_C6), Q__NOTE(_CS6),
|
||||||
Q__NOTE(_A5 ), \
|
|
||||||
Q__NOTE(_AS5 ), \
|
|
||||||
Q__NOTE(_B5), \
|
|
||||||
Q__NOTE(_C6 ), \
|
|
||||||
Q__NOTE(_CS6 ),
|
|
||||||
|
|
||||||
#define MAJOR_SOUND \
|
#define MAJOR_SOUND Q__NOTE(_A5), Q__NOTE(_B5), Q__NOTE(_CS6), Q__NOTE(_D6), Q__NOTE(_E6),
|
||||||
Q__NOTE(_A5 ), \
|
|
||||||
Q__NOTE(_B5 ), \
|
|
||||||
Q__NOTE(_CS6), \
|
|
||||||
Q__NOTE(_D6 ), \
|
|
||||||
Q__NOTE(_E6 ),
|
|
||||||
|
|
||||||
#define MINOR_SOUND \
|
#define MINOR_SOUND Q__NOTE(_A5), Q__NOTE(_B5), Q__NOTE(_C6), Q__NOTE(_D6), Q__NOTE(_E6),
|
||||||
Q__NOTE(_A5 ), \
|
|
||||||
Q__NOTE(_B5 ), \
|
|
||||||
Q__NOTE(_C6 ), \
|
|
||||||
Q__NOTE(_D6 ), \
|
|
||||||
Q__NOTE(_E6 ),
|
|
||||||
|
|
||||||
#define GUITAR_SOUND \
|
#define GUITAR_SOUND Q__NOTE(_E5), Q__NOTE(_A5), Q__NOTE(_D6), Q__NOTE(_G6),
|
||||||
Q__NOTE(_E5 ), \
|
|
||||||
Q__NOTE(_A5), \
|
|
||||||
Q__NOTE(_D6 ), \
|
|
||||||
Q__NOTE(_G6 ),
|
|
||||||
|
|
||||||
#define VIOLIN_SOUND \
|
#define VIOLIN_SOUND Q__NOTE(_G5), Q__NOTE(_D6), Q__NOTE(_A6), Q__NOTE(_E7),
|
||||||
Q__NOTE(_G5 ), \
|
|
||||||
Q__NOTE(_D6), \
|
|
||||||
Q__NOTE(_A6 ), \
|
|
||||||
Q__NOTE(_E7 ),
|
|
||||||
|
|
||||||
#define CAPS_LOCK_ON_SOUND \
|
#define CAPS_LOCK_ON_SOUND E__NOTE(_A3), E__NOTE(_B3),
|
||||||
E__NOTE(_A3), \
|
|
||||||
E__NOTE(_B3),
|
|
||||||
|
|
||||||
#define CAPS_LOCK_OFF_SOUND \
|
#define CAPS_LOCK_OFF_SOUND E__NOTE(_B3), E__NOTE(_A3),
|
||||||
E__NOTE(_B3), \
|
|
||||||
E__NOTE(_A3),
|
|
||||||
|
|
||||||
#define SCROLL_LOCK_ON_SOUND \
|
#define SCROLL_LOCK_ON_SOUND E__NOTE(_D4), E__NOTE(_E4),
|
||||||
E__NOTE(_D4), \
|
|
||||||
E__NOTE(_E4),
|
|
||||||
|
|
||||||
#define SCROLL_LOCK_OFF_SOUND \
|
#define SCROLL_LOCK_OFF_SOUND E__NOTE(_E4), E__NOTE(_D4),
|
||||||
E__NOTE(_E4), \
|
|
||||||
E__NOTE(_D4),
|
|
||||||
|
|
||||||
#define NUM_LOCK_ON_SOUND \
|
#define NUM_LOCK_ON_SOUND E__NOTE(_D5), E__NOTE(_E5),
|
||||||
E__NOTE(_D5), \
|
|
||||||
E__NOTE(_E5),
|
|
||||||
|
|
||||||
#define NUM_LOCK_OFF_SOUND \
|
#define NUM_LOCK_OFF_SOUND E__NOTE(_E5), E__NOTE(_D5),
|
||||||
E__NOTE(_E5), \
|
|
||||||
E__NOTE(_D5),
|
|
||||||
|
|
||||||
#define AG_NORM_SOUND \
|
#define AG_NORM_SOUND E__NOTE(_A5), E__NOTE(_A5),
|
||||||
E__NOTE(_A5), \
|
|
||||||
E__NOTE(_A5),
|
|
||||||
|
|
||||||
#define AG_SWAP_SOUND \
|
#define AG_SWAP_SOUND SD_NOTE(_B5), SD_NOTE(_A5), SD_NOTE(_B5), SD_NOTE(_A5),
|
||||||
SD_NOTE(_B5), \
|
|
||||||
SD_NOTE(_A5), \
|
|
||||||
SD_NOTE(_B5), \
|
|
||||||
SD_NOTE(_A5),
|
|
||||||
|
|
||||||
#define UNICODE_WINDOWS \
|
#define UNICODE_WINDOWS E__NOTE(_B5), S__NOTE(_E6),
|
||||||
E__NOTE(_B5), \
|
|
||||||
S__NOTE(_E6),
|
|
||||||
|
|
||||||
#define UNICODE_LINUX \
|
#define UNICODE_LINUX E__NOTE(_E6), S__NOTE(_B5),
|
||||||
E__NOTE(_E6), \
|
|
||||||
S__NOTE(_B5),
|
|
||||||
|
|
||||||
|
|
||||||
#define TERMINAL_SOUND \
|
|
||||||
E__NOTE(_C5 )
|
|
||||||
|
|
||||||
|
#define TERMINAL_SOUND E__NOTE(_C5)
|
||||||
|
|
||||||
/* Title: La Campanella
|
/* Title: La Campanella
|
||||||
* Author/Composer: Frank Lizst
|
* Author/Composer: Frank Lizst
|
||||||
+ License: Public Domain
|
+ License: Public Domain
|
||||||
*/
|
*/
|
||||||
#define CAMPANELLA \
|
#define CAMPANELLA \
|
||||||
Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), \
|
Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_E5), E__NOTE(_E5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), \
|
||||||
E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), \
|
E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_CS6), E__NOTE(_CS6), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_G5), E__NOTE(_G5), E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS7), W__NOTE(_DS6), W__NOTE(_GS5),
|
||||||
Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), \
|
|
||||||
E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), \
|
|
||||||
E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS6), \
|
|
||||||
Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_E5), E__NOTE(_E5), E__NOTE(_DS6), Q__NOTE(_DS5), \
|
|
||||||
E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), \
|
|
||||||
E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), \
|
|
||||||
Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), \
|
|
||||||
E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), \
|
|
||||||
E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), \
|
|
||||||
Q__NOTE(_DS6), E__NOTE(_DS6), E__NOTE(_DS7), Q__NOTE(_CS6), E__NOTE(_CS6), E__NOTE(_DS7), Q__NOTE(_B5), \
|
|
||||||
E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_B5), E__NOTE(_B5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), \
|
|
||||||
E__NOTE(_DS7), Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_G5), E__NOTE(_G5), E__NOTE(_DS7), \
|
|
||||||
Q__NOTE(_GS5), E__NOTE(_GS5), E__NOTE(_DS7), Q__NOTE(_AS5), E__NOTE(_AS5), E__NOTE(_DS7), Q__NOTE(_DS5), \
|
|
||||||
E__NOTE(_DS5), E__NOTE(_DS7), W__NOTE(_DS6), W__NOTE(_GS5),
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Title: Fantaisie-Impromptu
|
/* Title: Fantaisie-Impromptu
|
||||||
* Author/Composer: Chopin
|
* Author/Composer: Chopin
|
||||||
* License: Public Domain
|
* License: Public Domain
|
||||||
*/
|
*/
|
||||||
#define FANTASIE_IMPROMPTU \
|
#define FANTASIE_IMPROMPTU \
|
||||||
E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), \
|
E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_A4), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_CS6), E__NOTE(_DS6), E__NOTE(_B6), E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_FS6), E__NOTE(_CS6), E__NOTE(_C5), E__NOTE(_DS6), E__NOTE(_A5), E__NOTE(_GS5), E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_DS5), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_B4), E__NOTE(_A4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), \
|
||||||
E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_A4), \
|
E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_AS4), E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_DS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_REST), E__NOTE(_DS5), E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_CS6), E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_AS5), WD_NOTE(_GS5),
|
||||||
E__NOTE(_GS4), E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), \
|
|
||||||
E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_A4), E__NOTE(_CS5), E__NOTE(_DS5), \
|
|
||||||
E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_CS6), E__NOTE(_DS6), E__NOTE(_B6), E__NOTE(_A6), E__NOTE(_GS6), E__NOTE(_FS6), \
|
|
||||||
E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_FS6), E__NOTE(_CS6), E__NOTE(_C5), E__NOTE(_DS6), E__NOTE(_A5), E__NOTE(_GS5), \
|
|
||||||
E__NOTE(_FS5), E__NOTE(_A5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_FS5), E__NOTE(_CS5), E__NOTE(_C5), E__NOTE(_DS5), \
|
|
||||||
E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_B4), E__NOTE(_A4), E__NOTE(_A4), E__NOTE(_GS4), E__NOTE(_A4), E__NOTE(_GS4), \
|
|
||||||
E__NOTE(_REST), E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), \
|
|
||||||
E__NOTE(_C5), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_GS4), E__NOTE(_AS4), E__NOTE(_GS4), E__NOTE(_REST), \
|
|
||||||
E__NOTE(_GS4), E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_DS5), E__NOTE(_CS5), E__NOTE(_C5), \
|
|
||||||
E__NOTE(_CS5), E__NOTE(_E5), E__NOTE(_GS5), E__NOTE(_DS5), E__NOTE(_E5), E__NOTE(_DS5), E__NOTE(_REST), E__NOTE(_DS5), \
|
|
||||||
E__NOTE(_B5), E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_E6), E__NOTE(_DS6), E__NOTE(_CS6), E__NOTE(_B5), \
|
|
||||||
E__NOTE(_AS5), E__NOTE(_GS5), E__NOTE(_REST), E__NOTE(_AS5), WD_NOTE(_GS5),
|
|
||||||
|
|
||||||
|
|
||||||
/* Title: Nocturne Op. 9 No. 1 in B flat minor
|
/* Title: Nocturne Op. 9 No. 1 in B flat minor
|
||||||
* Author/Composer: Chopin
|
* Author/Composer: Chopin
|
||||||
License: Public Domain
|
License: Public Domain
|
||||||
*/
|
*/
|
||||||
#define NOCTURNE_OP_9_NO_1 \
|
#define NOCTURNE_OP_9_NO_1 \
|
||||||
H__NOTE(_BF5), H__NOTE(_C6), H__NOTE(_DF6), H__NOTE(_A5), H__NOTE(_BF5), H__NOTE(_GF5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), \
|
H__NOTE(_BF5), H__NOTE(_C6), H__NOTE(_DF6), H__NOTE(_A5), H__NOTE(_BF5), H__NOTE(_GF5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), H__NOTE(_GF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_C5), B__NOTE(_DF5), W__NOTE(_BF4), Q__NOTE(_BF5), Q__NOTE(_C6), Q__NOTE(_DF6), Q__NOTE(_A5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_GS5), Q__NOTE(_A5), Q__NOTE(_C6), Q__NOTE(_BF5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_GF5), Q__NOTE(_E5), Q__NOTE(_F5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_AF5), Q__NOTE(_G5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), Q__NOTE(_D5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_B4), Q__NOTE(_C5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), B__NOTE(_DF5), W__NOTE(_BF4), W__NOTE(_BF5), W__NOTE(_BF5), W__NOTE(_BF5), BD_NOTE(_AF5), W__NOTE(_DF5), H__NOTE(_BF4), H__NOTE(_C5), H__NOTE(_DF5), H__NOTE(_GF5), H__NOTE(_GF5), BD_NOTE(_F5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_A4), B__NOTE(_AF4), \
|
||||||
W__NOTE(_F5), H__NOTE(_GF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_C5), B__NOTE(_DF5), W__NOTE(_BF4), Q__NOTE(_BF5), \
|
W__NOTE(_DF5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_EF5), BD_NOTE(_F5),
|
||||||
Q__NOTE(_C6), Q__NOTE(_DF6), Q__NOTE(_A5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_GS5), Q__NOTE(_A5), Q__NOTE(_C6), \
|
|
||||||
Q__NOTE(_BF5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_GF5), Q__NOTE(_E5), Q__NOTE(_F5), Q__NOTE(_BF5), Q__NOTE(_A5), \
|
|
||||||
Q__NOTE(_AF5), Q__NOTE(_G5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), Q__NOTE(_D5), Q__NOTE(_DF5), \
|
|
||||||
Q__NOTE(_C5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_B4), Q__NOTE(_C5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), \
|
|
||||||
B__NOTE(_DF5), W__NOTE(_BF4), W__NOTE(_BF5), W__NOTE(_BF5), W__NOTE(_BF5), BD_NOTE(_AF5), W__NOTE(_DF5), H__NOTE(_BF4), \
|
|
||||||
H__NOTE(_C5), H__NOTE(_DF5), H__NOTE(_GF5), H__NOTE(_GF5), BD_NOTE(_F5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), \
|
|
||||||
H__NOTE(_DF5), H__NOTE(_A4), B__NOTE(_AF4), W__NOTE(_DF5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), \
|
|
||||||
H__NOTE(_EF5), BD_NOTE(_F5),
|
|
||||||
|
|
||||||
|
|
||||||
/* Removed sounds
|
/* Removed sounds
|
||||||
+ This list is here solely for compatibility, so that removed songs don't just break things
|
+ This list is here solely for compatibility, so that removed songs don't just break things
|
||||||
|
|
|
@ -25,22 +25,15 @@ extern bool glissando;
|
||||||
|
|
||||||
voice_type voice = default_voice;
|
voice_type voice = default_voice;
|
||||||
|
|
||||||
void set_voice(voice_type v) {
|
void set_voice(voice_type v) { voice = v; }
|
||||||
voice = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
void voice_iterate() {
|
void voice_iterate() { voice = (voice + 1) % number_of_voices; }
|
||||||
voice = (voice + 1) % number_of_voices;
|
|
||||||
}
|
|
||||||
|
|
||||||
void voice_deiterate() {
|
void voice_deiterate() { voice = (voice - 1 + number_of_voices) % number_of_voices; }
|
||||||
voice = (voice - 1 + number_of_voices) % number_of_voices;
|
|
||||||
}
|
|
||||||
|
|
||||||
float voice_envelope(float frequency) {
|
float voice_envelope(float frequency) {
|
||||||
// envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
|
// envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
|
||||||
__attribute__ ((unused))
|
__attribute__((unused)) uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
|
||||||
uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
|
|
||||||
|
|
||||||
switch (voice) {
|
switch (voice) {
|
||||||
case default_voice:
|
case default_voice:
|
||||||
|
@ -49,7 +42,7 @@ float voice_envelope(float frequency) {
|
||||||
polyphony_rate = 0;
|
polyphony_rate = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef AUDIO_VOICES
|
#ifdef AUDIO_VOICES
|
||||||
|
|
||||||
case something:
|
case something:
|
||||||
glissando = false;
|
glissando = false;
|
||||||
|
@ -90,9 +83,7 @@ float voice_envelope(float frequency) {
|
||||||
// frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8);
|
// frequency = (rand() % (int)(frequency * 1.2 - frequency)) + (frequency * 0.8);
|
||||||
|
|
||||||
if (frequency < 80.0) {
|
if (frequency < 80.0) {
|
||||||
|
|
||||||
} else if (frequency < 160.0) {
|
} else if (frequency < 160.0) {
|
||||||
|
|
||||||
// Bass drum: 60 - 100 Hz
|
// Bass drum: 60 - 100 Hz
|
||||||
frequency = (rand() % (int)(40)) + 60;
|
frequency = (rand() % (int)(40)) + 60;
|
||||||
switch (envelope_index) {
|
switch (envelope_index) {
|
||||||
|
@ -108,8 +99,6 @@ float voice_envelope(float frequency) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (frequency < 320.0) {
|
} else if (frequency < 320.0) {
|
||||||
|
|
||||||
|
|
||||||
// Snare drum: 1 - 2 KHz
|
// Snare drum: 1 - 2 KHz
|
||||||
frequency = (rand() % (int)(1000)) + 1000;
|
frequency = (rand() % (int)(1000)) + 1000;
|
||||||
switch (envelope_index) {
|
switch (envelope_index) {
|
||||||
|
@ -125,7 +114,6 @@ float voice_envelope(float frequency) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (frequency < 640.0) {
|
} else if (frequency < 640.0) {
|
||||||
|
|
||||||
// Closed Hi-hat: 3 - 5 KHz
|
// Closed Hi-hat: 3 - 5 KHz
|
||||||
frequency = (rand() % (int)(2000)) + 3000;
|
frequency = (rand() % (int)(2000)) + 3000;
|
||||||
switch (envelope_index) {
|
switch (envelope_index) {
|
||||||
|
@ -141,7 +129,6 @@ float voice_envelope(float frequency) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (frequency < 1280.0) {
|
} else if (frequency < 1280.0) {
|
||||||
|
|
||||||
// Open Hi-hat: 3 - 5 KHz
|
// Open Hi-hat: 3 - 5 KHz
|
||||||
frequency = (rand() % (int)(2000)) + 3000;
|
frequency = (rand() % (int)(2000)) + 3000;
|
||||||
switch (envelope_index) {
|
switch (envelope_index) {
|
||||||
|
@ -155,7 +142,6 @@ float voice_envelope(float frequency) {
|
||||||
note_timbre = 0;
|
note_timbre = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case butts_fader:
|
case butts_fader:
|
||||||
|
@ -173,7 +159,7 @@ float voice_envelope(float frequency) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20 ... 200:
|
case 20 ... 200:
|
||||||
note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
|
note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2) * .125;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -211,12 +197,12 @@ float voice_envelope(float frequency) {
|
||||||
polyphony_rate = 0;
|
polyphony_rate = 0;
|
||||||
switch (compensated_index) {
|
switch (compensated_index) {
|
||||||
default:
|
default:
|
||||||
#define OCS_SPEED 10
|
# define OCS_SPEED 10
|
||||||
#define OCS_AMP .25
|
# define OCS_AMP .25
|
||||||
// sine wave is slow
|
// sine wave is slow
|
||||||
// note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
|
// note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
|
||||||
// triangle wave is a bit faster
|
// triangle wave is a bit faster
|
||||||
note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
|
note_timbre = (float)abs((compensated_index * OCS_SPEED % 3000) - 1500) * (OCS_AMP / 1500) + (1 - OCS_AMP) / 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -225,22 +211,20 @@ float voice_envelope(float frequency) {
|
||||||
glissando = true;
|
glissando = true;
|
||||||
polyphony_rate = 0;
|
polyphony_rate = 0;
|
||||||
note_timbre = (envelope_index % 2) * .125 + .375 * 2;
|
note_timbre = (envelope_index % 2) * .125 + .375 * 2;
|
||||||
if ((envelope_index % 4) == 0)
|
if ((envelope_index % 4) == 0) note_timbre = 0.5;
|
||||||
note_timbre = 0.5;
|
if ((envelope_index % 8) == 0) note_timbre = 0;
|
||||||
if ((envelope_index % 8) == 0)
|
|
||||||
note_timbre = 0;
|
|
||||||
break;
|
break;
|
||||||
case delayed_vibrato:
|
case delayed_vibrato:
|
||||||
glissando = true;
|
glissando = true;
|
||||||
polyphony_rate = 0;
|
polyphony_rate = 0;
|
||||||
note_timbre = TIMBRE_50;
|
note_timbre = TIMBRE_50;
|
||||||
#define VOICE_VIBRATO_DELAY 150
|
# define VOICE_VIBRATO_DELAY 150
|
||||||
#define VOICE_VIBRATO_SPEED 50
|
# define VOICE_VIBRATO_SPEED 50
|
||||||
switch (compensated_index) {
|
switch (compensated_index) {
|
||||||
case 0 ... VOICE_VIBRATO_DELAY:
|
case 0 ... VOICE_VIBRATO_DELAY:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
|
frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1)) / 1000 * VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -286,7 +270,7 @@ float voice_envelope(float frequency) {
|
||||||
// note_timbre = 0.25;
|
// note_timbre = 0.25;
|
||||||
// break;
|
// break;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -16,19 +16,19 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#endif
|
#endif
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "luts.h"
|
#include "luts.h"
|
||||||
|
|
||||||
#ifndef VOICES_H
|
#ifndef VOICES_H
|
||||||
#define VOICES_H
|
# define VOICES_H
|
||||||
|
|
||||||
float voice_envelope(float frequency);
|
float voice_envelope(float frequency);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
default_voice,
|
default_voice,
|
||||||
#ifdef AUDIO_VOICES
|
# ifdef AUDIO_VOICES
|
||||||
something,
|
something,
|
||||||
drums,
|
drums,
|
||||||
butts_fader,
|
butts_fader,
|
||||||
|
@ -36,12 +36,12 @@ typedef enum {
|
||||||
duty_osc,
|
duty_osc,
|
||||||
duty_octave_down,
|
duty_octave_down,
|
||||||
delayed_vibrato,
|
delayed_vibrato,
|
||||||
// delayed_vibrato_octave,
|
// delayed_vibrato_octave,
|
||||||
// duty_fifth_down,
|
// duty_fifth_down,
|
||||||
// duty_fourth_down,
|
// duty_fourth_down,
|
||||||
// duty_third_down,
|
// duty_third_down,
|
||||||
// duty_fifth_third_down,
|
// duty_fifth_third_down,
|
||||||
#endif
|
# endif
|
||||||
number_of_voices // important that this is last
|
number_of_voices // important that this is last
|
||||||
} voice_type;
|
} voice_type;
|
||||||
|
|
||||||
|
|
|
@ -20,262 +20,17 @@
|
||||||
|
|
||||||
#define SINE_LENGTH 2048
|
#define SINE_LENGTH 2048
|
||||||
|
|
||||||
const uint8_t sinewave[] PROGMEM= //2048 values
|
const uint8_t sinewave[] PROGMEM = // 2048 values
|
||||||
{
|
{0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, 0x92, 0x93, 0x93, 0x93, 0x94, 0x94, 0x95, 0x95, 0x95, 0x96, 0x96, 0x96, 0x97, 0x97, 0x98, 0x98, 0x98, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xa6, 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xae, 0xae, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xbb,
|
||||||
0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82,
|
0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc2, 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc5, 0xc6, 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca, 0xca, 0xca, 0xcb, 0xcb, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xcd, 0xce, 0xce, 0xce, 0xcf, 0xcf, 0xcf, 0xcf, 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd5, 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xd9, 0xd9, 0xda, 0xda, 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xde, 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe5, 0xe5, 0xe6, 0xe6, 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8,
|
||||||
0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85,
|
0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
|
||||||
0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88,
|
0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7,
|
||||||
0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c,
|
0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4,
|
||||||
0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f,
|
0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb1, 0xb1, 0xb1, 0xb0, 0xb0, 0xb0, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0x9f, 0x9f, 0x9e, 0x9e, 0x9e, 0x9d,
|
||||||
0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92,
|
0x9d, 0x9d, 0x9c, 0x9c, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x99, 0x99, 0x98, 0x98, 0x98, 0x97, 0x97, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x94, 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x86, 0x86, 0x85, 0x85, 0x85, 0x84, 0x84, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x78, 0x78, 0x78, 0x77, 0x77, 0x77, 0x76, 0x76, 0x75, 0x75, 0x75, 0x74, 0x74, 0x73, 0x73, 0x73, 0x72, 0x72, 0x71, 0x71, 0x71, 0x70, 0x70, 0x70, 0x6f, 0x6f, 0x6e, 0x6e, 0x6e, 0x6d, 0x6d, 0x6c, 0x6c, 0x6c, 0x6b, 0x6b, 0x6a, 0x6a, 0x6a, 0x69, 0x69, 0x69, 0x68, 0x68, 0x67, 0x67, 0x67, 0x66, 0x66, 0x65, 0x65, 0x65, 0x64, 0x64, 0x64, 0x63, 0x63, 0x62, 0x62, 0x62, 0x61, 0x61, 0x61, 0x60,
|
||||||
0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95,
|
0x60, 0x5f, 0x5f, 0x5f, 0x5e, 0x5e, 0x5d, 0x5d, 0x5d, 0x5c, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a, 0x5a, 0x5a, 0x59, 0x59, 0x59, 0x58, 0x58, 0x58, 0x57, 0x57, 0x56, 0x56, 0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53, 0x53, 0x52, 0x52, 0x52, 0x51, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, 0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47, 0x47, 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2e, 0x2e, 0x2e, 0x2d, 0x2d, 0x2d, 0x2d, 0x2c, 0x2c, 0x2c, 0x2b, 0x2b, 0x2b, 0x2a, 0x2a,
|
||||||
0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98,
|
0x2a, 0x2a, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x26, 0x26, 0x26, 0x26, 0x25, 0x25, 0x25, 0x25, 0x24, 0x24, 0x24, 0x23, 0x23, 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x20, 0x20, 0x20, 0x1f, 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, 0x1d, 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, 0x1a, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x16, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xe, 0xe, 0xe, 0xe, 0xe, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x8, 0x8, 0x8, 0x8, 0x8,
|
||||||
0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b,
|
0x8, 0x8, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 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, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
|
||||||
0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e,
|
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17,
|
||||||
0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1,
|
0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46,
|
||||||
0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4,
|
0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f};
|
||||||
0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7,
|
|
||||||
0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa,
|
|
||||||
0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad,
|
|
||||||
0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0,
|
|
||||||
0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3,
|
|
||||||
0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6,
|
|
||||||
0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8,
|
|
||||||
0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb,
|
|
||||||
0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe,
|
|
||||||
0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1,
|
|
||||||
0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3,
|
|
||||||
0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6,
|
|
||||||
0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9,
|
|
||||||
0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb,
|
|
||||||
0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,
|
|
||||||
0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0,
|
|
||||||
0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2,
|
|
||||||
0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5,
|
|
||||||
0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7,
|
|
||||||
0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,
|
|
||||||
0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc,
|
|
||||||
0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde,
|
|
||||||
0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0,
|
|
||||||
0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,
|
|
||||||
0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,
|
|
||||||
0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6,
|
|
||||||
0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8,
|
|
||||||
0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,
|
|
||||||
0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,
|
|
||||||
0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed,
|
|
||||||
0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,
|
|
||||||
0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,
|
|
||||||
0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,
|
|
||||||
0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,
|
|
||||||
0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,
|
|
||||||
0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,
|
|
||||||
0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,
|
|
||||||
0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,
|
|
||||||
0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,
|
|
||||||
0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
|
|
||||||
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
|
|
||||||
0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,
|
|
||||||
0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,
|
|
||||||
0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
|
|
||||||
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
|
|
||||||
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe,
|
|
||||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
|
|
||||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
|
|
||||||
0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,
|
|
||||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
|
|
||||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
|
|
||||||
0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,
|
|
||||||
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
|
|
||||||
0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
|
|
||||||
0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,
|
|
||||||
0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,
|
|
||||||
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
|
|
||||||
0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
|
|
||||||
0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,
|
|
||||||
0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,
|
|
||||||
0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,
|
|
||||||
0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,
|
|
||||||
0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,
|
|
||||||
0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,
|
|
||||||
0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,
|
|
||||||
0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,
|
|
||||||
0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,
|
|
||||||
0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb,
|
|
||||||
0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,
|
|
||||||
0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,
|
|
||||||
0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,
|
|
||||||
0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,
|
|
||||||
0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2,
|
|
||||||
0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0,
|
|
||||||
0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde,
|
|
||||||
0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,
|
|
||||||
0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda,
|
|
||||||
0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,
|
|
||||||
0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5,
|
|
||||||
0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3,
|
|
||||||
0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1,
|
|
||||||
0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce,
|
|
||||||
0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc,
|
|
||||||
0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9,
|
|
||||||
0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7,
|
|
||||||
0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4,
|
|
||||||
0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1,
|
|
||||||
0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf,
|
|
||||||
0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc,
|
|
||||||
0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9,
|
|
||||||
0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6,
|
|
||||||
0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4,
|
|
||||||
0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,
|
|
||||||
0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae,
|
|
||||||
0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab,
|
|
||||||
0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8,
|
|
||||||
0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5,
|
|
||||||
0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2,
|
|
||||||
0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f,
|
|
||||||
0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,
|
|
||||||
0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99,
|
|
||||||
0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96,
|
|
||||||
0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93,
|
|
||||||
0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f,
|
|
||||||
0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c,
|
|
||||||
0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89,
|
|
||||||
0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86,
|
|
||||||
0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83,
|
|
||||||
0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80,
|
|
||||||
0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d,
|
|
||||||
0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a,
|
|
||||||
0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77,
|
|
||||||
0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73,
|
|
||||||
0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70,
|
|
||||||
0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d,
|
|
||||||
0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a,
|
|
||||||
0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67,
|
|
||||||
0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64,
|
|
||||||
0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61,
|
|
||||||
0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e,
|
|
||||||
0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b,
|
|
||||||
0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58,
|
|
||||||
0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55,
|
|
||||||
0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52,
|
|
||||||
0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f,
|
|
||||||
0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c,
|
|
||||||
0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49,
|
|
||||||
0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47,
|
|
||||||
0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44,
|
|
||||||
0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41,
|
|
||||||
0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e,
|
|
||||||
0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c,
|
|
||||||
0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39,
|
|
||||||
0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36,
|
|
||||||
0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34,
|
|
||||||
0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31,
|
|
||||||
0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f,
|
|
||||||
0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d,
|
|
||||||
0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a,
|
|
||||||
0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28,
|
|
||||||
0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26,
|
|
||||||
0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23,
|
|
||||||
0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21,
|
|
||||||
0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f,
|
|
||||||
0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d,
|
|
||||||
0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b,
|
|
||||||
0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19,
|
|
||||||
0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17,
|
|
||||||
0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16,
|
|
||||||
0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14,
|
|
||||||
0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12,
|
|
||||||
0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11,
|
|
||||||
0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf,
|
|
||||||
0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe,
|
|
||||||
0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc,
|
|
||||||
0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb,
|
|
||||||
0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa,
|
|
||||||
0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9,
|
|
||||||
0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
|
|
||||||
0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
|
|
||||||
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
|
|
||||||
0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,
|
|
||||||
0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4,
|
|
||||||
0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3,
|
|
||||||
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
|
|
||||||
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
|
|
||||||
0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1,
|
|
||||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
|
|
||||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
|
|
||||||
0x1,0x1,0x1,0x1,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,0x1,0x1,0x1,
|
|
||||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
|
|
||||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
|
|
||||||
0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2,
|
|
||||||
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
|
|
||||||
0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
|
|
||||||
0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4,
|
|
||||||
0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5,
|
|
||||||
0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,
|
|
||||||
0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
|
|
||||||
0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
|
|
||||||
0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
|
|
||||||
0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,
|
|
||||||
0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb,
|
|
||||||
0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc,
|
|
||||||
0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd,
|
|
||||||
0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf,
|
|
||||||
0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10,
|
|
||||||
0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,
|
|
||||||
0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14,
|
|
||||||
0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,
|
|
||||||
0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17,
|
|
||||||
0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19,
|
|
||||||
0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,
|
|
||||||
0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d,
|
|
||||||
0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f,
|
|
||||||
0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21,
|
|
||||||
0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23,
|
|
||||||
0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,
|
|
||||||
0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27,
|
|
||||||
0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a,
|
|
||||||
0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,
|
|
||||||
0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,
|
|
||||||
0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31,
|
|
||||||
0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,
|
|
||||||
0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36,
|
|
||||||
0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
|
|
||||||
0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,
|
|
||||||
0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,
|
|
||||||
0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40,
|
|
||||||
0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,
|
|
||||||
0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,
|
|
||||||
0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49,
|
|
||||||
0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,
|
|
||||||
0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,
|
|
||||||
0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51,
|
|
||||||
0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,
|
|
||||||
0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,
|
|
||||||
0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a,
|
|
||||||
0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,
|
|
||||||
0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,
|
|
||||||
0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,
|
|
||||||
0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,
|
|
||||||
0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69,
|
|
||||||
0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c,
|
|
||||||
0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70,
|
|
||||||
0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73,
|
|
||||||
0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76,
|
|
||||||
0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79,
|
|
||||||
0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c,
|
|
||||||
0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f
|
|
||||||
};
|
|
||||||
|
|
|
@ -14,21 +14,18 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "led_tables.h"
|
#include "led_tables.h"
|
||||||
#include "progmem.h"
|
#include "progmem.h"
|
||||||
|
|
||||||
RGB hsv_to_rgb( HSV hsv )
|
RGB hsv_to_rgb(HSV hsv) {
|
||||||
{
|
|
||||||
RGB rgb;
|
RGB rgb;
|
||||||
uint8_t region, remainder, p, q, t;
|
uint8_t region, remainder, p, q, t;
|
||||||
uint16_t h, s, v;
|
uint16_t h, s, v;
|
||||||
|
|
||||||
if ( hsv.s == 0 )
|
if (hsv.s == 0) {
|
||||||
{
|
|
||||||
#ifdef USE_CIE1931_CURVE
|
#ifdef USE_CIE1931_CURVE
|
||||||
rgb.r = rgb.g = rgb.b = pgm_read_byte( &CIE1931_CURVE[hsv.v] );
|
rgb.r = rgb.g = rgb.b = pgm_read_byte(&CIE1931_CURVE[hsv.v]);
|
||||||
#else
|
#else
|
||||||
rgb.r = hsv.v;
|
rgb.r = hsv.v;
|
||||||
rgb.g = hsv.v;
|
rgb.g = hsv.v;
|
||||||
|
@ -48,8 +45,7 @@ RGB hsv_to_rgb( HSV hsv )
|
||||||
q = (v * (255 - ((s * remainder) >> 8))) >> 8;
|
q = (v * (255 - ((s * remainder) >> 8))) >> 8;
|
||||||
t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
|
t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
|
||||||
|
|
||||||
switch ( region )
|
switch (region) {
|
||||||
{
|
|
||||||
case 6:
|
case 6:
|
||||||
case 0:
|
case 0:
|
||||||
rgb.r = v;
|
rgb.r = v;
|
||||||
|
@ -84,11 +80,10 @@ RGB hsv_to_rgb( HSV hsv )
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_CIE1931_CURVE
|
#ifdef USE_CIE1931_CURVE
|
||||||
rgb.r = pgm_read_byte( &CIE1931_CURVE[rgb.r] );
|
rgb.r = pgm_read_byte(&CIE1931_CURVE[rgb.r]);
|
||||||
rgb.g = pgm_read_byte( &CIE1931_CURVE[rgb.g] );
|
rgb.g = pgm_read_byte(&CIE1931_CURVE[rgb.g]);
|
||||||
rgb.b = pgm_read_byte( &CIE1931_CURVE[rgb.b] );
|
rgb.b = pgm_read_byte(&CIE1931_CURVE[rgb.b]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return rgb;
|
return rgb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,33 +14,30 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef COLOR_H
|
#ifndef COLOR_H
|
||||||
#define COLOR_H
|
#define COLOR_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
#define PACKED __attribute__ ((__packed__))
|
# define PACKED __attribute__((__packed__))
|
||||||
#else
|
#else
|
||||||
#define PACKED
|
# define PACKED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma pack( push, 1 )
|
# pragma pack(push, 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RGBW
|
#ifdef RGBW
|
||||||
#define LED_TYPE cRGBW
|
# define LED_TYPE cRGBW
|
||||||
#else
|
#else
|
||||||
#define LED_TYPE RGB
|
# define LED_TYPE RGB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// WS2812 specific layout
|
// WS2812 specific layout
|
||||||
typedef struct PACKED
|
typedef struct PACKED {
|
||||||
{
|
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
|
@ -49,23 +46,21 @@ typedef struct PACKED
|
||||||
typedef cRGB RGB;
|
typedef cRGB RGB;
|
||||||
|
|
||||||
// WS2812 specific layout
|
// WS2812 specific layout
|
||||||
typedef struct PACKED
|
typedef struct PACKED {
|
||||||
{
|
|
||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t r;
|
uint8_t r;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
uint8_t w;
|
uint8_t w;
|
||||||
} cRGBW;
|
} cRGBW;
|
||||||
|
|
||||||
typedef struct PACKED
|
typedef struct PACKED {
|
||||||
{
|
|
||||||
uint8_t h;
|
uint8_t h;
|
||||||
uint8_t s;
|
uint8_t s;
|
||||||
uint8_t v;
|
uint8_t v;
|
||||||
} HSV;
|
} HSV;
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma pack( pop )
|
# pragma pack(pop)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RGB hsv_to_rgb(HSV hsv);
|
RGB hsv_to_rgb(HSV hsv);
|
||||||
|
|
|
@ -25,262 +25,262 @@
|
||||||
#define NO_PIN (~0)
|
#define NO_PIN (~0)
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
#ifndef __ASSEMBLER__
|
# ifndef __ASSEMBLER__
|
||||||
#include <avr/io.h>
|
# include <avr/io.h>
|
||||||
#endif
|
# endif
|
||||||
#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
|
||||||
|
|
||||||
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)
|
# if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)
|
||||||
#define ADDRESS_BASE 0x00
|
# define ADDRESS_BASE 0x00
|
||||||
#define PINB_ADDRESS 0x3
|
# define PINB_ADDRESS 0x3
|
||||||
#define PINC_ADDRESS 0x6
|
# define PINC_ADDRESS 0x6
|
||||||
#define PIND_ADDRESS 0x9
|
# define PIND_ADDRESS 0x9
|
||||||
#define PINE_ADDRESS 0xC
|
# define PINE_ADDRESS 0xC
|
||||||
#define PINF_ADDRESS 0xF
|
# define PINF_ADDRESS 0xF
|
||||||
#elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__)
|
# elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__)
|
||||||
#define ADDRESS_BASE 0x00
|
# define ADDRESS_BASE 0x00
|
||||||
#define PINB_ADDRESS 0x3
|
# define PINB_ADDRESS 0x3
|
||||||
#define PINC_ADDRESS 0x6
|
# define PINC_ADDRESS 0x6
|
||||||
#define PIND_ADDRESS 0x9
|
# define PIND_ADDRESS 0x9
|
||||||
#elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__)
|
# elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__)
|
||||||
#define ADDRESS_BASE 0x00
|
# define ADDRESS_BASE 0x00
|
||||||
#define PINA_ADDRESS 0x0
|
# define PINA_ADDRESS 0x0
|
||||||
#define PINB_ADDRESS 0x3
|
# define PINB_ADDRESS 0x3
|
||||||
#define PINC_ADDRESS 0x6
|
# define PINC_ADDRESS 0x6
|
||||||
#define PIND_ADDRESS 0x9
|
# define PIND_ADDRESS 0x9
|
||||||
#define PINE_ADDRESS 0xC
|
# define PINE_ADDRESS 0xC
|
||||||
#define PINF_ADDRESS 0xF
|
# define PINF_ADDRESS 0xF
|
||||||
#elif defined(__AVR_ATmega32A__)
|
# elif defined(__AVR_ATmega32A__)
|
||||||
#define ADDRESS_BASE 0x10
|
# define ADDRESS_BASE 0x10
|
||||||
#define PIND_ADDRESS 0x0
|
# define PIND_ADDRESS 0x0
|
||||||
#define PINC_ADDRESS 0x3
|
# define PINC_ADDRESS 0x3
|
||||||
#define PINB_ADDRESS 0x6
|
# define PINB_ADDRESS 0x6
|
||||||
#define PINA_ADDRESS 0x9
|
# define PINA_ADDRESS 0x9
|
||||||
#elif defined(__AVR_ATmega328P__)
|
# elif defined(__AVR_ATmega328P__)
|
||||||
#define ADDRESS_BASE 0x00
|
# define ADDRESS_BASE 0x00
|
||||||
#define PINB_ADDRESS 0x3
|
# define PINB_ADDRESS 0x3
|
||||||
#define PINC_ADDRESS 0x6
|
# define PINC_ADDRESS 0x6
|
||||||
#define PIND_ADDRESS 0x9
|
# define PIND_ADDRESS 0x9
|
||||||
#else
|
# else
|
||||||
#error "Pins are not defined"
|
# error "Pins are not defined"
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
/* I/O pins */
|
/* I/O pins */
|
||||||
#define PINDEF(port, pin) ((PIN##port##_ADDRESS << PORT_SHIFTER) | pin)
|
# define PINDEF(port, pin) ((PIN##port##_ADDRESS << PORT_SHIFTER) | pin)
|
||||||
|
|
||||||
#ifdef PORTA
|
# ifdef PORTA
|
||||||
#define A0 PINDEF(A, 0)
|
# define A0 PINDEF(A, 0)
|
||||||
#define A1 PINDEF(A, 1)
|
# define A1 PINDEF(A, 1)
|
||||||
#define A2 PINDEF(A, 2)
|
# define A2 PINDEF(A, 2)
|
||||||
#define A3 PINDEF(A, 3)
|
# define A3 PINDEF(A, 3)
|
||||||
#define A4 PINDEF(A, 4)
|
# define A4 PINDEF(A, 4)
|
||||||
#define A5 PINDEF(A, 5)
|
# define A5 PINDEF(A, 5)
|
||||||
#define A6 PINDEF(A, 6)
|
# define A6 PINDEF(A, 6)
|
||||||
#define A7 PINDEF(A, 7)
|
# define A7 PINDEF(A, 7)
|
||||||
#endif
|
# endif
|
||||||
#ifdef PORTB
|
# ifdef PORTB
|
||||||
#define B0 PINDEF(B, 0)
|
# define B0 PINDEF(B, 0)
|
||||||
#define B1 PINDEF(B, 1)
|
# define B1 PINDEF(B, 1)
|
||||||
#define B2 PINDEF(B, 2)
|
# define B2 PINDEF(B, 2)
|
||||||
#define B3 PINDEF(B, 3)
|
# define B3 PINDEF(B, 3)
|
||||||
#define B4 PINDEF(B, 4)
|
# define B4 PINDEF(B, 4)
|
||||||
#define B5 PINDEF(B, 5)
|
# define B5 PINDEF(B, 5)
|
||||||
#define B6 PINDEF(B, 6)
|
# define B6 PINDEF(B, 6)
|
||||||
#define B7 PINDEF(B, 7)
|
# define B7 PINDEF(B, 7)
|
||||||
#endif
|
# endif
|
||||||
#ifdef PORTC
|
# ifdef PORTC
|
||||||
#define C0 PINDEF(C, 0)
|
# define C0 PINDEF(C, 0)
|
||||||
#define C1 PINDEF(C, 1)
|
# define C1 PINDEF(C, 1)
|
||||||
#define C2 PINDEF(C, 2)
|
# define C2 PINDEF(C, 2)
|
||||||
#define C3 PINDEF(C, 3)
|
# define C3 PINDEF(C, 3)
|
||||||
#define C4 PINDEF(C, 4)
|
# define C4 PINDEF(C, 4)
|
||||||
#define C5 PINDEF(C, 5)
|
# define C5 PINDEF(C, 5)
|
||||||
#define C6 PINDEF(C, 6)
|
# define C6 PINDEF(C, 6)
|
||||||
#define C7 PINDEF(C, 7)
|
# define C7 PINDEF(C, 7)
|
||||||
#endif
|
# endif
|
||||||
#ifdef PORTD
|
# ifdef PORTD
|
||||||
#define D0 PINDEF(D, 0)
|
# define D0 PINDEF(D, 0)
|
||||||
#define D1 PINDEF(D, 1)
|
# define D1 PINDEF(D, 1)
|
||||||
#define D2 PINDEF(D, 2)
|
# define D2 PINDEF(D, 2)
|
||||||
#define D3 PINDEF(D, 3)
|
# define D3 PINDEF(D, 3)
|
||||||
#define D4 PINDEF(D, 4)
|
# define D4 PINDEF(D, 4)
|
||||||
#define D5 PINDEF(D, 5)
|
# define D5 PINDEF(D, 5)
|
||||||
#define D6 PINDEF(D, 6)
|
# define D6 PINDEF(D, 6)
|
||||||
#define D7 PINDEF(D, 7)
|
# define D7 PINDEF(D, 7)
|
||||||
#endif
|
# endif
|
||||||
#ifdef PORTE
|
# ifdef PORTE
|
||||||
#define E0 PINDEF(E, 0)
|
# define E0 PINDEF(E, 0)
|
||||||
#define E1 PINDEF(E, 1)
|
# define E1 PINDEF(E, 1)
|
||||||
#define E2 PINDEF(E, 2)
|
# define E2 PINDEF(E, 2)
|
||||||
#define E3 PINDEF(E, 3)
|
# define E3 PINDEF(E, 3)
|
||||||
#define E4 PINDEF(E, 4)
|
# define E4 PINDEF(E, 4)
|
||||||
#define E5 PINDEF(E, 5)
|
# define E5 PINDEF(E, 5)
|
||||||
#define E6 PINDEF(E, 6)
|
# define E6 PINDEF(E, 6)
|
||||||
#define E7 PINDEF(E, 7)
|
# define E7 PINDEF(E, 7)
|
||||||
#endif
|
# endif
|
||||||
#ifdef PORTF
|
# ifdef PORTF
|
||||||
#define F0 PINDEF(F, 0)
|
# define F0 PINDEF(F, 0)
|
||||||
#define F1 PINDEF(F, 1)
|
# define F1 PINDEF(F, 1)
|
||||||
#define F2 PINDEF(F, 2)
|
# define F2 PINDEF(F, 2)
|
||||||
#define F3 PINDEF(F, 3)
|
# define F3 PINDEF(F, 3)
|
||||||
#define F4 PINDEF(F, 4)
|
# define F4 PINDEF(F, 4)
|
||||||
#define F5 PINDEF(F, 5)
|
# define F5 PINDEF(F, 5)
|
||||||
#define F6 PINDEF(F, 6)
|
# define F6 PINDEF(F, 6)
|
||||||
#define F7 PINDEF(F, 7)
|
# define F7 PINDEF(F, 7)
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
# ifndef __ASSEMBLER__
|
||||||
#define _PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset)
|
# define _PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset)
|
||||||
// Port X Input Pins Address
|
// Port X Input Pins Address
|
||||||
#define PINx_ADDRESS(p) _PIN_ADDRESS(p, 0)
|
# define PINx_ADDRESS(p) _PIN_ADDRESS(p, 0)
|
||||||
// Port X Data Direction Register, 0:input 1:output
|
// Port X Data Direction Register, 0:input 1:output
|
||||||
#define DDRx_ADDRESS(p) _PIN_ADDRESS(p, 1)
|
# define DDRx_ADDRESS(p) _PIN_ADDRESS(p, 1)
|
||||||
// Port X Data Register
|
// Port X Data Register
|
||||||
#define PORTx_ADDRESS(p) _PIN_ADDRESS(p, 2)
|
# define PORTx_ADDRESS(p) _PIN_ADDRESS(p, 2)
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#elif defined(PROTOCOL_CHIBIOS)
|
#elif defined(PROTOCOL_CHIBIOS)
|
||||||
// Defines mapping for Proton C replacement
|
// Defines mapping for Proton C replacement
|
||||||
#ifdef CONVERT_TO_PROTON_C
|
# ifdef CONVERT_TO_PROTON_C
|
||||||
// Left side (front)
|
// Left side (front)
|
||||||
#define D3 PAL_LINE(GPIOA, 9)
|
# define D3 PAL_LINE(GPIOA, 9)
|
||||||
#define D2 PAL_LINE(GPIOA, 10)
|
# define D2 PAL_LINE(GPIOA, 10)
|
||||||
// GND
|
// GND
|
||||||
// GND
|
// GND
|
||||||
#define D1 PAL_LINE(GPIOB, 7)
|
# define D1 PAL_LINE(GPIOB, 7)
|
||||||
#define D0 PAL_LINE(GPIOB, 6)
|
# define D0 PAL_LINE(GPIOB, 6)
|
||||||
#define D4 PAL_LINE(GPIOB, 5)
|
# define D4 PAL_LINE(GPIOB, 5)
|
||||||
#define C6 PAL_LINE(GPIOB, 4)
|
# define C6 PAL_LINE(GPIOB, 4)
|
||||||
#define D7 PAL_LINE(GPIOB, 3)
|
# define D7 PAL_LINE(GPIOB, 3)
|
||||||
#define E6 PAL_LINE(GPIOB, 2)
|
# define E6 PAL_LINE(GPIOB, 2)
|
||||||
#define B4 PAL_LINE(GPIOB, 1)
|
# define B4 PAL_LINE(GPIOB, 1)
|
||||||
#define B5 PAL_LINE(GPIOB, 0)
|
# define B5 PAL_LINE(GPIOB, 0)
|
||||||
|
|
||||||
// Right side (front)
|
// Right side (front)
|
||||||
// RAW
|
// RAW
|
||||||
// GND
|
// GND
|
||||||
// RESET
|
// RESET
|
||||||
// VCC
|
// VCC
|
||||||
#define F4 PAL_LINE(GPIOA, 2)
|
# define F4 PAL_LINE(GPIOA, 2)
|
||||||
#define F5 PAL_LINE(GPIOA, 1)
|
# define F5 PAL_LINE(GPIOA, 1)
|
||||||
#define F6 PAL_LINE(GPIOA, 0)
|
# define F6 PAL_LINE(GPIOA, 0)
|
||||||
#define F7 PAL_LINE(GPIOB, 8)
|
# define F7 PAL_LINE(GPIOB, 8)
|
||||||
#define B1 PAL_LINE(GPIOB, 13)
|
# define B1 PAL_LINE(GPIOB, 13)
|
||||||
#define B3 PAL_LINE(GPIOB, 14)
|
# define B3 PAL_LINE(GPIOB, 14)
|
||||||
#define B2 PAL_LINE(GPIOB, 15)
|
# define B2 PAL_LINE(GPIOB, 15)
|
||||||
#define B6 PAL_LINE(GPIOB, 9)
|
# define B6 PAL_LINE(GPIOB, 9)
|
||||||
|
|
||||||
// LEDs (only D5/C13 uses an actual LED)
|
// LEDs (only D5/C13 uses an actual LED)
|
||||||
#ifdef CONVERT_TO_PROTON_C_RXLED
|
# ifdef CONVERT_TO_PROTON_C_RXLED
|
||||||
#define D5 PAL_LINE(GPIOC, 13)
|
# define D5 PAL_LINE(GPIOC, 13)
|
||||||
#define B0 PAL_LINE(GPIOC, 13)
|
# define B0 PAL_LINE(GPIOC, 13)
|
||||||
#else
|
# else
|
||||||
#define D5 PAL_LINE(GPIOC, 13)
|
# define D5 PAL_LINE(GPIOC, 13)
|
||||||
#define B0 PAL_LINE(GPIOC, 14)
|
# define B0 PAL_LINE(GPIOC, 14)
|
||||||
#endif
|
# endif
|
||||||
#else
|
# else
|
||||||
#define A0 PAL_LINE(GPIOA, 0)
|
# define A0 PAL_LINE(GPIOA, 0)
|
||||||
#define A1 PAL_LINE(GPIOA, 1)
|
# define A1 PAL_LINE(GPIOA, 1)
|
||||||
#define A2 PAL_LINE(GPIOA, 2)
|
# define A2 PAL_LINE(GPIOA, 2)
|
||||||
#define A3 PAL_LINE(GPIOA, 3)
|
# define A3 PAL_LINE(GPIOA, 3)
|
||||||
#define A4 PAL_LINE(GPIOA, 4)
|
# define A4 PAL_LINE(GPIOA, 4)
|
||||||
#define A5 PAL_LINE(GPIOA, 5)
|
# define A5 PAL_LINE(GPIOA, 5)
|
||||||
#define A6 PAL_LINE(GPIOA, 6)
|
# define A6 PAL_LINE(GPIOA, 6)
|
||||||
#define A7 PAL_LINE(GPIOA, 7)
|
# define A7 PAL_LINE(GPIOA, 7)
|
||||||
#define A8 PAL_LINE(GPIOA, 8)
|
# define A8 PAL_LINE(GPIOA, 8)
|
||||||
#define A9 PAL_LINE(GPIOA, 9)
|
# define A9 PAL_LINE(GPIOA, 9)
|
||||||
#define A10 PAL_LINE(GPIOA, 10)
|
# define A10 PAL_LINE(GPIOA, 10)
|
||||||
#define A11 PAL_LINE(GPIOA, 11)
|
# define A11 PAL_LINE(GPIOA, 11)
|
||||||
#define A12 PAL_LINE(GPIOA, 12)
|
# define A12 PAL_LINE(GPIOA, 12)
|
||||||
#define A13 PAL_LINE(GPIOA, 13)
|
# define A13 PAL_LINE(GPIOA, 13)
|
||||||
#define A14 PAL_LINE(GPIOA, 14)
|
# define A14 PAL_LINE(GPIOA, 14)
|
||||||
#define A15 PAL_LINE(GPIOA, 15)
|
# define A15 PAL_LINE(GPIOA, 15)
|
||||||
#define B0 PAL_LINE(GPIOB, 0)
|
# define B0 PAL_LINE(GPIOB, 0)
|
||||||
#define B1 PAL_LINE(GPIOB, 1)
|
# define B1 PAL_LINE(GPIOB, 1)
|
||||||
#define B2 PAL_LINE(GPIOB, 2)
|
# define B2 PAL_LINE(GPIOB, 2)
|
||||||
#define B3 PAL_LINE(GPIOB, 3)
|
# define B3 PAL_LINE(GPIOB, 3)
|
||||||
#define B4 PAL_LINE(GPIOB, 4)
|
# define B4 PAL_LINE(GPIOB, 4)
|
||||||
#define B5 PAL_LINE(GPIOB, 5)
|
# define B5 PAL_LINE(GPIOB, 5)
|
||||||
#define B6 PAL_LINE(GPIOB, 6)
|
# define B6 PAL_LINE(GPIOB, 6)
|
||||||
#define B7 PAL_LINE(GPIOB, 7)
|
# define B7 PAL_LINE(GPIOB, 7)
|
||||||
#define B8 PAL_LINE(GPIOB, 8)
|
# define B8 PAL_LINE(GPIOB, 8)
|
||||||
#define B9 PAL_LINE(GPIOB, 9)
|
# define B9 PAL_LINE(GPIOB, 9)
|
||||||
#define B10 PAL_LINE(GPIOB, 10)
|
# define B10 PAL_LINE(GPIOB, 10)
|
||||||
#define B11 PAL_LINE(GPIOB, 11)
|
# define B11 PAL_LINE(GPIOB, 11)
|
||||||
#define B12 PAL_LINE(GPIOB, 12)
|
# define B12 PAL_LINE(GPIOB, 12)
|
||||||
#define B13 PAL_LINE(GPIOB, 13)
|
# define B13 PAL_LINE(GPIOB, 13)
|
||||||
#define B14 PAL_LINE(GPIOB, 14)
|
# define B14 PAL_LINE(GPIOB, 14)
|
||||||
#define B15 PAL_LINE(GPIOB, 15)
|
# define B15 PAL_LINE(GPIOB, 15)
|
||||||
#define B16 PAL_LINE(GPIOB, 16)
|
# define B16 PAL_LINE(GPIOB, 16)
|
||||||
#define B17 PAL_LINE(GPIOB, 17)
|
# define B17 PAL_LINE(GPIOB, 17)
|
||||||
#define C0 PAL_LINE(GPIOC, 0)
|
# define C0 PAL_LINE(GPIOC, 0)
|
||||||
#define C1 PAL_LINE(GPIOC, 1)
|
# define C1 PAL_LINE(GPIOC, 1)
|
||||||
#define C2 PAL_LINE(GPIOC, 2)
|
# define C2 PAL_LINE(GPIOC, 2)
|
||||||
#define C3 PAL_LINE(GPIOC, 3)
|
# define C3 PAL_LINE(GPIOC, 3)
|
||||||
#define C4 PAL_LINE(GPIOC, 4)
|
# define C4 PAL_LINE(GPIOC, 4)
|
||||||
#define C5 PAL_LINE(GPIOC, 5)
|
# define C5 PAL_LINE(GPIOC, 5)
|
||||||
#define C6 PAL_LINE(GPIOC, 6)
|
# define C6 PAL_LINE(GPIOC, 6)
|
||||||
#define C7 PAL_LINE(GPIOC, 7)
|
# define C7 PAL_LINE(GPIOC, 7)
|
||||||
#define C8 PAL_LINE(GPIOC, 8)
|
# define C8 PAL_LINE(GPIOC, 8)
|
||||||
#define C9 PAL_LINE(GPIOC, 9)
|
# define C9 PAL_LINE(GPIOC, 9)
|
||||||
#define C10 PAL_LINE(GPIOC, 10)
|
# define C10 PAL_LINE(GPIOC, 10)
|
||||||
#define C11 PAL_LINE(GPIOC, 11)
|
# define C11 PAL_LINE(GPIOC, 11)
|
||||||
#define C12 PAL_LINE(GPIOC, 12)
|
# define C12 PAL_LINE(GPIOC, 12)
|
||||||
#define C13 PAL_LINE(GPIOC, 13)
|
# define C13 PAL_LINE(GPIOC, 13)
|
||||||
#define C14 PAL_LINE(GPIOC, 14)
|
# define C14 PAL_LINE(GPIOC, 14)
|
||||||
#define C15 PAL_LINE(GPIOC, 15)
|
# define C15 PAL_LINE(GPIOC, 15)
|
||||||
#define D0 PAL_LINE(GPIOD, 0)
|
# define D0 PAL_LINE(GPIOD, 0)
|
||||||
#define D1 PAL_LINE(GPIOD, 1)
|
# define D1 PAL_LINE(GPIOD, 1)
|
||||||
#define D2 PAL_LINE(GPIOD, 2)
|
# define D2 PAL_LINE(GPIOD, 2)
|
||||||
#define D3 PAL_LINE(GPIOD, 3)
|
# define D3 PAL_LINE(GPIOD, 3)
|
||||||
#define D4 PAL_LINE(GPIOD, 4)
|
# define D4 PAL_LINE(GPIOD, 4)
|
||||||
#define D5 PAL_LINE(GPIOD, 5)
|
# define D5 PAL_LINE(GPIOD, 5)
|
||||||
#define D6 PAL_LINE(GPIOD, 6)
|
# define D6 PAL_LINE(GPIOD, 6)
|
||||||
#define D7 PAL_LINE(GPIOD, 7)
|
# define D7 PAL_LINE(GPIOD, 7)
|
||||||
#define D8 PAL_LINE(GPIOD, 8)
|
# define D8 PAL_LINE(GPIOD, 8)
|
||||||
#define D9 PAL_LINE(GPIOD, 9)
|
# define D9 PAL_LINE(GPIOD, 9)
|
||||||
#define D10 PAL_LINE(GPIOD, 10)
|
# define D10 PAL_LINE(GPIOD, 10)
|
||||||
#define D11 PAL_LINE(GPIOD, 11)
|
# define D11 PAL_LINE(GPIOD, 11)
|
||||||
#define D12 PAL_LINE(GPIOD, 12)
|
# define D12 PAL_LINE(GPIOD, 12)
|
||||||
#define D13 PAL_LINE(GPIOD, 13)
|
# define D13 PAL_LINE(GPIOD, 13)
|
||||||
#define D14 PAL_LINE(GPIOD, 14)
|
# define D14 PAL_LINE(GPIOD, 14)
|
||||||
#define D15 PAL_LINE(GPIOD, 15)
|
# define D15 PAL_LINE(GPIOD, 15)
|
||||||
#define E0 PAL_LINE(GPIOE, 0)
|
# define E0 PAL_LINE(GPIOE, 0)
|
||||||
#define E1 PAL_LINE(GPIOE, 1)
|
# define E1 PAL_LINE(GPIOE, 1)
|
||||||
#define E2 PAL_LINE(GPIOE, 2)
|
# define E2 PAL_LINE(GPIOE, 2)
|
||||||
#define E3 PAL_LINE(GPIOE, 3)
|
# define E3 PAL_LINE(GPIOE, 3)
|
||||||
#define E4 PAL_LINE(GPIOE, 4)
|
# define E4 PAL_LINE(GPIOE, 4)
|
||||||
#define E5 PAL_LINE(GPIOE, 5)
|
# define E5 PAL_LINE(GPIOE, 5)
|
||||||
#define E6 PAL_LINE(GPIOE, 6)
|
# define E6 PAL_LINE(GPIOE, 6)
|
||||||
#define E7 PAL_LINE(GPIOE, 7)
|
# define E7 PAL_LINE(GPIOE, 7)
|
||||||
#define E8 PAL_LINE(GPIOE, 8)
|
# define E8 PAL_LINE(GPIOE, 8)
|
||||||
#define E9 PAL_LINE(GPIOE, 9)
|
# define E9 PAL_LINE(GPIOE, 9)
|
||||||
#define E10 PAL_LINE(GPIOE, 10)
|
# define E10 PAL_LINE(GPIOE, 10)
|
||||||
#define E11 PAL_LINE(GPIOE, 11)
|
# define E11 PAL_LINE(GPIOE, 11)
|
||||||
#define E12 PAL_LINE(GPIOE, 12)
|
# define E12 PAL_LINE(GPIOE, 12)
|
||||||
#define E13 PAL_LINE(GPIOE, 13)
|
# define E13 PAL_LINE(GPIOE, 13)
|
||||||
#define E14 PAL_LINE(GPIOE, 14)
|
# define E14 PAL_LINE(GPIOE, 14)
|
||||||
#define E15 PAL_LINE(GPIOE, 15)
|
# define E15 PAL_LINE(GPIOE, 15)
|
||||||
#define F0 PAL_LINE(GPIOF, 0)
|
# define F0 PAL_LINE(GPIOF, 0)
|
||||||
#define F1 PAL_LINE(GPIOF, 1)
|
# define F1 PAL_LINE(GPIOF, 1)
|
||||||
#define F2 PAL_LINE(GPIOF, 2)
|
# define F2 PAL_LINE(GPIOF, 2)
|
||||||
#define F3 PAL_LINE(GPIOF, 3)
|
# define F3 PAL_LINE(GPIOF, 3)
|
||||||
#define F4 PAL_LINE(GPIOF, 4)
|
# define F4 PAL_LINE(GPIOF, 4)
|
||||||
#define F5 PAL_LINE(GPIOF, 5)
|
# define F5 PAL_LINE(GPIOF, 5)
|
||||||
#define F6 PAL_LINE(GPIOF, 6)
|
# define F6 PAL_LINE(GPIOF, 6)
|
||||||
#define F7 PAL_LINE(GPIOF, 7)
|
# define F7 PAL_LINE(GPIOF, 7)
|
||||||
#define F8 PAL_LINE(GPIOF, 8)
|
# define F8 PAL_LINE(GPIOF, 8)
|
||||||
#define F9 PAL_LINE(GPIOF, 9)
|
# define F9 PAL_LINE(GPIOF, 9)
|
||||||
#define F10 PAL_LINE(GPIOF, 10)
|
# define F10 PAL_LINE(GPIOF, 10)
|
||||||
#define F11 PAL_LINE(GPIOF, 11)
|
# define F11 PAL_LINE(GPIOF, 11)
|
||||||
#define F12 PAL_LINE(GPIOF, 12)
|
# define F12 PAL_LINE(GPIOF, 12)
|
||||||
#define F13 PAL_LINE(GPIOF, 13)
|
# define F13 PAL_LINE(GPIOF, 13)
|
||||||
#define F14 PAL_LINE(GPIOF, 14)
|
# define F14 PAL_LINE(GPIOF, 14)
|
||||||
#define F15 PAL_LINE(GPIOF, 15)
|
# define F15 PAL_LINE(GPIOF, 15)
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* USART configuration */
|
/* USART configuration */
|
||||||
|
@ -291,7 +291,8 @@
|
||||||
# define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
|
# define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
|
||||||
# define SERIAL_UART_RXD_VECT USART1_RX_vect
|
# define SERIAL_UART_RXD_VECT USART1_RX_vect
|
||||||
# define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
|
# define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
|
||||||
# define SERIAL_UART_INIT() do { \
|
# define SERIAL_UART_INIT() \
|
||||||
|
do { \
|
||||||
/* baud rate */ \
|
/* baud rate */ \
|
||||||
UBRR1L = SERIAL_UART_UBRR; \
|
UBRR1L = SERIAL_UART_UBRR; \
|
||||||
/* baud rate */ \
|
/* baud rate */ \
|
||||||
|
@ -301,7 +302,7 @@
|
||||||
/* 8-bit data */ \
|
/* 8-bit data */ \
|
||||||
UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
|
UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
|
||||||
sei(); \
|
sei(); \
|
||||||
} while(0)
|
} while (0)
|
||||||
# else
|
# else
|
||||||
# error "USART configuration is needed."
|
# error "USART configuration is needed."
|
||||||
# endif
|
# endif
|
||||||
|
|
|
@ -20,7 +20,7 @@ When no state changes have occured for DEBOUNCE milliseconds, we push the state.
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
#ifndef DEBOUNCE
|
#ifndef DEBOUNCE
|
||||||
#define DEBOUNCE 5
|
# define DEBOUNCE 5
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void debounce_init(uint8_t num_rows) {}
|
void debounce_init(uint8_t num_rows) {}
|
||||||
|
@ -28,8 +28,7 @@ static bool debouncing = false;
|
||||||
|
|
||||||
#if DEBOUNCE > 0
|
#if DEBOUNCE > 0
|
||||||
static uint16_t debouncing_time;
|
static uint16_t debouncing_time;
|
||||||
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed)
|
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
|
||||||
{
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
debouncing = true;
|
debouncing = true;
|
||||||
debouncing_time = timer_read();
|
debouncing_time = timer_read();
|
||||||
|
@ -42,16 +41,12 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
|
||||||
debouncing = false;
|
debouncing = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else //no debouncing.
|
#else // no debouncing.
|
||||||
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed)
|
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
|
||||||
{
|
|
||||||
for (int i = 0; i < num_rows; i++) {
|
for (int i = 0; i < num_rows; i++) {
|
||||||
cooked[i] = raw[i];
|
cooked[i] = raw[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool debounce_active(void) {
|
bool debounce_active(void) { return debouncing; }
|
||||||
return debouncing;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -23,40 +23,34 @@
|
||||||
|
|
||||||
#ifdef DYNAMIC_KEYMAP_ENABLE
|
#ifdef DYNAMIC_KEYMAP_ENABLE
|
||||||
|
|
||||||
#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
|
# ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
|
||||||
#error DYNAMIC_KEYMAP_EEPROM_ADDR not defined
|
# error DYNAMIC_KEYMAP_EEPROM_ADDR not defined
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef DYNAMIC_KEYMAP_LAYER_COUNT
|
# ifndef DYNAMIC_KEYMAP_LAYER_COUNT
|
||||||
#error DYNAMIC_KEYMAP_LAYER_COUNT not defined
|
# error DYNAMIC_KEYMAP_LAYER_COUNT not defined
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef DYNAMIC_KEYMAP_MACRO_COUNT
|
# ifndef DYNAMIC_KEYMAP_MACRO_COUNT
|
||||||
#error DYNAMIC_KEYMAP_MACRO_COUNT not defined
|
# error DYNAMIC_KEYMAP_MACRO_COUNT not defined
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
|
# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
|
||||||
#error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined
|
# error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
|
# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
|
||||||
#error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined
|
# error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
uint8_t dynamic_keymap_get_layer_count(void)
|
uint8_t dynamic_keymap_get_layer_count(void) { return DYNAMIC_KEYMAP_LAYER_COUNT; }
|
||||||
{
|
|
||||||
return DYNAMIC_KEYMAP_LAYER_COUNT;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column)
|
void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) {
|
||||||
{
|
|
||||||
// TODO: optimize this with some left shifts
|
// TODO: optimize this with some left shifts
|
||||||
return ((void*)DYNAMIC_KEYMAP_EEPROM_ADDR) + ( layer * MATRIX_ROWS * MATRIX_COLS * 2 ) +
|
return ((void *)DYNAMIC_KEYMAP_EEPROM_ADDR) + (layer * MATRIX_ROWS * MATRIX_COLS * 2) + (row * MATRIX_COLS * 2) + (column * 2);
|
||||||
( row * MATRIX_COLS * 2 ) + ( column * 2 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column)
|
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column) {
|
||||||
{
|
|
||||||
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
|
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
|
||||||
// Big endian, so we can read/write EEPROM directly from host if we want
|
// Big endian, so we can read/write EEPROM directly from host if we want
|
||||||
uint16_t keycode = eeprom_read_byte(address) << 8;
|
uint16_t keycode = eeprom_read_byte(address) << 8;
|
||||||
|
@ -64,35 +58,32 @@ uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column)
|
||||||
return keycode;
|
return keycode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode)
|
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) {
|
||||||
{
|
|
||||||
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
|
void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
|
||||||
// Big endian, so we can read/write EEPROM directly from host if we want
|
// Big endian, so we can read/write EEPROM directly from host if we want
|
||||||
eeprom_update_byte(address, (uint8_t)(keycode >> 8));
|
eeprom_update_byte(address, (uint8_t)(keycode >> 8));
|
||||||
eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF));
|
eeprom_update_byte(address + 1, (uint8_t)(keycode & 0xFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
void dynamic_keymap_reset(void)
|
void dynamic_keymap_reset(void) {
|
||||||
{
|
|
||||||
// Reset the keymaps in EEPROM to what is in flash.
|
// Reset the keymaps in EEPROM to what is in flash.
|
||||||
// All keyboards using dynamic keymaps should define a layout
|
// All keyboards using dynamic keymaps should define a layout
|
||||||
// for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT.
|
// for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT.
|
||||||
for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) {
|
for (int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) {
|
||||||
for ( int row = 0; row < MATRIX_ROWS; row++ ) {
|
for (int row = 0; row < MATRIX_ROWS; row++) {
|
||||||
for ( int column = 0; column < MATRIX_COLS; column++ ) {
|
for (int column = 0; column < MATRIX_COLS; column++) {
|
||||||
dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column]));
|
dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data )
|
void dynamic_keymap_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
|
||||||
{
|
|
||||||
uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
|
uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
|
||||||
void *source = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset);
|
void * source = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
|
||||||
uint8_t *target = data;
|
uint8_t *target = data;
|
||||||
for ( uint16_t i = 0; i < size; i++ ) {
|
for (uint16_t i = 0; i < size; i++) {
|
||||||
if ( offset + i < dynamic_keymap_eeprom_size ) {
|
if (offset + i < dynamic_keymap_eeprom_size) {
|
||||||
*target = eeprom_read_byte(source);
|
*target = eeprom_read_byte(source);
|
||||||
} else {
|
} else {
|
||||||
*target = 0x00;
|
*target = 0x00;
|
||||||
|
@ -102,13 +93,12 @@ void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data )
|
void dynamic_keymap_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
|
||||||
{
|
|
||||||
uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
|
uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
|
||||||
void *target = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset);
|
void * target = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
|
||||||
uint8_t *source = data;
|
uint8_t *source = data;
|
||||||
for ( uint16_t i = 0; i < size; i++ ) {
|
for (uint16_t i = 0; i < size; i++) {
|
||||||
if ( offset + i < dynamic_keymap_eeprom_size ) {
|
if (offset + i < dynamic_keymap_eeprom_size) {
|
||||||
eeprom_update_byte(target, *source);
|
eeprom_update_byte(target, *source);
|
||||||
}
|
}
|
||||||
source++;
|
source++;
|
||||||
|
@ -117,35 +107,23 @@ void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data )
|
||||||
}
|
}
|
||||||
|
|
||||||
// This overrides the one in quantum/keymap_common.c
|
// This overrides the one in quantum/keymap_common.c
|
||||||
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
|
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) {
|
||||||
{
|
if (layer < DYNAMIC_KEYMAP_LAYER_COUNT && key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
|
||||||
if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT &&
|
|
||||||
key.row < MATRIX_ROWS &&
|
|
||||||
key.col < MATRIX_COLS ) {
|
|
||||||
return dynamic_keymap_get_keycode(layer, key.row, key.col);
|
return dynamic_keymap_get_keycode(layer, key.row, key.col);
|
||||||
} else {
|
} else {
|
||||||
return KC_NO;
|
return KC_NO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t dynamic_keymap_macro_get_count(void) { return DYNAMIC_KEYMAP_MACRO_COUNT; }
|
||||||
|
|
||||||
|
uint16_t dynamic_keymap_macro_get_buffer_size(void) { return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; }
|
||||||
|
|
||||||
uint8_t dynamic_keymap_macro_get_count(void)
|
void dynamic_keymap_macro_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
|
||||||
{
|
void * source = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
|
||||||
return DYNAMIC_KEYMAP_MACRO_COUNT;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t dynamic_keymap_macro_get_buffer_size(void)
|
|
||||||
{
|
|
||||||
return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data )
|
|
||||||
{
|
|
||||||
void *source = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset);
|
|
||||||
uint8_t *target = data;
|
uint8_t *target = data;
|
||||||
for ( uint16_t i = 0; i < size; i++ ) {
|
for (uint16_t i = 0; i < size; i++) {
|
||||||
if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) {
|
if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
|
||||||
*target = eeprom_read_byte(source);
|
*target = eeprom_read_byte(source);
|
||||||
} else {
|
} else {
|
||||||
*target = 0x00;
|
*target = 0x00;
|
||||||
|
@ -155,12 +133,11 @@ void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data )
|
void dynamic_keymap_macro_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
|
||||||
{
|
void * target = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
|
||||||
void *target = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset);
|
|
||||||
uint8_t *source = data;
|
uint8_t *source = data;
|
||||||
for ( uint16_t i = 0; i < size; i++ ) {
|
for (uint16_t i = 0; i < size; i++) {
|
||||||
if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) {
|
if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
|
||||||
eeprom_update_byte(target, *source);
|
eeprom_update_byte(target, *source);
|
||||||
}
|
}
|
||||||
source++;
|
source++;
|
||||||
|
@ -168,19 +145,17 @@ void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dynamic_keymap_macro_reset(void)
|
void dynamic_keymap_macro_reset(void) {
|
||||||
{
|
void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
|
||||||
void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
|
void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
|
||||||
void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
|
while (p != end) {
|
||||||
while ( p != end ) {
|
|
||||||
eeprom_update_byte(p, 0);
|
eeprom_update_byte(p, 0);
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dynamic_keymap_macro_send( uint8_t id )
|
void dynamic_keymap_macro_send(uint8_t id) {
|
||||||
{
|
if (id >= DYNAMIC_KEYMAP_MACRO_COUNT) {
|
||||||
if ( id >= DYNAMIC_KEYMAP_MACRO_COUNT ) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,23 +163,23 @@ void dynamic_keymap_macro_send( uint8_t id )
|
||||||
// If it's not zero, then we are in the middle
|
// If it's not zero, then we are in the middle
|
||||||
// of buffer writing, possibly an aborted buffer
|
// of buffer writing, possibly an aborted buffer
|
||||||
// write. So do nothing.
|
// write. So do nothing.
|
||||||
void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE-1);
|
void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE - 1);
|
||||||
if ( eeprom_read_byte(p) != 0 ) {
|
if (eeprom_read_byte(p) != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip N null characters
|
// Skip N null characters
|
||||||
// p will then point to the Nth macro
|
// p will then point to the Nth macro
|
||||||
p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
|
p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
|
||||||
void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
|
void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
|
||||||
while ( id > 0 ) {
|
while (id > 0) {
|
||||||
// If we are past the end of the buffer, then the buffer
|
// If we are past the end of the buffer, then the buffer
|
||||||
// contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT
|
// contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT
|
||||||
// nulls in the buffer.
|
// nulls in the buffer.
|
||||||
if ( p == end ) {
|
if (p == end) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ( eeprom_read_byte(p) == 0 ) {
|
if (eeprom_read_byte(p) == 0) {
|
||||||
--id;
|
--id;
|
||||||
}
|
}
|
||||||
++p;
|
++p;
|
||||||
|
@ -212,21 +187,21 @@ void dynamic_keymap_macro_send( uint8_t id )
|
||||||
|
|
||||||
// Send the macro string one or two chars at a time
|
// Send the macro string one or two chars at a time
|
||||||
// by making temporary 1 or 2 char strings
|
// by making temporary 1 or 2 char strings
|
||||||
char data[3] = { 0, 0, 0 };
|
char data[3] = {0, 0, 0};
|
||||||
// We already checked there was a null at the end of
|
// We already checked there was a null at the end of
|
||||||
// the buffer, so this cannot go past the end
|
// the buffer, so this cannot go past the end
|
||||||
while ( 1 ) {
|
while (1) {
|
||||||
data[0] = eeprom_read_byte(p++);
|
data[0] = eeprom_read_byte(p++);
|
||||||
data[1] = 0;
|
data[1] = 0;
|
||||||
// Stop at the null terminator of this macro string
|
// Stop at the null terminator of this macro string
|
||||||
if ( data[0] == 0 ) {
|
if (data[0] == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// If the char is magic (tap, down, up),
|
// If the char is magic (tap, down, up),
|
||||||
// add the next char (key to use) and send a 2 char string.
|
// add the next char (key to use) and send a 2 char string.
|
||||||
if ( data[0] == SS_TAP_CODE || data[0] == SS_DOWN_CODE || data[0] == SS_UP_CODE ) {
|
if (data[0] == SS_TAP_CODE || data[0] == SS_DOWN_CODE || data[0] == SS_UP_CODE) {
|
||||||
data[1] = eeprom_read_byte(p++);
|
data[1] = eeprom_read_byte(p++);
|
||||||
if ( data[1] == 0 ) {
|
if (data[1] == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -235,4 +210,3 @@ void dynamic_keymap_macro_send( uint8_t id )
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // DYNAMIC_KEYMAP_ENABLE
|
#endif // DYNAMIC_KEYMAP_ENABLE
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
uint8_t dynamic_keymap_get_layer_count(void);
|
uint8_t dynamic_keymap_get_layer_count(void);
|
||||||
void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column);
|
void * dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column);
|
||||||
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column);
|
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column);
|
||||||
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode);
|
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode);
|
||||||
void dynamic_keymap_reset(void);
|
void dynamic_keymap_reset(void);
|
||||||
|
@ -31,14 +31,12 @@ void dynamic_keymap_reset(void);
|
||||||
// This is only really useful for host applications that want to get a whole keymap fast,
|
// This is only really useful for host applications that want to get a whole keymap fast,
|
||||||
// by reading 14 keycodes (28 bytes) at a time, reducing the number of raw HID transfers by
|
// by reading 14 keycodes (28 bytes) at a time, reducing the number of raw HID transfers by
|
||||||
// a factor of 14.
|
// a factor of 14.
|
||||||
void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
void dynamic_keymap_get_buffer(uint16_t offset, uint16_t size, uint8_t *data);
|
||||||
void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
void dynamic_keymap_set_buffer(uint16_t offset, uint16_t size, uint8_t *data);
|
||||||
|
|
||||||
// This overrides the one in quantum/keymap_common.c
|
// This overrides the one in quantum/keymap_common.c
|
||||||
// uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
|
// uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Note regarding dynamic_keymap_macro_set_buffer():
|
// Note regarding dynamic_keymap_macro_set_buffer():
|
||||||
// The last byte of the buffer is used as a valid flag,
|
// The last byte of the buffer is used as a valid flag,
|
||||||
// so macro sending is disabled during writing a new buffer,
|
// so macro sending is disabled during writing a new buffer,
|
||||||
|
@ -55,9 +53,8 @@ void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
||||||
|
|
||||||
uint8_t dynamic_keymap_macro_get_count(void);
|
uint8_t dynamic_keymap_macro_get_count(void);
|
||||||
uint16_t dynamic_keymap_macro_get_buffer_size(void);
|
uint16_t dynamic_keymap_macro_get_buffer_size(void);
|
||||||
void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
void dynamic_keymap_macro_get_buffer(uint16_t offset, uint16_t size, uint8_t *data);
|
||||||
void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data );
|
void dynamic_keymap_macro_set_buffer(uint16_t offset, uint16_t size, uint8_t *data);
|
||||||
void dynamic_keymap_macro_reset(void);
|
void dynamic_keymap_macro_reset(void);
|
||||||
|
|
||||||
void dynamic_keymap_macro_send( uint8_t id );
|
void dynamic_keymap_macro_send(uint8_t id);
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
* there have been reports of it being too much in some users' cases,
|
* there have been reports of it being too much in some users' cases,
|
||||||
* so 128 is considered a safe default.
|
* so 128 is considered a safe default.
|
||||||
*/
|
*/
|
||||||
#define DYNAMIC_MACRO_SIZE 128
|
# define DYNAMIC_MACRO_SIZE 128
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* DYNAMIC_MACRO_RANGE must be set as the last element of user's
|
/* DYNAMIC_MACRO_RANGE must be set as the last element of user's
|
||||||
|
@ -46,8 +46,7 @@ enum dynamic_macro_keycodes {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Blink the LEDs to notify the user about some event. */
|
/* Blink the LEDs to notify the user about some event. */
|
||||||
void dynamic_macro_led_blink(void)
|
void dynamic_macro_led_blink(void) {
|
||||||
{
|
|
||||||
#ifdef BACKLIGHT_ENABLE
|
#ifdef BACKLIGHT_ENABLE
|
||||||
backlight_toggle();
|
backlight_toggle();
|
||||||
wait_ms(100);
|
wait_ms(100);
|
||||||
|
@ -59,10 +58,8 @@ void dynamic_macro_led_blink(void)
|
||||||
* need a `direction` variable accessible at the call site.
|
* need a `direction` variable accessible at the call site.
|
||||||
*/
|
*/
|
||||||
#define DYNAMIC_MACRO_CURRENT_SLOT() (direction > 0 ? 1 : 2)
|
#define DYNAMIC_MACRO_CURRENT_SLOT() (direction > 0 ? 1 : 2)
|
||||||
#define DYNAMIC_MACRO_CURRENT_LENGTH(BEGIN, POINTER) \
|
#define DYNAMIC_MACRO_CURRENT_LENGTH(BEGIN, POINTER) ((int)(direction * ((POINTER) - (BEGIN))))
|
||||||
((int)(direction * ((POINTER) - (BEGIN))))
|
#define DYNAMIC_MACRO_CURRENT_CAPACITY(BEGIN, END2) ((int)(direction * ((END2) - (BEGIN)) + 1))
|
||||||
#define DYNAMIC_MACRO_CURRENT_CAPACITY(BEGIN, END2) \
|
|
||||||
((int)(direction * ((END2) - (BEGIN)) + 1))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start recording of the dynamic macro.
|
* Start recording of the dynamic macro.
|
||||||
|
@ -70,9 +67,7 @@ void dynamic_macro_led_blink(void)
|
||||||
* @param[out] macro_pointer The new macro buffer iterator.
|
* @param[out] macro_pointer The new macro buffer iterator.
|
||||||
* @param[in] macro_buffer The macro buffer used to initialize macro_pointer.
|
* @param[in] macro_buffer The macro buffer used to initialize macro_pointer.
|
||||||
*/
|
*/
|
||||||
void dynamic_macro_record_start(
|
void dynamic_macro_record_start(keyrecord_t **macro_pointer, keyrecord_t *macro_buffer) {
|
||||||
keyrecord_t **macro_pointer, keyrecord_t *macro_buffer)
|
|
||||||
{
|
|
||||||
dprintln("dynamic macro recording: started");
|
dprintln("dynamic macro recording: started");
|
||||||
|
|
||||||
dynamic_macro_led_blink();
|
dynamic_macro_led_blink();
|
||||||
|
@ -89,9 +84,7 @@ void dynamic_macro_record_start(
|
||||||
* @param macro_end[in] The element after the last macro buffer element.
|
* @param macro_end[in] The element after the last macro buffer element.
|
||||||
* @param direction[in] Either +1 or -1, which way to iterate the buffer.
|
* @param direction[in] Either +1 or -1, which way to iterate the buffer.
|
||||||
*/
|
*/
|
||||||
void dynamic_macro_play(
|
void dynamic_macro_play(keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_t direction) {
|
||||||
keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_t direction)
|
|
||||||
{
|
|
||||||
dprintf("dynamic macro: slot %d playback\n", DYNAMIC_MACRO_CURRENT_SLOT());
|
dprintf("dynamic macro: slot %d playback\n", DYNAMIC_MACRO_CURRENT_SLOT());
|
||||||
|
|
||||||
uint32_t saved_layer_state = layer_state;
|
uint32_t saved_layer_state = layer_state;
|
||||||
|
@ -118,13 +111,7 @@ void dynamic_macro_play(
|
||||||
* @param direction[in] Either +1 or -1, which way to iterate the buffer.
|
* @param direction[in] Either +1 or -1, which way to iterate the buffer.
|
||||||
* @param record[in] The current keypress.
|
* @param record[in] The current keypress.
|
||||||
*/
|
*/
|
||||||
void dynamic_macro_record_key(
|
void dynamic_macro_record_key(keyrecord_t *macro_buffer, keyrecord_t **macro_pointer, keyrecord_t *macro2_end, int8_t direction, keyrecord_t *record) {
|
||||||
keyrecord_t *macro_buffer,
|
|
||||||
keyrecord_t **macro_pointer,
|
|
||||||
keyrecord_t *macro2_end,
|
|
||||||
int8_t direction,
|
|
||||||
keyrecord_t *record)
|
|
||||||
{
|
|
||||||
/* If we've just started recording, ignore all the key releases. */
|
/* If we've just started recording, ignore all the key releases. */
|
||||||
if (!record->event.pressed && *macro_pointer == macro_buffer) {
|
if (!record->event.pressed && *macro_pointer == macro_buffer) {
|
||||||
dprintln("dynamic macro: ignoring a leading key-up event");
|
dprintln("dynamic macro: ignoring a leading key-up event");
|
||||||
|
@ -141,38 +128,25 @@ void dynamic_macro_record_key(
|
||||||
dynamic_macro_led_blink();
|
dynamic_macro_led_blink();
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintf(
|
dprintf("dynamic macro: slot %d length: %d/%d\n", DYNAMIC_MACRO_CURRENT_SLOT(), DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, *macro_pointer), DYNAMIC_MACRO_CURRENT_CAPACITY(macro_buffer, macro2_end));
|
||||||
"dynamic macro: slot %d length: %d/%d\n",
|
|
||||||
DYNAMIC_MACRO_CURRENT_SLOT(),
|
|
||||||
DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, *macro_pointer),
|
|
||||||
DYNAMIC_MACRO_CURRENT_CAPACITY(macro_buffer, macro2_end));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End recording of the dynamic macro. Essentially just update the
|
* End recording of the dynamic macro. Essentially just update the
|
||||||
* pointer to the end of the macro.
|
* pointer to the end of the macro.
|
||||||
*/
|
*/
|
||||||
void dynamic_macro_record_end(
|
void dynamic_macro_record_end(keyrecord_t *macro_buffer, keyrecord_t *macro_pointer, int8_t direction, keyrecord_t **macro_end) {
|
||||||
keyrecord_t *macro_buffer,
|
|
||||||
keyrecord_t *macro_pointer,
|
|
||||||
int8_t direction,
|
|
||||||
keyrecord_t **macro_end)
|
|
||||||
{
|
|
||||||
dynamic_macro_led_blink();
|
dynamic_macro_led_blink();
|
||||||
|
|
||||||
/* Do not save the keys being held when stopping the recording,
|
/* Do not save the keys being held when stopping the recording,
|
||||||
* i.e. the keys used to access the layer DYN_REC_STOP is on.
|
* i.e. the keys used to access the layer DYN_REC_STOP is on.
|
||||||
*/
|
*/
|
||||||
while (macro_pointer != macro_buffer &&
|
while (macro_pointer != macro_buffer && (macro_pointer - direction)->event.pressed) {
|
||||||
(macro_pointer - direction)->event.pressed) {
|
|
||||||
dprintln("dynamic macro: trimming a trailing key-down event");
|
dprintln("dynamic macro: trimming a trailing key-down event");
|
||||||
macro_pointer -= direction;
|
macro_pointer -= direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintf(
|
dprintf("dynamic macro: slot %d saved, length: %d\n", DYNAMIC_MACRO_CURRENT_SLOT(), DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, macro_pointer));
|
||||||
"dynamic macro: slot %d saved, length: %d\n",
|
|
||||||
DYNAMIC_MACRO_CURRENT_SLOT(),
|
|
||||||
DYNAMIC_MACRO_CURRENT_LENGTH(macro_buffer, macro_pointer));
|
|
||||||
|
|
||||||
*macro_end = macro_pointer;
|
*macro_end = macro_pointer;
|
||||||
}
|
}
|
||||||
|
@ -187,8 +161,7 @@ void dynamic_macro_record_end(
|
||||||
* <...THE REST OF THE FUNCTION...>
|
* <...THE REST OF THE FUNCTION...>
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
bool process_record_dynamic_macro(uint16_t keycode, keyrecord_t *record)
|
bool process_record_dynamic_macro(uint16_t keycode, keyrecord_t *record) {
|
||||||
{
|
|
||||||
/* Both macros use the same buffer but read/write on different
|
/* Both macros use the same buffer but read/write on different
|
||||||
* ends of it.
|
* ends of it.
|
||||||
*
|
*
|
||||||
|
|
|
@ -17,27 +17,25 @@
|
||||||
|
|
||||||
#include "encoder.h"
|
#include "encoder.h"
|
||||||
#ifdef SPLIT_KEYBOARD
|
#ifdef SPLIT_KEYBOARD
|
||||||
#include "split_util.h"
|
# include "split_util.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// for memcpy
|
// for memcpy
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
#ifndef ENCODER_RESOLUTION
|
#ifndef ENCODER_RESOLUTION
|
||||||
#define ENCODER_RESOLUTION 4
|
# define ENCODER_RESOLUTION 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(ENCODERS_PAD_A) || !defined(ENCODERS_PAD_B)
|
#if !defined(ENCODERS_PAD_A) || !defined(ENCODERS_PAD_B)
|
||||||
#error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B"
|
# error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define NUMBER_OF_ENCODERS (sizeof(encoders_pad_a) / sizeof(pin_t))
|
||||||
#define NUMBER_OF_ENCODERS (sizeof(encoders_pad_a)/sizeof(pin_t))
|
|
||||||
static pin_t encoders_pad_a[] = ENCODERS_PAD_A;
|
static pin_t encoders_pad_a[] = ENCODERS_PAD_A;
|
||||||
static pin_t encoders_pad_b[] = ENCODERS_PAD_B;
|
static pin_t encoders_pad_b[] = ENCODERS_PAD_B;
|
||||||
|
|
||||||
static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 };
|
static int8_t encoder_LUT[] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
|
||||||
|
|
||||||
static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0};
|
static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0};
|
||||||
|
|
||||||
|
@ -48,13 +46,9 @@ static int8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0};
|
||||||
static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0};
|
static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) void encoder_update_user(int8_t index, bool clockwise) {}
|
||||||
void encoder_update_user(int8_t index, bool clockwise) { }
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) void encoder_update_kb(int8_t index, bool clockwise) { encoder_update_user(index, clockwise); }
|
||||||
void encoder_update_kb(int8_t index, bool clockwise) {
|
|
||||||
encoder_update_user(index, clockwise);
|
|
||||||
}
|
|
||||||
|
|
||||||
void encoder_init(void) {
|
void encoder_init(void) {
|
||||||
#if defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT)
|
#if defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT)
|
||||||
|
@ -92,9 +86,7 @@ void encoder_read(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SPLIT_KEYBOARD
|
#ifdef SPLIT_KEYBOARD
|
||||||
void encoder_state_raw(uint8_t* slave_state) {
|
void encoder_state_raw(uint8_t* slave_state) { memcpy(slave_state, encoder_state, sizeof(encoder_state)); }
|
||||||
memcpy(slave_state, encoder_state, sizeof(encoder_state));
|
|
||||||
}
|
|
||||||
|
|
||||||
void encoder_update_raw(uint8_t* slave_state) {
|
void encoder_update_raw(uint8_t* slave_state) {
|
||||||
for (int i = 0; i < NUMBER_OF_ENCODERS; i++) {
|
for (int i = 0; i < NUMBER_OF_ENCODERS; i++) {
|
||||||
|
|
|
@ -25,8 +25,7 @@ uint16_t note_start = 0;
|
||||||
bool note_playing = false;
|
bool note_playing = false;
|
||||||
uint16_t note_period = 0;
|
uint16_t note_period = 0;
|
||||||
|
|
||||||
void fauxclicky_init()
|
void fauxclicky_init() {
|
||||||
{
|
|
||||||
// Set port PC6 (OC3A and /OC4A) as output
|
// Set port PC6 (OC3A and /OC4A) as output
|
||||||
DDRC |= _BV(PORTC6);
|
DDRC |= _BV(PORTC6);
|
||||||
|
|
||||||
|
@ -35,8 +34,7 @@ void fauxclicky_init()
|
||||||
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fauxclicky_stop()
|
void fauxclicky_stop() {
|
||||||
{
|
|
||||||
FAUXCLICKY_DISABLE_OUTPUT;
|
FAUXCLICKY_DISABLE_OUTPUT;
|
||||||
note_playing = false;
|
note_playing = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,18 +14,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef AUDIO_ENABLE
|
#ifdef AUDIO_ENABLE
|
||||||
#error "AUDIO_ENABLE and FAUXCLICKY_ENABLE cannot be both enabled"
|
# error "AUDIO_ENABLE and FAUXCLICKY_ENABLE cannot be both enabled"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "musical_notes.h"
|
#include "musical_notes.h"
|
||||||
#include "stdbool.h"
|
#include "stdbool.h"
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_D4, 0.25);
|
||||||
float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_D4, 0.25);
|
__attribute__((weak)) float fauxclicky_released_note[2] = MUSICAL_NOTE(_C4, 0.125);
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) float fauxclicky_beep_note[2] = MUSICAL_NOTE(_C4, 0.25);
|
||||||
float fauxclicky_released_note[2] = MUSICAL_NOTE(_C4, 0.125);
|
|
||||||
__attribute__ ((weak))
|
|
||||||
float fauxclicky_beep_note[2] = MUSICAL_NOTE(_C4, 0.25);
|
|
||||||
|
|
||||||
bool fauxclicky_enabled;
|
bool fauxclicky_enabled;
|
||||||
|
|
||||||
|
@ -34,7 +31,7 @@ bool fauxclicky_enabled;
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef FAUXCLICKY_TEMPO
|
#ifndef FAUXCLICKY_TEMPO
|
||||||
#define FAUXCLICKY_TEMPO TEMPO_DEFAULT
|
# define FAUXCLICKY_TEMPO TEMPO_DEFAULT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// beep on press
|
// beep on press
|
||||||
|
@ -50,42 +47,44 @@ bool fauxclicky_enabled;
|
||||||
#define FAUXCLICKY_ON fauxclicky_enabled = true
|
#define FAUXCLICKY_ON fauxclicky_enabled = true
|
||||||
|
|
||||||
// disable
|
// disable
|
||||||
#define FAUXCLICKY_OFF do { \
|
#define FAUXCLICKY_OFF \
|
||||||
|
do { \
|
||||||
fauxclicky_enabled = false; \
|
fauxclicky_enabled = false; \
|
||||||
fauxclicky_stop(); \
|
fauxclicky_stop(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
// toggle
|
// toggle
|
||||||
#define FAUXCLICKY_TOGGLE do { \
|
#define FAUXCLICKY_TOGGLE \
|
||||||
|
do { \
|
||||||
if (fauxclicky_enabled) { \
|
if (fauxclicky_enabled) { \
|
||||||
FAUXCLICKY_OFF; \
|
FAUXCLICKY_OFF; \
|
||||||
} else { \
|
} else { \
|
||||||
FAUXCLICKY_ON; \
|
FAUXCLICKY_ON; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
//
|
//
|
||||||
// pin configuration
|
// pin configuration
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef FAUXCLICKY_CPU_PRESCALER
|
#ifndef FAUXCLICKY_CPU_PRESCALER
|
||||||
#define FAUXCLICKY_CPU_PRESCALER 8
|
# define FAUXCLICKY_CPU_PRESCALER 8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FAUXCLICKY_ENABLE_OUTPUT
|
#ifndef FAUXCLICKY_ENABLE_OUTPUT
|
||||||
#define FAUXCLICKY_ENABLE_OUTPUT TCCR3A |= _BV(COM3A1)
|
# define FAUXCLICKY_ENABLE_OUTPUT TCCR3A |= _BV(COM3A1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FAUXCLICKY_DISABLE_OUTPUT
|
#ifndef FAUXCLICKY_DISABLE_OUTPUT
|
||||||
#define FAUXCLICKY_DISABLE_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0))
|
# define FAUXCLICKY_DISABLE_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FAUXCLICKY_TIMER_PERIOD
|
#ifndef FAUXCLICKY_TIMER_PERIOD
|
||||||
#define FAUXCLICKY_TIMER_PERIOD ICR3
|
# define FAUXCLICKY_TIMER_PERIOD ICR3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FAUXCLICKY_DUTY_CYCLE
|
#ifndef FAUXCLICKY_DUTY_CYCLE
|
||||||
#define FAUXCLICKY_DUTY_CYCLE OCR3A
|
# define FAUXCLICKY_DUTY_CYCLE OCR3A
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -96,4 +95,3 @@ void fauxclicky_init(void);
|
||||||
void fauxclicky_stop(void);
|
void fauxclicky_stop(void);
|
||||||
void fauxclicky_play(float note[2]);
|
void fauxclicky_play(float note[2]);
|
||||||
void fauxclicky_check(void);
|
void fauxclicky_check(void);
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@ extern keymap_config_t keymap_config;
|
||||||
* and will return the corrected keycode, when appropriate.
|
* and will return the corrected keycode, when appropriate.
|
||||||
*/
|
*/
|
||||||
uint16_t keycode_config(uint16_t keycode) {
|
uint16_t keycode_config(uint16_t keycode) {
|
||||||
|
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
case KC_CAPSLOCK:
|
case KC_CAPSLOCK:
|
||||||
case KC_LOCKING_CAPS:
|
case KC_LOCKING_CAPS:
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include "action_code.h"
|
#include "action_code.h"
|
||||||
|
|
||||||
#ifndef KEYCODE_CONFIG_H
|
#ifndef KEYCODE_CONFIG_H
|
||||||
#define KEYCODE_CONFIG_H
|
# define KEYCODE_CONFIG_H
|
||||||
|
|
||||||
uint16_t keycode_config(uint16_t keycode);
|
uint16_t keycode_config(uint16_t keycode);
|
||||||
uint8_t mod_config(uint8_t mod);
|
uint8_t mod_config(uint8_t mod);
|
||||||
|
@ -28,16 +28,16 @@ uint8_t mod_config(uint8_t mod);
|
||||||
typedef union {
|
typedef union {
|
||||||
uint16_t raw;
|
uint16_t raw;
|
||||||
struct {
|
struct {
|
||||||
bool swap_control_capslock:1;
|
bool swap_control_capslock : 1;
|
||||||
bool capslock_to_control:1;
|
bool capslock_to_control : 1;
|
||||||
bool swap_lalt_lgui:1;
|
bool swap_lalt_lgui : 1;
|
||||||
bool swap_ralt_rgui:1;
|
bool swap_ralt_rgui : 1;
|
||||||
bool no_gui:1;
|
bool no_gui : 1;
|
||||||
bool swap_grave_esc:1;
|
bool swap_grave_esc : 1;
|
||||||
bool swap_backslash_backspace:1;
|
bool swap_backslash_backspace : 1;
|
||||||
bool nkro:1;
|
bool nkro : 1;
|
||||||
bool swap_lctl_lgui:1;
|
bool swap_lctl_lgui : 1;
|
||||||
bool swap_rctl_rgui:1;
|
bool swap_rctl_rgui : 1;
|
||||||
};
|
};
|
||||||
} keymap_config_t;
|
} keymap_config_t;
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "action.h"
|
#include "action.h"
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <avr/pgmspace.h>
|
# include <avr/pgmspace.h>
|
||||||
#elif defined PROTOCOL_CHIBIOS
|
#elif defined PROTOCOL_CHIBIOS
|
||||||
//We need to ensure that chibios is include before redefining reset
|
// We need to ensure that chibios is include before redefining reset
|
||||||
#include "ch.h"
|
# include "ch.h"
|
||||||
#endif
|
#endif
|
||||||
#include "keycode.h"
|
#include "keycode.h"
|
||||||
#include "action_macro.h"
|
#include "action_macro.h"
|
||||||
|
@ -38,7 +38,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
// ChibiOS uses RESET in its FlagStatus enumeration
|
// ChibiOS uses RESET in its FlagStatus enumeration
|
||||||
// Therefore define it as QK_RESET here, to avoid name collision
|
// Therefore define it as QK_RESET here, to avoid name collision
|
||||||
#if defined(PROTOCOL_CHIBIOS)
|
#if defined(PROTOCOL_CHIBIOS)
|
||||||
#define RESET QK_RESET
|
# define RESET QK_RESET
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "quantum_keycodes.h"
|
#include "quantum_keycodes.h"
|
||||||
|
@ -47,10 +47,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
|
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
|
||||||
|
|
||||||
// translates function id to action
|
// translates function id to action
|
||||||
uint16_t keymap_function_id_to_action( uint16_t function_id );
|
uint16_t keymap_function_id_to_action(uint16_t function_id);
|
||||||
|
|
||||||
extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
||||||
extern const uint16_t fn_actions[];
|
extern const uint16_t fn_actions[];
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#include "keycode.h"
|
#include "keycode.h"
|
||||||
#include "action_layer.h"
|
#include "action_layer.h"
|
||||||
#if defined(__AVR__)
|
#if defined(__AVR__)
|
||||||
#include <util/delay.h>
|
# include <util/delay.h>
|
||||||
#include <stdio.h>
|
# include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
#include "action.h"
|
#include "action.h"
|
||||||
#include "action_macro.h"
|
#include "action_macro.h"
|
||||||
|
@ -30,7 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
#ifdef MIDI_ENABLE
|
#ifdef MIDI_ENABLE
|
||||||
#include "process_midi.h"
|
# include "process_midi.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern keymap_config_t keymap_config;
|
extern keymap_config_t keymap_config;
|
||||||
|
@ -38,8 +38,7 @@ extern keymap_config_t keymap_config;
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
/* converts key to action */
|
/* converts key to action */
|
||||||
action_t action_for_key(uint8_t layer, keypos_t key)
|
action_t action_for_key(uint8_t layer, keypos_t key) {
|
||||||
{
|
|
||||||
// 16bit keycodes - important
|
// 16bit keycodes - important
|
||||||
uint16_t keycode = keymap_key_to_keycode(layer, key);
|
uint16_t keycode = keymap_key_to_keycode(layer, key);
|
||||||
|
|
||||||
|
@ -69,15 +68,15 @@ action_t action_for_key(uint8_t layer, keypos_t key)
|
||||||
case KC_TRNS:
|
case KC_TRNS:
|
||||||
action.code = ACTION_TRANSPARENT;
|
action.code = ACTION_TRANSPARENT;
|
||||||
break;
|
break;
|
||||||
case QK_MODS ... QK_MODS_MAX: ;
|
case QK_MODS ... QK_MODS_MAX:;
|
||||||
// Has a modifier
|
// Has a modifier
|
||||||
// Split it up
|
// Split it up
|
||||||
action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
|
action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
|
||||||
break;
|
break;
|
||||||
case QK_FUNCTION ... QK_FUNCTION_MAX: ;
|
case QK_FUNCTION ... QK_FUNCTION_MAX:;
|
||||||
// Is a shortcut for function action_layer, pull last 12bits
|
// Is a shortcut for function action_layer, pull last 12bits
|
||||||
// This means we have 4,096 FN macros at our disposal
|
// This means we have 4,096 FN macros at our disposal
|
||||||
action.code = keymap_function_id_to_action( (int)keycode & 0xFFF );
|
action.code = keymap_function_id_to_action((int)keycode & 0xFFF);
|
||||||
break;
|
break;
|
||||||
case QK_MACRO ... QK_MACRO_MAX:
|
case QK_MACRO ... QK_MACRO_MAX:
|
||||||
if (keycode & 0x800) // tap macros have upper bit set
|
if (keycode & 0x800) // tap macros have upper bit set
|
||||||
|
@ -88,33 +87,33 @@ action_t action_for_key(uint8_t layer, keypos_t key)
|
||||||
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
|
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
|
||||||
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
|
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
|
||||||
break;
|
break;
|
||||||
case QK_TO ... QK_TO_MAX: ;
|
case QK_TO ... QK_TO_MAX:;
|
||||||
// Layer set "GOTO"
|
// Layer set "GOTO"
|
||||||
when = (keycode >> 0x4) & 0x3;
|
when = (keycode >> 0x4) & 0x3;
|
||||||
action_layer = keycode & 0xF;
|
action_layer = keycode & 0xF;
|
||||||
action.code = ACTION_LAYER_SET(action_layer, when);
|
action.code = ACTION_LAYER_SET(action_layer, when);
|
||||||
break;
|
break;
|
||||||
case QK_MOMENTARY ... QK_MOMENTARY_MAX: ;
|
case QK_MOMENTARY ... QK_MOMENTARY_MAX:;
|
||||||
// Momentary action_layer
|
// Momentary action_layer
|
||||||
action_layer = keycode & 0xFF;
|
action_layer = keycode & 0xFF;
|
||||||
action.code = ACTION_LAYER_MOMENTARY(action_layer);
|
action.code = ACTION_LAYER_MOMENTARY(action_layer);
|
||||||
break;
|
break;
|
||||||
case QK_DEF_LAYER ... QK_DEF_LAYER_MAX: ;
|
case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:;
|
||||||
// Set default action_layer
|
// Set default action_layer
|
||||||
action_layer = keycode & 0xFF;
|
action_layer = keycode & 0xFF;
|
||||||
action.code = ACTION_DEFAULT_LAYER_SET(action_layer);
|
action.code = ACTION_DEFAULT_LAYER_SET(action_layer);
|
||||||
break;
|
break;
|
||||||
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: ;
|
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:;
|
||||||
// Set toggle
|
// Set toggle
|
||||||
action_layer = keycode & 0xFF;
|
action_layer = keycode & 0xFF;
|
||||||
action.code = ACTION_LAYER_TOGGLE(action_layer);
|
action.code = ACTION_LAYER_TOGGLE(action_layer);
|
||||||
break;
|
break;
|
||||||
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: ;
|
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:;
|
||||||
// OSL(action_layer) - One-shot action_layer
|
// OSL(action_layer) - One-shot action_layer
|
||||||
action_layer = keycode & 0xFF;
|
action_layer = keycode & 0xFF;
|
||||||
action.code = ACTION_LAYER_ONESHOT(action_layer);
|
action.code = ACTION_LAYER_ONESHOT(action_layer);
|
||||||
break;
|
break;
|
||||||
case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: ;
|
case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:;
|
||||||
// OSM(mod) - One-shot mod
|
// OSM(mod) - One-shot mod
|
||||||
mod = mod_config(keycode & 0xFF);
|
mod = mod_config(keycode & 0xFF);
|
||||||
action.code = ACTION_MODS_ONESHOT(mod);
|
action.code = ACTION_MODS_ONESHOT(mod);
|
||||||
|
@ -131,7 +130,7 @@ action_t action_for_key(uint8_t layer, keypos_t key)
|
||||||
mod = mod_config((keycode >> 0x8) & 0x1F);
|
mod = mod_config((keycode >> 0x8) & 0x1F);
|
||||||
action.code = ACTION_MODS_TAP_KEY(mod, keycode & 0xFF);
|
action.code = ACTION_MODS_TAP_KEY(mod, keycode & 0xFF);
|
||||||
break;
|
break;
|
||||||
#ifdef BACKLIGHT_ENABLE
|
#ifdef BACKLIGHT_ENABLE
|
||||||
case BL_ON:
|
case BL_ON:
|
||||||
action.code = ACTION_BACKLIGHT_ON();
|
action.code = ACTION_BACKLIGHT_ON();
|
||||||
break;
|
break;
|
||||||
|
@ -150,12 +149,12 @@ action_t action_for_key(uint8_t layer, keypos_t key)
|
||||||
case BL_STEP:
|
case BL_STEP:
|
||||||
action.code = ACTION_BACKLIGHT_STEP();
|
action.code = ACTION_BACKLIGHT_STEP();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef SWAP_HANDS_ENABLE
|
#ifdef SWAP_HANDS_ENABLE
|
||||||
case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
|
case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
|
||||||
action.code = ACTION(ACT_SWAP_HANDS, keycode & 0xff);
|
action.code = ACTION(ACT_SWAP_HANDS, keycode & 0xff);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
action.code = ACTION_NO;
|
action.code = ACTION_NO;
|
||||||
|
@ -164,42 +163,30 @@ action_t action_for_key(uint8_t layer, keypos_t key)
|
||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) const uint16_t PROGMEM fn_actions[] = {
|
||||||
const uint16_t PROGMEM fn_actions[] = {
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Macro */
|
/* Macro */
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; }
|
||||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
|
||||||
{
|
|
||||||
return MACRO_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Function */
|
/* Function */
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {}
|
||||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// translates key to keycode
|
// translates key to keycode
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) {
|
||||||
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
|
|
||||||
{
|
|
||||||
// Read entire word (16bits)
|
// Read entire word (16bits)
|
||||||
return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
|
return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// translates function id to action
|
// translates function id to action
|
||||||
__attribute__ ((weak))
|
__attribute__((weak)) uint16_t keymap_function_id_to_action(uint16_t function_id) {
|
||||||
uint16_t keymap_function_id_to_action( uint16_t function_id )
|
// The compiler sees the empty (weak) fn_actions and generates a warning
|
||||||
{
|
// This function should not be called in that case, so the warning is too strict
|
||||||
// The compiler sees the empty (weak) fn_actions and generates a warning
|
// If this function is called however, the keymap should have overridden fn_actions, and then the compile
|
||||||
// This function should not be called in that case, so the warning is too strict
|
// is comparing against the wrong array
|
||||||
// If this function is called however, the keymap should have overridden fn_actions, and then the compile
|
#pragma GCC diagnostic push
|
||||||
// is comparing against the wrong array
|
#pragma GCC diagnostic ignored "-Warray-bounds"
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Warray-bounds"
|
|
||||||
return pgm_read_word(&fn_actions[function_id]);
|
return pgm_read_word(&fn_actions[function_id]);
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
|
|
||||||
#ifndef GR2A
|
#ifndef GR2A
|
||||||
#define GR2A(kc) RCTL(kc)
|
# define GR2A(kc) RCTL(kc)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Normal characters
|
// Normal characters
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#define CH_G KC_G
|
#define CH_G KC_G
|
||||||
#ifdef CH_H
|
#ifdef CH_H
|
||||||
// The ChibiOS ch.h file defines this...
|
// The ChibiOS ch.h file defines this...
|
||||||
#undef CH_H
|
# undef CH_H
|
||||||
#endif
|
#endif
|
||||||
#define CH_H KC_H
|
#define CH_H KC_H
|
||||||
#define CH_I KC_I
|
#define CH_I KC_I
|
||||||
|
|
|
@ -128,7 +128,7 @@
|
||||||
#define HU_HASH ALGR(HU_X) // #
|
#define HU_HASH ALGR(HU_X) // #
|
||||||
#define HU_AMPR ALGR(HU_C) // &
|
#define HU_AMPR ALGR(HU_C) // &
|
||||||
#define HU_AT ALGR(HU_V) // @
|
#define HU_AT ALGR(HU_V) // @
|
||||||
#define HU_LCBR ALGR(HU_B)// {
|
#define HU_LCBR ALGR(HU_B) // {
|
||||||
#define HU_RCBR ALGR(HU_N) // }
|
#define HU_RCBR ALGR(HU_N) // }
|
||||||
#define HU_SCLN ALGR(HU_COMM) // ;
|
#define HU_SCLN ALGR(HU_COMM) // ;
|
||||||
#define HU_ASTR ALGR(HU_MINS) // *
|
#define HU_ASTR ALGR(HU_MINS) // *
|
||||||
|
|
|
@ -70,11 +70,8 @@
|
||||||
|
|
||||||
#define IT_APOS KC_MINS // ', ?, ,
|
#define IT_APOS KC_MINS // ', ?, ,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define IT_BKSL KC_GRAVE // backslash \, |
|
#define IT_BKSL KC_GRAVE // backslash \, |
|
||||||
|
|
||||||
|
|
||||||
#define IT_ACUT // accent acute ´ and grave `
|
#define IT_ACUT // accent acute ´ and grave `
|
||||||
|
|
||||||
#define IT_LESS KC_NUBS // < and > and |
|
#define IT_LESS KC_NUBS // < and > and |
|
||||||
|
|
|
@ -20,14 +20,11 @@
|
||||||
* note: This website is written in Japanese.
|
* note: This website is written in Japanese.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef KEYMAP_JP_H
|
#ifndef KEYMAP_JP_H
|
||||||
#define KEYMAP_JP_H
|
#define KEYMAP_JP_H
|
||||||
|
|
||||||
|
|
||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
|
|
||||||
|
|
||||||
#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi
|
#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi
|
||||||
#define JP_YEN KC_INT3 // yen, |
|
#define JP_YEN KC_INT3 // yen, |
|
||||||
#define JP_CIRC KC_EQL // ^, ~
|
#define JP_CIRC KC_EQL // ^, ~
|
||||||
|
@ -40,11 +37,10 @@
|
||||||
#define JP_HENK KC_INT4 // henkan
|
#define JP_HENK KC_INT4 // henkan
|
||||||
#define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi
|
#define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi
|
||||||
|
|
||||||
#define JP_MKANA KC_LANG1 //kana on MacOSX
|
#define JP_MKANA KC_LANG1 // kana on MacOSX
|
||||||
#define JP_MEISU KC_LANG2 //eisu on MacOSX
|
#define JP_MEISU KC_LANG2 // eisu on MacOSX
|
||||||
|
|
||||||
|
// Aliases for shifted symbols
|
||||||
//Aliases for shifted symbols
|
|
||||||
#define JP_DQT LSFT(KC_2) // "
|
#define JP_DQT LSFT(KC_2) // "
|
||||||
#define JP_AMPR LSFT(KC_6) // &
|
#define JP_AMPR LSFT(KC_6) // &
|
||||||
#define JP_QUOT LSFT(KC_7) // '
|
#define JP_QUOT LSFT(KC_7) // '
|
||||||
|
@ -60,7 +56,6 @@
|
||||||
#define JP_RCBR LSFT(JP_RBRC) // }
|
#define JP_RCBR LSFT(JP_RBRC) // }
|
||||||
#define JP_UNDS LSFT(JP_BSLS) // _
|
#define JP_UNDS LSFT(JP_BSLS) // _
|
||||||
|
|
||||||
|
|
||||||
// These symbols are correspond to US101-layout.
|
// These symbols are correspond to US101-layout.
|
||||||
#define JP_MINS KC_MINS // -
|
#define JP_MINS KC_MINS // -
|
||||||
#define JP_SCLN KC_SCLN // ;
|
#define JP_SCLN KC_SCLN // ;
|
||||||
|
@ -76,5 +71,4 @@
|
||||||
#define JP_GT KC_GT // >
|
#define JP_GT KC_GT // >
|
||||||
#define JP_QUES KC_QUES // ?
|
#define JP_QUES KC_QUES // ?
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -51,4 +51,3 @@
|
||||||
#define NM_COMM KC_COMM
|
#define NM_COMM KC_COMM
|
||||||
#define NM_DOT KC_DOT
|
#define NM_DOT KC_DOT
|
||||||
#define NM_SLSH KC_SLSH
|
#define NM_SLSH KC_SLSH
|
||||||
|
|
||||||
|
|
|
@ -20,11 +20,11 @@
|
||||||
|
|
||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
|
|
||||||
//Swapped Z and Y
|
// Swapped Z and Y
|
||||||
#define SI_Z KC_Y
|
#define SI_Z KC_Y
|
||||||
#define SI_Y KC_Z
|
#define SI_Y KC_Z
|
||||||
|
|
||||||
//Special characters
|
// Special characters
|
||||||
#define SI_CV KC_SCLN
|
#define SI_CV KC_SCLN
|
||||||
#define SI_SV KC_LBRC
|
#define SI_SV KC_LBRC
|
||||||
#define SI_ZV KC_BSLS
|
#define SI_ZV KC_BSLS
|
||||||
|
|
|
@ -20,45 +20,13 @@
|
||||||
|
|
||||||
#include "keymap_belgian.h"
|
#include "keymap_belgian.h"
|
||||||
|
|
||||||
const bool ascii_to_shift_lut[128] PROGMEM = {
|
const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 0, 0, 0, 0, 1, 0, 0,
|
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
0, 0, 1, 1, 0, 0, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 0, 0, 0, 0, 1, 1,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 0, 0, 0, 0, 1,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const bool ascii_to_altgr_lut[128] PROGMEM = {
|
const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 0, 0, 1, 0, 0, 0, 0,
|
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 0,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// NUL SOH STX ETX EOT ENQ ACK BEL
|
// NUL SOH STX ETX EOT ENQ ACK BEL
|
||||||
|
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
KC_P, BE_Q, KC_R, KC_S, KC_T, KC_U, KC_V, BE_W,
|
KC_P, BE_Q, KC_R, KC_S, KC_T, KC_U, KC_V, BE_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
KC_X, KC_Y, BE_Z, BE_CCED, BE_AMP, BE_AGRV, BE_EQL, KC_DEL
|
KC_X, KC_Y, BE_Z, BE_CCED, BE_AMP, BE_AGRV, BE_EQL, KC_DEL};
|
||||||
};
|
|
||||||
|
|
|
@ -20,45 +20,13 @@
|
||||||
|
|
||||||
#include "keymap_bepo.h"
|
#include "keymap_bepo.h"
|
||||||
|
|
||||||
const bool ascii_to_shift_lut[128] PROGMEM = {
|
const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 1, 0, 1, 0, 0, 0, 0,
|
0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 0, 0, 0, 1,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 0, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const bool ascii_to_altgr_lut[128] PROGMEM = {
|
const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 0, 0, 0, 0, 0, 1, 0,
|
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 1, 0, 1, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 1,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// NUL SOH STX ETX EOT ENQ ACK BEL
|
// NUL SOH STX ETX EOT ENQ ACK BEL
|
||||||
|
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
BP_P, BP_Q, BP_R, BP_S, BP_T, BP_U, BP_V, BP_W,
|
BP_P, BP_Q, BP_R, BP_S, BP_T, BP_U, BP_V, BP_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
BP_X, BP_Y, BP_Z, BP_Y, BP_B, BP_X, BP_K, KC_DEL
|
BP_X, BP_Y, BP_Z, BP_Y, BP_B, BP_X, BP_K, KC_DEL};
|
||||||
};
|
|
||||||
|
|
|
@ -53,5 +53,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
|
CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
|
CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL};
|
||||||
};
|
|
||||||
|
|
|
@ -53,5 +53,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
|
DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_GRV, KC_DEL
|
DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_GRV, KC_DEL};
|
||||||
};
|
|
||||||
|
|
|
@ -20,45 +20,13 @@
|
||||||
|
|
||||||
#include "keymap_french.h"
|
#include "keymap_french.h"
|
||||||
|
|
||||||
const bool ascii_to_shift_lut[128] PROGMEM = {
|
const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 0, 0, 0, 0, 1, 0, 0,
|
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
0, 0, 0, 1, 0, 0, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 0, 0, 0, 0, 1, 1,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const bool ascii_to_altgr_lut[128] PROGMEM = {
|
const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 0, 0, 1, 0, 0, 0, 0,
|
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 0,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// NUL SOH STX ETX EOT ENQ ACK BEL
|
// NUL SOH STX ETX EOT ENQ ACK BEL
|
||||||
|
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
KC_P, FR_Q, KC_R, KC_S, KC_T, KC_U, KC_V, FR_W,
|
KC_P, FR_Q, KC_R, KC_S, KC_T, KC_U, KC_V, FR_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
KC_X, KC_Y, FR_Z, FR_APOS, FR_MINS, FR_EQL, FR_EACU, KC_DEL
|
KC_X, KC_Y, FR_Z, FR_APOS, FR_MINS, FR_EQL, FR_EACU, KC_DEL};
|
||||||
};
|
|
||||||
|
|
|
@ -20,45 +20,13 @@
|
||||||
|
|
||||||
#include "keymap_german.h"
|
#include "keymap_german.h"
|
||||||
|
|
||||||
const bool ascii_to_shift_lut[128] PROGMEM = {
|
const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 1, 1, 0, 1, 1, 1, 1,
|
0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
1, 1, 1, 0, 0, 0, 0, 1,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 1, 1, 0, 1, 1, 1,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 0, 0, 0, 0, 1,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const bool ascii_to_altgr_lut[128] PROGMEM = {
|
const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// NUL SOH STX ETX EOT ENQ ACK BEL
|
// NUL SOH STX ETX EOT ENQ ACK BEL
|
||||||
|
@ -93,5 +61,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
DE_P, DE_Q, DE_R, DE_S, DE_T, DE_U, DE_V, DE_W,
|
DE_P, DE_Q, DE_R, DE_S, DE_T, DE_U, DE_V, DE_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
DE_X, DE_Y, DE_Z, DE_7, DE_LESS, DE_0, DE_PLUS, KC_DEL
|
DE_X, DE_Y, DE_Z, DE_7, DE_LESS, DE_0, DE_PLUS, KC_DEL};
|
||||||
};
|
|
||||||
|
|
|
@ -20,25 +20,9 @@
|
||||||
|
|
||||||
#include "keymap_jp.h"
|
#include "keymap_jp.h"
|
||||||
|
|
||||||
const bool ascii_to_shift_lut[128] PROGMEM = {
|
const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1,
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
|
||||||
1, 1, 1, 1, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 1, 1, 1, 1,
|
|
||||||
0, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 0, 0, 0, 0, 1,
|
|
||||||
1, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 1, 1, 1, 1, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// NUL SOH STX ETX EOT ENQ ACK BEL
|
// NUL SOH STX ETX EOT ENQ ACK BEL
|
||||||
|
@ -73,5 +57,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
|
KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
KC_X, KC_Y, KC_Z, JP_LBRC, JP_YEN, JP_RBRC, JP_CIRC, KC_DEL
|
KC_X, KC_Y, KC_Z, JP_LBRC, JP_YEN, JP_RBRC, JP_CIRC, KC_DEL};
|
||||||
};
|
|
||||||
|
|
|
@ -53,5 +53,4 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
|
||||||
// p q r s t u v w
|
// p q r s t u v w
|
||||||
NM_P, NM_Q, NM_R, NM_S, NM_T, NM_U, NM_V, NM_W,
|
NM_P, NM_Q, NM_R, NM_S, NM_T, NM_U, NM_V, NM_W,
|
||||||
// x y z { | } ~ DEL
|
// x y z { | } ~ DEL
|
||||||
NM_X, NM_Y, NM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
|
NM_X, NM_Y, NM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL};
|
||||||
};
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue