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
This commit is contained in:
parent
7e698f4b22
commit
46b63f7153
1
Kconfig
1
Kconfig
|
@ -303,6 +303,7 @@ source "../../kernel/liteos_a/bsd/dev/usb/Kconfig"
|
||||||
source "../../drivers/adapter/khdf/liteos/Kconfig"
|
source "../../drivers/adapter/khdf/liteos/Kconfig"
|
||||||
|
|
||||||
source "drivers/char/mem/Kconfig"
|
source "drivers/char/mem/Kconfig"
|
||||||
|
source "drivers/char/quickstart/Kconfig"
|
||||||
source "drivers/char/random/Kconfig"
|
source "drivers/char/random/Kconfig"
|
||||||
source "../../drivers/liteos/tzdriver/Kconfig"
|
source "../../drivers/liteos/tzdriver/Kconfig"
|
||||||
source "drivers/char/video/Kconfig"
|
source "drivers/char/video/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.
|
|
@ -33,6 +33,7 @@
|
||||||
#define __LOS_QUICK_START_H__
|
#define __LOS_QUICK_START_H__
|
||||||
|
|
||||||
#include "los_typedef.h"
|
#include "los_typedef.h"
|
||||||
|
#include "sys/ioctl.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
|
@ -40,7 +41,41 @@ extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
#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
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
|
@ -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__ */
|
|
|
@ -29,16 +29,15 @@
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "los_quick_start_pri.h"
|
#include "los_dev_quickstart.h"
|
||||||
#include "bits/ioctl.h"
|
|
||||||
#include "fcntl.h"
|
#include "fcntl.h"
|
||||||
#include "linux/kernel.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)
|
static int QuickstartOpen(struct file *filep)
|
||||||
{
|
{
|
||||||
|
@ -50,18 +49,30 @@ static int QuickstartClose(struct file *filep)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SystemInitStep2(void)
|
static void QuickstartNotify(unsigned int events)
|
||||||
{
|
{
|
||||||
static int once = 0;
|
LOS_EventWrite((PEVENT_CB_S)&g_qsEvent, events);
|
||||||
/* Only one call is allowed */
|
}
|
||||||
if (once != 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
once = 1;
|
|
||||||
|
|
||||||
unsigned int ret = OsSystemInitStep2();
|
static void QuickstartListen(unsigned int eventMask)
|
||||||
if (ret != LOS_OK) {
|
{
|
||||||
PRINT_ERR("systemInitStep2 failed\n");
|
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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
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) {
|
switch (cmd) {
|
||||||
case QUICKSTART_INITSTEP2:
|
|
||||||
SystemInitStep2();
|
|
||||||
break;
|
|
||||||
case QUICKSTART_UNREGISTER:
|
case QUICKSTART_UNREGISTER:
|
||||||
QuickstartDevUnregister();
|
QuickstartDevUnregister();
|
||||||
break;
|
break;
|
||||||
|
case QUICKSTART_LISTEN:
|
||||||
|
QuickstartListen(arg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
QuickStartStageWorking(cmd - QUICKSTART_STAGE(1)); /* ioctl cmd converted to stage level */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -100,8 +123,9 @@ static const struct file_operations_vfs g_quickstartDevOps = {
|
||||||
NULL, /* unlink */
|
NULL, /* unlink */
|
||||||
};
|
};
|
||||||
|
|
||||||
int DevQuickStartRegister(void)
|
int QuickStartDevRegister(void)
|
||||||
{
|
{
|
||||||
|
LOS_EventInit(&g_qsEvent);
|
||||||
return register_driver(QUICKSTART_NODE, &g_quickstartDevOps, 0666, 0); /* 0666: file mode */
|
return register_driver(QUICKSTART_NODE, &g_quickstartDevOps, 0666, 0); /* 0666: file mode */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,10 +117,6 @@
|
||||||
#include "los_hilog.h"
|
#include "los_hilog.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LOSCFG_QUICK_START
|
|
||||||
#include "los_quick_start_pri.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
STATIC SystemRebootFunc g_rebootHook = NULL;
|
STATIC SystemRebootFunc g_rebootHook = NULL;
|
||||||
|
|
||||||
|
@ -388,13 +384,6 @@ STATIC UINT32 OsSystemInitTaskCreate(VOID)
|
||||||
return LOS_TaskCreate(&taskID, &sysTask);
|
return LOS_TaskCreate(&taskID, &sysTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LOSCFG_QUICK_START
|
|
||||||
UINT32 OsSystemInitStep2(VOID)
|
|
||||||
{
|
|
||||||
SystemInit2();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
UINT32 OsSystemInit(VOID)
|
UINT32 OsSystemInit(VOID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -398,10 +398,10 @@ ifeq ($(LOSCFG_DRIVERS_MEM), y)
|
||||||
LITEOS_DEV_MEM_INCLUDE = -I $(LITEOSTOPDIR)/drivers/char/mem/include
|
LITEOS_DEV_MEM_INCLUDE = -I $(LITEOSTOPDIR)/drivers/char/mem/include
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(LOSCFG_QUICK_START), y)
|
ifeq ($(LOSCFG_DRIVERS_QUICKSTART), y)
|
||||||
LITEOS_BASELIB += -lquickstart
|
LITEOS_BASELIB += -lquickstart
|
||||||
LIB_SUBDIRS += $(LITEOSTOPDIR)/drivers/char/quickstart
|
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
|
endif
|
||||||
|
|
||||||
ifeq ($(LOSCFG_DRIVERS_RANDOM), y)
|
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_REGULATOR_INCLUDE) $(LITEOS_VIDEO_INCLUDE) \
|
||||||
$(LITEOS_DRIVERS_HDF_INCLUDE) $(LITEOS_TZDRIVER_INCLUDE) \
|
$(LITEOS_DRIVERS_HDF_INCLUDE) $(LITEOS_TZDRIVER_INCLUDE) \
|
||||||
$(LITEOS_HIEVENT_INCLUDE) $(LITEOS_DEV_MEM_INCLUDE) \
|
$(LITEOS_HIEVENT_INCLUDE) $(LITEOS_DEV_MEM_INCLUDE) \
|
||||||
$(LITEOS_QUICK_START_INCLUDE)
|
$(LITEOS_DEV_QUICKSTART_INCLUDE)
|
||||||
LITEOS_DFX_INCLUDE := $(LITEOS_HILOG_INCLUDE)
|
LITEOS_DFX_INCLUDE := $(LITEOS_HILOG_INCLUDE)
|
||||||
|
|
||||||
LITEOS_SECURITY_INCLUDE := $(LITEOS_SECURITY_CAP_INC) $(LITEOS_SECURITY_VID_INC)
|
LITEOS_SECURITY_INCLUDE := $(LITEOS_SECURITY_CAP_INC) $(LITEOS_SECURITY_VID_INC)
|
||||||
|
|
Loading…
Reference in New Issue