1- use alloc:: { boxed:: Box , collections:: VecDeque , vec:: Vec } ;
21use core:: fmt:: { Arguments , Result , Write } ;
32
4- use spin:: Mutex ;
5-
63use super :: { sbi, uart} ;
74
8- lazy_static:: lazy_static! {
9- static ref STDIN : Mutex <VecDeque <u8 >> = Mutex :: new( VecDeque :: new( ) ) ;
10- static ref STDIN_CALLBACK : Mutex <Vec <Box <dyn Fn ( ) -> bool + Send + Sync >>> =
11- Mutex :: new( Vec :: new( ) ) ;
12- }
13-
145struct SbiConsole ;
156struct UartConsole ;
167
@@ -34,52 +25,10 @@ impl Write for UartConsole {
3425 }
3526}
3627
37- pub ( super ) fn sbi_print_fmt ( fmt : Arguments ) {
38- SbiConsole . write_fmt ( fmt) . unwrap ( ) ;
39- }
40-
41- pub ( super ) fn uart_print_fmt ( fmt : Arguments ) {
42- UartConsole . write_fmt ( fmt) . unwrap ( ) ;
43- }
44-
4528hal_fn_impl ! {
4629 impl mod crate :: hal_fn:: serial {
47- fn serial_put( x: u8 ) {
48- if ( x == b'\r' ) || ( x == b'\n' ) {
49- STDIN . lock( ) . push_back( b'\n' ) ;
50- STDIN . lock( ) . push_back( b'\r' ) ;
51- } else{
52- STDIN . lock( ) . push_back( x) ;
53- }
54- STDIN_CALLBACK . lock( ) . retain( |f| !f( ) ) ;
55- }
56-
57- fn serial_set_callback( callback: Box <dyn Fn ( ) -> bool + Send + Sync >) {
58- STDIN_CALLBACK . lock( ) . push( callback) ;
59- }
60-
61- fn serial_read( buf: & mut [ u8 ] ) -> usize {
62- let mut stdin = STDIN . lock( ) ;
63- let len = stdin. len( ) . min( buf. len( ) ) ;
64- for c in & mut buf[ ..len] {
65- * c = stdin. pop_front( ) . unwrap( ) ;
66- }
67- len
68- }
69-
7030 fn serial_write_fmt( fmt: Arguments ) {
71- uart_print_fmt ( fmt) ;
31+ UartConsole . write_fmt ( fmt) . unwrap ( ) ;
7232 }
7333 }
7434}
75-
76- macro_rules! sbi_print {
77- ( $( $arg: tt) * ) => ( {
78- crate :: serial:: sbi_print_fmt( format_args!( $( $arg) * ) ) ;
79- } ) ;
80- }
81-
82- macro_rules! sbi_println {
83- ( ) => ( sbi_print!( "\n " ) ) ;
84- ( $( $arg: tt) * ) => ( sbi_print!( "{}\n " , format_args!( $( $arg) * ) ) ) ;
85- }
0 commit comments