feat: 完善m核qemu串口驱动,支持shell输入

【背景】
m核qemu需完善串口驱动,支持shell输入
【修改方案】
1.完善串口驱动
2.添加shell任务,获取串口输入并下发处理
【影响】
对现有的产品编译不会有影响。

re #I46N7F

Signed-off-by: lanleinan <lanleinan@163.com>
Change-Id: Ib58d4e633081743e64412cb65aa209d3356d6c1c
This commit is contained in:
lnlan 2021-08-21 07:36:41 +00:00
parent 97c4a5813f
commit c4dc5ab0f8
3 changed files with 111 additions and 30 deletions

View File

@ -29,11 +29,18 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "shmsg.h" #include "shmsg.h"
#include "securec.h"
#include "shcmd.h" #include "shcmd.h"
#include "show.h" #include "show.h"
#include "securec.h" #if (LOSCFG_USE_SHELL == 1)
#include "uart.h"
#endif
#include "los_event.h"
#include "los_task.h"
EVENT_CB_S g_shellInputEvent;
#define SHELL_CMD_MAX_SIZE 64
UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType) UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType)
{ {
@ -60,17 +67,17 @@ UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType)
return OS_INVALID; return OS_INVALID;
} }
char *GetCmdName(const char *cmdline, unsigned int len) CHAR *GetCmdName(const CHAR *cmdline, UINT32 len)
{ {
unsigned int loop; UINT32 loop;
const char *tmpStr = NULL; const CHAR *tmpStr = NULL;
BOOL quotes = FALSE; BOOL quotes = FALSE;
char *cmdName = NULL; CHAR *cmdName = NULL;
if (cmdline == NULL) { if (cmdline == NULL) {
return NULL; return NULL;
} }
cmdName = (char *)malloc(len + 1); cmdName = (CHAR *)malloc(len + 1);
if (cmdName == NULL) { if (cmdName == NULL) {
PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__); PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__);
return NULL; return NULL;
@ -99,9 +106,9 @@ char *GetCmdName(const char *cmdline, unsigned int len)
return cmdName; return cmdName;
} }
int ShellCmdExec(const char *msgName, const char *cmdString) INT32 ShellCmdExec(const CHAR *msgName, const CHAR *cmdString)
{ {
unsigned int uintRet; UINT32 uintRet;
errno_t err; errno_t err;
CmdParsed cmdParsed; CmdParsed cmdParsed;
@ -118,24 +125,24 @@ int ShellCmdExec(const char *msgName, const char *cmdString)
PRINTK("%s:command not found\n", msgName); PRINTK("%s:command not found\n", msgName);
return -EFAULT; return -EFAULT;
} else { } else {
(void)OsCmdExec(&cmdParsed, (char *)cmdString); (VOID)OsCmdExec(&cmdParsed, (CHAR *)cmdString);
} }
return 0; return 0;
} }
unsigned int PreHandleCmdline(const char *input, char **output, unsigned int *outputlen) UINT32 PreHandleCmdline(const CHAR *input, CHAR **output, UINT32 *outputlen)
{ {
unsigned int shiftLen; UINT32 shiftLen;
unsigned int ret; UINT32 ret;
const char *cmdBuf = input; const CHAR *cmdBuf = input;
unsigned int cmdBufLen = strlen(cmdBuf); UINT32 cmdBufLen = strlen(cmdBuf);
char *shiftStr = (char *)malloc(cmdBufLen + 1); CHAR *shiftStr = (CHAR *)malloc(cmdBufLen + 1);
if (shiftStr == NULL) { if (shiftStr == NULL) {
PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__); PRINTK("malloc failure in %s[%d]\n", __FUNCTION__, __LINE__);
return SH_NOK; return SH_NOK;
} }
(void)memset_s(shiftStr, cmdBufLen + 1, 0, cmdBufLen + 1); (VOID)memset_s(shiftStr, cmdBufLen + 1, 0, cmdBufLen + 1);
/* Call function 'OsCmdKeyShift' to squeeze and clear useless or overmuch space if string buffer */ /* Call function 'OsCmdKeyShift' to squeeze and clear useless or overmuch space if string buffer */
ret = OsCmdKeyShift(cmdBuf, shiftStr, cmdBufLen + 1); ret = OsCmdKeyShift(cmdBuf, shiftStr, cmdBufLen + 1);
@ -156,12 +163,12 @@ END:
return ret; return ret;
} }
static void ParseAndExecCmdline(CmdParsed *cmdParsed, const char *cmdline, unsigned int len) static VOID ParseAndExecCmdline(CmdParsed *cmdParsed, const CHAR *cmdline, UINT32 len)
{ {
int i; INT32 i;
unsigned int ret; UINT32 ret;
char *cmdlineOrigin = NULL; CHAR *cmdlineOrigin = NULL;
char *cmdName = NULL; CHAR *cmdName = NULL;
cmdlineOrigin = strdup(cmdline); cmdlineOrigin = strdup(cmdline);
if (cmdlineOrigin == NULL) { if (cmdlineOrigin == NULL) {
@ -176,13 +183,13 @@ static void ParseAndExecCmdline(CmdParsed *cmdParsed, const char *cmdline, unsig
return; return;
} }
ret = OsCmdParse((char *)cmdline, cmdParsed); ret = OsCmdParse((CHAR *)cmdline, cmdParsed);
if (ret != SH_OK) { if (ret != SH_OK) {
PRINTK("cmd parse failure in %s[%d]\n", __FUNCTION__, __LINE__); PRINTK("cmd parse failure in %s[%d]\n", __FUNCTION__, __LINE__);
goto OUT; goto OUT;
} }
(void)ShellCmdExec(cmdName, cmdlineOrigin); (VOID)ShellCmdExec(cmdName, cmdlineOrigin);
OUT: OUT:
for (i = 0; i < cmdParsed->paramCnt; i++) { for (i = 0; i < cmdParsed->paramCnt; i++) {
@ -195,11 +202,11 @@ OUT:
free(cmdlineOrigin); free(cmdlineOrigin);
} }
LITE_OS_SEC_TEXT_MINOR void ExecCmdline(const char *cmdline) LITE_OS_SEC_TEXT_MINOR VOID ExecCmdline(const CHAR *cmdline)
{ {
unsigned int ret; UINT32 ret;
char *output = NULL; CHAR *output = NULL;
unsigned int outputlen; UINT32 outputlen;
CmdParsed cmdParsed; CmdParsed cmdParsed;
if (cmdline == NULL) { if (cmdline == NULL) {
@ -214,8 +221,63 @@ LITE_OS_SEC_TEXT_MINOR void ExecCmdline(const char *cmdline)
return; return;
} }
(void)memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed)); (VOID)memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed));
ParseAndExecCmdline(&cmdParsed, output, outputlen); ParseAndExecCmdline(&cmdParsed, output, outputlen);
free(output); free(output);
} }
#if (LOSCFG_USE_SHELL == 1)
VOID ShellTaskEntry(VOID)
{
CHAR buf[SHELL_CMD_MAX_SIZE] = {0};
CHAR *ptr = buf;
PRINTK("OHOS # ");
while(1) {
(VOID)LOS_EventRead(&g_shellInputEvent, 0x1, LOS_WAITMODE_AND | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);
while((*ptr = (UINT8)UartGetc()) != 0 && *ptr != 13) {
PRINTK("%c", *ptr);
if ((ptr - buf) == (sizeof(buf) - 1)) {
break;
}
ptr++;
}
if (ptr != buf) {
if (*ptr == 13 || ((ptr - buf) == (sizeof(buf) - 1))) {
PRINTK("%c", *ptr);
*ptr = '\0';
ptr = buf;
PRINTK("\n\r", buf);
ExecCmdline(buf);
PRINTK("OHOS # ");
}
} else {
PRINTK("\n\rOHOS # ");
}
}
}
LITE_OS_SEC_TEXT_MINOR UINT32 LosShellInit(VOID)
{
UINT32 ret;
UINT32 taskID1, taskID2;
TSK_INIT_PARAM_S task1 = { 0 };
ret = LOS_EventInit(&g_shellInputEvent);
if (ret != LOS_OK) {
PRINTK("Init shellInputEvent failed! ERROR: 0x%x\n", ret);
return ret;
}
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)ShellTaskEntry;
task1.uwStackSize = 0x1000;
task1.pcName = "ShellTaskEntry";
task1.usTaskPrio = LOSCFG_SHELL_PRIO;
ret = LOS_TaskCreate(&taskID1, &task1);
if (ret != LOS_OK) {
PRINTK("Create Shell Task failed! ERROR: 0x%x\n", ret);
return ret;
}
return ret;
}
#endif

View File

@ -62,7 +62,7 @@ LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellCmdConvertTskStatus(UINT16 taskStatus)
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID) LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID)
{ {
PRINTK("\r\nName TaskEntryAddr TID "); PRINTK("Name TaskEntryAddr TID ");
PRINTK("Priority Status " PRINTK("Priority Status "
"StackSize StackPoint TopOfStack"); "StackSize StackPoint TopOfStack");

View File

@ -781,6 +781,25 @@ extern UINT8 *m_aucSysMem0;
#define LOSCFG_MPU_ENABLE 0 #define LOSCFG_MPU_ENABLE 0
#endif #endif
/*=============================================================================
shell module configuration
=============================================================================*/
/**
* @ingroup los_config
* Configuration item for shell.
*/
#ifndef LOSCFG_USE_SHELL
#define LOSCFG_USE_SHELL 0
#endif
/**
* @ingroup los_config
* Configuration shell task priority.
*/
#ifndef LOSCFG_SHELL_PRIO
#define LOSCFG_SHELL_PRIO 3
#endif
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }