63#ifdef LOSCFG_SHELL_DMESG
74#define BUF_MAX_INDEX (g_logBufSize - 1)
147 readLen = len < logSize ? len : logSize;
150 ret = memcpy_s(buf, len, logBuf + head, readLen);
158 ret = memcpy_s(buf, len, logBuf + head, readLen);
165 ret = memcpy_s(buf, len, logBuf + head,
g_logBufSize - head);
179 return (
INT32)readLen;
206 if (bufSize < g_dmesgInfo->logSize) {
216 ret = memcpy_s(newBuf, bufSize, temp + copyStart, copyLen);
223 return (
INT32)copyLen;
227 PRINT_ERR(
"%s,%d failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
277 CHAR *newString = NULL;
285 if (newString == NULL) {
338 if (buffer == NULL) {
389 if (!logLen || (dst == NULL)) {
392 if (logLen > bufSize) {
393 ret = memcpy_s(buf + tail, bufSize - tail, dst, bufSize - tail);
395 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
398 ret = memcpy_s(buf, bufSize, dst + bufSize - tail, tail);
400 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
406 if (logLen > (bufSize - tail)) {
407 ret = memcpy_s(buf + tail, bufSize - tail, dst, bufSize - tail);
409 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
412 ret = memcpy_s(buf, bufSize, dst + bufSize - tail, logLen - (bufSize - tail));
414 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
421 ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
423 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
444 if ((!logLen) || (dst == NULL)) {
447 if (logLen > (bufSize - logSize)) {
448 writeLen = bufSize - logSize;
449 ret = memcpy_s(buf + tail, bufSize - tail, dst, writeLen);
451 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
459 ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
461 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
478 if ((!logLen) || (dst == NULL)) {
481 if (logLen >= (bufSize - tail)) {
482 writeLen = bufSize - tail;
483 ret = memcpy_s(buf + tail, writeLen, dst, writeLen);
485 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
497 ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
499 PRINT_ERR(
"%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
548 while (i < g_dmesgInfo->logSize) {
550 if (index > BUF_MAX_INDEX) {
568 levelNum = strtoul(level, &p, 0);
570 PRINTK(
"dmesg: invalid option or parameter.\n");
580 PRINTK(
"dmesg -l [num] can access as 0:EMG 1:COMMON 2:ERROR 3:WARN 4:INFO 5:DEBUG\n");
590 sizeVal = strtoul(size, &p, 0);
591 if (sizeVal > MAX_KERNEL_LOG_BUF_SIZE) {
596 PRINTK(
"Set dmesg buf size %u success\n", sizeVal);
603 PRINTK(
"Set dmesg buf size %u fail\n", sizeVal);
667 INT32 fd = open(fullpath, O_CREAT | O_RDWR | O_APPEND, 0644);
671 ret = write(fd, buf, logSize);
680 CHAR *fullpath = NULL;
684 UINT32 logSize, bufSize, head, tail, intSave;
710 ret = memcpy_s(buf, logSize, logBuf + head, logSize);
715 ret = memcpy_s(buf, logSize, logBuf + head, bufSize - head);
719 ret = memcpy_s(buf + bufSize - head, logSize - (bufSize - head), logBuf, tail);
736 PRINTK(
"File operation need VFS\n");
769 }
else if (argc == 2) {
774 if (!strcmp(argv[1],
"-c")) {
779 }
else if (!strcmp(argv[1],
"-C")) {
782 }
else if (!strcmp(argv[1],
"-D")) {
785 }
else if (!strcmp(argv[1],
"-E")) {
788 }
else if (!strcmp(argv[1],
"-L")) {
791 }
else if (!strcmp(argv[1],
"-U")) {
795 }
else if (argc == 3) {
800 if (!strcmp(argv[1],
">")) {
802 PRINTK(
"Dmesg write log to %s fail \n", argv[2]);
805 PRINTK(
"Dmesg write log to %s success \n", argv[2]);
808 }
else if (!strcmp(argv[1],
"-l")) {
810 }
else if (!strcmp(argv[1],
"-s")) {
816 PRINTK(
"dmesg: invalid option or parameter.\n");
@ CMD_TYPE_STD
支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
char * OsShellGetWorkingDirectory(void)
UINT32 OsCheckUartLock(VOID)
STATIC VOID OsWriteTailToHead(const CHAR *dst, UINT32 logLen)
从头写入
STATIC UINT32 OsCheckError(VOID)
读取dmesg日志
STATIC CHAR OsLogRecordChar(CHAR c)
只记录一个字符
STATIC UINT32 g_uartLock
用于关闭和打开串口
LOS_MODULE_INIT(OsDmesgInit, LOS_INIT_LEVEL_EARLIEST)
STATIC VOID OsLockUart(VOID)
关闭串口
INT32 OsDmesgWrite2File(const CHAR *fullpath, const CHAR *buf, UINT32 logSize)
UINT32 OsLogRecordStr(const CHAR *str, UINT32 len)
记录一个字符串
INT32 OsLogMemcpyRecord(const CHAR *buf, UINT32 logLen)
内存拷贝日志
INT32 LOS_DmesgToFile(const CHAR *filename)
将dmesg 保存到文件中
STATIC UINT32 g_consoleLock
用于关闭和打开控制台
STATIC VOID OsUnlockConsole(VOID)
打开控制台
STATIC INT32 OsDmesgRead(CHAR *buf, UINT32 len)
STATIC UINT32 g_logBufSize
缓冲区内容体大小
UINT32 LOS_DmesgLvSet(UINT32 level)
Set the dmesg level
STATIC VOID OsWriteTailToEnd(const CHAR *dst, UINT32 logLen)
从尾写入
STATIC VOID * g_mallocAddr
缓存区开始位置,即头位置
STATIC UINT32 OsDmesgResetMem(const VOID *addr, UINT32 size)
重置内存
VOID OsLogShow(VOID)
使用串口打印日志
UINT32 LOS_DmesgMemSet(const VOID *addr, UINT32 size)
设置dmesg缓存大小
SHELLCMD_ENTRY(dmesg_shellcmd, CMD_TYPE_STD, "dmesg", XARGS,(CmdCallBackFunc) OsShellCmdDmesg)
STATIC INT32 OsDmesgMemSizeSet(const CHAR *size)
LITE_OS_SEC_BSS STATIC SPIN_LOCK_INIT(g_dmesgSpin)
STATIC const CHAR * g_levelString[]
STATIC INT32 OsCopyToNew(const VOID *addr, UINT32 size)
把旧人账目移交给新人
STATIC VOID OsLockConsole(VOID)
关闭控制台
STATIC VOID OsUnlockUart(VOID)
打开串口
STATIC VOID OsBufFullWrite(const CHAR *dst, UINT32 logLen)
INT32 LOS_DmesgRead(CHAR *buf, UINT32 len)
读取 dmesg 消息
STATIC INT32 OsDmesgLvSet(const CHAR *level)
设置日志层级
VOID LOS_DmesgClear(VOID)
Clear dmesg log.
UINT32 OsCheckConsoleLock(VOID)
STATIC DmesgInfo * g_dmesgInfo
保存在 g_mallocAddr 的开始位置,即头信息
STATIC UINT32 OsDmesgChangeSize(UINT32 size)
调整缓冲区大小,如下五个步骤
UINT32 OsDmesgInit(VOID)
初始化 dmesg
UINT32 OsDmesgLvGet(VOID)
STATIC UINT32 g_dmesgLogLevel
日志等级
INT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
dmesg全称是display message (or display driver),即显示信息。
int vfs_normalize_path(const char *directory, const char *filename, char **pathname)
VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *lock, UINT32 intSave)
VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UINT32 *intSave)
void * malloc(size_t size)
动态分配内存块大小
void free(void *ptr)
释放ptr所指向的内存空间
VOID UartPuts(const CHAR *s, UINT32 len, BOOL isLock)
u32_t(* CmdCallBackFunc)(u32_t argc, const char **argv)