diff --git a/doc/rpi3_serial.md b/doc/rpi3_serial.md new file mode 100644 index 0000000..78aca93 --- /dev/null +++ b/doc/rpi3_serial.md @@ -0,0 +1,30 @@ +# Connecting RPi3 UART + +## Using cp2104 usb-to-ttl converter + +Download drivers from: https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers + +Install `minicom`: `brew install minicom` + +Configure minicom to use `/dev/tty.SLAB_USBtoUART` port. + +Connect rpi wires to cp2014: + +``` +UART0 + +FUNC | GPIO | PIN # | MODE | Wire color +------+--------+---------+--------+------------ +RXD0 | GPIO15 | 10 | Alt0 | Brown +TXD0 | GPIO14 | 8 | Alt0 | Red +``` + +``` +MiniUart (UART1) + +FUNC | GPIO | PIN # | MODE | Wire color +------+--------+---------+--------+------------ +RXD1 | GPIO15 | 10 | Alt5 | Brown +TXD1 | GPIO14 | 8 | Alt5 | Red +GND | GND | 6 | | Green +``` diff --git a/src/main.rs b/src/main.rs index bc2954c..23a30b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -55,41 +55,52 @@ use platform::{ /// The global console. Output of the print! and println! macros. static CONSOLE: sync::NullLock = sync::NullLock::new(devices::Console::new()); -// Kernel entry point -// arch crate is responsible for calling this -fn kmain() -> ! { - // let gpio = GPIO::new_default(); - - // let uart = platform::MiniUart::new_default(); - // uart.init(&gpio); - // CONSOLE.lock(|c| { - // // Moves uart into the global CONSOLE. It is not accessible - // // anymore for the remaining parts of kernel_entry(). - // c.replace_with(uart.into()); - // }); - - // let uart = platform::PL011Uart::new_default(); - - // let mut mbox = platform::mailbox::Mailbox::new(); - - // match uart.init(&mut mbox, &gpio) { - // Ok(_) => { - // CONSOLE.lock(|c| { - // // Moves uart into the global CONSOLE. It is not accessible - // // anymore for the remaining parts of kernel_entry(). - // c.replace_with(uart.into()); - // }); - // } - // Err(_) => endless_sleep(), - // } - +fn init_jlink_rtt() { CONSOLE.lock(|c| { c.replace_with(Output::new().into()); }); - jtag_dbg_wait(); + println!("\n[0] JLink RTT is live!"); +} - println!("\n[0] UART is live!"); +fn init_uart_serial() { + let gpio = GPIO::new_default(); + + let uart = platform::MiniUart::new_default(); + uart.init(&gpio); + CONSOLE.lock(|c| { + // Moves uart into the global CONSOLE. It is not accessible + // anymore for the remaining parts of kernel_entry(). + c.replace_with(uart.into()); + }); + + println!("[0] MiniUART is live!"); + + let uart = platform::PL011Uart::new_default(); + + let mut mbox = platform::mailbox::Mailbox::new(); + + match uart.init(&mut mbox, &gpio) { + Ok(_) => { + CONSOLE.lock(|c| { + // Moves uart into the global CONSOLE. It is not accessible + // anymore for the remaining parts of kernel_entry(). + c.replace_with(uart.into()); + }); + } + Err(_) => endless_sleep(), // @todo ignore error because MiniUart is still there? + } + + println!("[0] UART0 is live!"); +} + +// Kernel entry point +// arch crate is responsible for calling this +fn kmain() -> ! { + init_jlink_rtt(); + + // init_uart_serial(); + // jtag_dbg_wait(); extern "C" { static __exception_vectors_start: u64;