From 9f85adba4ffa9be92543e94bd6576bf6bfd2f6d7 Mon Sep 17 00:00:00 2001 From: kuangyufei Date: Thu, 10 Dec 2020 17:46:33 +0800 Subject: [PATCH] =?UTF-8?q?1.zzz=E7=9B=AE=E5=BD=95=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BC=96=E8=AF=91hi3516dv300=E5=90=8E=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=9A=84=E5=AE=8F=E6=96=87=E4=BB=B6=202.?= =?UTF-8?q?=E5=86=85=E6=A0=B8=E6=9C=89=E5=93=AA=E4=BA=9B=E5=9D=97/?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E8=AE=BE=E5=A4=87,=E6=98=AF=E5=A6=82?= =?UTF-8?q?=E4=BD=95=E5=AE=9E=E7=8E=B0=E7=9A=84=3F=20=E6=90=9C=E7=B4=A2=20?= =?UTF-8?q?@note=5Fpic=20=E5=8F=AF=E4=BB=A5=E6=9F=A5=E7=9C=8B=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E5=AD=97=E7=AC=A6=E5=9B=BE=20=E6=90=9C=E7=B4=A2=20@no?= =?UTF-8?q?te=5Fwhy=20=E6=98=AF=E6=B3=A8=E8=80=85=E5=B0=9A=E6=9C=AA?= =?UTF-8?q?=E7=9C=8B=E6=98=8E=E7=99=BD=E7=9A=84=E5=9C=B0=E6=96=B9=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=82=A8=E7=9C=8B=E6=98=8E=E7=99=BD=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E8=AF=B7=E5=91=8A=E8=AF=89=E6=B3=A8=E8=80=85=E5=AE=8C?= =?UTF-8?q?=E5=96=84=20=E6=90=9C=E7=B4=A2=20@note=5Fthinking=20=E6=98=AF?= =?UTF-8?q?=E6=B3=A8=E8=80=85=E7=9A=84=E6=80=9D=E8=80=83=E5=92=8C=E5=90=90?= =?UTF-8?q?=E6=A7=BD=E7=9A=84=E5=9C=B0=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compat/posix/src/time.c | 13 +- fs/vfs/include/driver/mtd_dev.h | 39 ++++-- .../include/multi_partition/mtd_partition.h | 34 ++--- fs/vfs/multi_partition/src/mtd_partition.c | 22 ++-- kernel/common/console.c | 15 ++- kernel/common/console.h | 10 ++ kernel/common/los_config.c | 12 +- kernel/common/los_hilog.c | 118 +++++++++--------- kernel/common/los_rootfs.c | 2 +- kernel/common/los_rootfs.h | 4 +- kernel/common/virtual_serial.c | 2 +- kernel/common/virtual_serial.h | 4 +- kernel/extended/liteipc/hm_liteipc.c | 2 +- net/telnet/src/telnet_dev.c | 2 +- .../config/hi3516dv300_clang_release.config | 22 ++-- zzz/autogen/menuconfig.h | 105 ++++++++++++++++ zzz/git/push.sh | 2 +- 17 files changed, 278 insertions(+), 130 deletions(-) create mode 100644 zzz/autogen/menuconfig.h diff --git a/compat/posix/src/time.c b/compat/posix/src/time.c index b3eebdd2..d6095048 100644 --- a/compat/posix/src/time.c +++ b/compat/posix/src/time.c @@ -456,6 +456,15 @@ int clock_settime(clockid_t clockID, const struct timespec *tp) return settimeofday(&tv, NULL); } +/******************************************************* +获取系统时钟时间 +参数:clk_id 设置时间的类型 + CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从 UTC1970-1-1 0:0:0 开始计时, + 中间时刻如果系统时间被用户改成其他,则对应的时间相应改变 + CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响 + CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间 + CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间 +/********************************************************/ int clock_gettime(clockid_t clockID, struct timespec *tp) { UINT32 intSave; @@ -470,7 +479,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp) goto ERROUT; } - OsGetHwTime(&hwTime); + OsGetHwTime(&hwTime);//获取硬件时间 switch (clockID) { case CLOCK_MONOTONIC_RAW: @@ -484,7 +493,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp) tp->tv_sec = tmp.tv_sec; tp->tv_nsec = tmp.tv_nsec; break; - case CLOCK_REALTIME: + case CLOCK_REALTIME://实时时间 LOS_SpinLockSave(&g_timeSpin, &intSave); tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj); tmp = OsTimeSpecAdd(tmp, g_accDeltaFromSet); diff --git a/fs/vfs/include/driver/mtd_dev.h b/fs/vfs/include/driver/mtd_dev.h index bec2c9be..17eef8fe 100644 --- a/fs/vfs/include/driver/mtd_dev.h +++ b/fs/vfs/include/driver/mtd_dev.h @@ -32,28 +32,45 @@ #define __MTD_DEV_H__ #include "los_typedef.h" +/************************************************ +Linux系统中采用MTD来管理不同类型的Flash芯片,包括NandFlash和NorFlash +NAND型和NOR型Flash在进行写入和擦除时都需要MTD(Memory Technology Drivers,MTD已集成在Flash芯片内部, +它是对Flash进行操作的接口),这是它们的共同特点;但在NOR型Flash上运行代码不需要任何的软件支持, +而在NAND型Flash上进行同样操作时,通常需要驱动程序,即内存技术驱动程序MTD。 -#define MTD_NORFLASH 3 +NOR型Flash采用的SRAM接口,提供足够的地址引脚来寻址,可以很容易的存取其片内的每一个字节; +NAND型Flash使用复杂的I/O口来串行的存取数据,各个产品或厂商的方法可能各不相同,通常是采用8个I/O引脚 +来传送控制、地址、数据信息。 + +NAND型Flash具有较高的单元密度,容量可以做得比较大,加之其生产过程更为简单,价格较低;NOR型Flash占据了容量 +为1~16MB闪存市场的大部分,而NAND型Flash只是用在8~128MB的产品中,这也说明NOR主要用在代码存储介质中, +NAND适合数据存储。 +************************************************/ +#define MTD_NORFLASH 3//存储空间一般比较小,但它可以不用初始化,可以在其内部运行程序,一般在其存储一些初始化内存的固件代码; #define MTD_NANDFLASH 4 #define MTD_DATAFLASH 6 #define MTD_MLCNANDFLASH 8 - -struct MtdNorDev { - unsigned long blockSize; - unsigned long blockStart; - unsigned long blockEnd; +/********************************************* +扇区是对硬盘而言,而块是对文件系统而言 +文件系统不是一个扇区一个扇区的来读数据,一个扇区512个字节,太慢了,所以有了block(块)的概念, +文件系统是一个块一个块的读取的,block才是文件存取的最小单位。 +*********************************************/ +struct MtdNorDev {//一个block是4K,即:文件系统中1个块是由连续的8个扇区组成 + unsigned long blockSize; //块大小,不用猜也知道,是4K,和内存的页等同,如此方便置换 + unsigned long blockStart; //开始块索引 + unsigned long blockEnd; //结束块索引 }; -struct MtdDev { +struct MtdDev {//flash描述符 VOID *priv; UINT32 type; UINT64 size; - UINT32 eraseSize; + UINT32 eraseSize;//4K, 跟PAGE_CACHE_SIZE对应 - int (*erase)(struct MtdDev *mtd, UINT64 start, UINT64 len, UINT64 *failAddr); - int (*read)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); - int (*write)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); + int (*erase)(struct MtdDev *mtd, UINT64 start, UINT64 len, UINT64 *failAddr);//擦除flash操作 + int (*read)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); //读flash操作 + int (*write)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); //写flash操作 }; #endif /* __MTD_DEV_H__ */ diff --git a/fs/vfs/include/multi_partition/mtd_partition.h b/fs/vfs/include/multi_partition/mtd_partition.h index 41a22ce3..f67e6429 100644 --- a/fs/vfs/include/multi_partition/mtd_partition.h +++ b/fs/vfs/include/multi_partition/mtd_partition.h @@ -73,29 +73,29 @@ MTD设备通常可分为四层 这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。 ***************************************************************/ typedef struct mtd_node {//通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90) - UINT32 start_block; - UINT32 end_block; - UINT32 patitionnum; - CHAR *blockdriver_name; - CHAR *chardriver_name; - CHAR *mountpoint_name; - VOID *mtd_info; /* Driver used by a partition */ - LOS_DL_LIST node_info; - LosMux lock; - UINT32 user_num; + UINT32 start_block; //开始块索引 + UINT32 end_block; //结束块索引 + UINT32 patitionnum; //分区编号 + CHAR *blockdriver_name; //块设备驱动名称 + CHAR *chardriver_name; //字符设备驱动名称 + CHAR *mountpoint_name; //挂载点名称 + VOID *mtd_info; /* Driver used by a partition *///分区使用的驱动程序 + LOS_DL_LIST node_info;//双循环节点,挂在首个分区节点上 + LosMux lock; //每个分区都有自己的互斥量 + UINT32 user_num; } mtd_partition; -typedef struct par_param { - mtd_partition *partition_head; - struct MtdDev *flash_mtd; - const struct block_operations *flash_ops;//块设备的操作方法 - const struct file_operations_vfs *char_ops;//字符设备的操作方法 +typedef struct par_param {//分区参数描述符,一个分区既可支持按块访问也可以支持按字符访问,只要有驱动程序就可 + mtd_partition *partition_head; //首个分区,其他分区都挂在.node_info节点上 + struct MtdDev *flash_mtd; //flash设备描述符,属于硬件驱动层 + const struct block_operations *flash_ops; //块设备的操作方法 + const struct file_operations_vfs *char_ops; //字符设备的操作方法 CHAR *blockname; //块设备名称 CHAR *charname; //字符设备名称 - UINT32 block_size; + UINT32 block_size; //块单位(4K),对文件系统而言是按块读取数据,方便和内存页置换 } partition_param; -#define CONFIG_MTD_PATTITION_NUM 20 +#define CONFIG_MTD_PATTITION_NUM 20 //分区数量的上限 #define ALIGN_ASSIGN(len, startAddr, startBlk, endBlk, blkSize) do { \ (len) = (((len) + ((blkSize) - 1)) & ~((blkSize) - 1)); \ diff --git a/fs/vfs/multi_partition/src/mtd_partition.c b/fs/vfs/multi_partition/src/mtd_partition.c index 06a6a951..c0b99183 100644 --- a/fs/vfs/multi_partition/src/mtd_partition.c +++ b/fs/vfs/multi_partition/src/mtd_partition.c @@ -49,20 +49,20 @@ extern "C" { #define DRIVER_NAME_ADD_SIZE 3 pthread_mutex_t g_mtdPartitionLock = PTHREAD_MUTEX_INITIALIZER; - -static INT32 JffsLockInit(VOID) __attribute__((weakref("JffsMutexCreate"))); -static VOID JffsLockDeinit(VOID) __attribute__((weakref("JffsMutexDelete"))); +//通常在NorFlash上会选取jffs及jffs2文件系统 +static INT32 JffsLockInit(VOID) __attribute__((weakref("JffsMutexCreate")));//弱引用 JffsMutexCreate +static VOID JffsLockDeinit(VOID) __attribute__((weakref("JffsMutexDelete")));//弱引用 JffsMutexDelete partition_param *g_spinorPartParam = NULL; mtd_partition *g_spinorPartitionHead = NULL; -#define RWE_RW_RW 0755 +#define RWE_RW_RW 0755 //文件读/写/执权限,chmod 755 mtd_partition *GetSpinorPartitionHead(VOID) { return g_spinorPartitionHead; } - +//初始化 norflash 参数 static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev *spinorMtd) { LOS_ListInit(&g_spinorPartitionHead->node_info); @@ -71,21 +71,21 @@ static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev * you can change the SPIBLK_NAME or SPICHR_NAME to NULL. */ spinorParam->flash_mtd = (struct MtdDev *)spinorMtd; - spinorParam->flash_ops = GetDevSpinorOps(); - spinorParam->char_ops = GetMtdCharFops(); + spinorParam->flash_ops = GetDevSpinorOps(); //获取块设备操作方法 + spinorParam->char_ops = GetMtdCharFops(); //获取字符设备操作方法 spinorParam->blockname = SPIBLK_NAME; spinorParam->charname = SPICHR_NAME; spinorParam->partition_head = g_spinorPartitionHead; - spinorParam->block_size = spinorMtd->eraseSize; + spinorParam->block_size = spinorMtd->eraseSize;//4K, 读/写/擦除 的最小单位 } - +//反初始化 norflash 参数 static VOID MtdDeinitSpinorParam(VOID) { if (JffsLockDeinit != NULL) { JffsLockDeinit(); } } - +//初始化 nor flash 参数 static partition_param *MtdInitSpinorParam(partition_param *spinorParam) { struct MtdDev *spinorMtd = GetMtd("spinor"); @@ -118,7 +118,7 @@ static partition_param *MtdInitSpinorParam(partition_param *spinorParam) return spinorParam; } -/* According the flash-type to init the param of the partition. */ +/* According the flash-type to init the param of the partition. *///根据flash类型初始化分区的参数 static INT32 MtdInitFsparParam(const CHAR *type, partition_param **fsparParam) { if (strcmp(type, "spinor") == 0) { diff --git a/kernel/common/console.c b/kernel/common/console.c index 4c3ca98c..5c9a52b3 100644 --- a/kernel/common/console.c +++ b/kernel/common/console.c @@ -910,8 +910,8 @@ ERROUT: return VFS_ERROR; } -/* console device driver function structure */ -STATIC const struct file_operations_vfs g_consoleDevOps = { +/* console device driver function structure *///控制台设备驱动程序功能结构体 +STATIC const struct file_operations_vfs g_consoleDevOps = {//实现VFS接口函数,对控制台进行操作 .open = ConsoleOpen, /* open */ .close = ConsoleClose, /* close */ .read = ConsoleRead, /* read */ @@ -996,7 +996,7 @@ ERROUT_WITH_FULLPATH: /* * Initialized console control platform so that when we operate /dev/console * as if we are operating /dev/ttyS0 (uart0). - *///初始化控制台控制平台,以便在操作/dev/console时,就好像我们在操作/dev/ttyS0(uart0) + *///初始化控制台以此来控制平台,以便在操作/dev/console时,就好像我们在操作/dev/ttyS0(uart0) STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) { INT32 ret; @@ -1025,7 +1025,6 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) goto ERROUT_WITH_FULLPATH; } inode = desc.node; - consoleCB->devInode = inode; /* @@ -1034,6 +1033,10 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) * then we can operate console's filep as if we operate uart0 filep of * /dev/ttyS0. */ + /* + 初始化与/dev/console关联的console filep,将/dev/ttyS0的uart0 inode赋给 + /dev/console的console inod,就可以像操作/dev/ttyS0的uart0 filep一样操作控制台的filep + */ (VOID)memset_s(filep, sizeof(struct file), 0, sizeof(struct file)); filep->f_oflags = O_RDWR; filep->f_pos = 0; @@ -1052,7 +1055,9 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) * Use filep to connect console and uart, we can find uart driver function throught filep. * now we can operate /dev/console to operate /dev/ttyS0 through filep. */ - ret = register_driver(consoleCB->name, &g_consoleDevOps, DEFFILEMODE, filep); + //使用filep连接控制台和uart,通过它可以找到uart驱动函数, 可以通过filep操作/dev/console + //达到操作/dev/ttyS0的目的 + ret = register_driver(consoleCB->name, &g_consoleDevOps, DEFFILEMODE, filep);//注册字符设备驱动程序 if (ret != LOS_OK) { goto ERROUT_WITH_INODE; } diff --git a/kernel/common/console.h b/kernel/common/console.h index 41d46e99..b9231310 100644 --- a/kernel/common/console.h +++ b/kernel/common/console.h @@ -59,7 +59,17 @@ extern "C" { #define STDIN 0 //标准输入 #define STDOUT 1 //标准输出 #define STDERR 2 //错误 +/********************************************************** +https://www.cnblogs.com/sparkdev/p/11460821.html +TTY 是 Teletype 或 Teletypewriter 的缩写,字符设备的通称,原来是指电传打字机, +后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘,显示器, +都是作为计算机的终端设备存在的,所以 TTY 也泛指计算机的终端(terminal)设备。 +为了支持这些 TTY 设备,Linux 实现了一个叫做 TTY 的子系统。所以 TTY 既指终端,也指 Linux 的 TTY 子系统 + +/dev/console是一个虚拟的tty,在鸿蒙它映射到真正的dev/ttyS0(UART0)上 +能直接显示系统消息的那个终端称为控制台,其他的则称为终端 +**********************************************************/ #define CONSOLE "/dev/console" #define CONSOLE_NAMELEN 16 #define CONSOLE_RD_BLOCK 1 diff --git a/kernel/common/los_config.c b/kernel/common/los_config.c index 5b2111ce..e4897c27 100644 --- a/kernel/common/los_config.c +++ b/kernel/common/los_config.c @@ -330,7 +330,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) #endif #ifdef LOSCFG_KERNEL_PIPE //打开管道宏 - OsDriverPipeInit();//管道init + OsDriverPipeInit();//管道模块初始化 #endif ret = OsSystemInit();//系统初始化 @@ -347,14 +347,14 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) #endif #if (LOSCFG_KERNEL_LITEIPC == YES) - ret = LiteIpcInit();//这是lite自有的IPC模块 初始化 + ret = LiteIpcInit();//初始化鸿蒙自有的进程间通讯模块 if (ret != LOS_OK) { return ret; } #endif -#if (LOSCFG_BASE_CORE_HILOG == YES) - ret = HiLogDriverInit(); +#if (LOSCFG_BASE_CORE_HILOG == YES)//hilog开关 + ret = HiLogDriverInit();//初始化hilog字符设备驱动程序 if (ret != LOS_OK) { return ret; } @@ -373,8 +373,8 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) return ret; } - ret = OomTaskInit();//Out-Of-Memory 用户监控使用内存太大的task,在内存不足而某些进程太耗内存时 - if (ret != LOS_OK) {//可以直接把进程干掉而释放内存 + ret = OomTaskInit();//Out-Of-Memory 用于监控使用内存太大的task. + if (ret != LOS_OK) {//在内存不足而某些进程太耗内存时,内核可直接把进程干掉而释放内存 return ret; } diff --git a/kernel/common/los_hilog.c b/kernel/common/los_hilog.c index 612029ba..f0180048 100644 --- a/kernel/common/los_hilog.c +++ b/kernel/common/los_hilog.c @@ -38,20 +38,20 @@ #include "los_vm_map.h" #include "los_vm_lock.h" #include "user_copy.h" - -#define HILOG_BUFFER 1024 -#define DRIVER_MODE 0666 -#define HILOG_DRIVER "/dev/hilog" - -struct HiLogEntry { - unsigned int len; - unsigned int hdrSize; - unsigned int pid : 16; - unsigned int taskId : 16; - unsigned int sec; - unsigned int nsec; - unsigned int reserved; - char msg[0]; +//hilog是鸿蒙的一个用于输出的功能模块 +#define HILOG_BUFFER 1024 // 1K缓存, ring buf 方式管理 +#define DRIVER_MODE 0666 //权限 chmod 666 +#define HILOG_DRIVER "/dev/hilog" // 可以看出hilog是当一种字符设备来实现 + +struct HiLogEntry { //hilog 实体 + unsigned int len; //写入buffer的内容长度 + unsigned int hdrSize; // sizeof(struct HiLogEntry) ,为何命名hdr @note_why + unsigned int pid : 16; //进程ID + unsigned int taskId : 16; //任务ID + unsigned int sec; //秒级 + unsigned int nsec; //纳秒级,提供给外部准确分析和定位问题 + unsigned int reserved;//保留位 + char msg[0]; //消息内容 }; ssize_t HilogRead(struct file *filep, char __user *buf, size_t count); @@ -61,7 +61,7 @@ int HiLogClose(FAR struct file *filep); static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t bufLen); static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen); - +//实现VFS接口函数,对hilog进行操作 STATIC struct file_operations_vfs g_hilogFops = { HiLogOpen, /* open */ HiLogClose, /* close */ @@ -76,51 +76,51 @@ STATIC struct file_operations_vfs g_hilogFops = { NULL, /* unlink */ }; -FAR struct HiLogCharDevice { - int flag; - LosMux mtx; - unsigned char *buffer; +FAR struct HiLogCharDevice {//hilog 本质上是个字符设备 + int flag; //设备标签 + LosMux mtx; //读写buf的互斥量 + unsigned char *buffer;//采用 ring buffer 管理 wait_queue_head_t wq; - size_t writeOffset; - size_t headOffset; - size_t size; - size_t count; + size_t writeOffset;//用于写操作,不断累加 + size_t headOffset;//用于读操作,不断累加 + size_t size;//记录buffer使用的大小, 读写操作会返回 +-这个size + size_t count;//读写操作的次数对冲 } g_hiLogDev; static inline unsigned char *HiLogBufferHead(void) { return g_hiLogDev.buffer + g_hiLogDev.headOffset; } - +//为支持VFS,作打开状 int HiLogOpen(FAR struct file *filep) { (void)filep; return 0; } - +//为支持VFS,作关闭状 int HiLogClose(FAR struct file *filep) { (void)filep; return 0; } - +//读写对冲,对hilog的写操作,更新相关变量内容 static void HiLogBufferInc(size_t sz) { if (g_hiLogDev.size + sz <= HILOG_BUFFER) { - g_hiLogDev.size += sz; - g_hiLogDev.writeOffset += sz; - g_hiLogDev.writeOffset %= HILOG_BUFFER; - g_hiLogDev.count++; + g_hiLogDev.size += sz; //已使用buf的size + g_hiLogDev.writeOffset += sz;//大小是不断累加 + g_hiLogDev.writeOffset %= HILOG_BUFFER;//ring buf + g_hiLogDev.count++;//读写对冲 } } - +//读写对冲,对hilog的读操作,更新相关变量内容 static void HiLogBufferDec(size_t sz) { if (g_hiLogDev.size >= sz) { - g_hiLogDev.size -= sz; + g_hiLogDev.size -= sz;//维持可使用buf size g_hiLogDev.headOffset += sz; g_hiLogDev.headOffset %= HILOG_BUFFER; - g_hiLogDev.count--; + g_hiLogDev.count--;//读写对冲 } } @@ -170,7 +170,7 @@ static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen) wait_event_interruptible(g_hiLogDev.wq, (g_hiLogDev.size > 0)); - (VOID)LOS_MuxAcquire(&g_hiLogDev.mtx); + (VOID)LOS_MuxAcquire(&g_hiLogDev.mtx);//临界区操作开始 retval = HiLogReadRingBuffer((unsigned char *)&header, sizeof(header)); if (retval < 0) { retval = -EINVAL; @@ -200,10 +200,10 @@ static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen) HiLogBufferDec(header.len); retval = header.len + sizeof(header); out: - (VOID)LOS_MuxRelease(&g_hiLogDev.mtx); + (VOID)LOS_MuxRelease(&g_hiLogDev.mtx);//临界区操作结束 return retval; } - +//写入 RingBuffer环形缓冲,也叫 circleBuffer static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen) { int retval; @@ -222,23 +222,23 @@ static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen) } return 0; } - +//hilog实体初始化 static void HiLogHeadInit(struct HiLogEntry *header, size_t len) { - struct timespec now; + struct timespec now;//标准C库函数,时间格式,包含秒数和纳秒数 int ret; - ret = clock_gettime(CLOCK_REALTIME, &now); + ret = clock_gettime(CLOCK_REALTIME, &now);//获取系统实时时间 if (ret != 0) { dprintf("In %s line %d,clock_gettime fail", __FUNCTION__, __LINE__); return; } - header->len = len; - header->pid = LOS_GetCurrProcessID(); - header->taskId = LOS_CurTaskIDGet(); - header->sec = now.tv_sec; - header->nsec = now.tv_nsec; + header->len = len;//写入buffer的内容长度 + header->pid = LOS_GetCurrProcessID();//当前进程ID + header->taskId = LOS_CurTaskIDGet(); //当前任务ID + header->sec = now.tv_sec; //秒级记录 + header->nsec = now.tv_nsec; //纳秒级记录 header->hdrSize = sizeof(struct HiLogEntry); } @@ -257,7 +257,7 @@ static void HiLogCoverOldLog(size_t bufLen) HiLogBufferDec(sizeof(header) + header.len); } } - +//将外部buf写入hilog设备分两步完成 int HiLogWriteInternal(const char *buffer, size_t bufLen) { struct HiLogEntry header; @@ -267,14 +267,14 @@ int HiLogWriteInternal(const char *buffer, size_t bufLen) HiLogCoverOldLog(bufLen); HiLogHeadInit(&header, bufLen); - retval = HiLogWriteRingBuffer((unsigned char *)&header, sizeof(header)); + retval = HiLogWriteRingBuffer((unsigned char *)&header, sizeof(header));//1.先写入头部内容 if (retval) { retval = -ENODATA; goto out; } - HiLogBufferInc(sizeof(header)); + HiLogBufferInc(sizeof(header));// - retval = HiLogWriteRingBuffer((unsigned char *)(buffer), header.len); + retval = HiLogWriteRingBuffer((unsigned char *)(buffer), header.len);//2.再写入实际buf内容 if (retval) { retval = -ENODATA; goto out; @@ -294,7 +294,7 @@ out: } return retval; } - +//写hilog,外部以VFS方式写入 static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t bufLen) { (void)filep; @@ -305,26 +305,26 @@ static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t buf return HiLogWriteInternal(buffer, bufLen); } - +//初始化全局变量g_hiLogDev static void HiLogDeviceInit(void) { - g_hiLogDev.buffer = LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, HILOG_BUFFER); + g_hiLogDev.buffer = LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, HILOG_BUFFER);//分配内核空间 if (g_hiLogDev.buffer == NULL) { dprintf("In %s line %d,LOS_MemAlloc fail", __FUNCTION__, __LINE__); } + //初始化waitqueue头,请确保输入参数wait有效,否则系统将崩溃。 + init_waitqueue_head(&g_hiLogDev.wq);//见于..\third_party\FreeBSD\sys\compat\linuxkpi\common\src\linux_semaphore.c + LOS_MuxInit(&g_hiLogDev.mtx, NULL);//初始化hilog互斥量 - init_waitqueue_head(&g_hiLogDev.wq); - LOS_MuxInit(&g_hiLogDev.mtx, NULL); - - g_hiLogDev.writeOffset = 0; + g_hiLogDev.writeOffset = 0;//写g_hiLogDev.buffer偏移地址 g_hiLogDev.headOffset = 0; - g_hiLogDev.size = 0; + g_hiLogDev.size = 0; // g_hiLogDev.count = 0; } - +//初始化hilog驱动 int HiLogDriverInit(VOID) { - HiLogDeviceInit(); - return register_driver(HILOG_DRIVER, &g_hilogFops, DRIVER_MODE, NULL); + HiLogDeviceInit();//初始化全局变量g_hiLogDev + return register_driver(HILOG_DRIVER, &g_hilogFops, DRIVER_MODE, NULL);//注册字符设备驱动程序,生成inode节点 } diff --git a/kernel/common/los_rootfs.c b/kernel/common/los_rootfs.c index 11acaf22..b79716bf 100644 --- a/kernel/common/los_rootfs.c +++ b/kernel/common/los_rootfs.c @@ -219,7 +219,7 @@ STATIC INT32 GetArgs(CHAR **args) #endif #ifdef LOSCFG_PLATFORM_HI3518EV300 - struct MtdDev *mtd = GetMtd(FLASH_TYPE); + struct MtdDev *mtd = GetMtd(FLASH_TYPE);//获取flash设备描述符 if (mtd == NULL) { PRINT_ERR("Get spinor mtd failed!\n"); goto ERROUT; diff --git a/kernel/common/los_rootfs.h b/kernel/common/los_rootfs.h index 69d5a607..12bc15c0 100644 --- a/kernel/common/los_rootfs.h +++ b/kernel/common/los_rootfs.h @@ -58,8 +58,8 @@ #define FLASH_TYPE "spinor" //flash类型 #define FLASH_DEV_NAME "/dev/spinorblk0" //根文件系统路径 - -#define EMMC_SEC_SIZE 512 +//扇区是对硬盘而言,而块是对文件系统而言 +#define EMMC_SEC_SIZE 512 //扇区大小,按512个字节,按扇区对齐 #define DEC_NUMBER_STRING "0123456789" #define HEX_NUMBER_STRING "0123456789abcdefABCDEF" diff --git a/kernel/common/virtual_serial.c b/kernel/common/virtual_serial.c index 9f81b18f..83ecfc5b 100644 --- a/kernel/common/virtual_serial.c +++ b/kernel/common/virtual_serial.c @@ -198,7 +198,7 @@ ERROUT: set_errno(-ret); return VFS_ERROR; } - +//实现VFS接口函数,对串行设备进行操作 STATIC const struct file_operations_vfs g_serialDevOps = { SerialOpen, /* open */ SerialClose, /* close */ diff --git a/kernel/common/virtual_serial.h b/kernel/common/virtual_serial.h index f7162b79..9dc01edd 100644 --- a/kernel/common/virtual_serial.h +++ b/kernel/common/virtual_serial.h @@ -46,9 +46,9 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -#ifdef LOSCFG_FS_VFS +#ifdef LOSCFG_FS_VFS //将设备虚拟为文件统一来操作,对鸿蒙来说一切皆为文件 #define SERIAL "/dev/serial" -#define SERIAL_TTYGS0 "/dev/ttyGS0" +#define SERIAL_TTYGS0 "/dev/ttyGS0" #define SERIAL_UARTDEV "/dev/uartdev" #define SERIAL_TYPE_UART_DEV 1 diff --git a/kernel/extended/liteipc/hm_liteipc.c b/kernel/extended/liteipc/hm_liteipc.c index 4de078e0..156dd151 100644 --- a/kernel/extended/liteipc/hm_liteipc.c +++ b/kernel/extended/liteipc/hm_liteipc.c @@ -88,7 +88,7 @@ STATIC UINT32 LiteIpcWrite(IpcContent *content); STATIC UINT32 GetTid(UINT32 serviceHandle, UINT32 *taskID); STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *node, BOOL isRollback); - +//实现VFS接口函数,对liteIpc进行操作 STATIC const struct file_operations_vfs g_liteIpcFops = { LiteIpcOpen, /* open */ LiteIpcClose, /* close */ diff --git a/net/telnet/src/telnet_dev.c b/net/telnet/src/telnet_dev.c index 8f0985fc..b614bb49 100644 --- a/net/telnet/src/telnet_dev.c +++ b/net/telnet/src/telnet_dev.c @@ -334,7 +334,7 @@ STATIC INT32 TelnetPoll(struct file *file, poll_table *table) TelnetUnlock(); return 0; } - +//实现VFS接口函数,对远程登录进行操作 STATIC const struct file_operations_vfs g_telnetOps = {//远程登录操作 TelnetOpen, //打开 TelnetClose, //关闭 diff --git a/tools/build/config/hi3516dv300_clang_release.config b/tools/build/config/hi3516dv300_clang_release.config index 7d92a24d..13ab3de1 100644 --- a/tools/build/config/hi3516dv300_clang_release.config +++ b/tools/build/config/hi3516dv300_clang_release.config @@ -1,10 +1,12 @@ +#编译器将本文件自动生成 menuconfig.h 放在..\..\..\platform\include\menuconfig.h +#详见 zzz\autogen\menuconfig.h # # Automatically generated file; DO NOT EDIT. # Huawei LiteOS Configuration # # -# Compiler +# Compiler # # LOSCFG_COMPILER_HIMIX_32 is not set LOSCFG_COMPILER_CLANG_LLVM=y @@ -12,8 +14,8 @@ LOSCFG_COMPILER_CLANG_LLVM=y # # Platform # -LOSCFG_PLATFORM="hi3516dv300" -LOSCFG_PLATFORM_HI3516DV300=y +LOSCFG_PLATFORM="hi3516dv300" #平台名称 +LOSCFG_PLATFORM_HI3516DV300=y #编译平台开关 # LOSCFG_PLATFORM_HI3518EV300 is not set # LOSCFG_TEE_ENABLE is not set LOSCFG_PLATFORM_BSP_GIC_V2=y @@ -54,7 +56,7 @@ LOSCFG_KERNEL_VDSO=y #VDSO就是Virtual Dynamic Shared Object,就是内 # LOSCFG_KERNEL_TRACE is not set LOSCFG_KERNEL_LITEIPC=y #用于轻量级进程间通讯 LOSCFG_KERNEL_PIPE=y #管道支持 -LOSCFG_BASE_CORE_HILOG=y #hilog 日志支持 +LOSCFG_BASE_CORE_HILOG=y #hilog 日志支持 /dev/hilog # # Lib @@ -77,14 +79,14 @@ LOSCFG_FILE_MODE=y #文件权限支持 例如:chmod 777 LOSCFG_FS_FAT=y #文件配置表(英语:File Allocation Table,首字母缩略字:FAT),是一种由微软发明并拥有部分专利的文件系统 LOSCFG_FS_FAT_CACHE=y #FAT缓存支持 # LOSCFG_FS_FAT_CACHE_SYNC_THREAD is not set -LOSCFG_FS_FAT_CHINESE=y +LOSCFG_FS_FAT_CHINESE=y #区域设置和命名空间配置 LOSCFG_FS_FAT_VIRTUAL_PARTITION=y LOSCFG_FS_FAT_VOLUMES=16 -LOSCFG_FS_FAT_DISK=y +LOSCFG_FS_FAT_DISK=y # LOSCFG_FS_RAMFS=y LOSCFG_FS_NFS=y #网络文件系统,英文Network File System(NFS) LOSCFG_FS_PROC=y -LOSCFG_FS_JFFS=y #Journalling Flash File System(闪存设备日志型文件系统,JFFS)最初是由瑞典的 Axis Communication AB 开发 +LOSCFG_FS_JFFS=y #Journalling Flash File System(闪存设备日志型文件系统,JFFS),一般用于nor flash的文件系统 # # Net @@ -96,9 +98,9 @@ LOSCFG_NET_LWIP_SACK_2_1=y # Debug # # LOSCFG_COMPILE_DEBUG is not set -LOSCFG_PLATFORM_ADAPT=y -LOSCFG_ENABLE_OOM_LOOP_TASK=y -LOSCFG_ENABLE_MAGICKEY=y +LOSCFG_PLATFORM_ADAPT=y +LOSCFG_ENABLE_OOM_LOOP_TASK=y #支持内存溢出检测 +LOSCFG_ENABLE_MAGICKEY=y #支持魔法键 # LOSCFG_THUMB is not set # LOSCFG_DEBUG_VERSION is not set LOSCFG_DRIVERS_HDF_PLATFORM_UART=y diff --git a/zzz/autogen/menuconfig.h b/zzz/autogen/menuconfig.h new file mode 100644 index 00000000..de834967 --- /dev/null +++ b/zzz/autogen/menuconfig.h @@ -0,0 +1,105 @@ +/* + * + * Automatically generated file; DO NOT EDIT. + * Huawei LiteOS Configuration + * + */ +#define LOSCFG_DRIVERS_HDF_PLATFORM_WATCHDOG 1 +#define LOSCFG_KERNEL_LITEIPC 1 +#define LOSCFG_SECURITY_CAPABILITY 1 +#define LOSCFG_DRIVERS_USB_ETHERNET 1 +#define LOSCFG_NET_LWIP_SACK 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM_I2C 1 +#define LOSCFG_ASLR 1 +#define LOSCFG_FS_FAT_VIRTUAL_PARTITION 1 +#define LOSCFG_FS_FAT_VOLUMES 16 +#define LOSCFG_DRIVERS_HDF_LCD 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM_SDIO 1 +#define LOSCFG_ENABLE_MAGICKEY 1 +#define LOSCFG_KERNEL_SMP_CORE_NUM 2 +#define LOSCFG_DRIVERS 1 +#define LOSCFG_PLATFORM_ADAPT 1 +#define LOSCFG_KERNEL_PIPE 1 +#define LOSCFG_DRIVERS_MEM 1 +#define LOSCFG_CC_STACKPROTECTOR_STRONG 1 +#define LOSCFG_DRIVERS_MTD_SPI_NOR_HIFMC100 1 +#define LOSCFG_COMPILER_CLANG_LLVM 1 +#define LOSCFG_DRIVERS_USB_SERIAL 1 +#define LOSCFG_DRIVERS_HDF 1 +#define LOSCFG_BASE_CORE_HILOG 1 +#define LOSCFG_NET_LWIP_SACK_2_1 1 +#define LOSCFG_FS_VFS 1 +#define LOSCFG_KERNEL_DYNLOAD 1 +#define LOSCFG_COMPAT_POSIX 1 +#define LOSCFG_DRIVERS_USB 1 +#define LOSCFG_KERNEL_VDSO 1 +#define LOSCFG_COMPAT_BSD 1 +#define LOSCFG_FILE_MODE 1 +#define LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS 1 +#define LOSCFG_PLATFORM "hi3516dv300" +#define LOSCFG_PLATFORM_BSP_GIC_V2 1 +#define LOSCFG_DRIVERS_HDF_TP_5P5_GT911 1 +#define LOSCFG_PLATFORM_ROOTFS 1 +#define LOSCFG_KERNEL_CPPSUPPORT 1 +#define LOSCFG_HW_RANDOM_ENABLE 1 +#define LOSCFG_ARCH_CORTEX_A7 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM_RTC 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM_UART 1 +#define LOSCFG_FS_FAT 1 +#define LOSCFG_DRIVERS_HIETH_SF 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM_HISI_SDK 1 +#define LOSCFG_FS_NFS 1 +#define LOSCFG_ARCH_ARM_VER "armv7-a" +#define LOSCFG_FS_FAT_DISK 1 +#define LOSCFG_DRIVERS_USB_HOST_XHCI 1 +#define LOSCFG_IRQ_USE_STANDALONE_STACK 1 +#define LOSCFG_ENABLE_OOM_LOOP_TASK 1 +#define LOSCFG_ARCH_ARM_AARCH32 1 +#define LOSCFG_KERNEL_EXTKERNEL 1 +#define LOSCFG_DRIVERS_USB_MASS_STORAGE 1 +#define LOSCFG_DRIVERS_MTD_SPI_NOR 1 +#define LOSCFG_DRIVERS_HDF_INPUT 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM 1 +#define LOSCFG_FS_PROC 1 +#define LOSCFG_ARCH_CPU "cortex-a7" +#define LOSCFG_DRIVERS_RANDOM 1 +#define LOSCFG_ARCH_ARM_V7A 1 +#define LOSCFG_LIB_ZLIB 1 +#define LOSCFG_DRIVERS_SD 1 +#define LOSCFG_DRIVERS_HI3881 1 +#define LOSCFG_SECURITY_VID 1 +#define LOSCFG_ARCH_FPU "neon-vfpv4" +#define LOSCFG_DRIVERS_MTD 1 +#define LOSCFG_ARCH_FPU_VFP_D32 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM_GPIO 1 +#define LOSCFG_PLATFORM_HI3516DV300 1 +#define LOSCFG_ARCH_ARM 1 +#define LOSCFG_DRIVERS_USB_RNDIS_HOST 1 +#define LOSCFG_FS_JFFS 1 +#define LOSCFG_DRIVERS_HIEVENT 1 +#define LOSCFG_KERNEL_SMP 1 +#define LOSCFG_ARCH_FPU_VFP_NEON 1 +#define LOSCFG_DRIVERS_EMMC 1 +#define LOSCFG_DRIVERS_USB_WIRELESS 1 +#define LOSCFG_KERNEL_SMP_LOCKDEP 1 +#define LOSCFG_CPUP_INCLUDE_IRQ 1 +#define LOSCFG_KERNEL_SMP_TASK_SYNC 1 +#define LOSCFG_FS_FAT_CACHE 1 +#define LOSCFG_DRIVERS_HDF_LCD_ICN9700 1 +#define LOSCFG_DRIVERS_MMC 1 +#define LOSCFG_SECURITY 1 +#define LOSCFG_FS_VFS_BLOCK_DEVICE 1 +#define LOSCFG_FS_RAMFS 1 +#define LOSCFG_DRIVERS_HDF_WIFI 1 +#define LOSCFG_DRIVERS_USB_HID_CLASS 1 +#define LOSCFG_DRIVERS_USB_4G_MODEM 1 +#define LOSCFG_LIB_LIBC 1 +#define LOSCFG_FS_FAT_CHINESE 1 +#define LOSCFG_DRIVERS_NETDEV 1 +#define LOSCFG_KERNEL_CPUP 1 +#define LOSCFG_DRIVERS_HDF_USB 1 +#define LOSCFG_DRIVERS_VIDEO 1 +#define LOSCFG_ARCH_FPU_VFP_V4 1 +#define LOSCFG_DRIVERS_EMMC_HS200 1 +#define LOSCFG_DRIVERS_HDF_PLATFORM_SPI 1 +#define LOSCFG_DRIVERS_USB_HOST_DRIVER 1 diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 3a2c8803..159965d1 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m 'python build.py ipcamera_hi3516dv300 编译kernel_liteos_a_note通过 +git commit -m '1.zzz目录添加编译hi3516dv300后自动生成的宏文件 2.内核有哪些块/字符设备,是如何实现的? 搜索 @note_pic 可以查看全部字符图 搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善 搜索 @note_thinking 是注者的思考和吐槽的地方 -- GitLab