commit 621c3fa7e60bd46123980e938e3e9342b6ab4f3b from: Aleksey Ryndin date: Thu Mar 02 12:53:23 2023 UTC UART recv implementation commit - f9977d5b1ec596532f80fbeb1a112024f8f6d43f commit + 621c3fa7e60bd46123980e938e3e9342b6ab4f3b blob - 24f15702cdb5ba0ca3a48174cca2ef20f7d0f547 blob + 349071597c6fca19429942fb86deeb6f1892a6f6 --- Makefile +++ Makefile @@ -12,9 +12,11 @@ BOARD = virt ASFLAGS = -target ${TARGET} ASFILES = boot.o -CXXFLAGS = -target ${TARGET} -Wall -Wextra -nostdlib -fno-exceptions +CXXFLAGS = -target ${TARGET} +CXXFLAGS +=-Wall -Wextra -Werror +CXXFLAGS +=-nostdlib -fno-exceptions -std=c++11 CXXFLAGS +=-ffreestanding -mgeneral-regs-only -CXXFLAGS +=-Iinclude -std=c++11 +CXXFLAGS +=-Iinclude CXXFILES = kernel.cc uart_${BOARD}.cc OBJS = ${ASFILES:.S=.o} ${CXXFILES:.cc=.o} blob - 66a22a047beaacf08b00ea31812c9be3b8d2076a blob + 60bb64a260ae9b8f384a0d42559ad7c8bbd90448 --- kernel.cc +++ kernel.cc @@ -10,13 +10,25 @@ void uart_send_string(const char *szContent) { const char *szCurrent = szContent; - while (*szCurrent) { + while (*szCurrent) + { Board::Uart::send(*szCurrent); ++szCurrent; } } +void +uart_echo_test_mode() +{ + uart_send_string("UART echo test mode\r\n> "); + for (; ; ) + { + Board::Uart::send(Board::Uart::recv()); + } +} + + } // anonymous namespace @@ -27,6 +39,5 @@ kernel_entry_point() Board::Uart::initialize(); uart_send_string("Squat entry point\r\n"); - for (; ; ) - ; + uart_echo_test_mode(); } blob - 74896d01b6a78d7f2a5bd6bb89926a2e82b31c27 blob + 7663a12da52749a2f572dedb6a5cbed5c08869f6 --- uart_virt.cc +++ uart_virt.cc @@ -23,6 +23,7 @@ void initialize() Pl011::ControlRegister ControlRegister; ControlRegister.m_u.m_Bits.m_UartEnable = 1; ControlRegister.m_u.m_Bits.m_TransmitEnable = 1; + ControlRegister.m_u.m_Bits.m_ReceiveEnable = 1; Hw::write32(UART_BASE + Pl011::CONTROL_REGISTER, ControlRegister.m_u.m_nValue); } @@ -42,7 +43,13 @@ void send(uint8_t nValue) uint8_t recv() { - return 0; + for (; ; ) + { + Pl011::FlagRegister FlagRegister{Hw::read32(UART_BASE + Pl011::FLAG_REGISTER)}; + if (!FlagRegister.m_u.m_Bits.m_ReceiveFifoEmpty) + break; + } + return Hw::read32(UART_BASE + Pl011::DATA_REGISTER) & 0xff; }