From 46b63f71537789743ed2f3f337c1809ee4900d71 Mon Sep 17 00:00:00 2001 From: boxi Date: Wed, 28 Apr 2021 08:59:17 +0800 Subject: [PATCH] feat: Add /dev/quickstart to support synchronous communication between processes in user mode startup. Add /dev/quickstart to support synchronous communication between processes in user mode startup. Support ioctl cmd: QUICKSTART_LISTEN,QUICKSTART_STAGE1,QUICKSTART_STAGE2,QUICKSTART_STAGE3,QUICKSTART_UNREGISTER only for init process; QUICKSTART_NOTIFY for other app process. Close #I3OHO5 Change-Id: If6a56123be93a5bc6b6d1069abda8d872b15fae1 --- Kconfig | 1 + drivers/char/quickstart/Kconfig | 6 ++ ...los_quick_start.h => los_dev_quickstart.h} | 37 ++++++++++- .../quickstart/include/los_quick_start_pri.h | 52 ---------------- drivers/char/quickstart/src/quickstart.c | 62 +++++++++++++------ kernel/common/los_config.c | 11 ---- tools/build/mk/los_config.mk | 6 +- 7 files changed, 89 insertions(+), 86 deletions(-) create mode 100644 drivers/char/quickstart/Kconfig rename drivers/char/quickstart/include/{los_quick_start.h => los_dev_quickstart.h} (62%) delete mode 100644 drivers/char/quickstart/include/los_quick_start_pri.h diff --git a/Kconfig b/Kconfig index 50750d11..ccf86320 100644 --- a/Kconfig +++ b/Kconfig @@ -303,6 +303,7 @@ source "../../kernel/liteos_a/bsd/dev/usb/Kconfig" source "../../drivers/adapter/khdf/liteos/Kconfig" source "drivers/char/mem/Kconfig" +source "drivers/char/quickstart/Kconfig" source "drivers/char/random/Kconfig" source "../../drivers/liteos/tzdriver/Kconfig" source "drivers/char/video/Kconfig" diff --git a/drivers/char/quickstart/Kconfig b/drivers/char/quickstart/Kconfig new file mode 100644 index 00000000..5ff73fe5 --- /dev/null +++ b/drivers/char/quickstart/Kconfig @@ -0,0 +1,6 @@ +config DRIVERS_QUICKSTART + bool "Enable QUICKSTART" + default y + depends on DRIVERS && FS_VFS + help + Answer Y to enable LiteOS support quickstart frame dev. diff --git a/drivers/char/quickstart/include/los_quick_start.h b/drivers/char/quickstart/include/los_dev_quickstart.h similarity index 62% rename from drivers/char/quickstart/include/los_quick_start.h rename to drivers/char/quickstart/include/los_dev_quickstart.h index ad3d3742..6c5f078c 100644 --- a/drivers/char/quickstart/include/los_quick_start.h +++ b/drivers/char/quickstart/include/los_dev_quickstart.h @@ -33,6 +33,7 @@ #define __LOS_QUICK_START_H__ #include "los_typedef.h" +#include "sys/ioctl.h" #ifdef __cplusplus #if __cplusplus @@ -40,7 +41,41 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -extern int DevQuickStartRegister(void); +typedef enum { + QS_STAGE1 = 1, /* 1: start from stage1, 0 is already called in kernel process */ + QS_STAGE2, /* system init stage No 2 */ + QS_STAGE3, /* system init stage No 3 */ + QS_STAGE_LIMIT +} QS_STAGE; + +typedef enum { + QS_UNREGISTER = QS_STAGE_LIMIT, /* quickstart dev unregister */ + QS_NOTIFY, /* quickstart notify */ + QS_LISTEN, /* quickstart listen */ + QS_CTL_LIMIT +} QS_CTL; + +#define QS_STAGE_CNT (QS_STAGE_LIMIT - QS_STAGE1) + +#define QS_STAGE_NO(x) QS_STAGE##x + +#define QUICKSTART_IOC_MAGIC 'T' +#define QUICKSTART_UNREGISTER _IO(QUICKSTART_IOC_MAGIC, QS_UNREGISTER) +#define QUICKSTART_NOTIFY _IO(QUICKSTART_IOC_MAGIC, QS_NOTIFY) +#define QUICKSTART_LISTEN _IO(QUICKSTART_IOC_MAGIC, QS_LISTEN) +#define QUICKSTART_STAGE(x) _IO(QUICKSTART_IOC_MAGIC, QS_STAGE_NO(x)) + +#define QUICKSTART_NODE "/dev/quickstart" + +typedef void (*SysteminitHook)(void); + +typedef struct { + SysteminitHook func[QS_STAGE_CNT]; +} LosSysteminitHook; + +extern void QuickStartHookRegister(LosSysteminitHook hooks); + +extern int QuickStartDevRegister(void); #ifdef __cplusplus #if __cplusplus diff --git a/drivers/char/quickstart/include/los_quick_start_pri.h b/drivers/char/quickstart/include/los_quick_start_pri.h deleted file mode 100644 index 012b548e..00000000 --- a/drivers/char/quickstart/include/los_quick_start_pri.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __LOS_QUICK_START_PRI_H__ -#define __LOS_QUICK_START_PRI_H__ - -#include "los_typedef.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -unsigned int OsSystemInitStep2(void); -extern VOID SystemInit2(VOID); - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif /* __LOS_QUICK_START_PRI_H__ */ \ No newline at end of file diff --git a/drivers/char/quickstart/src/quickstart.c b/drivers/char/quickstart/src/quickstart.c index 7a920206..663c57a7 100644 --- a/drivers/char/quickstart/src/quickstart.c +++ b/drivers/char/quickstart/src/quickstart.c @@ -29,16 +29,15 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_quick_start_pri.h" -#include "bits/ioctl.h" +#include "los_dev_quickstart.h" #include "fcntl.h" #include "linux/kernel.h" +#include "los_process_pri.h" -#define QUICKSTART_IOC_MAGIC 'T' -#define QUICKSTART_INITSTEP2 _IO(QUICKSTART_IOC_MAGIC, 0) -#define QUICKSTART_UNREGISTER _IO(QUICKSTART_IOC_MAGIC, 1) -#define QUICKSTART_NODE "/dev/quickstart" +EVENT_CB_S g_qsEvent; +static SysteminitHook g_systemInitFunc[QS_STAGE_CNT] = {0}; +static char g_callOnce[QS_STAGE_CNT] = {0}; static int QuickstartOpen(struct file *filep) { @@ -50,18 +49,30 @@ static int QuickstartClose(struct file *filep) return 0; } -static void SystemInitStep2(void) +static void QuickstartNotify(unsigned int events) { - static int once = 0; - /* Only one call is allowed */ - if (once != 0) { - return; + LOS_EventWrite((PEVENT_CB_S)&g_qsEvent, events); +} + +static void QuickstartListen(unsigned int eventMask) +{ + LOS_EventRead((PEVENT_CB_S)&g_qsEvent, eventMask, LOS_WAITMODE_AND | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER); +} + +void QuickStartHookRegister(LosSysteminitHook hooks) +{ + for (int i = 0; i < QS_STAGE_CNT; i++) { + g_systemInitFunc[i] = hooks.func[i]; } - once = 1; +} - unsigned int ret = OsSystemInitStep2(); - if (ret != LOS_OK) { - PRINT_ERR("systemInitStep2 failed\n"); +static void QuickStartStageWorking(unsigned int level) +{ + if ((level < QS_STAGE_CNT) && (g_callOnce[level] == 0) && (g_systemInitFunc[level] != NULL)) { + g_callOnce[level] = 1; /* 1: Already called */ + g_systemInitFunc[level](); + } else { + PRINT_WARN("Trigger quickstart,but doing nothing!!\n"); } } @@ -72,15 +83,27 @@ static int QuickstartDevUnregister(void) static ssize_t QuickstartIoctl(struct file *filep, int cmd, unsigned long arg) { + if (cmd == QUICKSTART_NOTIFY) { + QuickstartNotify(arg); + return 0; + } + + if (OsGetUserInitProcessID() != LOS_GetCurrProcessID()) { + PRINT_ERR("Permission denios!\n"); + return -1; + } switch (cmd) { - case QUICKSTART_INITSTEP2: - SystemInitStep2(); - break; case QUICKSTART_UNREGISTER: QuickstartDevUnregister(); break; + case QUICKSTART_LISTEN: + QuickstartListen(arg); + break; + + default: + QuickStartStageWorking(cmd - QUICKSTART_STAGE(1)); /* ioctl cmd converted to stage level */ break; } return 0; @@ -100,8 +123,9 @@ static const struct file_operations_vfs g_quickstartDevOps = { NULL, /* unlink */ }; -int DevQuickStartRegister(void) +int QuickStartDevRegister(void) { + LOS_EventInit(&g_qsEvent); return register_driver(QUICKSTART_NODE, &g_quickstartDevOps, 0666, 0); /* 0666: file mode */ } diff --git a/kernel/common/los_config.c b/kernel/common/los_config.c index f67921fc..d593007f 100644 --- a/kernel/common/los_config.c +++ b/kernel/common/los_config.c @@ -117,10 +117,6 @@ #include "los_hilog.h" #endif -#ifdef LOSCFG_QUICK_START -#include "los_quick_start_pri.h" -#endif - STATIC SystemRebootFunc g_rebootHook = NULL; @@ -388,13 +384,6 @@ STATIC UINT32 OsSystemInitTaskCreate(VOID) return LOS_TaskCreate(&taskID, &sysTask); } -#ifdef LOSCFG_QUICK_START -UINT32 OsSystemInitStep2(VOID) -{ - SystemInit2(); - return 0; -} -#endif UINT32 OsSystemInit(VOID) { diff --git a/tools/build/mk/los_config.mk b/tools/build/mk/los_config.mk index cf1526c3..1240217a 100644 --- a/tools/build/mk/los_config.mk +++ b/tools/build/mk/los_config.mk @@ -398,10 +398,10 @@ ifeq ($(LOSCFG_DRIVERS_MEM), y) LITEOS_DEV_MEM_INCLUDE = -I $(LITEOSTOPDIR)/drivers/char/mem/include endif -ifeq ($(LOSCFG_QUICK_START), y) +ifeq ($(LOSCFG_DRIVERS_QUICKSTART), y) LITEOS_BASELIB += -lquickstart LIB_SUBDIRS += $(LITEOSTOPDIR)/drivers/char/quickstart - LITEOS_QUICK_START_INCLUDE = -I $(LITEOSTOPDIR)/drivers/char/quickstart/include + LITEOS_DEV_QUICKSTART_INCLUDE = -I $(LITEOSTOPDIR)/drivers/char/quickstart/include endif ifeq ($(LOSCFG_DRIVERS_RANDOM), y) @@ -642,7 +642,7 @@ LITEOS_DRIVERS_INCLUDE := $(LITEOS_CELLWISE_INCLUDE) $(LITEOS_GPIO_INCLUDE $(LITEOS_REGULATOR_INCLUDE) $(LITEOS_VIDEO_INCLUDE) \ $(LITEOS_DRIVERS_HDF_INCLUDE) $(LITEOS_TZDRIVER_INCLUDE) \ $(LITEOS_HIEVENT_INCLUDE) $(LITEOS_DEV_MEM_INCLUDE) \ - $(LITEOS_QUICK_START_INCLUDE) + $(LITEOS_DEV_QUICKSTART_INCLUDE) LITEOS_DFX_INCLUDE := $(LITEOS_HILOG_INCLUDE) LITEOS_SECURITY_INCLUDE := $(LITEOS_SECURITY_CAP_INC) $(LITEOS_SECURITY_VID_INC) -- GitLab