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

1.zzz目录添加编译hi3516dv300后自动生成的宏文件 2.内核有哪些块/字符设备,是如何实现的?

搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
上级 e7a236d3
...@@ -456,6 +456,15 @@ int clock_settime(clockid_t clockID, const struct timespec *tp) ...@@ -456,6 +456,15 @@ int clock_settime(clockid_t clockID, const struct timespec *tp)
return settimeofday(&tv, NULL); 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) int clock_gettime(clockid_t clockID, struct timespec *tp)
{ {
UINT32 intSave; UINT32 intSave;
...@@ -470,7 +479,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp) ...@@ -470,7 +479,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp)
goto ERROUT; goto ERROUT;
} }
OsGetHwTime(&hwTime); OsGetHwTime(&hwTime);//获取硬件时间
switch (clockID) { switch (clockID) {
case CLOCK_MONOTONIC_RAW: case CLOCK_MONOTONIC_RAW:
...@@ -484,7 +493,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp) ...@@ -484,7 +493,7 @@ int clock_gettime(clockid_t clockID, struct timespec *tp)
tp->tv_sec = tmp.tv_sec; tp->tv_sec = tmp.tv_sec;
tp->tv_nsec = tmp.tv_nsec; tp->tv_nsec = tmp.tv_nsec;
break; break;
case CLOCK_REALTIME: case CLOCK_REALTIME://实时时间
LOS_SpinLockSave(&g_timeSpin, &intSave); LOS_SpinLockSave(&g_timeSpin, &intSave);
tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj); tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);
tmp = OsTimeSpecAdd(tmp, g_accDeltaFromSet); tmp = OsTimeSpecAdd(tmp, g_accDeltaFromSet);
......
...@@ -32,28 +32,45 @@ ...@@ -32,28 +32,45 @@
#define __MTD_DEV_H__ #define __MTD_DEV_H__
#include "los_typedef.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_NANDFLASH 4
#define MTD_DATAFLASH 6 #define MTD_DATAFLASH 6
#define MTD_MLCNANDFLASH 8 #define MTD_MLCNANDFLASH 8
/*********************************************
struct MtdNorDev { 扇区是对硬盘而言,而块是对文件系统而言
unsigned long blockSize; 文件系统不是一个扇区一个扇区的来读数据,一个扇区512个字节,太慢了,所以有了block(块)的概念,
unsigned long blockStart; 文件系统是一个块一个块的读取的,block才是文件存取的最小单位。
unsigned long blockEnd; *********************************************/
struct MtdNorDev {//一个block是4K,即:文件系统中1个块是由连续的8个扇区组成
unsigned long blockSize; //块大小,不用猜也知道,是4K,和内存的页等同,如此方便置换
unsigned long blockStart; //开始块索引
unsigned long blockEnd; //结束块索引
}; };
struct MtdDev { struct MtdDev {//flash描述符
VOID *priv; VOID *priv;
UINT32 type; UINT32 type;
UINT64 size; UINT64 size;
UINT32 eraseSize; UINT32 eraseSize;//4K, 跟PAGE_CACHE_SIZE对应
int (*erase)(struct MtdDev *mtd, UINT64 start, UINT64 len, UINT64 *failAddr); int (*erase)(struct MtdDev *mtd, UINT64 start, UINT64 len, UINT64 *failAddr);//擦除flash操作
int (*read)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); 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); int (*write)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf); //写flash操作
}; };
#endif /* __MTD_DEV_H__ */ #endif /* __MTD_DEV_H__ */
...@@ -73,29 +73,29 @@ MTD设备通常可分为四层 ...@@ -73,29 +73,29 @@ MTD设备通常可分为四层
这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。 这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
***************************************************************/ ***************************************************************/
typedef struct mtd_node {//通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90) typedef struct mtd_node {//通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90)
UINT32 start_block; UINT32 start_block; //开始块索引
UINT32 end_block; UINT32 end_block; //结束块索引
UINT32 patitionnum; UINT32 patitionnum; //分区编号
CHAR *blockdriver_name; CHAR *blockdriver_name; //块设备驱动名称
CHAR *chardriver_name; CHAR *chardriver_name; //字符设备驱动名称
CHAR *mountpoint_name; CHAR *mountpoint_name; //挂载点名称
VOID *mtd_info; /* Driver used by a partition */ VOID *mtd_info; /* Driver used by a partition *///分区使用的驱动程序
LOS_DL_LIST node_info; LOS_DL_LIST node_info;//双循环节点,挂在首个分区节点上
LosMux lock; LosMux lock; //每个分区都有自己的互斥量
UINT32 user_num; UINT32 user_num;
} mtd_partition; } mtd_partition;
typedef struct par_param { typedef struct par_param {//分区参数描述符,一个分区既可支持按块访问也可以支持按字符访问,只要有驱动程序就可
mtd_partition *partition_head; mtd_partition *partition_head; //首个分区,其他分区都挂在.node_info节点上
struct MtdDev *flash_mtd; struct MtdDev *flash_mtd; //flash设备描述符,属于硬件驱动层
const struct block_operations *flash_ops;//块设备的操作方法 const struct block_operations *flash_ops; //块设备的操作方法
const struct file_operations_vfs *char_ops;//字符设备的操作方法 const struct file_operations_vfs *char_ops; //字符设备的操作方法
CHAR *blockname; //块设备名称 CHAR *blockname; //块设备名称
CHAR *charname; //字符设备名称 CHAR *charname; //字符设备名称
UINT32 block_size; UINT32 block_size; //块单位(4K),对文件系统而言是按块读取数据,方便和内存页置换
} partition_param; } partition_param;
#define CONFIG_MTD_PATTITION_NUM 20 #define CONFIG_MTD_PATTITION_NUM 20 //分区数量的上限
#define ALIGN_ASSIGN(len, startAddr, startBlk, endBlk, blkSize) do { \ #define ALIGN_ASSIGN(len, startAddr, startBlk, endBlk, blkSize) do { \
(len) = (((len) + ((blkSize) - 1)) & ~((blkSize) - 1)); \ (len) = (((len) + ((blkSize) - 1)) & ~((blkSize) - 1)); \
......
...@@ -49,20 +49,20 @@ extern "C" { ...@@ -49,20 +49,20 @@ extern "C" {
#define DRIVER_NAME_ADD_SIZE 3 #define DRIVER_NAME_ADD_SIZE 3
pthread_mutex_t g_mtdPartitionLock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t g_mtdPartitionLock = PTHREAD_MUTEX_INITIALIZER;
//通常在NorFlash上会选取jffs及jffs2文件系统
static INT32 JffsLockInit(VOID) __attribute__((weakref("JffsMutexCreate"))); static INT32 JffsLockInit(VOID) __attribute__((weakref("JffsMutexCreate")));//弱引用 JffsMutexCreate
static VOID JffsLockDeinit(VOID) __attribute__((weakref("JffsMutexDelete"))); static VOID JffsLockDeinit(VOID) __attribute__((weakref("JffsMutexDelete")));//弱引用 JffsMutexDelete
partition_param *g_spinorPartParam = NULL; partition_param *g_spinorPartParam = NULL;
mtd_partition *g_spinorPartitionHead = NULL; mtd_partition *g_spinorPartitionHead = NULL;
#define RWE_RW_RW 0755 #define RWE_RW_RW 0755 //文件读/写/执权限,chmod 755
mtd_partition *GetSpinorPartitionHead(VOID) mtd_partition *GetSpinorPartitionHead(VOID)
{ {
return g_spinorPartitionHead; return g_spinorPartitionHead;
} }
//初始化 norflash 参数
static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev *spinorMtd) static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev *spinorMtd)
{ {
LOS_ListInit(&g_spinorPartitionHead->node_info); LOS_ListInit(&g_spinorPartitionHead->node_info);
...@@ -71,21 +71,21 @@ static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev ...@@ -71,21 +71,21 @@ static VOID MtdNorParamAssign(partition_param *spinorParam, const struct MtdDev
* you can change the SPIBLK_NAME or SPICHR_NAME to NULL. * you can change the SPIBLK_NAME or SPICHR_NAME to NULL.
*/ */
spinorParam->flash_mtd = (struct MtdDev *)spinorMtd; spinorParam->flash_mtd = (struct MtdDev *)spinorMtd;
spinorParam->flash_ops = GetDevSpinorOps(); spinorParam->flash_ops = GetDevSpinorOps(); //获取块设备操作方法
spinorParam->char_ops = GetMtdCharFops(); spinorParam->char_ops = GetMtdCharFops(); //获取字符设备操作方法
spinorParam->blockname = SPIBLK_NAME; spinorParam->blockname = SPIBLK_NAME;
spinorParam->charname = SPICHR_NAME; spinorParam->charname = SPICHR_NAME;
spinorParam->partition_head = g_spinorPartitionHead; spinorParam->partition_head = g_spinorPartitionHead;
spinorParam->block_size = spinorMtd->eraseSize; spinorParam->block_size = spinorMtd->eraseSize;//4K, 读/写/擦除 的最小单位
} }
//反初始化 norflash 参数
static VOID MtdDeinitSpinorParam(VOID) static VOID MtdDeinitSpinorParam(VOID)
{ {
if (JffsLockDeinit != NULL) { if (JffsLockDeinit != NULL) {
JffsLockDeinit(); JffsLockDeinit();
} }
} }
//初始化 nor flash 参数
static partition_param *MtdInitSpinorParam(partition_param *spinorParam) static partition_param *MtdInitSpinorParam(partition_param *spinorParam)
{ {
struct MtdDev *spinorMtd = GetMtd("spinor"); struct MtdDev *spinorMtd = GetMtd("spinor");
...@@ -118,7 +118,7 @@ static partition_param *MtdInitSpinorParam(partition_param *spinorParam) ...@@ -118,7 +118,7 @@ static partition_param *MtdInitSpinorParam(partition_param *spinorParam)
return 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) static INT32 MtdInitFsparParam(const CHAR *type, partition_param **fsparParam)
{ {
if (strcmp(type, "spinor") == 0) { if (strcmp(type, "spinor") == 0) {
......
...@@ -910,8 +910,8 @@ ERROUT: ...@@ -910,8 +910,8 @@ ERROUT:
return VFS_ERROR; return VFS_ERROR;
} }
/* console device driver function structure */ /* console device driver function structure *///控制台设备驱动程序功能结构体
STATIC const struct file_operations_vfs g_consoleDevOps = { STATIC const struct file_operations_vfs g_consoleDevOps = {//实现VFS接口函数,对控制台进行操作
.open = ConsoleOpen, /* open */ .open = ConsoleOpen, /* open */
.close = ConsoleClose, /* close */ .close = ConsoleClose, /* close */
.read = ConsoleRead, /* read */ .read = ConsoleRead, /* read */
...@@ -996,7 +996,7 @@ ERROUT_WITH_FULLPATH: ...@@ -996,7 +996,7 @@ ERROUT_WITH_FULLPATH:
/* /*
* Initialized console control platform so that when we operate /dev/console * Initialized console control platform so that when we operate /dev/console
* as if we are operating /dev/ttyS0 (uart0). * 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) STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName)
{ {
INT32 ret; INT32 ret;
...@@ -1025,7 +1025,6 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) ...@@ -1025,7 +1025,6 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName)
goto ERROUT_WITH_FULLPATH; goto ERROUT_WITH_FULLPATH;
} }
inode = desc.node; inode = desc.node;
consoleCB->devInode = inode; consoleCB->devInode = inode;
/* /*
...@@ -1034,6 +1033,10 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) ...@@ -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 * then we can operate console's filep as if we operate uart0 filep of
* /dev/ttyS0. * /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)); (VOID)memset_s(filep, sizeof(struct file), 0, sizeof(struct file));
filep->f_oflags = O_RDWR; filep->f_oflags = O_RDWR;
filep->f_pos = 0; filep->f_pos = 0;
...@@ -1052,7 +1055,9 @@ STATIC INT32 OsConsoleDevInit(CONSOLE_CB *consoleCB, const CHAR *deviceName) ...@@ -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. * 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. * 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) { if (ret != LOS_OK) {
goto ERROUT_WITH_INODE; goto ERROUT_WITH_INODE;
} }
......
...@@ -59,7 +59,17 @@ extern "C" { ...@@ -59,7 +59,17 @@ extern "C" {
#define STDIN 0 //标准输入 #define STDIN 0 //标准输入
#define STDOUT 1 //标准输出 #define STDOUT 1 //标准输出
#define STDERR 2 //错误 #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 "/dev/console"
#define CONSOLE_NAMELEN 16 #define CONSOLE_NAMELEN 16
#define CONSOLE_RD_BLOCK 1 #define CONSOLE_RD_BLOCK 1
......
...@@ -330,7 +330,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) ...@@ -330,7 +330,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif #endif
#ifdef LOSCFG_KERNEL_PIPE //打开管道宏 #ifdef LOSCFG_KERNEL_PIPE //打开管道宏
OsDriverPipeInit();//管道init OsDriverPipeInit();//管道模块初始化
#endif #endif
ret = OsSystemInit();//系统初始化 ret = OsSystemInit();//系统初始化
...@@ -347,14 +347,14 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) ...@@ -347,14 +347,14 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif #endif
#if (LOSCFG_KERNEL_LITEIPC == YES) #if (LOSCFG_KERNEL_LITEIPC == YES)
ret = LiteIpcInit();//这是lite自有的IPC模块 初始化 ret = LiteIpcInit();//初始化鸿蒙自有的进程间通讯模块
if (ret != LOS_OK) { if (ret != LOS_OK) {
return ret; return ret;
} }
#endif #endif
#if (LOSCFG_BASE_CORE_HILOG == YES) #if (LOSCFG_BASE_CORE_HILOG == YES)//hilog开关
ret = HiLogDriverInit(); ret = HiLogDriverInit();//初始化hilog字符设备驱动程序
if (ret != LOS_OK) { if (ret != LOS_OK) {
return ret; return ret;
} }
...@@ -373,8 +373,8 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) ...@@ -373,8 +373,8 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
return ret; return ret;
} }
ret = OomTaskInit();//Out-Of-Memory 用户监控使用内存太大的task,在内存不足而某些进程太耗内存时 ret = OomTaskInit();//Out-Of-Memory 用于监控使用内存太大的task.
if (ret != LOS_OK) {//可以直接把进程干掉而释放内存 if (ret != LOS_OK) {//在内存不足而某些进程太耗内存时,内核可直接把进程干掉而释放内存
return ret; return ret;
} }
......
...@@ -38,20 +38,20 @@ ...@@ -38,20 +38,20 @@
#include "los_vm_map.h" #include "los_vm_map.h"
#include "los_vm_lock.h" #include "los_vm_lock.h"
#include "user_copy.h" #include "user_copy.h"
//hilog是鸿蒙的一个用于输出的功能模块
#define HILOG_BUFFER 1024 #define HILOG_BUFFER 1024 // 1K缓存, ring buf 方式管理
#define DRIVER_MODE 0666 #define DRIVER_MODE 0666 //权限 chmod 666
#define HILOG_DRIVER "/dev/hilog" #define HILOG_DRIVER "/dev/hilog" // 可以看出hilog是当一种字符设备来实现
struct HiLogEntry { struct HiLogEntry { //hilog 实体
unsigned int len; unsigned int len; //写入buffer的内容长度
unsigned int hdrSize; unsigned int hdrSize; // sizeof(struct HiLogEntry) ,为何命名hdr @note_why
unsigned int pid : 16; unsigned int pid : 16; //进程ID
unsigned int taskId : 16; unsigned int taskId : 16; //任务ID
unsigned int sec; unsigned int sec; //秒级
unsigned int nsec; unsigned int nsec; //纳秒级,提供给外部准确分析和定位问题
unsigned int reserved; unsigned int reserved;//保留位
char msg[0]; char msg[0]; //消息内容
}; };
ssize_t HilogRead(struct file *filep, char __user *buf, size_t count); ssize_t HilogRead(struct file *filep, char __user *buf, size_t count);
...@@ -61,7 +61,7 @@ int HiLogClose(FAR struct file *filep); ...@@ -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 HiLogWrite(FAR struct file *filep, const char *buffer, size_t bufLen);
static ssize_t HiLogRead(FAR struct file *filep, 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 = { STATIC struct file_operations_vfs g_hilogFops = {
HiLogOpen, /* open */ HiLogOpen, /* open */
HiLogClose, /* close */ HiLogClose, /* close */
...@@ -76,51 +76,51 @@ STATIC struct file_operations_vfs g_hilogFops = { ...@@ -76,51 +76,51 @@ STATIC struct file_operations_vfs g_hilogFops = {
NULL, /* unlink */ NULL, /* unlink */
}; };
FAR struct HiLogCharDevice { FAR struct HiLogCharDevice {//hilog 本质上是个字符设备
int flag; int flag; //设备标签
LosMux mtx; LosMux mtx; //读写buf的互斥量
unsigned char *buffer; unsigned char *buffer;//采用 ring buffer 管理
wait_queue_head_t wq; wait_queue_head_t wq;
size_t writeOffset; size_t writeOffset;//用于写操作,不断累加
size_t headOffset; size_t headOffset;//用于读操作,不断累加
size_t size; size_t size;//记录buffer使用的大小, 读写操作会返回 +-这个size
size_t count; size_t count;//读写操作的次数对冲
} g_hiLogDev; } g_hiLogDev;
static inline unsigned char *HiLogBufferHead(void) static inline unsigned char *HiLogBufferHead(void)
{ {
return g_hiLogDev.buffer + g_hiLogDev.headOffset; return g_hiLogDev.buffer + g_hiLogDev.headOffset;
} }
//为支持VFS,作打开状
int HiLogOpen(FAR struct file *filep) int HiLogOpen(FAR struct file *filep)
{ {
(void)filep; (void)filep;
return 0; return 0;
} }
//为支持VFS,作关闭状
int HiLogClose(FAR struct file *filep) int HiLogClose(FAR struct file *filep)
{ {
(void)filep; (void)filep;
return 0; return 0;
} }
//读写对冲,对hilog的写操作,更新相关变量内容
static void HiLogBufferInc(size_t sz) static void HiLogBufferInc(size_t sz)
{ {
if (g_hiLogDev.size + sz <= HILOG_BUFFER) { if (g_hiLogDev.size + sz <= HILOG_BUFFER) {
g_hiLogDev.size += sz; g_hiLogDev.size += sz; //已使用buf的size
g_hiLogDev.writeOffset += sz; g_hiLogDev.writeOffset += sz;//大小是不断累加
g_hiLogDev.writeOffset %= HILOG_BUFFER; g_hiLogDev.writeOffset %= HILOG_BUFFER;//ring buf
g_hiLogDev.count++; g_hiLogDev.count++;//读写对冲
} }
} }
//读写对冲,对hilog的读操作,更新相关变量内容
static void HiLogBufferDec(size_t sz) static void HiLogBufferDec(size_t sz)
{ {
if (g_hiLogDev.size >= sz) { if (g_hiLogDev.size >= sz) {
g_hiLogDev.size -= sz; g_hiLogDev.size -= sz;//维持可使用buf size
g_hiLogDev.headOffset += sz; g_hiLogDev.headOffset += sz;
g_hiLogDev.headOffset %= HILOG_BUFFER; 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) ...@@ -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)); 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)); retval = HiLogReadRingBuffer((unsigned char *)&header, sizeof(header));
if (retval < 0) { if (retval < 0) {
retval = -EINVAL; retval = -EINVAL;
...@@ -200,10 +200,10 @@ static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen) ...@@ -200,10 +200,10 @@ static ssize_t HiLogRead(FAR struct file *filep, char *buffer, size_t bufLen)
HiLogBufferDec(header.len); HiLogBufferDec(header.len);
retval = header.len + sizeof(header); retval = header.len + sizeof(header);
out: out:
(VOID)LOS_MuxRelease(&g_hiLogDev.mtx); (VOID)LOS_MuxRelease(&g_hiLogDev.mtx);//临界区操作结束
return retval; return retval;
} }
//写入 RingBuffer环形缓冲,也叫 circleBuffer
static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen) static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen)
{ {
int retval; int retval;
...@@ -222,23 +222,23 @@ static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen) ...@@ -222,23 +222,23 @@ static int HiLogWriteRingBuffer(unsigned char *buffer, size_t bufLen)
} }
return 0; return 0;
} }
//hilog实体初始化
static void HiLogHeadInit(struct HiLogEntry *header, size_t len) static void HiLogHeadInit(struct HiLogEntry *header, size_t len)
{ {
struct timespec now; struct timespec now;//标准C库函数,时间格式,包含秒数和纳秒数
int ret; int ret;
ret = clock_gettime(CLOCK_REALTIME, &now); ret = clock_gettime(CLOCK_REALTIME, &now);//获取系统实时时间
if (ret != 0) { if (ret != 0) {
dprintf("In %s line %d,clock_gettime fail", __FUNCTION__, __LINE__); dprintf("In %s line %d,clock_gettime fail", __FUNCTION__, __LINE__);
return; return;
} }
header->len = len; header->len = len;//写入buffer的内容长度
header->pid = LOS_GetCurrProcessID(); header->pid = LOS_GetCurrProcessID();//当前进程ID
header->taskId = LOS_CurTaskIDGet(); header->taskId = LOS_CurTaskIDGet(); //当前任务ID
header->sec = now.tv_sec; header->sec = now.tv_sec; //秒级记录
header->nsec = now.tv_nsec; header->nsec = now.tv_nsec; //纳秒级记录
header->hdrSize = sizeof(struct HiLogEntry); header->hdrSize = sizeof(struct HiLogEntry);
} }
...@@ -257,7 +257,7 @@ static void HiLogCoverOldLog(size_t bufLen) ...@@ -257,7 +257,7 @@ static void HiLogCoverOldLog(size_t bufLen)
HiLogBufferDec(sizeof(header) + header.len); HiLogBufferDec(sizeof(header) + header.len);
} }
} }
//将外部buf写入hilog设备分两步完成
int HiLogWriteInternal(const char *buffer, size_t bufLen) int HiLogWriteInternal(const char *buffer, size_t bufLen)
{ {
struct HiLogEntry header; struct HiLogEntry header;
...@@ -267,14 +267,14 @@ int HiLogWriteInternal(const char *buffer, size_t bufLen) ...@@ -267,14 +267,14 @@ int HiLogWriteInternal(const char *buffer, size_t bufLen)
HiLogCoverOldLog(bufLen); HiLogCoverOldLog(bufLen);
HiLogHeadInit(&header, bufLen); HiLogHeadInit(&header, bufLen);
retval = HiLogWriteRingBuffer((unsigned char *)&header, sizeof(header)); retval = HiLogWriteRingBuffer((unsigned char *)&header, sizeof(header));//1.先写入头部内容
if (retval) { if (retval) {
retval = -ENODATA; retval = -ENODATA;
goto out; 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) { if (retval) {
retval = -ENODATA; retval = -ENODATA;
goto out; goto out;
...@@ -294,7 +294,7 @@ out: ...@@ -294,7 +294,7 @@ out:
} }
return retval; return retval;
} }
//写hilog,外部以VFS方式写入
static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t bufLen) static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t bufLen)
{ {
(void)filep; (void)filep;
...@@ -305,26 +305,26 @@ static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t buf ...@@ -305,26 +305,26 @@ static ssize_t HiLogWrite(FAR struct file *filep, const char *buffer, size_t buf
return HiLogWriteInternal(buffer, bufLen); return HiLogWriteInternal(buffer, bufLen);
} }
//初始化全局变量g_hiLogDev
static void HiLogDeviceInit(void) 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) { if (g_hiLogDev.buffer == NULL) {
dprintf("In %s line %d,LOS_MemAlloc fail", __FUNCTION__, __LINE__); 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); g_hiLogDev.writeOffset = 0;//写g_hiLogDev.buffer偏移地址
LOS_MuxInit(&g_hiLogDev.mtx, NULL);
g_hiLogDev.writeOffset = 0;
g_hiLogDev.headOffset = 0; g_hiLogDev.headOffset = 0;
g_hiLogDev.size = 0; g_hiLogDev.size = 0; //
g_hiLogDev.count = 0; g_hiLogDev.count = 0;
} }
//初始化hilog驱动
int HiLogDriverInit(VOID) int HiLogDriverInit(VOID)
{ {
HiLogDeviceInit(); HiLogDeviceInit();//初始化全局变量g_hiLogDev
return register_driver(HILOG_DRIVER, &g_hilogFops, DRIVER_MODE, NULL); return register_driver(HILOG_DRIVER, &g_hilogFops, DRIVER_MODE, NULL);//注册字符设备驱动程序,生成inode节点
} }
...@@ -219,7 +219,7 @@ STATIC INT32 GetArgs(CHAR **args) ...@@ -219,7 +219,7 @@ STATIC INT32 GetArgs(CHAR **args)
#endif #endif
#ifdef LOSCFG_PLATFORM_HI3518EV300 #ifdef LOSCFG_PLATFORM_HI3518EV300
struct MtdDev *mtd = GetMtd(FLASH_TYPE); struct MtdDev *mtd = GetMtd(FLASH_TYPE);//获取flash设备描述符
if (mtd == NULL) { if (mtd == NULL) {
PRINT_ERR("Get spinor mtd failed!\n"); PRINT_ERR("Get spinor mtd failed!\n");
goto ERROUT; goto ERROUT;
......
...@@ -58,8 +58,8 @@ ...@@ -58,8 +58,8 @@
#define FLASH_TYPE "spinor" //flash类型 #define FLASH_TYPE "spinor" //flash类型
#define FLASH_DEV_NAME "/dev/spinorblk0" //根文件系统路径 #define FLASH_DEV_NAME "/dev/spinorblk0" //根文件系统路径
//扇区是对硬盘而言,而块是对文件系统而言
#define EMMC_SEC_SIZE 512 #define EMMC_SEC_SIZE 512 //扇区大小,按512个字节,按扇区对齐
#define DEC_NUMBER_STRING "0123456789" #define DEC_NUMBER_STRING "0123456789"
#define HEX_NUMBER_STRING "0123456789abcdefABCDEF" #define HEX_NUMBER_STRING "0123456789abcdefABCDEF"
......
...@@ -198,7 +198,7 @@ ERROUT: ...@@ -198,7 +198,7 @@ ERROUT:
set_errno(-ret); set_errno(-ret);
return VFS_ERROR; return VFS_ERROR;
} }
//实现VFS接口函数,对串行设备进行操作
STATIC const struct file_operations_vfs g_serialDevOps = { STATIC const struct file_operations_vfs g_serialDevOps = {
SerialOpen, /* open */ SerialOpen, /* open */
SerialClose, /* close */ SerialClose, /* close */
......
...@@ -46,9 +46,9 @@ extern "C" { ...@@ -46,9 +46,9 @@ extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef LOSCFG_FS_VFS #ifdef LOSCFG_FS_VFS //将设备虚拟为文件统一来操作,对鸿蒙来说一切皆为文件
#define SERIAL "/dev/serial" #define SERIAL "/dev/serial"
#define SERIAL_TTYGS0 "/dev/ttyGS0" #define SERIAL_TTYGS0 "/dev/ttyGS0"
#define SERIAL_UARTDEV "/dev/uartdev" #define SERIAL_UARTDEV "/dev/uartdev"
#define SERIAL_TYPE_UART_DEV 1 #define SERIAL_TYPE_UART_DEV 1
......
...@@ -88,7 +88,7 @@ STATIC UINT32 LiteIpcWrite(IpcContent *content); ...@@ -88,7 +88,7 @@ STATIC UINT32 LiteIpcWrite(IpcContent *content);
STATIC UINT32 GetTid(UINT32 serviceHandle, UINT32 *taskID); STATIC UINT32 GetTid(UINT32 serviceHandle, UINT32 *taskID);
STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *node, BOOL isRollback); STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *node, BOOL isRollback);
//实现VFS接口函数,对liteIpc进行操作
STATIC const struct file_operations_vfs g_liteIpcFops = { STATIC const struct file_operations_vfs g_liteIpcFops = {
LiteIpcOpen, /* open */ LiteIpcOpen, /* open */
LiteIpcClose, /* close */ LiteIpcClose, /* close */
......
...@@ -334,7 +334,7 @@ STATIC INT32 TelnetPoll(struct file *file, poll_table *table) ...@@ -334,7 +334,7 @@ STATIC INT32 TelnetPoll(struct file *file, poll_table *table)
TelnetUnlock(); TelnetUnlock();
return 0; return 0;
} }
//实现VFS接口函数,对远程登录进行操作
STATIC const struct file_operations_vfs g_telnetOps = {//远程登录操作 STATIC const struct file_operations_vfs g_telnetOps = {//远程登录操作
TelnetOpen, //打开 TelnetOpen, //打开
TelnetClose, //关闭 TelnetClose, //关闭
......
#编译器将本文件自动生成 menuconfig.h 放在..\..\..\platform\include\menuconfig.h
#详见 zzz\autogen\menuconfig.h
# #
# Automatically generated file; DO NOT EDIT. # Automatically generated file; DO NOT EDIT.
# Huawei LiteOS Configuration # Huawei LiteOS Configuration
# #
# #
# Compiler # Compiler
# #
# LOSCFG_COMPILER_HIMIX_32 is not set # LOSCFG_COMPILER_HIMIX_32 is not set
LOSCFG_COMPILER_CLANG_LLVM=y LOSCFG_COMPILER_CLANG_LLVM=y
...@@ -12,8 +14,8 @@ LOSCFG_COMPILER_CLANG_LLVM=y ...@@ -12,8 +14,8 @@ LOSCFG_COMPILER_CLANG_LLVM=y
# #
# Platform # Platform
# #
LOSCFG_PLATFORM="hi3516dv300" LOSCFG_PLATFORM="hi3516dv300" #平台名称
LOSCFG_PLATFORM_HI3516DV300=y LOSCFG_PLATFORM_HI3516DV300=y #编译平台开关
# LOSCFG_PLATFORM_HI3518EV300 is not set # LOSCFG_PLATFORM_HI3518EV300 is not set
# LOSCFG_TEE_ENABLE is not set # LOSCFG_TEE_ENABLE is not set
LOSCFG_PLATFORM_BSP_GIC_V2=y LOSCFG_PLATFORM_BSP_GIC_V2=y
...@@ -54,7 +56,7 @@ LOSCFG_KERNEL_VDSO=y #VDSO就是Virtual Dynamic Shared Object,就是内 ...@@ -54,7 +56,7 @@ LOSCFG_KERNEL_VDSO=y #VDSO就是Virtual Dynamic Shared Object,就是内
# LOSCFG_KERNEL_TRACE is not set # LOSCFG_KERNEL_TRACE is not set
LOSCFG_KERNEL_LITEIPC=y #用于轻量级进程间通讯 LOSCFG_KERNEL_LITEIPC=y #用于轻量级进程间通讯
LOSCFG_KERNEL_PIPE=y #管道支持 LOSCFG_KERNEL_PIPE=y #管道支持
LOSCFG_BASE_CORE_HILOG=y #hilog 日志支持 LOSCFG_BASE_CORE_HILOG=y #hilog 日志支持 /dev/hilog
# #
# Lib # Lib
...@@ -77,14 +79,14 @@ LOSCFG_FILE_MODE=y #文件权限支持 例如:chmod 777 ...@@ -77,14 +79,14 @@ LOSCFG_FILE_MODE=y #文件权限支持 例如:chmod 777
LOSCFG_FS_FAT=y #文件配置表(英语:File Allocation Table,首字母缩略字:FAT),是一种由微软发明并拥有部分专利的文件系统 LOSCFG_FS_FAT=y #文件配置表(英语:File Allocation Table,首字母缩略字:FAT),是一种由微软发明并拥有部分专利的文件系统
LOSCFG_FS_FAT_CACHE=y #FAT缓存支持 LOSCFG_FS_FAT_CACHE=y #FAT缓存支持
# LOSCFG_FS_FAT_CACHE_SYNC_THREAD is not set # 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_VIRTUAL_PARTITION=y
LOSCFG_FS_FAT_VOLUMES=16 LOSCFG_FS_FAT_VOLUMES=16
LOSCFG_FS_FAT_DISK=y LOSCFG_FS_FAT_DISK=y #
LOSCFG_FS_RAMFS=y LOSCFG_FS_RAMFS=y
LOSCFG_FS_NFS=y #网络文件系统,英文Network File System(NFS) LOSCFG_FS_NFS=y #网络文件系统,英文Network File System(NFS)
LOSCFG_FS_PROC=y 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 # Net
...@@ -96,9 +98,9 @@ LOSCFG_NET_LWIP_SACK_2_1=y ...@@ -96,9 +98,9 @@ LOSCFG_NET_LWIP_SACK_2_1=y
# Debug # Debug
# #
# LOSCFG_COMPILE_DEBUG is not set # LOSCFG_COMPILE_DEBUG is not set
LOSCFG_PLATFORM_ADAPT=y LOSCFG_PLATFORM_ADAPT=y
LOSCFG_ENABLE_OOM_LOOP_TASK=y LOSCFG_ENABLE_OOM_LOOP_TASK=y #支持内存溢出检测
LOSCFG_ENABLE_MAGICKEY=y LOSCFG_ENABLE_MAGICKEY=y #支持魔法键
# LOSCFG_THUMB is not set # LOSCFG_THUMB is not set
# LOSCFG_DEBUG_VERSION is not set # LOSCFG_DEBUG_VERSION is not set
LOSCFG_DRIVERS_HDF_PLATFORM_UART=y LOSCFG_DRIVERS_HDF_PLATFORM_UART=y
......
/*
*
* 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
git add -A 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_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善 搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方 搜索 @note_thinking 是注者的思考和吐槽的地方
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册