From a522b1f15627c69f94cbc814968be5a63519b8e3 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 16 Jan 2024 13:26:40 +1100 Subject: i2c: rename read/write register functions (#22905) --- platforms/avr/drivers/i2c_master.c | 8 ++++---- platforms/avr/drivers/i2c_master.h | 15 +++++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) (limited to 'platforms/avr') diff --git a/platforms/avr/drivers/i2c_master.c b/platforms/avr/drivers/i2c_master.c index 58939f3e00..0183103707 100644 --- a/platforms/avr/drivers/i2c_master.c +++ b/platforms/avr/drivers/i2c_master.c @@ -189,7 +189,7 @@ i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16 return (status < 0) ? status : I2C_STATUS_SUCCESS; } -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_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { i2c_status_t status = i2c_start(devaddr | 0x00, timeout); if (status >= 0) { status = i2c_write(regaddr, timeout); @@ -204,7 +204,7 @@ i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, return status; } -i2c_status_t i2c_writeReg16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { +i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { i2c_status_t status = i2c_start(devaddr | 0x00, timeout); if (status >= 0) { status = i2c_write(regaddr >> 8, timeout); @@ -223,7 +223,7 @@ i2c_status_t i2c_writeReg16(uint8_t devaddr, uint16_t regaddr, const uint8_t* da return 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_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) { i2c_status_t status = i2c_start(devaddr, timeout); if (status < 0) { goto error; @@ -256,7 +256,7 @@ error: return (status < 0) ? status : I2C_STATUS_SUCCESS; } -i2c_status_t i2c_readReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) { +i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) { i2c_status_t status = i2c_start(devaddr, timeout); if (status < 0) { goto error; diff --git a/platforms/avr/drivers/i2c_master.h b/platforms/avr/drivers/i2c_master.h index 04ef126c80..18587c4a57 100644 --- a/platforms/avr/drivers/i2c_master.h +++ b/platforms/avr/drivers/i2c_master.h @@ -21,6 +21,13 @@ #include +// ### DEPRECATED - DO NOT USE ### +#define i2c_writeReg(devaddr, regaddr, data, length, timeout) i2c_write_register(devaddr, regaddr, data, length, timeout) +#define i2c_writeReg16(devaddr, regaddr, data, length, timeout) i2c_write_register16(devaddr, regaddr, data, length, timeout) +#define i2c_readReg(devaddr, regaddr, data, length, timeout) i2c_read_register(devaddr, regaddr, data, length, timeout) +#define i2c_readReg16(devaddr, regaddr, data, length, timeout) i2c_read_register16(devaddr, regaddr, data, length, timeout) +// ############################### + #define I2C_READ 0x01 #define I2C_WRITE 0x00 @@ -40,8 +47,8 @@ int16_t i2c_read_ack(uint16_t timeout); int16_t i2c_read_nack(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_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_writeReg16(uint8_t devaddr, uint16_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_readReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); +i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); +i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); +i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); +i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); void i2c_stop(void); -- cgit v1.2.3 From e9bd7d7ad308f9c72c86863bf9f19382c7e2d892 Mon Sep 17 00:00:00 2001 From: David Hoelscher Date: Wed, 17 Jan 2024 07:05:38 -0600 Subject: I2C driver cleanup (#21273) * remove i2c_start and i2c_stop from i2c drivers * remove static i2c_address variable from chibios i2c driver --- platforms/avr/drivers/i2c_master.c | 31 +++++++++++++++++++++++++------ platforms/avr/drivers/i2c_master.h | 7 ++----- 2 files changed, 27 insertions(+), 11 deletions(-) (limited to 'platforms/avr') diff --git a/platforms/avr/drivers/i2c_master.c b/platforms/avr/drivers/i2c_master.c index 0183103707..64083d862a 100644 --- a/platforms/avr/drivers/i2c_master.c +++ b/platforms/avr/drivers/i2c_master.c @@ -24,6 +24,7 @@ #include "timer.h" #include "wait.h" #include "util.h" +#include "progmem.h" #ifndef F_SCL # define F_SCL 400000UL // SCL frequency @@ -38,7 +39,7 @@ #define TWBR_val (((F_CPU / F_SCL) - 16) / 2) -void i2c_init(void) { +__attribute__((weak)) void i2c_init(void) { TWSR = 0; /* no prescaler */ TWBR = (uint8_t)TWBR_val; @@ -94,7 +95,7 @@ static i2c_status_t i2c_start_impl(uint8_t address, uint16_t timeout) { return I2C_STATUS_SUCCESS; } -i2c_status_t i2c_start(uint8_t address, uint16_t timeout) { +__attribute__((always_inline)) static inline i2c_status_t i2c_start(uint8_t address, uint16_t timeout) { // Retry i2c_start_impl a bunch times in case the remote side has interrupts disabled. uint16_t timeout_timer = timer_read(); uint16_t time_slice = MAX(1, (timeout == (I2C_TIMEOUT_INFINITE)) ? 5 : (timeout / (I2C_START_RETRY_COUNT))); // if it's infinite, wait 1ms between attempts, otherwise split up the entire timeout into the number of retries @@ -105,6 +106,11 @@ i2c_status_t i2c_start(uint8_t address, uint16_t timeout) { return status; } +__attribute__((always_inline)) static inline void i2c_stop(void) { + // transmit STOP condition + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); +} + i2c_status_t i2c_write(uint8_t data, uint16_t timeout) { // load data into data register TWDR = data; @@ -167,6 +173,18 @@ i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, return status; } +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_ACTION_WRITE, timeout); + + for (uint16_t i = 0; i < length && status >= 0; i++) { + status = i2c_write(pgm_read_byte((const char*)data++), timeout); + } + + i2c_stop(); + + return status; +} + i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) { i2c_status_t status = i2c_start(address | I2C_ACTION_READ, timeout); @@ -293,7 +311,8 @@ error: return (status < 0) ? status : I2C_STATUS_SUCCESS; } -void i2c_stop(void) { - // transmit STOP condition - TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); -} +__attribute__((weak)) i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout) { + i2c_status_t status = i2c_start(address, timeout); + i2c_stop(); + return status; +} \ No newline at end of file diff --git a/platforms/avr/drivers/i2c_master.h b/platforms/avr/drivers/i2c_master.h index 18587c4a57..b797997619 100644 --- a/platforms/avr/drivers/i2c_master.h +++ b/platforms/avr/drivers/i2c_master.h @@ -41,14 +41,11 @@ typedef int16_t i2c_status_t; #define I2C_TIMEOUT_INFINITE (0xFFFF) void i2c_init(void); -i2c_status_t i2c_start(uint8_t address, uint16_t timeout); -i2c_status_t i2c_write(uint8_t data, uint16_t timeout); -int16_t i2c_read_ack(uint16_t timeout); -int16_t i2c_read_nack(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_transmit_P(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_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); -void i2c_stop(void); +i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout); -- cgit v1.2.3 From bb711456329beda1ab8573fbac3ad51bd398872b Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 27 Jan 2024 04:30:29 +0000 Subject: Tidy up print/debug logging headers (#22969) --- platforms/avr/_print.h | 7 ------- 1 file changed, 7 deletions(-) (limited to 'platforms/avr') diff --git a/platforms/avr/_print.h b/platforms/avr/_print.h index 5c1fdd26d8..bf8247c2f3 100644 --- a/platforms/avr/_print.h +++ b/platforms/avr/_print.h @@ -24,10 +24,3 @@ #pragma once #include "avr/xprintf.h" - -// Create user & normal print defines -#define print(s) xputs(PSTR(s)) -#define println(s) xputs(PSTR(s "\r\n")) -#define uprint(s) xputs(PSTR(s)) -#define uprintln(s) xputs(PSTR(s "\r\n")) -#define uprintf(fmt, ...) __xprintf(PSTR(fmt), ##__VA_ARGS__) \ No newline at end of file -- cgit v1.2.3 From b8646bc40bd616167da150f6da4eda372f7de23d Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 17 Feb 2024 00:18:26 +1100 Subject: Update naming convention for GPIO control macros (#23085) --- platforms/avr/gpio.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'platforms/avr') diff --git a/platforms/avr/gpio.h b/platforms/avr/gpio.h index 95f15c28dc..6f089bc663 100644 --- a/platforms/avr/gpio.h +++ b/platforms/avr/gpio.h @@ -22,17 +22,17 @@ typedef uint8_t pin_t; /* Operation of GPIO by pin. */ -#define setPinInput(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) -#define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) -#define setPinInputLow(pin) _Static_assert(0, "AVR processors cannot implement an input as pull low") -#define setPinOutputPushPull(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) -#define setPinOutputOpenDrain(pin) _Static_assert(0, "AVR platform does not implement an open-drain output") -#define setPinOutput(pin) setPinOutputPushPull(pin) +#define gpio_set_pin_input(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) +#define gpio_set_pin_input_high(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) +#define gpio_set_pin_input_low(pin) _Static_assert(0, "GPIO pulldowns in input mode are not available on AVR") +#define gpio_set_pin_output_push_pull(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) +#define gpio_set_pin_output_open_drain(pin) _Static_assert(0, "Open-drain outputs are not available on AVR") +#define gpio_set_pin_output(pin) gpio_set_pin_output_push_pull(pin) -#define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) -#define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) -#define writePin(pin, level) ((level) ? writePinHigh(pin) : writePinLow(pin)) +#define gpio_write_pin_high(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) +#define gpio_write_pin_low(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) +#define gpio_write_pin(pin, level) ((level) ? gpio_write_pin_high(pin) : gpio_write_pin_low(pin)) -#define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF))) +#define gpio_read_pin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF))) -#define togglePin(pin) (PORTx_ADDRESS(pin) ^= _BV((pin)&0xF)) +#define gpio_toggle_pin(pin) (PORTx_ADDRESS(pin) ^= _BV((pin)&0xF)) -- cgit v1.2.3 From 2d1aed78a67b3d2b002cc739ef087963b05b76b8 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 18 Feb 2024 17:08:27 +1100 Subject: Update GPIO macro usages in core (#23093) --- platforms/avr/drivers/audio_pwm_hardware.c | 4 ++-- platforms/avr/drivers/backlight_pwm.c | 6 +++--- platforms/avr/drivers/ps2/ps2_io.c | 20 ++++++++++---------- platforms/avr/drivers/serial.c | 10 +++++----- platforms/avr/drivers/spi_master.c | 16 ++++++++-------- 5 files changed, 28 insertions(+), 28 deletions(-) (limited to 'platforms/avr') diff --git a/platforms/avr/drivers/audio_pwm_hardware.c b/platforms/avr/drivers/audio_pwm_hardware.c index 6799cf2fdd..d484fba00f 100644 --- a/platforms/avr/drivers/audio_pwm_hardware.c +++ b/platforms/avr/drivers/audio_pwm_hardware.c @@ -216,12 +216,12 @@ void channel_2_stop(void) { void audio_driver_initialize(void) { #ifdef AUDIO1_PIN_SET channel_1_stop(); - setPinOutput(AUDIO1_PIN); + gpio_set_pin_output(AUDIO1_PIN); #endif #ifdef AUDIO2_PIN_SET channel_2_stop(); - setPinOutput(AUDIO2_PIN); + gpio_set_pin_output(AUDIO2_PIN); #endif // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers TCCR3A/TCCR3B, TCCR1A/TCCR1B diff --git a/platforms/avr/drivers/backlight_pwm.c b/platforms/avr/drivers/backlight_pwm.c index 74d25753a4..f6ab9391e2 100644 --- a/platforms/avr/drivers/backlight_pwm.c +++ b/platforms/avr/drivers/backlight_pwm.c @@ -291,11 +291,11 @@ ISR(TIMERx_OVF_vect) { #endif // BACKLIGHT_BREATHING void backlight_init_ports(void) { - setPinOutput(BACKLIGHT_PIN); + gpio_set_pin_output(BACKLIGHT_PIN); #if BACKLIGHT_ON_STATE == 1 - writePinLow(BACKLIGHT_PIN); + gpio_write_pin_low(BACKLIGHT_PIN); #else - writePinHigh(BACKLIGHT_PIN); + gpio_write_pin_high(BACKLIGHT_PIN); #endif // I could write a wall of text here to explain... but TL;DW diff --git a/platforms/avr/drivers/ps2/ps2_io.c b/platforms/avr/drivers/ps2/ps2_io.c index b75a1ab0be..fb87474372 100644 --- a/platforms/avr/drivers/ps2/ps2_io.c +++ b/platforms/avr/drivers/ps2/ps2_io.c @@ -19,18 +19,18 @@ void clock_init(void) {} void clock_lo(void) { // Transition from input with pull-up to output low via Hi-Z instead of output high - writePinLow(PS2_CLOCK_PIN); - setPinOutput(PS2_CLOCK_PIN); + gpio_write_pin_low(PS2_CLOCK_PIN); + gpio_set_pin_output(PS2_CLOCK_PIN); } void clock_hi(void) { - setPinInputHigh(PS2_CLOCK_PIN); + gpio_set_pin_input_high(PS2_CLOCK_PIN); } bool clock_in(void) { - setPinInputHigh(PS2_CLOCK_PIN); + gpio_set_pin_input_high(PS2_CLOCK_PIN); wait_us(1); - return readPin(PS2_CLOCK_PIN); + return gpio_read_pin(PS2_CLOCK_PIN); } /* @@ -40,16 +40,16 @@ void data_init(void) {} void data_lo(void) { // Transition from input with pull-up to output low via Hi-Z instead of output high - writePinLow(PS2_DATA_PIN); - setPinOutput(PS2_DATA_PIN); + gpio_write_pin_low(PS2_DATA_PIN); + gpio_set_pin_output(PS2_DATA_PIN); } void data_hi(void) { - setPinInputHigh(PS2_DATA_PIN); + gpio_set_pin_input_high(PS2_DATA_PIN); } bool data_in(void) { - setPinInputHigh(PS2_DATA_PIN); + gpio_set_pin_input_high(PS2_DATA_PIN); wait_us(1); - return readPin(PS2_DATA_PIN); + return gpio_read_pin(PS2_DATA_PIN); } diff --git a/platforms/avr/drivers/serial.c b/platforms/avr/drivers/serial.c index 730d9b7a01..b529f9b45e 100644 --- a/platforms/avr/drivers/serial.c +++ b/platforms/avr/drivers/serial.c @@ -239,28 +239,28 @@ inline static void serial_delay_half2(void) { inline static void serial_output(void) ALWAYS_INLINE; inline static void serial_output(void) { - setPinOutput(SOFT_SERIAL_PIN); + gpio_set_pin_output(SOFT_SERIAL_PIN); } // make the serial pin an input with pull-up resistor inline static void serial_input_with_pullup(void) ALWAYS_INLINE; inline static void serial_input_with_pullup(void) { - setPinInputHigh(SOFT_SERIAL_PIN); + gpio_set_pin_input_high(SOFT_SERIAL_PIN); } inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { - return !!readPin(SOFT_SERIAL_PIN); + return !!gpio_read_pin(SOFT_SERIAL_PIN); } inline static void serial_low(void) ALWAYS_INLINE; inline static void serial_low(void) { - writePinLow(SOFT_SERIAL_PIN); + gpio_write_pin_low(SOFT_SERIAL_PIN); } inline static void serial_high(void) ALWAYS_INLINE; inline static void serial_high(void) { - writePinHigh(SOFT_SERIAL_PIN); + gpio_write_pin_high(SOFT_SERIAL_PIN); } void soft_serial_initiator_init(void) { diff --git a/platforms/avr/drivers/spi_master.c b/platforms/avr/drivers/spi_master.c index ae9df03c02..74b847c71a 100644 --- a/platforms/avr/drivers/spi_master.c +++ b/platforms/avr/drivers/spi_master.c @@ -41,10 +41,10 @@ static uint8_t currentSlaveConfig = 0; static bool currentSlave2X = false; void spi_init(void) { - writePinHigh(SPI_SS_PIN); - setPinOutput(SPI_SCK_PIN); - setPinOutput(SPI_MOSI_PIN); - setPinInput(SPI_MISO_PIN); + gpio_write_pin_high(SPI_SS_PIN); + gpio_set_pin_output(SPI_SCK_PIN); + gpio_set_pin_output(SPI_MOSI_PIN); + gpio_set_pin_input(SPI_MISO_PIN); SPCR = (_BV(SPE) | _BV(MSTR)); } @@ -105,8 +105,8 @@ bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor) { SPSR |= _BV(SPI2X); } currentSlavePin = slavePin; - setPinOutput(currentSlavePin); - writePinLow(currentSlavePin); + gpio_set_pin_output(currentSlavePin); + gpio_write_pin_low(currentSlavePin); return true; } @@ -169,8 +169,8 @@ spi_status_t spi_receive(uint8_t *data, uint16_t length) { void spi_stop(void) { if (currentSlavePin != NO_PIN) { - setPinOutput(currentSlavePin); - writePinHigh(currentSlavePin); + gpio_set_pin_output(currentSlavePin); + gpio_write_pin_high(currentSlavePin); currentSlavePin = NO_PIN; SPSR &= ~(_BV(SPI2X)); SPCR &= ~(currentSlaveConfig); -- cgit v1.2.3