quickstart.c 4.0 KB
Newer Older
M
mamingshuai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/*
 * 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.
 */

32
#include "los_dev_quickstart.h"
M
mamingshuai 已提交
33 34
#include "fcntl.h"
#include "linux/kernel.h"
35
#include "los_process_pri.h"
M
mamingshuai 已提交
36 37


38 39 40
EVENT_CB_S g_qsEvent;
static SysteminitHook g_systemInitFunc[QS_STAGE_CNT] = {0};
static char g_callOnce[QS_STAGE_CNT] = {0};
M
mamingshuai 已提交
41 42 43 44 45 46 47 48 49 50 51

static int QuickstartOpen(struct file *filep)
{
    return 0;
}

static int QuickstartClose(struct file *filep)
{
    return 0;
}

52
static void QuickstartNotify(unsigned int events)
M
mamingshuai 已提交
53
{
54 55 56 57 58 59 60 61
    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);
}

B
boxi 已提交
62
void QuickstartHookRegister(LosSysteminitHook hooks)
63 64 65
{
    for (int i = 0; i < QS_STAGE_CNT; i++) {
        g_systemInitFunc[i] = hooks.func[i];
M
mamingshuai 已提交
66
    }
67
}
M
mamingshuai 已提交
68

B
boxi 已提交
69
static void QuickstartStageWorking(unsigned int level)
70 71 72 73 74 75
{
    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");
M
mamingshuai 已提交
76 77 78 79 80 81 82 83 84 85
    }
}

static int QuickstartDevUnregister(void)
{
    return unregister_driver(QUICKSTART_NODE);
}

static ssize_t QuickstartIoctl(struct file *filep, int cmd, unsigned long arg)
{
86 87 88 89 90 91 92 93 94
    if (cmd == QUICKSTART_NOTIFY) {
        QuickstartNotify(arg);
        return 0;
    }

    if (OsGetUserInitProcessID() != LOS_GetCurrProcessID()) {
        PRINT_ERR("Permission denios!\n");
        return -1;
    }
M
mamingshuai 已提交
95 96 97 98
    switch (cmd) {
        case QUICKSTART_UNREGISTER:
            QuickstartDevUnregister();
            break;
99 100 101
        case QUICKSTART_LISTEN:
            QuickstartListen(arg);
            break;
M
mamingshuai 已提交
102
        default:
B
boxi 已提交
103
            QuickstartStageWorking(cmd - QUICKSTART_STAGE(QS_STAGE1));  /* ioctl cmd converted to stage level */
M
mamingshuai 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
            break;
    }
    return 0;
}

static const struct file_operations_vfs g_quickstartDevOps = {
    QuickstartOpen,  /* open */
    QuickstartClose, /* close */
    NULL,  /* read */
    NULL, /* write */
    NULL,      /* seek */
    QuickstartIoctl,      /* ioctl */
    NULL,   /* mmap */
#ifndef CONFIG_DISABLE_POLL
    NULL,      /* poll */
#endif
    NULL,      /* unlink */
};

B
boxi 已提交
123
int QuickstartDevRegister(void)
M
mamingshuai 已提交
124
{
125
    LOS_EventInit(&g_qsEvent);
M
mamingshuai 已提交
126 127 128
    return register_driver(QUICKSTART_NODE, &g_quickstartDevOps, 0666, 0); /* 0666: file mode */
}