2017-06-18 12:45:07 +08:00
|
|
|
#[cfg(has_converter_spi)]
|
2017-12-28 16:15:51 +08:00
|
|
|
mod imp {
|
2018-05-15 01:54:29 +08:00
|
|
|
use board_misoc::csr;
|
2017-06-18 12:45:07 +08:00
|
|
|
|
2018-02-23 17:50:49 +08:00
|
|
|
pub fn set_config(busno: u8, flags: u8, length: u8, div: u8, cs: u8) -> Result<(), ()> {
|
2017-12-28 16:15:51 +08:00
|
|
|
if busno != 0 {
|
|
|
|
return Err(())
|
|
|
|
}
|
|
|
|
unsafe {
|
2018-03-01 18:37:33 +08:00
|
|
|
while csr::converter_spi::writable_read() == 0 {}
|
2018-02-23 17:50:49 +08:00
|
|
|
csr::converter_spi::offline_write(flags >> 0 & 1);
|
|
|
|
csr::converter_spi::end_write(flags >> 1 & 1);
|
2018-03-01 04:00:01 +08:00
|
|
|
// input (in RTIO): flags >> 2 & 1
|
|
|
|
// cs_polarity is a mask in the CSR interface
|
|
|
|
// only affect the bits that are selected
|
|
|
|
let mut cs_polarity = csr::converter_spi::cs_polarity_read();
|
|
|
|
if flags >> 3 & 1 != 0 {
|
|
|
|
cs_polarity |= cs;
|
|
|
|
} else {
|
|
|
|
cs_polarity &= !cs;
|
|
|
|
}
|
|
|
|
csr::converter_spi::cs_polarity_write(cs_polarity);
|
2017-12-28 16:15:51 +08:00
|
|
|
csr::converter_spi::clk_polarity_write(flags >> 4 & 1);
|
|
|
|
csr::converter_spi::clk_phase_write(flags >> 5 & 1);
|
|
|
|
csr::converter_spi::lsb_first_write(flags >> 6 & 1);
|
|
|
|
csr::converter_spi::half_duplex_write(flags >> 7 & 1);
|
2018-02-23 17:50:49 +08:00
|
|
|
csr::converter_spi::length_write(length - 1);
|
|
|
|
csr::converter_spi::div_write(div - 2);
|
|
|
|
csr::converter_spi::cs_write(cs);
|
2017-12-28 16:15:51 +08:00
|
|
|
}
|
|
|
|
Ok(())
|
2017-06-19 14:22:59 +08:00
|
|
|
}
|
2017-06-18 12:45:07 +08:00
|
|
|
|
2017-12-28 16:15:51 +08:00
|
|
|
pub fn write(busno: u8, data: u32) -> Result<(), ()> {
|
|
|
|
if busno != 0 {
|
|
|
|
return Err(())
|
|
|
|
}
|
|
|
|
unsafe {
|
2018-02-23 17:50:49 +08:00
|
|
|
while csr::converter_spi::writable_read() == 0 {}
|
|
|
|
csr::converter_spi::data_write(data);
|
2017-12-28 16:15:51 +08:00
|
|
|
}
|
|
|
|
Ok(())
|
2017-06-18 12:45:07 +08:00
|
|
|
}
|
|
|
|
|
2017-12-28 16:15:51 +08:00
|
|
|
pub fn read(busno: u8) -> Result<u32, ()> {
|
|
|
|
if busno != 0 {
|
|
|
|
return Err(())
|
|
|
|
}
|
|
|
|
Ok(unsafe {
|
2018-03-01 18:37:33 +08:00
|
|
|
while csr::converter_spi::writable_read() == 0 {}
|
2018-02-23 17:50:49 +08:00
|
|
|
csr::converter_spi::data_read()
|
2017-12-28 16:15:51 +08:00
|
|
|
})
|
2017-06-18 12:45:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(has_converter_spi))]
|
2017-12-28 16:15:51 +08:00
|
|
|
mod imp {
|
2018-02-23 17:50:49 +08:00
|
|
|
pub fn set_config(_busno: u8, _flags: u8, _length: u8, _div: u8, _cs: u8) -> Result<(), ()> { Err(()) }
|
2017-12-28 16:15:51 +08:00
|
|
|
pub fn write(_busno: u8,_data: u32) -> Result<(), ()> { Err(()) }
|
|
|
|
pub fn read(_busno: u8,) -> Result<u32, ()> { Err(()) }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub use self::imp::*;
|