自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析

系統(tǒng) OpenHarmony
開源鴻蒙小型系統(tǒng)的輸入功能仍未完善,比如熱插拔問題和屏幕HDF化的設(shè)計(jì)沒有考慮到無觸控屏的開發(fā)板等的問題。

想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:

51CTO 開源基礎(chǔ)軟件社區(qū)

https://ost.51cto.com

前言

本文將以鼠標(biāo)為例介紹小型系統(tǒng)上的輸入系統(tǒng)架構(gòu)以及輸入信號(hào)傳遞的整個(gè)流程。

一、大致流程

  1. 輸入設(shè)備產(chǎn)生信號(hào),內(nèi)核接收到并處理信號(hào)。
  2. 內(nèi)核將處理后的信號(hào)傳遞給HDF化后的設(shè)備節(jié)點(diǎn)。
  3. HDF對(duì)信號(hào)進(jìn)行事件上報(bào),也就是通過HDF的消息機(jī)制與用戶空間空間進(jìn)行交互。
  4. 最后WMS給用戶程序進(jìn)行事件分發(fā)。

二、內(nèi)核到HDF

1、框架生成部分
由于硬件到內(nèi)核這一步與linux沒有太多的不同,在這里不做過多的介紹。

HDF設(shè)備的注冊(cè)以及后續(xù)的輸入信號(hào)傳遞都是通過給內(nèi)核添加補(bǔ)丁來實(shí)現(xiàn)的。

kernel/linux/patches/linux-4.19/common_patch/hdf.patch。

+	dev->devType = type;
+	dev->devName = hdev->name;
+	hdev->input_dev = HidRegisterHdfInputDev(dev);  //Hid設(shè)備注冊(cè)接口
+	if (hdev->input_dev == NULL) {
+		printk("%s: RegisterInputDevice failed\n", __func__);
+	}
+	kfree(dev);
+	dev = NULL;
+}
+#endif

HidRegisterHdfInputDev()的主要作用是調(diào)用管理器的注冊(cè)接口。

drivers/hdf_core/framework/model/input/driver/hdf_hid_adapter.c

void* HidRegisterHdfInputDev(HidInfo *info)
{
    InputDevice* inputDev = HidConstructInputDev(info);
    if (inputDev == NULL) {
        HDF_LOGE("%s: hid construct input Dev failed", __func__);
        return NULL;
    }

    if (InputDriverLoaded()) {
        DoRegisterInputDev(inputDev); //將調(diào)用管理器的接口RegisterInputDevice()
    } else {
        CacheHid(inputDev);
    }
    return inputDev;
}

管理器的RegisterInputDevice()完成分配id、緩存和生成HDF設(shè)備節(jié)點(diǎn)。

drivers/hdf_core/framework/model/input/driver/hdf_hid_device_managerr.c

int32_t RegisterInputDevice(InputDevice *inputDev)
{
    int32_t ret;

    HDF_LOGI("%s: enter", __func__);
    if (inputDev == NULL) {
        HDF_LOGE("%s: inputdev is null", __func__);
        return HDF_ERR_INVALID_PARAM;
    }

    if ((g_inputManager == NULL) || (g_inputManager->initialized == false)) {
        HDF_LOGE("%s: dev manager is null or initialized failed", __func__);
        return HDF_FAILURE;
    }

    OsalMutexLock(&g_inputManager->mutex);
    ret = AllocDeviceID(inputDev);  //分配設(shè)備ID
    if (ret != HDF_SUCCESS) {
        goto EXIT;
    }
    ret = CreateDeviceNode(inputDev);  //創(chuàng)建設(shè)備節(jié)點(diǎn),也就是上面所述的hdf_input_eventX
    if (ret != HDF_SUCCESS) {
        goto EXIT1;
    }

    ret = AllocPackageBuffer(inputDev);  //分配包的緩存
    if (ret != HDF_SUCCESS) {
        goto EXIT1;
    }

    AddInputDevice(inputDev);
    OsalMutexUnlock(&g_inputManager->mutex);
    HDF_LOGI("%s: exit succ, devCount is %d", __func__, g_inputManager->devCount);
    return HDF_SUCCESS;

EXIT1:
    DeleteDeviceNode(inputDev);
EXIT:
    OsalMutexUnlock(&g_inputManager->mutex);
    return ret;
}

OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)

2、信號(hào)傳遞部分。
上面步驟準(zhǔn)備就緒后,如上提及,鼠標(biāo)的信息傳遞也是通過內(nèi)核調(diào)用了HDF接口向用戶空間傳輸鼠標(biāo)的事件信號(hào)。

補(bǔ)丁調(diào)用適配器接口發(fā)送輸入事件信息。

hdf.patch:

+#if defined(CONFIG_DRIVERS_HDF_INPUT)
+	if (hid->input_dev) {
//內(nèi)核獲取到的輸入設(shè)備產(chǎn)生的信號(hào),將信號(hào)通過事件上報(bào)傳遞到HDF
+		HidReportEvent(hid->input_dev, usage->type, usage->code, value); 
+	}
+#endif

hdf_hid_adapter.c:

void HidReportEvent(const void *inputDev, uint32_t type, uint32_t code, int32_t value)
{
#ifdef CONFIG_DFX_ZEROHUNG
    if (type == EV_KEY && code == KEY_POWER)
        hung_wp_screen_powerkey_ncb(value);
#endif
    InputDevice *device = (InputDevice *)inputDev;
    PushOnePackage(device, type, code, value);  //調(diào)用了event_hub.c中的接口,先打包,再發(fā)送
    if (type == EV_KEY && KEY_RESERVED < code && code < KEY_MAX && value == 0 && code == g_kbdcode) {
        OsalTimerDelete(&g_timer);
        g_kbdcode = 0;
    }
    if (type == EV_KEY && KEY_RESERVED < code && code < KEY_MAX && value == 1 &&
        device->devType == INDEV_TYPE_KEYBOARD) {
        g_kbdcode = code;
        RepateEvent(device);
    }
}

經(jīng)過event_hub處理進(jìn)行下一步的傳遞。

// PushOnePackage()在這里的作用就是將事件流打成包的形式進(jìn)行傳遞
// 代碼過長(zhǎng)不展示,PushOnePackage()處理完成包后就開始進(jìn)入HDF消息機(jī)制了
static void SendFramePackages(InputDevice *inputDev) //該函數(shù)由PushOnePackage調(diào)用
{
    struct HdfDeviceObject *hdfDev = inputDev->hdfDevObj;
    if (hdfDev == NULL || inputDev->pkgBuf == NULL) {
        HDF_LOGE("%s: hdf dev is null", __func__);
        return;
    }
    //  HDF消息機(jī)制的事件上報(bào)接口
    int32_t ret = HdfDeviceSendEvent(hdfDev, 0, inputDev->pkgBuf);
}

OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)

三、HDF到WMS

1、WMS簡(jiǎn)單介紹。
源碼位置由foundation/graphic/wms變更至/foundation/window/window_manager_lite。
WMS全稱是Window Manager Service,顧名思義,該服務(wù)就是用來管理窗口和繪畫光標(biāo)等操作的。該組件里還包含了另一個(gè)必不可少的組件IMS(Input Manager Service),同理,它是用來處理輸入事件的。

由圖可知,IMS也有一個(gè)eventhub,很容易想到這邊的eventhub就是用來接收內(nèi)核態(tài)的evenhub發(fā)來的輸入信號(hào)的。

2、消息機(jī)制簡(jiǎn)單介紹。
HDF消息機(jī)制是建立用戶態(tài)應(yīng)用和內(nèi)核態(tài)驅(qū)動(dòng)的交互。主要功能有兩個(gè),一個(gè)是用戶態(tài)應(yīng)用發(fā)送消息到驅(qū)動(dòng),另一個(gè)是用戶態(tài)應(yīng)用接收驅(qū)動(dòng)主動(dòng)上報(bào)事件。主要接口有如下:

接口

描述

struct HdfIoService *HdfIoServiceBind(const char *serviceName);

用戶態(tài)獲取驅(qū)動(dòng)的服務(wù),獲取該服務(wù)之后通過服務(wù)中的Dispatch方法向驅(qū)動(dòng)發(fā)送消息。

void HdfIoServiceRecycle(struct HdfIoService *service);

釋放驅(qū)動(dòng)服務(wù)。

int HdfDeviceRegisterEventListener(struct HdfIoService *target, struct HdfDevEventlistener *listener);

用戶態(tài)程序注冊(cè)接收驅(qū)動(dòng)上報(bào)事件的操作方法。

int HdfDeviceSendEvent(struct HdfDeviceObject *deviceObject, uint32_t id, struct HdfSBuf *data);

驅(qū)動(dòng)主動(dòng)上報(bào)事件接口。

該消息機(jī)制的實(shí)現(xiàn)方法大概就是對(duì)上面相應(yīng)設(shè)備的事件緩存區(qū)進(jìn)行操作,具體可以查閱代碼。

3、信號(hào)傳遞過程。
如上表所示,內(nèi)核態(tài)的eventhub最終調(diào)用了事件上報(bào)接口,但是事件監(jiān)聽器不是在IMS中的eventhub注冊(cè)的。而是由硬件抽象層drivers/peripheral/input/hal中注冊(cè)的。并且封裝成了API供IMS使用。有input_controller,input_manager和input_reporter,分別管理輸入設(shè)備的的上電、開關(guān)以及事件接收。input_reporter.h里的主要接口如下:

接口

描述

int32_t (*RegisterReportCallback)(uint32_t devIndex, InputEventCb *callback);

注冊(cè)事件上報(bào)的回調(diào)函數(shù)

int32_t (*UnregisterReportCallback)(uint32_t devIndex);

注銷

int32_t (*RegisterHotPlugCallback)(InputHostCb *callback);

注冊(cè)熱插拔事件上報(bào)的回調(diào)函數(shù)

int32_t (*UnregisterHotPlugCallback)(void);

注銷

4、IMS注冊(cè)事件上報(bào)的回調(diào)函數(shù)。(源碼此處有問題,僅做部分展示)。

// input_event_hub.cpp
ret = inputInterface_->iInputManager->OpenInputDevice(mountDevIndex_[i]);  //首先要打開設(shè)備
if (ret == INPUT_SUCCESS && inputInterface_->iInputReporter != nullptr) {
    callback_.EventPkgCallback = EventCallback;  //進(jìn)行callback綁定
    ret = inputInterface_->iInputReporter->RegisterReportCallback(mountDevIndex_[i], &callback_);  //以設(shè)備號(hào)注冊(cè)回調(diào)函數(shù),此處設(shè)備號(hào)對(duì)應(yīng)hdf_input_eventX中的X
    if (ret != INPUT_SUCCESS) {
        GRAPHIC_LOGE("device dose not exist, can't register callback to it!");
        return;
    }
    openDev_ = openDev_ | (1 << i);
}

注冊(cè)完畢后,當(dāng)鼠標(biāo)觸發(fā)了輸入信號(hào),將在回調(diào)函數(shù)中接收到事件。

OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)

至此,輸入信號(hào)從內(nèi)核傳遞到了用戶空間。

四、WMS到用戶程序

用戶程序與WNS硬件之間的交互體現(xiàn)在UI與WMS之間或者UI直接與HAL層的交互。

OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)

在這里源碼不做過多分析,留一張流程圖。

OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)OpenHarmony小型系統(tǒng)輸入子系統(tǒng)解析-開源基礎(chǔ)軟件社區(qū)

高清pdf放在附件里:https://ost.51cto.com/resource/2801。

總結(jié)

開源鴻蒙小型系統(tǒng)的輸入功能仍未完善,比如熱插拔問題和屏幕HDF化的設(shè)計(jì)沒有考慮到無觸控屏的開發(fā)板等的問題。于是在這里,我將我學(xué)到的知識(shí)分享給大家與大家共同討論。

想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:

51CTO 開源基礎(chǔ)軟件社區(qū)

https://ost.51cto.com

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-04-06 09:14:11

多模輸入子系統(tǒng)鴻蒙

2021-09-17 14:38:58

鴻蒙HarmonyOS應(yīng)用

2023-04-12 15:31:11

系統(tǒng)服務(wù)管理鴻蒙

2022-01-06 16:17:58

鴻蒙HarmonyOS應(yīng)用

2022-02-17 20:57:07

OpenHarmon操作系統(tǒng)鴻蒙

2021-09-18 14:40:37

鴻蒙HarmonyOS應(yīng)用

2021-11-08 15:04:47

鴻蒙HarmonyOS應(yīng)用

2021-12-17 16:42:09

鴻蒙HarmonyOS應(yīng)用

2021-09-13 15:15:18

鴻蒙HarmonyOS應(yīng)用

2022-01-10 15:30:11

鴻蒙HarmonyOS應(yīng)用

2022-05-10 11:17:27

電話子系統(tǒng)數(shù)據(jù)服務(wù)模塊

2021-11-18 10:28:03

鴻蒙HarmonyOS應(yīng)用

2022-05-24 15:46:51

Wi-FiSTA模式

2022-01-13 10:11:59

鴻蒙HarmonyOS應(yīng)用

2022-01-20 14:33:29

openharmonwayland協(xié)議鴻蒙

2022-03-18 16:07:04

Graphic子系統(tǒng)鴻蒙

2022-01-20 11:04:31

Linux DRMOpenHarmon鴻蒙

2022-04-11 11:07:37

HarmonyUI小型系統(tǒng)textarea

2021-08-10 11:30:30

Linux代碼中斷控制器

2021-08-03 15:10:26

Linux代碼驅(qū)動(dòng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)