107 lines
3.5 KiB
Rust
107 lines
3.5 KiB
Rust
use devices::DeviceImpl;
|
|
|
|
use std;
|
|
use slog::Logger;
|
|
|
|
const USART_DATA: u32 = 0;
|
|
const USART_STATUS: u32 = 1;
|
|
const USART_CTRLA: u32 = 3;
|
|
const USART_CTRLB: u32 = 4;
|
|
const USART_CTRLC: u32 = 5;
|
|
const USART_BAUDCTRLA: u32 = 6;
|
|
const USART_BAUDCTRLB: u32 = 7;
|
|
|
|
pub struct USART {
|
|
/*
|
|
0x8A0: 'USARTC0_DATA',
|
|
0x8A1: 'USARTC0_STATUS',
|
|
0x8A3: 'USARTC0_CTRLA',
|
|
0x8A4: 'USARTC0_CTRLB',
|
|
0x8A5: 'USARTC0_CTRLC',
|
|
0x8A6: 'USARTC0_BAUDCTRLA',
|
|
0x8A7: 'USARTC0_BAUDCTRLB',
|
|
*/
|
|
log: Logger,
|
|
// Raw values:
|
|
status: u8,
|
|
ctrla: u8,
|
|
ctrlb: u8,
|
|
ctrlc: u8,
|
|
baudctrla: u8,
|
|
baudctrlb: u8,
|
|
}
|
|
|
|
impl USART {
|
|
pub fn new(log: Logger) -> Self {
|
|
Self {
|
|
log: log,
|
|
status: 0,
|
|
ctrla: 0,
|
|
ctrlb: 0,
|
|
ctrlc: 0,
|
|
baudctrla: 0,
|
|
baudctrlb: 0,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl DeviceImpl for USART {
|
|
fn read(&mut self, addr: u32) -> u8 {
|
|
match addr {
|
|
USART_DATA => {
|
|
info!(self.log, "USART::Read(), not implemented");
|
|
0
|
|
},
|
|
USART_STATUS => {
|
|
// USART_DREIF_bm 0x20
|
|
/*
|
|
|
|
6528 #define USART_RXCIF_bm 0x80 // Receive Interrupt Flag bit mask.
|
|
6529 #define USART_RXCIF_bp 7 // Receive Interrupt Flag bit position.
|
|
6530
|
|
6531 #define USART_TXCIF_bm 0x40 // Transmit Interrupt Flag bit mask.
|
|
6532 #define USART_TXCIF_bp 6 // Transmit Interrupt Flag bit position.
|
|
6533
|
|
6534 #define USART_DREIF_bm 0x20 // Data Register Empty Flag bit mask.
|
|
6535 #define USART_DREIF_bp 5 // Data Register Empty Flag bit position.
|
|
6536
|
|
6537 #define USART_FERR_bm 0x10 // Frame Error bit mask.
|
|
6538 #define USART_FERR_bp 4 // Frame Error bit position.
|
|
6539
|
|
6540 #define USART_BUFOVF_bm 0x08 // Buffer Overflow bit mask.
|
|
6541 #define USART_BUFOVF_bp 3 // Buffer Overflow bit position.
|
|
6542
|
|
6543 #define USART_PERR_bm 0x04 // Parity Error bit mask.
|
|
6544 #define USART_PERR_bp 2 // Parity Error bit position.
|
|
6545
|
|
6546 #define USART_RXB8_bm 0x01 // Receive Bit 8 bit mask.
|
|
6547 #define USART_RXB8_bp 0 // Receive Bit 8 bit position.
|
|
6548
|
|
*/
|
|
info!(self.log, "Checking USART status");
|
|
self.status | 0x20u8 // Data register empty flag.
|
|
}
|
|
USART_CTRLA => self.ctrla,
|
|
USART_CTRLB => self.ctrlb,
|
|
USART_CTRLC => self.ctrlc,
|
|
USART_BAUDCTRLA => self.baudctrla,
|
|
USART_BAUDCTRLB => self.baudctrlb,
|
|
_ => unreachable!()
|
|
}
|
|
}
|
|
|
|
fn write(&mut self, addr: u32, value: u8) {
|
|
match addr {
|
|
USART_DATA => {
|
|
info!(self.log, "USART::Write({} / {:?})", value, std::char::from_u32(u32::from(value)));
|
|
},
|
|
USART_STATUS => self.status = value,
|
|
USART_CTRLA => self.ctrla = value,
|
|
USART_CTRLB => self.ctrlb = value,
|
|
USART_CTRLC => self.ctrlc = value,
|
|
USART_BAUDCTRLA => self.baudctrla = value,
|
|
USART_BAUDCTRLB => self.baudctrlb = value,
|
|
_ => panic!("Write to usart offset {} <- {:02X}", addr, value),
|
|
}
|
|
}
|
|
} |