提交 bf7a1ab7 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

完善串口注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    鸿蒙研究站 | http://weharmonyos.com (国内)
              | https://weharmony.github.io (国外)
    oschina | https://my.oschina.net/weharmony
    博客园 | https://www.cnblogs.com/weharmony/
    知乎 | https://www.zhihu.com/people/weharmonyos
    csdn | https://blog.csdn.net/kuangyufei
    51cto | https://harmonyos.51cto.com/column/34
    掘金 | https://juejin.cn/user/756888642000808
    公众号 | 鸿蒙研究站 (weharmonyos)
上级 260d7bd7
...@@ -657,7 +657,7 @@ void *ShellEntry(void *argv) ...@@ -657,7 +657,7 @@ void *ShellEntry(void *argv)
char ch; char ch;
int ret; int ret;
int n; int n;
pid_t tid = syscall(__NR_gettid); pid_t tid = syscall(__NR_gettid);//获取当前任务/线程ID, 即 "Shell Entry" 任务的ID
ShellCB *shellCB = (ShellCB *)argv; ShellCB *shellCB = (ShellCB *)argv;
if (shellCB == NULL) { if (shellCB == NULL) {
...@@ -666,12 +666,12 @@ void *ShellEntry(void *argv) ...@@ -666,12 +666,12 @@ void *ShellEntry(void *argv)
(void)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN); (void)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);
ret = prctl(PR_SET_NAME, "ShellEntry");//创建一个shell客户端任务 ret = prctl(PR_SET_NAME, "ShellEntry");//将任务的名称设置成 ShellEntry
if (ret != SH_OK) { if (ret != SH_OK) {
return NULL; return NULL;
} }
ret = ShellKernelReg((int)tid);///< 将shell客户端任务和控制台绑定 ret = ShellKernelReg((int)tid);//向内核注册shell,和控制台捆绑在一块
if (ret != 0) { if (ret != 0) {
printf("another shell is already running!\n"); printf("another shell is already running!\n");
exit(-1); exit(-1);
......
...@@ -462,7 +462,7 @@ VOID KillPgrp(UINT16 consoleId) ...@@ -462,7 +462,7 @@ VOID KillPgrp(UINT16 consoleId)
} }
(VOID)OsKillLock(consoleCB->pgrpId, SIGINT);//发送信号 SIGINT对应 键盘中断(ctrl + c)信号 (VOID)OsKillLock(consoleCB->pgrpId, SIGINT);//发送信号 SIGINT对应 键盘中断(ctrl + c)信号
} }
///用户使用参数buffer将控制台的buf接走 ///使用参数buffer将控制台的buf接走
STATIC INT32 UserFilepRead(CONSOLE_CB *consoleCB, struct file *filep, const struct file_operations_vfs *fops, STATIC INT32 UserFilepRead(CONSOLE_CB *consoleCB, struct file *filep, const struct file_operations_vfs *fops,
CHAR *buffer, size_t bufLen) CHAR *buffer, size_t bufLen)
{ {
...@@ -531,7 +531,7 @@ INT32 FilepRead(struct file *filep, const struct file_operations_vfs *fops, CHAR ...@@ -531,7 +531,7 @@ INT32 FilepRead(struct file *filep, const struct file_operations_vfs *fops, CHAR
* adopt uart read function to read data from filep * adopt uart read function to read data from filep
* and write data to buffer (filep is * and write data to buffer (filep is
* corresponding to filep of /dev/console) * corresponding to filep of /dev/console)
*/ *///采用uart read函数从文件中读取数据,将数据写入缓冲区(文件对应/dev/console的filep)
ret = fops->read(filep, buffer, bufLen); ret = fops->read(filep, buffer, bufLen);
if (ret < 0) { if (ret < 0) {
return -EPERM; return -EPERM;
...@@ -721,7 +721,7 @@ STATIC ssize_t ConsoleRead(struct file *filep, CHAR *buffer, size_t bufLen) ...@@ -721,7 +721,7 @@ STATIC ssize_t ConsoleRead(struct file *filep, CHAR *buffer, size_t bufLen)
goto ERROUT; goto ERROUT;
} }
ret = DoRead(consoleCB, sbuffer, bufLen, privFilep, fileOps);//真正的读数据 ret = DoRead(consoleCB, sbuffer, bufLen, privFilep, fileOps);//从 console buf中取数据
if (ret < 0) { if (ret < 0) {
goto ERROUT; goto ERROUT;
} }
...@@ -1159,7 +1159,7 @@ ERROUT: ...@@ -1159,7 +1159,7 @@ ERROUT:
set_errno(ret); set_errno(ret);
return LOS_NOK; return LOS_NOK;
} }
/// 控制台设备去初始化 /// 注销控制台设备
STATIC UINT32 OsConsoleDevDeinit(const CONSOLE_CB *consoleCB) STATIC UINT32 OsConsoleDevDeinit(const CONSOLE_CB *consoleCB)
{ {
return unregister_driver(consoleCB->name);//注销驱动 return unregister_driver(consoleCB->name);//注销驱动
...@@ -1240,7 +1240,7 @@ STATIC UINT32 OsConsoleBufInit(CONSOLE_CB *consoleCB) ...@@ -1240,7 +1240,7 @@ STATIC UINT32 OsConsoleBufInit(CONSOLE_CB *consoleCB)
}//永久等待读取 CONSOLE_SEND_TASK_RUNNING 事件,CONSOLE_SEND_TASK_RUNNING 由 ConsoleSendTask 发出. }//永久等待读取 CONSOLE_SEND_TASK_RUNNING 事件,CONSOLE_SEND_TASK_RUNNING 由 ConsoleSendTask 发出.
(VOID)LOS_EventRead(&consoleCB->cirBufSendCB->sendEvent, CONSOLE_SEND_TASK_RUNNING, (VOID)LOS_EventRead(&consoleCB->cirBufSendCB->sendEvent, CONSOLE_SEND_TASK_RUNNING,
LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER); LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);
// ... 读取到 CONSOLE_SEND_TASK_RUNNING 事件才会往下执行
return LOS_OK; return LOS_OK;
} }
/// 控制台buf去初始化 /// 控制台buf去初始化
...@@ -1313,17 +1313,17 @@ STATIC CONSOLE_CB *OsConsoleCreate(UINT32 consoleID, const CHAR *deviceName) ...@@ -1313,17 +1313,17 @@ STATIC CONSOLE_CB *OsConsoleCreate(UINT32 consoleID, const CHAR *deviceName)
goto ERR_WITH_SEM; goto ERR_WITH_SEM;
} }
ret = OsConsoleFileInit(consoleCB); //控制台文件初始化,其中file要绑定驱动程序 ret = OsConsoleFileInit(consoleCB); //为 /dev/console(n|1:2)分配fd(3)
if (ret != LOS_OK) { if (ret != LOS_OK) {
PRINT_ERR("console OsConsoleFileInit error. %d\n", ret); PRINT_ERR("console OsConsoleFileInit error. %d\n", ret);
goto ERR_WITH_DEV; goto ERR_WITH_DEV;
} }
OsConsoleTermiosInit(consoleCB, deviceName);//控制台术语/控制初始化 OsConsoleTermiosInit(consoleCB, deviceName);//控制台行规程初始化
return consoleCB; return consoleCB;
ERR_WITH_DEV: ERR_WITH_DEV:
ret = (INT32)OsConsoleDevDeinit(consoleCB);//控制台设备去初始化 ret = (INT32)OsConsoleDevDeinit(consoleCB);//控制台设备注销
if (ret != LOS_OK) { if (ret != LOS_OK) {
PRINT_ERR("OsConsoleDevDeinit failed!\n"); PRINT_ERR("OsConsoleDevDeinit failed!\n");
} }
......
...@@ -58,7 +58,7 @@ UART 串口通信有几个重要的参数,分别是波特率、起始位、数 ...@@ -58,7 +58,7 @@ UART 串口通信有几个重要的参数,分别是波特率、起始位、数
*/ */
STATIC volatile UINT32 g_serialType = 0; STATIC volatile UINT32 g_serialType = 0;
STATIC struct file g_serialFilep; STATIC struct file g_serialFilep;// COM0 /dev/uartdev-0 在内核层的表述 属于 .bbs段
//获取串口类型 //获取串口类型
UINT32 SerialTypeGet(VOID) UINT32 SerialTypeGet(VOID)
...@@ -125,13 +125,13 @@ STATIC ssize_t SerialRead(struct file *filep, CHAR *buffer, size_t bufLen) ...@@ -125,13 +125,13 @@ STATIC ssize_t SerialRead(struct file *filep, CHAR *buffer, size_t bufLen)
struct file *privFilep = NULL; struct file *privFilep = NULL;
const struct file_operations_vfs *fileOps = NULL; const struct file_operations_vfs *fileOps = NULL;
ret = GetFilepOps(filep, &privFilep, &fileOps);//获取控制台file实例 ret = GetFilepOps(filep, &privFilep, &fileOps);//获取COM口在内核的file实例
if (ret != ENOERR) { if (ret != ENOERR) {
ret = -EINVAL; ret = -EINVAL;
goto ERROUT; goto ERROUT;
} }
ret = FilepRead(privFilep, fileOps, buffer, bufLen);//从控制台读buf ret = FilepRead(privFilep, fileOps, buffer, bufLen);//从COM口读buf
if (ret < 0) { if (ret < 0) {
goto ERROUT; goto ERROUT;
} }
...@@ -149,7 +149,7 @@ STATIC ssize_t SerialWrite(struct file *filep, const CHAR *buffer, size_t bufLe ...@@ -149,7 +149,7 @@ STATIC ssize_t SerialWrite(struct file *filep, const CHAR *buffer, size_t bufLe
struct file *privFilep = NULL; struct file *privFilep = NULL;
const struct file_operations_vfs *fileOps = NULL; const struct file_operations_vfs *fileOps = NULL;
ret = GetFilepOps(filep, &privFilep, &fileOps);//获取控制台file实例 ret = GetFilepOps(filep, &privFilep, &fileOps);//获取COM口在内核的file实例
if (ret != ENOERR) { if (ret != ENOERR) {
ret = -EINVAL; ret = -EINVAL;
goto ERROUT; goto ERROUT;
...@@ -235,7 +235,7 @@ INT32 virtual_serial_init(const CHAR *deviceName) ...@@ -235,7 +235,7 @@ INT32 virtual_serial_init(const CHAR *deviceName)
goto ERROUT; goto ERROUT;
} }
SerialTypeSet(deviceName);//设置串口类型 SerialTypeSet(deviceName);//例如: /dev/uartdev-0 <--> /dev/console1
VnodeHold(); VnodeHold();
ret = VnodeLookup(deviceName, &vnode, V_DUMMY);//由deviceName查询vnode节点 ret = VnodeLookup(deviceName, &vnode, V_DUMMY);//由deviceName查询vnode节点
...@@ -255,8 +255,8 @@ INT32 virtual_serial_init(const CHAR *deviceName) ...@@ -255,8 +255,8 @@ INT32 virtual_serial_init(const CHAR *deviceName)
ret = EFAULT; ret = EFAULT;
PRINTK("virtual_serial_init %s open is NULL\n", deviceName); PRINTK("virtual_serial_init %s open is NULL\n", deviceName);
goto ERROUT; goto ERROUT;
}//这是真正的注册串口的驱动程序 }
(VOID)register_driver(SERIAL, &g_serialDevOps, DEFFILEMODE, &g_serialFilep); (VOID)register_driver(SERIAL, &g_serialDevOps, DEFFILEMODE, &g_serialFilep);//这是真正的注册串口的驱动程序
VnodeDrop(); VnodeDrop();
return ENOERR; return ENOERR;
......
...@@ -236,12 +236,12 @@ STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg) ...@@ -236,12 +236,12 @@ STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg)
switch (msg->cmd) { switch (msg->cmd) {
case TRACE_CMD_START: case TRACE_CMD_START:
LOS_TraceStart(); LOS_TraceStart();//启动trace
break; break;
case TRACE_CMD_STOP: case TRACE_CMD_STOP:
LOS_TraceStop(); LOS_TraceStop();//关闭trace
break; break;
case TRACE_CMD_SET_EVENT_MASK: case TRACE_CMD_SET_EVENT_MASK://设置事件掩码
/* 4 params(UINT8) composition the mask(UINT32) */ /* 4 params(UINT8) composition the mask(UINT32) */
LOS_TraceEventMaskSet(TRACE_MASK_COMBINE(msg->param1, msg->param2, msg->param3, msg->param4)); LOS_TraceEventMaskSet(TRACE_MASK_COMBINE(msg->param1, msg->param2, msg->param3, msg->param4));
break; break;
...@@ -252,7 +252,7 @@ STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg) ...@@ -252,7 +252,7 @@ STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg)
break; break;
} }
} }
///< trace任务的入口函数 ///< trace任务的入口函数,接收串口数据
VOID TraceAgent(VOID) VOID TraceAgent(VOID)
{ {
UINT32 ret; UINT32 ret;
...@@ -260,10 +260,10 @@ VOID TraceAgent(VOID) ...@@ -260,10 +260,10 @@ VOID TraceAgent(VOID)
while (1) { while (1) {
(VOID)memset_s(&msg, sizeof(TraceClientCmd), 0, sizeof(TraceClientCmd)); (VOID)memset_s(&msg, sizeof(TraceClientCmd), 0, sizeof(TraceClientCmd));
ret = OsTraceDataWait(); ret = OsTraceDataWait();//等待数据到来
if (ret == LOS_OK) { if (ret == LOS_OK) {
OsTraceDataRecv((UINT8 *)&msg, sizeof(TraceClientCmd), 0); OsTraceDataRecv((UINT8 *)&msg, sizeof(TraceClientCmd), 0);
OsTraceCmdHandle(&msg); OsTraceCmdHandle(&msg);//处理数据
} }
} }
} }
......
...@@ -37,7 +37,7 @@ UINT32 SerialPipelineInit(VOID) ...@@ -37,7 +37,7 @@ UINT32 SerialPipelineInit(VOID)
{ {
return uart_hwiCreate(); return uart_hwiCreate();
} }
///< 接收串口数据
UINT32 SerialDataReceive(UINT8 *data, UINT32 size, UINT32 timeout) UINT32 SerialDataReceive(UINT8 *data, UINT32 size, UINT32 timeout)
{ {
return uart_read(data, size, timeout); return uart_read(data, size, timeout);
...@@ -70,7 +70,7 @@ VOID SerialDataSend(UINT16 len, UINT8 *data) ...@@ -70,7 +70,7 @@ VOID SerialDataSend(UINT16 len, UINT8 *data)
{ {
UartPuts((CHAR *)data, len, 1); UartPuts((CHAR *)data, len, 1);
} }
///< 用串口打印trace数据 ///< 串口数据处理
STATIC const TracePipelineOps g_serialOps = { STATIC const TracePipelineOps g_serialOps = {
.init = SerialPipelineInit, .init = SerialPipelineInit,
.dataSend = SerialDataSend, .dataSend = SerialDataSend,
......
...@@ -126,7 +126,7 @@ VOID OsTracePipelineReg(const TracePipelineOps *ops) ...@@ -126,7 +126,7 @@ VOID OsTracePipelineReg(const TracePipelineOps *ops)
{ {
g_tracePipelineOps = ops; g_tracePipelineOps = ops;
} }
///< 向串口发送数据
VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data) VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data)
{ {
UINT32 intSave; UINT32 intSave;
...@@ -135,14 +135,14 @@ VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data) ...@@ -135,14 +135,14 @@ VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data)
if ((type > TRACE_MSG_MAX) || (len > LOSCFG_TRACE_TLV_BUF_SIZE)) { if ((type > TRACE_MSG_MAX) || (len > LOSCFG_TRACE_TLV_BUF_SIZE)) {
return; return;
} }
//将发送前先将数据编码
len = OsTraceDataEncode(type, g_traceTlvTbl[type], data, &outBuf[0], sizeof(outBuf)); len = OsTraceDataEncode(type, g_traceTlvTbl[type], data, &outBuf[0], sizeof(outBuf));
PIPE_LOCK(intSave); PIPE_LOCK(intSave);
g_tracePipelineOps->dataSend(len, &outBuf[0]); g_tracePipelineOps->dataSend(len, &outBuf[0]);
PIPE_UNLOCK(intSave); PIPE_UNLOCK(intSave);
} }
///< 接收串口数据
UINT32 OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout) UINT32 OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout)
{ {
return g_tracePipelineOps->dataRecv(data, size, timeout); return g_tracePipelineOps->dataRecv(data, size, timeout);
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
#define TELNET_EVENT_MORE_CMD 0x01 ///< 还有很多命令在FIFO中等待运行的事件 #define TELNET_EVENT_MORE_CMD 0x01 ///< 还有很多命令在FIFO中等待运行的事件
#define TELNET_DEV_DRV_MODE 0666 ///< 文件权限 chmod = 666 #define TELNET_DEV_DRV_MODE 0666 ///< 文件权限 chmod = 666
STATIC TELNET_DEV_S g_telnetDev; STATIC TELNET_DEV_S g_telnetDev; ///< 远程登录设备
STATIC EVENT_CB_S *g_event; STATIC EVENT_CB_S *g_event;
STATIC struct Vnode *g_currentVnode; STATIC struct Vnode *g_currentVnode;
......
...@@ -401,7 +401,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellTask(UINTPTR param1, ...@@ -401,7 +401,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellTask(UINTPTR param1,
(VOID)param4; (VOID)param4;
while (1) { while (1) {
PRINTK("\nOHOS # ");//读取shell 输入事件 例如: cat weharmony.net 命令 PRINTK("\nOHOS # ");//在没有事件的时候,会一直停留在此, 读取shell 输入事件 例如: cat weharmony.net 命令
ret = LOS_EventRead(&shellCB->shellEvent, ret = LOS_EventRead(&shellCB->shellEvent,
0xFFF, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER); 0xFFF, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);
if (ret == SHELL_CMD_PARSE_EVENT) {//获得解析命令事件 if (ret == SHELL_CMD_PARSE_EVENT) {//获得解析命令事件
......
...@@ -46,7 +46,7 @@ STATIC UINT32 OsShellCmdInit(VOID) ...@@ -46,7 +46,7 @@ STATIC UINT32 OsShellCmdInit(VOID)
return OsShellSysCmdRegister();//系统自带的shell命令初始化 return OsShellSysCmdRegister();//系统自带的shell命令初始化
} }
///创建shell任务 ///创建shell服务端任务
STATIC UINT32 OsShellCreateTask(ShellCB *shellCB) STATIC UINT32 OsShellCreateTask(ShellCB *shellCB)
{ {
UINT32 ret = ShellTaskInit(shellCB);//执行shell命令的任务初始化 UINT32 ret = ShellTaskInit(shellCB);//执行shell命令的任务初始化
......
git add -A git add -A
git commit -m ' 完善控制台注解 git commit -m ' 完善串口注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码 百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
鸿蒙研究站 | http://weharmonyos.com (国内) 鸿蒙研究站 | http://weharmonyos.com (国内)
| https://weharmony.github.io (国外) | https://weharmony.github.io (国外)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册