rp-hal-boards/boards/pimoroni-servo2040/src/lib.rs
Paul Daniel Faria d3b0156269 Fix servo example in rp2040-servo, remove unusable aliases.
The servo example included phase correction, which does not work with the
provided divider. Updated comments to explain numbers and also explain
alternate calculation with phase correction enabled.

Remove unusable aliases from all servo pins. The board includes a 180 Ohm
resistor on all servo data pins, which makes the lines not very usable for
Spi, Uart or I2C. The aliases were removed given they will rarely, if ever,
be used with this board.
2022-09-21 18:00:37 +10:00

604 lines
22 KiB
Rust

#![no_std]
pub extern crate rp2040_hal as hal;
#[cfg(feature = "rt")]
extern crate cortex_m_rt;
#[cfg(feature = "rt")]
pub use hal::entry;
/// The linker will place this boot block at the start of our program image. We
/// need this to help the ROM bootloader get our code up and running.
#[cfg(feature = "boot2")]
#[link_section = ".boot2"]
#[no_mangle]
#[used]
pub static BOOT2_FIRMWARE: [u8; 256] = rp2040_boot2::BOOT_LOADER_W25Q080;
pub const NUM_SERVOS: u8 = 18;
pub const NUM_SENSORS: u8 = 6;
pub const NUM_LEDS: u8 = 6;
pub const SENSOR_1_ADDR: u8 = 0b_0000;
pub const SENSOR_2_ADDR: u8 = 0b_0001;
pub const SENSOR_3_ADDR: u8 = 0b_0010;
pub const SENSOR_4_ADDR: u8 = 0b_0011;
pub const SENSOR_5_ADDR: u8 = 0b_0100;
pub const SENSOR_6_ADDR: u8 = 0b_0101;
pub const VOLTAGE_SENSE_ADDR: u8 = 0b_0110;
pub const CURRENT_SENSE_ADDR: u8 = 0b_0111;
pub const VOLTAGE_GAIN: f32 = 0.28058;
pub const SHUNT_RESISTOR: f32 = 0.003;
pub const CURRENT_GAIN: u8 = 69;
pub const CURRENT_OFFSET: f32 = -0.02;
pub use hal::pac;
hal::bsp_pins!(
/// GPIO 0 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM0 A` | [crate::Servo1Pwm0A] |
/// | `PIO0` | [crate::Servo1Pio0] |
/// | `PIO1` | [crate::Servo1Pio1] |
Gpio0 {
name: servo1,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo1].
FunctionPwm: Servo1Pwm0A,
/// PIO0 Function alias for pin [crate::Pins::servo1].
FunctionPio0: Servo1Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo1].
FunctionPio1: Servo1Pio1
}
},
/// GPIO 1 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM0 B` | [crate::Servo2Pwm0B] |
/// | `PIO0` | [crate::Servo2Pio0] |
/// | `PIO1` | [crate::Servo2Pio1] |
Gpio1 {
name: servo2,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo2].
FunctionPwm: Servo2Pwm0B,
/// PIO0 Function alias for pin [crate::Pins::servo2].
FunctionPio0: Servo2Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo2].
FunctionPio1: Servo2Pio1
}
},
/// GPIO 2 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM1 A` | [crate::Servo3Pwm1A] |
/// | `PIO0` | [crate::Servo3Pio0] |
/// | `PIO1` | [crate::Servo3Pio1] |
Gpio2 {
name: servo3,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo3].
FunctionPwm: Servo3Pwm1A,
/// PIO0 Function alias for pin [crate::Pins::servo3].
FunctionPio0: Servo3Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo3].
FunctionPio1: Servo3Pio1
}
},
/// GPIO 3 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM1 B` | [crate::Servo4Pwm1B] |
/// | `PIO0` | [crate::Servo4Pio0] |
/// | `PIO1` | [crate::Servo4Pio1] |
Gpio3 {
name: servo4,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo4].
FunctionPwm: Servo4Pwm1B,
/// PIO0 Function alias for pin [crate::Pins::servo4].
FunctionPio0: Servo4Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo4].
FunctionPio1: Servo4Pio1
}
},
/// GPIO 4 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM2 A` | [crate::Servo5Pwm2A] |
/// | `PIO0` | [crate::Servo5Pio0] |
/// | `PIO1` | [crate::Servo5Pio1] |
Gpio4 {
name: servo5,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo5].
FunctionPwm: Servo5Pwm2A,
/// PIO0 Function alias for pin [crate::Pins::servo5].
FunctionPio0: Servo5Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo5].
FunctionPio1: Servo5Pio1
}
},
/// GPIO 5 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM2 B` | [crate::Servo6Pwm2B] |
/// | `PIO0` | [crate::Servo6Pio0] |
/// | `PIO1` | [crate::Servo6Pio1] |
Gpio5 {
name: servo6,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo6].
FunctionPwm: Servo6Pwm2B,
/// PIO0 Function alias for pin [crate::Pins::servo6].
FunctionPio0: Servo6Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo6].
FunctionPio1: Servo6Pio1
}
},
/// GPIO 6 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM3 A` | [crate::Servo7Pwm3A] |
/// | `PIO0` | [crate::Servo7Pio0] |
/// | `PIO1` | [crate::Servo7Pio1] |
Gpio6 {
name: servo7,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo7].
FunctionPwm: Servo7Pwm3A,
/// PIO0 Function alias for pin [crate::Pins::servo7].
FunctionPio0: Servo7Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo7].
FunctionPio1: Servo7Pio1
}
},
/// GPIO 7 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM3 B` | [crate::Servo8Pwm3B] |
/// | `PIO0` | [crate::Servo8Pio0] |
/// | `PIO1` | [crate::Servo8Pio1] |
Gpio7 {
name: servo8,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo8].
FunctionPwm: Servo8Pwm3B,
/// PIO0 Function alias for pin [crate::Pins::servo8].
FunctionPio0: Servo8Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo8].
FunctionPio1: Servo8Pio1
}
},
/// GPIO 8 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM4 A` | [crate::Servo9Pwm4A] |
/// | `PIO0` | [crate::Servo9Pio0] |
/// | `PIO1` | [crate::Servo9Pio1] |
Gpio8 {
name: servo9,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo9].
FunctionPwm: Servo9Pwm4A,
/// PIO0 Function alias for pin [crate::Pins::servo9].
FunctionPio0: Servo9Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo9].
FunctionPio1: Servo9Pio1
}
},
/// GPIO 9 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM4 B` | [crate::Servo10Pwm4B] |
/// | `PIO0` | [crate::Servo10Pio0] |
/// | `PIO1` | [crate::Servo10Pio1] |
Gpio9 {
name: servo10,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo10].
FunctionPwm: Servo10Pwm4B,
/// PIO0 Function alias for pin [crate::Pins::servo10].
FunctionPio0: Servo10Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo10].
FunctionPio1: Servo10Pio1
}
},
/// GPIO 10 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM5 A` | [crate::Servo11Pwm5A] |
/// | `PIO0` | [crate::Servo11Pio0] |
/// | `PIO1` | [crate::Servo11Pio1] |
Gpio10 {
name: servo11,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo11].
FunctionPwm: Servo11Pwm5A,
/// PIO0 Function alias for pin [crate::Pins::servo11].
FunctionPio0: Servo11Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo11].
FunctionPio1: Servo11Pio1
}
},
/// GPIO 11 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM5 B` | [crate::Servo12Pwm5B] |
/// | `PIO0` | [crate::Servo12Pio0] |
/// | `PIO1` | [crate::Servo12Pio1] |
Gpio11 {
name: servo12,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo12].
FunctionPwm: Servo12Pwm5B,
/// PIO0 Function alias for pin [crate::Pins::servo12].
FunctionPio0: Servo12Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo12].
FunctionPio1: Servo12Pio1
}
},
/// GPIO 12 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM6 A` | [crate::Servo13Pwm6A] |
/// | `PIO0` | [crate::Servo13Pio0] |
/// | `PIO1` | [crate::Servo13Pio1] |
Gpio12 {
name: servo13,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo13].
FunctionPwm: Servo13Pwm6A,
/// PIO0 Function alias for pin [crate::Pins::servo13].
FunctionPio0: Servo13Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo13].
FunctionPio1: Servo13Pio1
}
},
/// GPIO 13 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM6 B` | [crate::Servo14Pwm6B] |
/// | `PIO0` | [crate::Servo14Pio0] |
/// | `PIO1` | [crate::Servo14Pio1] |
Gpio13 {
name: servo14,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo14].
FunctionPwm: Servo14Pwm6B,
/// PIO0 Function alias for pin [crate::Pins::servo14].
FunctionPio0: Servo14Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo14].
FunctionPio1: Servo14Pio1
}
},
/// GPIO 14 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM7 A` | [crate::Servo15Pwm7A] |
/// | `PIO0` | [crate::Servo15Pio0] |
/// | `PIO1` | [crate::Servo15Pio1] |
Gpio14 {
name: servo15,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo15].
FunctionPwm: Servo15Pwm7A,
/// PIO0 Function alias for pin [crate::Pins::servo15].
FunctionPio0: Servo15Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo15].
FunctionPio1: Servo15Pio1
}
},
/// GPIO 15 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM7 B` | [crate::Servo16Pwm7B] |
/// | `PIO0` | [crate::Servo16Pio0] |
/// | `PIO1` | [crate::Servo16Pio1] |
Gpio15 {
name: servo16,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo16].
FunctionPwm: Servo16Pwm7B,
/// PIO0 Function alias for pin [crate::Pins::servo16].
FunctionPio0: Servo16Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo16].
FunctionPio1: Servo16Pio1
}
},
/// GPIO 16 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM0 A` | [crate::Servo17Pwm0A] |
/// | `PIO0` | [crate::Servo17Pio0] |
/// | `PIO1` | [crate::Servo17Pio1] |
Gpio16 {
name: servo17,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo17].
FunctionPwm: Servo17Pwm0A,
/// PIO0 Function alias for pin [crate::Pins::servo17].
FunctionPio0: Servo17Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo17].
FunctionPio1: Servo17Pio1
}
},
/// GPIO 17 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `PWM0 B` | [crate::Servo18Pwm0B] |
/// | `PIO0` | [crate::Servo18Pio0] |
/// | `PIO1` | [crate::Servo18Pio1] |
Gpio17 {
name: servo18,
aliases: {
/// PWM Function alias for pin [crate::Pins::servo18].
FunctionPwm: Servo18Pwm0B,
/// PIO0 Function alias for pin [crate::Pins::servo18].
FunctionPio0: Servo18Pio0,
/// PIO1 Function alias for pin [crate::Pins::servo18].
FunctionPio1: Servo18Pio1
}
},
/// GPIO 18 is connected to the leds of the Servo 2040 board.
Gpio18 {
name: led_data
},
/// GPIO 19 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `SPI0 TX` | [crate::Gp19Spi0Tx] |
/// | `UART0 RTS` | [crate::Gp19Uart0Rts] |
/// | `I2C1 SCL` | [crate::Gp19I2C1Scl] |
/// | `PWM1 B` | [crate::Gp19Pwm1B] |
/// | `PIO0` | [crate::Gp19Pio0] |
/// | `PIO1` | [crate::Gp19Pio1] |
Gpio19 {
name: int_,
aliases: {
/// UART Function alias for pin [crate::Pins::int_].
FunctionUart: Gp19Uart0Rts,
/// SPI Function alias for pin [crate::Pins::int_].
FunctionSpi: Gp19Spi0Tx,
/// I2C Function alias for pin [crate::Pins::int_].
FunctionI2C: Gp19I2C1Scl,
/// PWM Function alias for pin [crate::Pins::int_].
FunctionPwm: Gp19Pwm1B,
/// PIO0 Function alias for pin [crate::Pins::int_].
FunctionPio0: Gp19Pio0,
/// PIO1 Function alias for pin [crate::Pins::int_].
FunctionPio1: Gp19Pio1
}
},
/// GPIO 20 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `SPI0 RX` | [crate::Gp20Spi0Rx] |
/// | `UART1 TX` | [crate::Gp20Uart1Tx] |
/// | `I2C0 SDA` | [crate::Gp20I2C0Sda] |
/// | `PWM2 A` | [crate::Gp20Pwm2A] |
/// | `PIO0` | [crate::Gp20Pio0] |
/// | `PIO1` | [crate::Gp20Pio1] |
Gpio20 {
name: sda,
aliases: {
/// UART Function alias for pin [crate::Pins::sda].
FunctionUart: Gp20Uart1Tx,
/// SPI Function alias for pin [crate::Pins::sda].
FunctionSpi: Gp20Spi0Rx,
/// I2C Function alias for pin [crate::Pins::sda].
FunctionI2C: Gp20I2C0Sda,
/// PWM Function alias for pin [crate::Pins::sda].
FunctionPwm: Gp20Pwm2A,
/// PIO0 Function alias for pin [crate::Pins::sda].
FunctionPio0: Gp20Pio0,
/// PIO1 Function alias for pin [crate::Pins::sda].
FunctionPio1: Gp20Pio1
}
},
/// GPIO 21 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `SPI0 CSn` | [crate::Gp21Spi0Csn] |
/// | `UART1 RX` | [crate::Gp21Uart1Rx] |
/// | `I2C0 SCL` | [crate::Gp21I2C0Scl] |
/// | `PWM2 B` | [crate::Gp21Pwm2B] |
/// | `PIO0` | [crate::Gp21Pio0] |
/// | `PIO1` | [crate::Gp21Pio1] |
Gpio21 {
name: scl,
aliases: {
/// UART Function alias for pin [crate::Pins::scl].
FunctionUart: Gp21Uart1Rx,
/// SPI Function alias for pin [crate::Pins::scl].
FunctionSpi: Gp21Spi0Csn,
/// I2C Function alias for pin [crate::Pins::scl].
FunctionI2C: Gp21I2C0Scl,
/// PWM Function alias for pin [crate::Pins::scl].
FunctionPwm: Gp21Pwm2B,
/// PIO0 Function alias for pin [crate::Pins::scl].
FunctionPio0: Gp21Pio0,
/// PIO1 Function alias for pin [crate::Pins::scl].
FunctionPio1: Gp21Pio1
}
},
/// GPIO 22 is connected to adc_addr_0 of the Servo 2040 board.
Gpio22 {
name: adc_addr_0,
},
/// GPIO 23 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `SPI0 TX` | [crate::Gp23Spi0Tx] |
/// | `UART1 RTS` | [crate::Gp23Uart1Rts] |
/// | `I2C1 SCL` | [crate::Gp23I2C1Scl] |
/// | `PWM3 B` | [crate::Gp23Pwm3B] |
/// | `PIO0` | [crate::Gp23Pio0] |
/// | `PIO1` | [crate::Gp23Pio1] |
Gpio23 {
name: user_sw,
aliases: {
/// UART Function alias for pin [crate::Pins::user_sw].
FunctionUart: Gp23Uart1Rts,
/// SPI Function alias for pin [crate::Pins::user_sw].
FunctionSpi: Gp23Spi0Tx,
/// I2C Function alias for pin [crate::Pins::user_sw].
FunctionI2C: Gp23I2C1Scl,
/// PWM Function alias for pin [crate::Pins::user_sw].
FunctionPwm: Gp23Pwm3B,
/// PIO0 Function alias for pin [crate::Pins::user_sw].
FunctionPio0: Gp23Pio0,
/// PIO1 Function alias for pin [crate::Pins::user_sw].
FunctionPio1: Gp23Pio1
}
},
/// GPIO 24 is connected to adc_addr_1 of the Servo 2040 board.
Gpio24 {
name: adc_addr_1,
},
/// GPIO 25 is connected to adc_addr_2 of the Servo 2040 board.
Gpio25 {
name: adc_addr_2,
},
/// GPIO 26 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `SPI1 SCK` | [crate::Gp26Spi1Sck] |
/// | `UART1 CTS` | [crate::Gp26Uart1Cts] |
/// | `I2C1 SDA` | [crate::Gp26I2C1Sda] |
/// | `PWM5 A` | [crate::Gp26Pwm5A] |
/// | `PIO0` | [crate::Gp26Pio0] |
/// | `PIO1` | [crate::Gp26Pio1] |
Gpio26 {
name: adc0,
aliases: {
/// UART Function alias for pin [crate::Pins::gpio26].
FunctionUart: Gp26Uart1Cts,
/// SPI Function alias for pin [crate::Pins::gpio26].
FunctionSpi: Gp26Spi1Sck,
/// I2C Function alias for pin [crate::Pins::gpio26].
FunctionI2C: Gp26I2C1Sda,
/// PWM Function alias for pin [crate::Pins::gpio26].
FunctionPwm: Gp26Pwm5A,
/// PIO0 Function alias for pin [crate::Pins::gpio26].
FunctionPio0: Gp26Pio0,
/// PIO1 Function alias for pin [crate::Pins::gpio26].
FunctionPio1: Gp26Pio1
}
},
/// GPIO 27 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `SPI1 TX` | [crate::Gp27Spi1Tx] |
/// | `UART1 RTS` | [crate::Gp27Uart1Rts] |
/// | `I2C1 SCL` | [crate::Gp27I2C1Scl] |
/// | `PWM5 B` | [crate::Gp27Pwm5B] |
/// | `PIO0` | [crate::Gp27Pio0] |
/// | `PIO1` | [crate::Gp27Pio1] |
Gpio27 {
name: adc1,
aliases: {
/// UART Function alias for pin [crate::Pins::gpio27].
FunctionUart: Gp27Uart1Rts,
/// SPI Function alias for pin [crate::Pins::gpio27].
FunctionSpi: Gp27Spi1Tx,
/// I2C Function alias for pin [crate::Pins::gpio27].
FunctionI2C: Gp27I2C1Scl,
/// PWM Function alias for pin [crate::Pins::gpio27].
FunctionPwm: Gp27Pwm5B,
/// PIO0 Function alias for pin [crate::Pins::gpio27].
FunctionPio0: Gp27Pio0,
/// PIO1 Function alias for pin [crate::Pins::gpio27].
FunctionPio1: Gp27Pio1
}
},
/// GPIO 28 supports following functions:
///
/// | Function | Alias with applied function |
/// |--------------|-----------------------------|
/// | `SPI1 RX` | [crate::Gp28Spi1Rx] |
/// | `UART0 TX` | [crate::Gp28Uart0Tx] |
/// | `I2C0 SDA` | [crate::Gp28I2C0Sda] |
/// | `PWM6 A` | [crate::Gp28Pwm6A] |
/// | `PIO0` | [crate::Gp28Pio0] |
/// | `PIO1` | [crate::Gp28Pio1] |
Gpio28 {
name: adc2,
aliases: {
/// UART Function alias for pin [crate::Pins::gpio28].
FunctionUart: Gp28Uart0Tx,
/// SPI Function alias for pin [crate::Pins::gpio28].
FunctionSpi: Gp28Spi1Rx,
/// I2C Function alias for pin [crate::Pins::gpio28].
FunctionI2C: Gp28I2C0Sda,
/// PWM Function alias for pin [crate::Pins::gpio28].
FunctionPwm: Gp28Pwm6A,
/// PIO0 Function alias for pin [crate::Pins::gpio28].
FunctionPio0: Gp28Pio0,
/// PIO1 Function alias for pin [crate::Pins::gpio28].
FunctionPio1: Gp28Pio1
}
},
/// GPIO 29 is connected to shared adc of the Servo2040 board.
Gpio29 {
name: shared_adc,
},
);
pub const XOSC_CRYSTAL_FREQ: u32 = 12_000_000;