use embedded_hal::serial;
use serial_embedded_hal::{PortSettings, Serial};
use spidriver::SPIDriver;
fn main() {
let port = Serial::new(
"/dev/ttyUSB0",
&PortSettings {
baud_rate: serial_embedded_hal::BaudRate::BaudOther(460800),
char_size: serial_embedded_hal::CharSize::Bits8,
parity: serial_embedded_hal::Parity::ParityNone,
stop_bits: serial_embedded_hal::StopBits::Stop1,
flow_control: serial_embedded_hal::FlowControl::FlowNone,
},
)
.unwrap();
let (tx, rx) = port.split();
let mut sd = SPIDriver::new(tx, rx);
init(&mut sd).unwrap();
const WIDTH: usize = 256;
const HEIGHT: usize = 64;
const BPP: usize = 4;
const BUF_SIZE: usize = HEIGHT * WIDTH / (8 / BPP);
let mut buf: [u8; BUF_SIZE] = [0; BUF_SIZE];
for y in 0..HEIGHT {
for x in 0..(WIDTH / 2) {
buf[(y * WIDTH / 2 + x)] = if y % 2 == 0 { 0xf0 } else { 0x0f };
}
}
cmd_n(&mut sd, 0x5c, &mut buf[..]).unwrap();
}
fn init<TX: serial::Write<u8>, RX: serial::Read<u8>>(
sd: &mut SPIDriver<TX, RX>,
) -> Result<(), spidriver::Error<TX::Error, RX::Error>> {
reset(sd)?;
cmd_1(sd, 0xfd, 0b00010010)?; cmd_0(sd, 0xae)?; cmd_2(sd, 0x15, 0x1C, 0x5B)?; cmd_2(sd, 0x75, 0x00, 0x3F)?; cmd_1(sd, 0xb3, 0x91)?; cmd_1(sd, 0xca, 0x3f)?; cmd_1(sd, 0xa2, 0x00)?; cmd_1(sd, 0xa1, 0x00)?; cmd_2(sd, 0xa0, 0b00010100, 0b00010001)?; cmd_1(sd, 0xb5, 0x00)?; cmd_1(sd, 0xab, 0x01)?; cmd_2(sd, 0xb4, 0xA0, 0xFD)?; cmd_1(sd, 0xc1, 0x9f)?; cmd_1(sd, 0xc7, 0x0f)?; cmd_0(sd, 0xb9)?; cmd_1(sd, 0xb1, 0xe2)?; cmd_2(sd, 0xd1, 0xa2, 0x20)?; cmd_1(sd, 0xbb, 0x1d)?; cmd_1(sd, 0xb6, 0x08)?; cmd_1(sd, 0xbe, 0x07)?; cmd_0(sd, 0xa6)?; cmd_0(sd, 0xaf)?;
Ok(())
}
fn reset<TX: serial::Write<u8>, RX: serial::Read<u8>>(
sd: &mut SPIDriver<TX, RX>,
) -> Result<(), spidriver::Error<TX::Error, RX::Error>> {
sd.set_b(false)?;
sd.set_b(true)
}
fn cmd_0<TX: serial::Write<u8>, RX: serial::Read<u8>>(
sd: &mut SPIDriver<TX, RX>,
cmd: u8,
) -> Result<(), spidriver::Error<TX::Error, RX::Error>> {
sd.select()?;
sd.set_a(false)?; sd.write_byte(cmd)?;
sd.unselect()
}
fn cmd_1<TX: serial::Write<u8>, RX: serial::Read<u8>>(
sd: &mut SPIDriver<TX, RX>,
cmd: u8,
a: u8,
) -> Result<(), spidriver::Error<TX::Error, RX::Error>> {
sd.select()?;
sd.set_a(false)?; sd.write_byte(cmd)?;
sd.set_a(true)?; sd.write_byte(a)?;
sd.unselect()
}
fn cmd_2<TX: serial::Write<u8>, RX: serial::Read<u8>>(
sd: &mut SPIDriver<TX, RX>,
cmd: u8,
a: u8,
b: u8,
) -> Result<(), spidriver::Error<TX::Error, RX::Error>> {
sd.select()?;
sd.set_a(false)?; sd.write_byte(cmd)?;
let msg: [u8; 2] = [a, b];
sd.set_a(true)?; sd.write(&msg[..])?;
sd.unselect()
}
fn cmd_n<TX: serial::Write<u8>, RX: serial::Read<u8>>(
sd: &mut SPIDriver<TX, RX>,
cmd: u8,
data: &mut [u8],
) -> Result<(), spidriver::Error<TX::Error, RX::Error>> {
sd.select()?;
sd.set_a(false)?; sd.write_byte(cmd)?;
let mut remain = data;
sd.set_a(true)?; while remain.len() > 0 {
let len: usize = if remain.len() > 64 { 64 } else { remain.len() };
let (this, next) = remain.split_at_mut(len);
sd.write(this)?;
remain = next;
}
sd.unselect()
}