diff --git a/Ubiquitous/XiUOS/board/cortex-m0-emulator/third_party_driver/Libraries/driverlib/uart.c b/Ubiquitous/XiUOS/board/cortex-m0-emulator/third_party_driver/Libraries/driverlib/uart.c index 757d3d36d..5e4f70e93 100644 --- a/Ubiquitous/XiUOS/board/cortex-m0-emulator/third_party_driver/Libraries/driverlib/uart.c +++ b/Ubiquitous/XiUOS/board/cortex-m0-emulator/third_party_driver/Libraries/driverlib/uart.c @@ -79,20 +79,11 @@ void UARTlInitialize(void) { UART_STARTTX = 1; UART_STARTRX = 1; UART_RXDRDY = 0; + UART_TXDRDY = 1; /* Enable the uart interrupt in NVIC */ HWREG(g_pulEnRegs[(18 - 16) / 32]) = 1 << ((18 - 16) & 31); } -int SerialGetcNoBlock(void) { - char ch; - if (UART_RXDRDY) { - ch = UART_RXD; - UART_RXDRDY = 0; - return ch; - } - return -1; -} - void UARTConfigSetExpClk(unsigned long ulBase, unsigned long ulUARTClk, unsigned long ulBaud, unsigned long ulConfig) { @@ -106,22 +97,34 @@ tBoolean UARTCharsAvail(unsigned long ulBase) long UARTCharGetNonBlocking(unsigned long ulBase) { - return SerialGetcNoBlock(); + char ch; + + if (UART_RXDRDY) { + UART_RXDRDY = 0; + ch = UART_RXD; + return ch; + } + return -1; } long UARTCharGet(unsigned long ulBase) { + char ch; + while (!UART_RXDRDY); - char ch = UART_RXD; UART_RXDRDY = 0; + ch = UART_RXD; return ch; } tBoolean UARTCharPutNonBlocking(unsigned long ulBase, unsigned char ucData) { - UART_TXDRDY = 0; - UART_TXD = ucData; - return 1; + if (UART_TXDRDY) { + UART_TXDRDY = 0; + UART_TXD = ucData; + return true; + } + return false; } void UARTCharPut(unsigned long ulBase, unsigned char ucData) @@ -148,6 +151,6 @@ unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked) void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags) { - ulIntFlags &= 0xFFFFFFFB; UART_INTENCLR = ulIntFlags; + UART_INTENSET = ulIntFlags; } diff --git a/Ubiquitous/XiUOS/resources/include/dev_serial.h b/Ubiquitous/XiUOS/resources/include/dev_serial.h index 8672e3c4e..146202f8a 100644 --- a/Ubiquitous/XiUOS/resources/include/dev_serial.h +++ b/Ubiquitous/XiUOS/resources/include/dev_serial.h @@ -73,6 +73,7 @@ extern "C" { #define SERIAL_DMA_RX 0x01 #define SERIAL_DMA_TX 0x02 +#define KEY_LENGTH 8 struct SerialTx { diff --git a/Ubiquitous/XiUOS/resources/serial/dev_serial.c b/Ubiquitous/XiUOS/resources/serial/dev_serial.c index 46a042dfb..f12cb1d0b 100644 --- a/Ubiquitous/XiUOS/resources/serial/dev_serial.c +++ b/Ubiquitous/XiUOS/resources/serial/dev_serial.c @@ -122,30 +122,41 @@ static inline int SerialDevIntRead(struct SerialHardwareDevice *serial_dev, stru NULL_PARAM_CHECK(serial_dev); NULL_PARAM_CHECK(read_param); + int char_num = 0; struct SerialHwDevDone *hwdev_done = serial_dev->hwdev_done; struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_dev->private_data; uint8 *read_data = (uint8 *)read_param->buffer; x_size_t read_length = read_param->size; + int start_pointer, end_pointer; + int i; + while (read_length) { - uint8 get_char; x_base lock; + start_pointer = serial_dev->serial_fifo.serial_rx->serial_recv_num; + end_pointer = serial_dev->serial_fifo.serial_rx->serial_send_num; lock = CriticalAreaLock(); - if (serial_dev->serial_fifo.serial_rx->serial_recv_num == serial_dev->serial_fifo.serial_rx->serial_send_num) { + if (start_pointer == end_pointer) { if (RET_FALSE == serial_dev->serial_fifo.serial_rx->serial_rx_full) { CriticalAreaUnLock(lock); break; } } - - get_char = serial_dev->serial_fifo.serial_rx->serial_rx_buffer[serial_dev->serial_fifo.serial_rx->serial_recv_num]; - serial_dev->serial_fifo.serial_rx->serial_recv_num += 1; - if (serial_dev->serial_fifo.serial_rx->serial_recv_num >= serial_cfg->data_cfg.serial_buffer_size) { - serial_dev->serial_fifo.serial_rx->serial_recv_num = 0; + + /* Read all the chars from the serial_rx_buffer */ + while (start_pointer != end_pointer) + { + read_data[char_num] = serial_dev->serial_fifo.serial_rx->serial_rx_buffer[start_pointer]; + start_pointer += 1; + if (start_pointer >= serial_cfg->data_cfg.serial_buffer_size) { + start_pointer = 0; + } + char_num = char_num + 1; } + read_data[char_num]='\0'; if (RET_TRUE == serial_dev->serial_fifo.serial_rx->serial_rx_full) { serial_dev->serial_fifo.serial_rx->serial_rx_full = RET_FALSE; @@ -153,10 +164,9 @@ static inline int SerialDevIntRead(struct SerialHardwareDevice *serial_dev, stru CriticalAreaUnLock(lock); - *read_data = get_char; - read_data++; read_length--; - read_param->read_length++; + read_param->read_length += char_num; + serial_dev->serial_fifo.serial_rx->serial_recv_num = start_pointer; } return EOK; diff --git a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c index 2cd6e577b..a0e3f46db 100644 --- a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c +++ b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.c @@ -1645,14 +1645,21 @@ void shellTask(void *param) { // KPrintf("this is in 1733"); Shell *shell = (Shell *)param; - char data; + + /* One input key from the the keyboard/uart may consist of mutliple characters (e.g., arrow keys). */ + char data[KEY_LENGTH]; + int i; + int data_len; + while(RET_TRUE) { - if (shell->read && shell->read(&data) == 0) - { + if (shell->read && shell->read(data) == 0) { // KPrintf("in 1741 the char is: '%c' and ascii code is %d.\n\n",data,data); // KPrintf("the buffer is:'%s'\n\n",shell->parser.); - shellHandler(shell, data); + data_len = strlen(data); + for (i = 0; i < data_len; i++) { + shellHandler(shell, data[i]); + } } } } diff --git a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.h b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.h index 61cb78d3f..75084d63c 100644 --- a/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.h +++ b/Ubiquitous/XiUOS/tool/shell/letter-shell/shell.h @@ -256,6 +256,7 @@ typedef struct #define shellSetPath(_shell, _path) (_shell)->info.path = _path #define shellGetPath(_shell) ((_shell)->info.path) +#define KEY_LENGTH 8 void shellInit(Shell *shell, char *buffer, unsigned short size); unsigned short shellWriteString(Shell *shell, const char *string);