diff --git a/fs/proc/os_adapt/fd_proc.c b/fs/proc/os_adapt/fd_proc.c index d357227ae2afe9ba018090c8cb69c6a6c6c92165..d19182f61bd6fb45a1aedd6b3b50b8882a2ea9a2 100644 --- a/fs/proc/os_adapt/fd_proc.c +++ b/fs/proc/os_adapt/fd_proc.c @@ -39,11 +39,12 @@ #include "los_process.h" #include "capability_api.h" #include "capability_type.h" +// /proc 下的文件描述符适配层 /* * Template: Pid Fd [SysFd ] Name - */ + */ //打印系统文件描述符信息 static void FillFdInfo(struct SeqBuf *seqBuf, struct filelist *fileList, unsigned int pid, bool hasPrivilege) { int fd; @@ -128,7 +129,7 @@ static int FdProcFill(struct SeqBuf *seqBuf, void *v) static const struct ProcFileOperations FD_PROC_FOPS = { .read = FdProcFill, }; - +// 初始化 /proc/fd void ProcFdInit(void) { struct ProcDirEntry *pde = CreateProcEntry("fd", 0, NULL); diff --git a/fs/proc/os_adapt/power_proc.c b/fs/proc/os_adapt/power_proc.c index f8a6f6ebf070afa7e3fdd74183f3b7cf4e2381ee..8229b312a34f08d15a614cc529c31a73b4b22557 100644 --- a/fs/proc/os_adapt/power_proc.c +++ b/fs/proc/os_adapt/power_proc.c @@ -35,7 +35,8 @@ #include "internal.h" #ifdef LOSCFG_KERNEL_PM #include "los_pm.h" - +// /proc 下的电源适配层 +//写电源锁信息 static int PowerLockWrite(struct ProcFile *pf, const char *buf, size_t count, loff_t *ppos) { (void)pf; @@ -43,7 +44,7 @@ static int PowerLockWrite(struct ProcFile *pf, const char *buf, size_t count, lo (void)ppos; return -LOS_PmLockRequest(buf); } - +//读取电源锁信息 static int PowerLockRead(struct SeqBuf *m, void *v) { (void)v; @@ -51,12 +52,12 @@ static int PowerLockRead(struct SeqBuf *m, void *v) LOS_PmLockInfoShow(m); return 0; } - +//proc 拿电源锁操作 static const struct ProcFileOperations PowerLock = { .write = PowerLockWrite, .read = PowerLockRead, }; - +//proc 释放锁操作 static int PowerUnlockWrite(struct ProcFile *pf, const char *buf, size_t count, loff_t *ppos) { (void)pf; @@ -115,12 +116,12 @@ static const struct ProcFileOperations PowerCount = { }; #define POWER_FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH) -#define OS_POWER_PRIVILEGE 7 - +#define OS_POWER_PRIVILEGE 7 //电源特权 +// /proc/power 的初始化 void ProcPmInit(void) { struct ProcDirEntry *power = CreateProcEntry("power", S_IFDIR | S_IRWXU | S_IRWXG | S_IROTH, NULL); - if (power == NULL) { + if (power == NULL) {//创建 文件夹 /proc/power PRINT_ERR("create /proc/power error!\n"); return; } @@ -128,7 +129,7 @@ void ProcPmInit(void) power->gid = OS_POWER_PRIVILEGE; struct ProcDirEntry *mode = CreateProcEntry("power/power_mode", POWER_FILE_MODE, NULL); - if (mode == NULL) { + if (mode == NULL) {//创建 文件夹 /proc/power/power_mode PRINT_ERR("create /proc/power/power_mode error!\n"); goto FREE_POWER; } @@ -137,7 +138,7 @@ void ProcPmInit(void) mode->gid = OS_POWER_PRIVILEGE; struct ProcDirEntry *lock = CreateProcEntry("power/power_lock", POWER_FILE_MODE, NULL); - if (lock == NULL) { + if (lock == NULL) {//创建 文件夹 /proc/power/power_lock PRINT_ERR("create /proc/power/power_lock error!\n"); goto FREE_MODE; } @@ -146,7 +147,7 @@ void ProcPmInit(void) lock->gid = OS_POWER_PRIVILEGE; struct ProcDirEntry *unlock = CreateProcEntry("power/power_unlock", POWER_FILE_MODE, NULL); - if (unlock == NULL) { + if (unlock == NULL) {//创建 文件夹 /proc/power/power_unlock PRINT_ERR("create /proc/power/power_unlock error!\n"); goto FREE_LOCK; } @@ -155,7 +156,7 @@ void ProcPmInit(void) unlock->gid = OS_POWER_PRIVILEGE; struct ProcDirEntry *count = CreateProcEntry("power/power_count", S_IRUSR | S_IRGRP | S_IROTH, NULL); - if (count == NULL) { + if (count == NULL) {//创建 文件夹 /proc/power/power_count PRINT_ERR("create /proc/power/power_count error!\n"); goto FREE_UNLOCK; } diff --git a/kernel/extended/power/los_pm.c b/kernel/extended/power/los_pm.c index 7c8bc9d20773b365503210b45a8b4e73074d5ce4..3d79490152bc18a7a0e4a576500b55578b0b6e94 100644 --- a/kernel/extended/power/los_pm.c +++ b/kernel/extended/power/los_pm.c @@ -37,6 +37,43 @@ #include "los_spinlock.h" #include "los_mp.h" +/******************************************************************* +// @note_link http://weharmonyos.com/openharmony/zh-cn/readme/%E7%94%B5%E6%BA%90%E7%AE%A1%E7%90%86%E5%AD%90%E7%B3%BB%E7%BB%9F.html +电源管理子系统提供如下功能: + 重启系统。 + 管理休眠运行锁。 + 系统电源状态查询。 + 充电和电池状态查询和上报。 + 亮灭屏管理和亮度调节。 +/base/powermgr +├── battery_manager # 电池服务组件 +│ ├── hdi # HDI层 +│ ├── interfaces # 接口层 +│ ├── sa_profile # SA配置文件 +│ ├── services # 服务层 +│ └── utils # 工具和通用层 +├── display_manager # 显示控制组件 +│ ├── interfaces # 接口层 +│ └── sa_profile # SA配置文件 +│ └── services # 服务层 +│ └── utils # 工具和通用层 +├── powermgr_lite # 轻量级电源管理组件 +│ ├── interfaces # 接口层 +│ └── services # 服务层 +└── power_manager # 电源管理服务组件 + ├── interfaces # 接口层 + ├── sa_profile # SA配置文件 + └── services # 服务层 + └── utils # 工具和通用层 +开发者通过电源管理子系统提供的接口可以进行申请和释放休眠运行锁RunningLock、获取电池信息、亮度调节、重启设备、关机等操作。 + +电源管理子系统相关仓库 + +powermgr_battery_manager +powermgr_power_manager +powermgr_display_manager + +*******************************************************************/ #ifdef LOSCFG_KERNEL_PM #define PM_INFO_SHOW(seqBuf, arg...) do { \ if (seqBuf != NULL) { \ @@ -50,34 +87,34 @@ #define OS_PM_LOCK_NAME_MAX 28 typedef UINT32 (*Suspend)(VOID); - +//电源锁控制块 typedef struct { - CHAR name[OS_PM_LOCK_NAME_MAX]; - UINT32 count; - LOS_DL_LIST list; + CHAR name[OS_PM_LOCK_NAME_MAX];//电源锁名称 + UINT32 count; //数量 + LOS_DL_LIST list; //电源锁链表,上面挂的是 OsPmLockCB } OsPmLockCB; - +//电源管理控制块 typedef struct { - LOS_SysSleepEnum mode; - UINT16 lock; - LOS_DL_LIST lockList; + LOS_SysSleepEnum mode; //模式类型 + UINT16 lock; //锁数量 + LOS_DL_LIST lockList; //电源锁链表头,上面挂的是 OsPmLockCB } LosPmCB; -STATIC LosPmCB g_pmCB; -STATIC SPIN_LOCK_INIT(g_pmSpin); - +STATIC LosPmCB g_pmCB;//电源控制块全局遍历 +STATIC SPIN_LOCK_INIT(g_pmSpin);//电源模块自旋锁 +//获取电源模式 LOS_SysSleepEnum LOS_PmModeGet(VOID) { LOS_SysSleepEnum mode; LosPmCB *pm = &g_pmCB; LOS_SpinLock(&g_pmSpin); - mode = pm->mode; + mode = pm->mode; //枚举类型,4种状态 LOS_SpinUnlock(&g_pmSpin); return mode; } - +//获取电源锁数量 UINT32 LOS_PmLockCountGet(VOID) { UINT16 count; @@ -89,7 +126,7 @@ UINT32 LOS_PmLockCountGet(VOID) return (UINT32)count; } - +//显示所有电源锁信息 VOID LOS_PmLockInfoShow(struct SeqBuf *m) { UINT32 intSave; @@ -99,16 +136,16 @@ VOID LOS_PmLockInfoShow(struct SeqBuf *m) LOS_DL_LIST *list = head->pstNext; intSave = LOS_IntLock(); - while (list != head) { - lock = LOS_DL_LIST_ENTRY(list, OsPmLockCB, list); - PM_INFO_SHOW(m, "%-30s%5u\n\r", lock->name, lock->count); + while (list != head) {//遍历链表 + lock = LOS_DL_LIST_ENTRY(list, OsPmLockCB, list);//获取 OsPmLockCB 实体 + PM_INFO_SHOW(m, "%-30s%5u\n\r", lock->name, lock->count); //打印名称和数量 list = list->pstNext; } LOS_IntRestore(intSave); return; } - +//请求获取指定的锁 UINT32 LOS_PmLockRequest(const CHAR *name) { INT32 len; @@ -137,7 +174,7 @@ UINT32 LOS_PmLockRequest(const CHAR *name) LOS_SpinUnlock(&g_pmSpin); return LOS_EINVAL; } - + //遍历找到参数对应的 OsPmLockCB while (list != head) { listNode = LOS_DL_LIST_ENTRY(list, OsPmLockCB, list); if (strcmp(name, listNode->name) == 0) { @@ -147,8 +184,8 @@ UINT32 LOS_PmLockRequest(const CHAR *name) list = list->pstNext; } - - if (lock == NULL) { + + if (lock == NULL) {//没有记录则创建记录 lock = LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, sizeof(OsPmLockCB)); if (lock == NULL) { LOS_SpinUnlock(&g_pmSpin); @@ -162,17 +199,18 @@ UINT32 LOS_PmLockRequest(const CHAR *name) return err; } - lock->count = 1; - LOS_ListTailInsert(head, &lock->list); + lock->count = 1;//数量增加 + LOS_ListTailInsert(head, &lock->list);//从尾部插入链表中 } else if (lock->count < OS_PM_LOCK_MAX) { - lock->count++; + lock->count++;//存在记录时,数量增加 } - pm->lock++; + pm->lock++;//总数量增加 LOS_SpinUnlock(&g_pmSpin); return LOS_OK; } - +//释放指定锁,注意这里的释放指的是释放数量,当数量为0时才删除锁 +//释放方式跟系统描述符(sysfd)很像 UINT32 LOS_PmLockRelease(const CHAR *name) { LosPmCB *pm = &g_pmCB; @@ -196,43 +234,43 @@ UINT32 LOS_PmLockRelease(const CHAR *name) return LOS_EINVAL; } - while (list != head) { + while (list != head) {//遍历找到参数对应的 OsPmLockCB listNode = LOS_DL_LIST_ENTRY(list, OsPmLockCB, list); if (strcmp(name, listNode->name) == 0) { lock = listNode; - break; + break;//找到返回 } - list = list->pstNext; + list = list->pstNext;//继续遍历下一个结点 } if (lock == NULL) { LOS_SpinUnlock(&g_pmSpin); return LOS_EACCES; - } else if (lock->count > 0) { - lock->count--; - if (lock->count == 0) { - LOS_ListDelete(&lock->list); + } else if (lock->count > 0) {//有记录且有数量 + lock->count--; //数量减少 + if (lock->count == 0) {//没有了 + LOS_ListDelete(&lock->list);//讲自己从链表中摘除 lockFree = lock; } } - pm->lock--; + pm->lock--;//总数量减少 LOS_SpinUnlock(&g_pmSpin); (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, lockFree); return LOS_OK; } - +//电源管理模块初始化 UINT32 OsPmInit(VOID) { LosPmCB *pm = &g_pmCB; - (VOID)memset_s(pm, sizeof(LosPmCB), 0, sizeof(LosPmCB)); + (VOID)memset_s(pm, sizeof(LosPmCB), 0, sizeof(LosPmCB));//全局链表置0 - pm->mode = LOS_SYS_NORMAL_SLEEP; - LOS_ListInit(&pm->lockList); + pm->mode = LOS_SYS_NORMAL_SLEEP;//初始模式 + LOS_ListInit(&pm->lockList);//初始化链表 return LOS_OK; } -LOS_MODULE_INIT(OsPmInit, LOS_INIT_LEVEL_KMOD_EXTENDED); +LOS_MODULE_INIT(OsPmInit, LOS_INIT_LEVEL_KMOD_EXTENDED);//以扩展方式初始化电源管理模块 #endif diff --git a/kernel/include/los_pm.h b/kernel/include/los_pm.h index b26adf501df698962c355858405197a0538fa3ae..b2a7f5d0f10b57caa292a55f2652d10f224e76fc 100644 --- a/kernel/include/los_pm.h +++ b/kernel/include/los_pm.h @@ -39,10 +39,10 @@ #include "los_errno.h" typedef enum { - LOS_SYS_NORMAL_SLEEP = 0, - LOS_SYS_LIGHT_SLEEP, - LOS_SYS_DEEP_SLEEP, - LOS_SYS_SHUTDOWN, + LOS_SYS_NORMAL_SLEEP = 0, //普通睡眠 + LOS_SYS_LIGHT_SLEEP, //浅度睡眠 + LOS_SYS_DEEP_SLEEP, //深度睡眠 + LOS_SYS_SHUTDOWN, //关闭电源 } LOS_SysSleepEnum; /** diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 1d75a837e1e6b19520b79f5cefeeea8763a5b15d..0b31da2894a07f124af1ba01603ee3f10d3a56ff 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m ' 同步下官方源码,近半个月官方改动很小. +git commit -m ' 注解内核对电源模块的初始化代码. 百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码 博客输出站点(国内):http://weharmonyos.com 博客输出站点(国外):https://weharmony.github.io