rust: clean up FPIOA interface

Remove need for .into() everywhere by accepting everything
that goes into usize in the appropriate methods.
This commit is contained in:
Wladimir J. van der Laan 2019-06-01 21:45:28 +00:00
parent 1630dc2a31
commit 00ac503e3e
10 changed files with 73 additions and 74 deletions

View File

@ -27,16 +27,16 @@ pub const GRID_HEIGHT: usize = DISP_HEIGHT / BLK_SIZE;
/** Connect pins to internal functions */
fn io_mux_init() {
/* Init SPI IO map and function settings */
fpioa::set_function(io::LCD_RST.into(), fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST.into(), fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC.into(), fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC.into(), fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS.into(), fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR.into(), fpioa::function::SPI0_SCLK);
fpioa::set_function(io::LCD_RST, fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST, fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC, fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC, fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS, fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR, fpioa::function::SPI0_SCLK);
/* I2C0 for touch-screen */
fpioa::set_function(io::I2C1_SCL.into(), fpioa::function::I2C0_SCLK);
fpioa::set_function(io::I2C1_SDA.into(), fpioa::function::I2C0_SDA);
fpioa::set_function(io::I2C1_SCL, fpioa::function::I2C0_SCLK);
fpioa::set_function(io::I2C1_SDA, fpioa::function::I2C0_SDA);
sysctl::set_spi0_dvp_data(true);
}

View File

@ -24,22 +24,22 @@ pub type ScreenImage = [u32; DISP_WIDTH * DISP_HEIGHT / 2];
/** Connect pins to internal functions */
fn io_init() {
/* Init DVP IO map and function settings */
fpioa::set_function(io::DVP_RST.into(), fpioa::function::CMOS_RST);
fpioa::set_function(io::DVP_PWDN.into(), fpioa::function::CMOS_PWDN);
fpioa::set_function(io::DVP_XCLK.into(), fpioa::function::CMOS_XCLK);
fpioa::set_function(io::DVP_VSYNC.into(), fpioa::function::CMOS_VSYNC);
fpioa::set_function(io::DVP_HSYNC.into(), fpioa::function::CMOS_HREF);
fpioa::set_function(io::DVP_PCLK.into(), fpioa::function::CMOS_PCLK);
fpioa::set_function(io::DVP_SCL.into(), fpioa::function::SCCB_SCLK);
fpioa::set_function(io::DVP_SDA.into(), fpioa::function::SCCB_SDA);
fpioa::set_function(io::DVP_RST, fpioa::function::CMOS_RST);
fpioa::set_function(io::DVP_PWDN, fpioa::function::CMOS_PWDN);
fpioa::set_function(io::DVP_XCLK, fpioa::function::CMOS_XCLK);
fpioa::set_function(io::DVP_VSYNC, fpioa::function::CMOS_VSYNC);
fpioa::set_function(io::DVP_HSYNC, fpioa::function::CMOS_HREF);
fpioa::set_function(io::DVP_PCLK, fpioa::function::CMOS_PCLK);
fpioa::set_function(io::DVP_SCL, fpioa::function::SCCB_SCLK);
fpioa::set_function(io::DVP_SDA, fpioa::function::SCCB_SDA);
/* Init SPI IO map and function settings */
fpioa::set_function(io::LCD_RST.into(), fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST.into(), fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC.into(), fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC.into(), fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS.into(), fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR.into(), fpioa::function::SPI0_SCLK);
fpioa::set_function(io::LCD_RST, fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST, fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC, fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC, fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS, fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR, fpioa::function::SPI0_SCLK);
sysctl::set_spi0_dvp_data(true);

View File

@ -104,16 +104,16 @@ impl Universe {
/** Connect pins to internal functions */
fn io_mux_init() {
/* Init SPI IO map and function settings */
fpioa::set_function(io::LCD_RST.into(), fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST.into(), fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC.into(), fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC.into(), fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS.into(), fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR.into(), fpioa::function::SPI0_SCLK);
fpioa::set_function(io::LCD_RST, fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST, fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC, fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC, fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS, fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR, fpioa::function::SPI0_SCLK);
/* I2C0 for touch-screen */
fpioa::set_function(io::I2C1_SCL.into(), fpioa::function::I2C0_SCLK);
fpioa::set_function(io::I2C1_SDA.into(), fpioa::function::I2C0_SDA);
fpioa::set_function(io::I2C1_SCL, fpioa::function::I2C0_SCLK);
fpioa::set_function(io::I2C1_SDA, fpioa::function::I2C0_SDA);
sysctl::set_spi0_dvp_data(true);
}

View File

@ -25,12 +25,12 @@ use k210_console::palette_xterm256::PALETTE;
/** Connect pins to internal functions */
fn io_mux_init() {
/* Init SPI IO map and function settings */
fpioa::set_function(io::LCD_RST.into(), fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST.into(), fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC.into(), fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC.into(), fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS.into(), fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR.into(), fpioa::function::SPI0_SCLK);
fpioa::set_function(io::LCD_RST, fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST, fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC, fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC, fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS, fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR, fpioa::function::SPI0_SCLK);
sysctl::set_spi0_dvp_data(true);
}

View File

@ -31,7 +31,6 @@ pub const OV2640_ADDR: u8 = 0x60;
/** I/O pins for FPIOA */
#[derive(Copy, Clone)]
#[repr(u32)]
pub enum io {
/** JTAG TCK */
JTAG_TCK = 0,
@ -131,8 +130,8 @@ pub enum io {
DVP_PCLK = 47,
}
impl From<io> for u8 {
impl From<io> for usize {
fn from(io: io) -> Self {
io as u8
io as usize
}
}

View File

@ -349,17 +349,17 @@ static FUNCTION_DEFAULTS: &[u32] = &[
0x00001ff8, 0x00001ff9, 0x00001ffa, 0x00001ffb, 0x00001ffc, 0x00001ffd, 0x00001ffe, 0x00001fff,
];
pub fn set_function(number: u8, function: function) {
pub fn set_function<N: Into<usize>>(number: N, function: function) {
// TODO: check for overlapping assignments and assign to RESV0 as the Kendryte SDK does?
unsafe {
let ptr = pac::FPIOA::ptr();
(*ptr).io[number as usize].write(|w| w.bits(FUNCTION_DEFAULTS[function as usize]));
(*ptr).io[number.into()].write(|w| w.bits(FUNCTION_DEFAULTS[function as usize]));
}
}
pub fn set_io_pull(number: u8, pull: pull) {
pub fn set_io_pull<N: Into<usize>>(number: N, pull: pull) {
unsafe {
(*pac::FPIOA::ptr()).io[number as usize].modify(|_, w| match pull {
(*pac::FPIOA::ptr()).io[number.into()].modify(|_, w| match pull {
pull::NONE => w.pu().bit(false).pd().bit(false),
pull::DOWN => w.pu().bit(false).pd().bit(true),
pull::UP => w.pu().bit(true).pd().bit(false),

View File

@ -24,12 +24,12 @@ use crate::palette::PALETTE;
/** Connect pins to internal functions */
fn io_mux_init() {
/* Init SPI IO map and function settings */
fpioa::set_function(io::LCD_RST.into(), fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST.into(), fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC.into(), fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC.into(), fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS.into(), fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR.into(), fpioa::function::SPI0_SCLK);
fpioa::set_function(io::LCD_RST, fpioa::function::gpiohs(lcd::RST_GPIONUM));
fpioa::set_io_pull(io::LCD_RST, fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC, fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC, fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS, fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR, fpioa::function::SPI0_SCLK);
sysctl::set_spi0_dvp_data(true);
}

View File

@ -31,25 +31,25 @@ const B_SCALE: f32 = 0.33;
fn io_init() {
/* Init SPI IO map and function settings */
fpioa::set_function(
io::LCD_RST.into(),
io::LCD_RST,
fpioa::function::gpiohs(lcd::RST_GPIONUM),
);
fpioa::set_io_pull(io::LCD_RST.into(), fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC.into(), fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC.into(), fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS.into(), fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR.into(), fpioa::function::SPI0_SCLK);
fpioa::set_io_pull(io::LCD_RST, fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC, fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC, fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS, fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR, fpioa::function::SPI0_SCLK);
/* Route PWM outputs of TIMER0 to RGB leds */
fpioa::set_function(io::LED_R as u8, fpioa::function::TIMER0_TOGGLE1);
fpioa::set_function(io::LED_G as u8, fpioa::function::TIMER0_TOGGLE2);
fpioa::set_function(io::LED_B as u8, fpioa::function::TIMER0_TOGGLE3);
fpioa::set_function(io::LED_R, fpioa::function::TIMER0_TOGGLE1);
fpioa::set_function(io::LED_G, fpioa::function::TIMER0_TOGGLE2);
fpioa::set_function(io::LED_B, fpioa::function::TIMER0_TOGGLE3);
sysctl::set_spi0_dvp_data(true);
/* I2C0 for touch-screen */
fpioa::set_function(io::I2C1_SCL.into(), fpioa::function::I2C0_SCLK);
fpioa::set_function(io::I2C1_SDA.into(), fpioa::function::I2C0_SDA);
fpioa::set_function(io::I2C1_SCL, fpioa::function::I2C0_SCLK);
fpioa::set_function(io::I2C1_SDA, fpioa::function::I2C0_SDA);
/* Set DVP and SPI pins to 1.8V */
sysctl::set_power_mode(sysctl::power_bank::BANK6, sysctl::io_power_mode::V18);

View File

@ -29,10 +29,10 @@ fn main() -> ! {
// Configure UART1 (→WIFI)
sysctl::clock_enable(sysctl::clock::UART1);
sysctl::reset(sysctl::reset::UART1);
fpioa::set_function(io::WIFI_RX as u8, fpioa::function::UART1_TX);
fpioa::set_function(io::WIFI_TX as u8, fpioa::function::UART1_RX);
fpioa::set_function(io::WIFI_EN as u8, fpioa::function::GPIOHS8);
fpioa::set_io_pull(io::WIFI_EN as u8, fpioa::pull::DOWN);
fpioa::set_function(io::WIFI_RX, fpioa::function::UART1_TX);
fpioa::set_function(io::WIFI_TX, fpioa::function::UART1_RX);
fpioa::set_function(io::WIFI_EN, fpioa::function::GPIOHS8);
fpioa::set_io_pull(io::WIFI_EN, fpioa::pull::DOWN);
gpiohs::set_pin(8, true);
gpiohs::set_direction(8, gpio::direction::OUTPUT);
let mut wifi_serial = p.UART1.constrain(DEFAULT_BAUD.bps(), &clocks);

View File

@ -65,14 +65,14 @@ where
fn io_init() {
/* Init SPI IO map and function settings */
fpioa::set_function(
io::LCD_RST.into(),
io::LCD_RST,
fpioa::function::gpiohs(lcd::RST_GPIONUM),
);
fpioa::set_io_pull(io::LCD_RST.into(), fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC.into(), fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC.into(), fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS.into(), fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR.into(), fpioa::function::SPI0_SCLK);
fpioa::set_io_pull(io::LCD_RST, fpioa::pull::DOWN); // outputs must be pull-down
fpioa::set_function(io::LCD_DC, fpioa::function::gpiohs(lcd::DCX_GPIONUM));
fpioa::set_io_pull(io::LCD_DC, fpioa::pull::DOWN);
fpioa::set_function(io::LCD_CS, fpioa::function::SPI0_SS3);
fpioa::set_function(io::LCD_WR, fpioa::function::SPI0_SCLK);
sysctl::set_spi0_dvp_data(true);
@ -97,10 +97,10 @@ fn main() -> ! {
// Configure UART1 (→WIFI)
sysctl::clock_enable(sysctl::clock::UART1);
sysctl::reset(sysctl::reset::UART1);
fpioa::set_function(io::WIFI_RX as u8, fpioa::function::UART1_TX);
fpioa::set_function(io::WIFI_TX as u8, fpioa::function::UART1_RX);
fpioa::set_function(io::WIFI_EN as u8, fpioa::function::GPIOHS8);
fpioa::set_io_pull(io::WIFI_EN as u8, fpioa::pull::DOWN);
fpioa::set_function(io::WIFI_RX, fpioa::function::UART1_TX);
fpioa::set_function(io::WIFI_TX, fpioa::function::UART1_RX);
fpioa::set_function(io::WIFI_EN, fpioa::function::GPIOHS8);
fpioa::set_io_pull(io::WIFI_EN, fpioa::pull::DOWN);
gpiohs::set_pin(8, true);
gpiohs::set_direction(8, gpio::direction::OUTPUT);
let wifi_serial = p.UART1.constrain(DEFAULT_BAUD.bps(), &clocks);