!279 feat: 完善m核qemu串口驱动,支持shell输入
Merge pull request !279 from lnlan/shell_fix
This commit is contained in:
commit
75f975c424
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue