fix: enable the serial to retrieve the keys that consists of several characters, e.g., arrow keys (#1)

minor: mmodify out-dated comment

minor: format code

format code and fix a bug of uart driver in m0

minor: format code

fix the problem that shell cannot read arrow keys correctly

Co-authored-by: yuansm <yuanshumin@sjtu.edu.cn>
Co-authored-by: trenne <trennewen@sjtu.edu.cn>
Reviewed-on: https://git.trustie.net/gujinyu/xiuos/pulls/1
This commit is contained in:
TRenneWen 2021-09-03 10:40:36 +08:00 committed by gujinyu
parent bc91fb23ee
commit 5c9255d38e
5 changed files with 52 additions and 30 deletions

View File

@ -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;
}

View File

@ -73,6 +73,7 @@ extern "C" {
#define SERIAL_DMA_RX 0x01
#define SERIAL_DMA_TX 0x02
#define KEY_LENGTH 8
struct SerialTx
{

View File

@ -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;

View File

@ -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]);
}
}
}
}

View File

@ -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);