概述
輸入設(shè)備是用戶與計(jì)算機(jī)系統(tǒng)進(jìn)行人機(jī)交互的主要裝置之一,是用戶與計(jì)算機(jī)或者其他設(shè)備通信的橋梁。常見(jiàn)的輸入設(shè)備有鍵盤、鼠標(biāo)、游戲桿、觸摸屏等。本文檔將介紹如何使用 Hi3516DV300 開(kāi)發(fā)板完成基于 HDF_Input 模型的觸摸屏(Touch Screen)器件驅(qū)動(dòng)開(kāi)發(fā),從而使開(kāi)發(fā)者快速入門。
硬件資源簡(jiǎn)介
Touch 設(shè)備與主機(jī)通訊一般采用 I2C 總線完成數(shù)據(jù)的交互,為了提高觸屏數(shù)據(jù)的實(shí)時(shí)性,觸屏 IC 都會(huì)提供中斷支持。當(dāng)有觸屏事件發(fā)生時(shí),會(huì)觸發(fā)主機(jī)中斷管腳完成一次中斷響應(yīng)。中斷處理函數(shù)中主機(jī)通過(guò) I2C 總線讀取觸屏 IC 寄存器完成一次數(shù)據(jù)采集。
Hi3516DV300 開(kāi)發(fā)板套件所提供的觸摸屏器件 IC 為 GT911,該器件采用標(biāo)準(zhǔn) I2C 與主機(jī)通信,通過(guò) 6pin 軟排線與主板連接。6pin 分布以及實(shí)物連接圖如下圖所示:
Input模型簡(jiǎn)介
Input 驅(qū)動(dòng)模型核心部分由設(shè)備管理層、公共驅(qū)動(dòng)層、器件驅(qū)動(dòng)層組成。器件產(chǎn)生的數(shù)據(jù)借助平臺(tái)數(shù)據(jù)通道能力從內(nèi)核傳遞到用戶態(tài),驅(qū)動(dòng)模型通過(guò)配置文件適配不同器件及硬件平臺(tái),提高開(kāi)發(fā)者的器件驅(qū)動(dòng)開(kāi)發(fā)效率。如下部分為模型各部分的說(shuō)明:
(1)input 設(shè)備管理:為各類輸入設(shè)備驅(qū)動(dòng)提供 input 設(shè)備的注冊(cè)、注銷接口,同時(shí)統(tǒng)一管理 input 設(shè)備列表;
(2)input 平臺(tái)驅(qū)動(dòng):指各類 input 設(shè)備的公共抽象驅(qū)動(dòng)(例如觸摸屏的公共驅(qū)動(dòng)),負(fù)責(zé)對(duì)板級(jí)硬件進(jìn)行初始化、硬件中斷處理、向 manager 注冊(cè) input 設(shè)備等;
(3)input 器件驅(qū)動(dòng):指各器件廠家的差異化驅(qū)動(dòng),通過(guò)適配平臺(tái)驅(qū)動(dòng)預(yù)留的差異化接口,實(shí)現(xiàn)器件驅(qū)動(dòng)開(kāi)發(fā)量最小化;
(4)input 數(shù)據(jù)通道:提供一套通用的數(shù)據(jù)上報(bào)通道,各類別的 input 設(shè)備驅(qū)動(dòng)均可用此通道上報(bào) input 事件;
(5)input 配置解析:負(fù)責(zé)對(duì) input 設(shè)備的板級(jí)配置及器件私有配置進(jìn)行解析及管理。
Input模型工作流程解析
為了讓開(kāi)發(fā)者更清晰的了解 Input 模型工作流程,本節(jié)將對(duì) input 模型加載的關(guān)鍵流程代碼進(jìn)行說(shuō)明。
本章節(jié)為 Input 模型工作流程說(shuō)明,開(kāi)發(fā)者無(wú)需進(jìn)行開(kāi)發(fā)。
私有配置信息解析示例代碼路徑:
。/drivers/framework/model/input/driver/input_config_parser.c
根據(jù) OSAL 提供的配置解析函數(shù),可以將 hcs 文件中各字段含義進(jìn)行解析,具體請(qǐng)參考 input_config_parser.c 中各函數(shù)的實(shí)現(xiàn)。如果提供的模板不能滿足需求,在 hcs 文件中添加相應(yīng)信息后,需要根據(jù)添加的字段開(kāi)發(fā)相應(yīng)的解析函數(shù)。
static int32_t ParseAttr(struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode, BoardAttrCfg *attr){int32_t ret;// 獲取inputType字段信息,保存在BoardAttrCfg結(jié)構(gòu)體中 ret = parser->GetUint8(attrNode, “inputType”, &attr->devType, 0); CHECK_PARSER_RET(ret, “GetUint8”); ...return HDF_SUCCESS;}
管理驅(qū)動(dòng)層初始化及注冊(cè)驅(qū)動(dòng)至HDF框架示例代碼路徑:
。/drivers/framework/model/input/driver/hdf_input_device_manager.cstatic int32_t HdfInputManagerInit(struct HdfDeviceObject *device){ /* 分配內(nèi)存給manager,manager中將存放所有input設(shè)備 */ g_inputManager = InputManagerInstance();
...}struct HdfDriverEntry g_hdfInputEntry = { .moduleVersion = 1, .moduleName = “HDF_INPUT_MANAGER”, .Bind = HdfInputManagerBind, .Init = HdfInputManagerInit, .Release = HdfInputManagerRelease,};HDF_INIT(g_hdfInputEntry); //驅(qū)動(dòng)注冊(cè)入口
公共驅(qū)動(dòng)層初始化及注冊(cè)驅(qū)動(dòng)至HDF框架示例代碼路徑:
。/drivers/framework/model/input/driver/hdf_touch.cstatic int32_t HdfTouchDriverProbe(struct HdfDeviceObject *device)
{ .../* 板級(jí)信息結(jié)構(gòu)體內(nèi)存申請(qǐng)及hcs配置信息解析 */ boardCfg = BoardConfigInstance(device); .../* 公共驅(qū)動(dòng)結(jié)構(gòu)體內(nèi)存申請(qǐng) */ touchDriver = TouchDriverInstance(); .../* 依據(jù)解析出的板級(jí)信息進(jìn)行公共資源初始化,如IIC初始化 */ ret = TouchDriverInit(touchDriver, boardCfg); if (ret == HDF_SUCCESS)
{ .../* 添加驅(qū)動(dòng)至公共驅(qū)動(dòng)層驅(qū)動(dòng)管理鏈表,當(dāng)設(shè)備與驅(qū)動(dòng)進(jìn)行綁定時(shí)使用該鏈表進(jìn)行查詢 */ AddTouchDriver(touchDriver); ...} ...}struct HdfDriverEntry g_hdfTouchEntry = { .moduleVersion = 1, .moduleName = “HDF_TOUCH”, .Bind = HdfTouchDriverBind, .Init = HdfTouchDriverProbe, .Release = HdfTouchDriverRelease,}; HDF_INIT(g_hdfTouchEntry); //驅(qū)動(dòng)注冊(cè)入口
器件驅(qū)動(dòng)層初始化及注冊(cè)驅(qū)動(dòng)至HDF框架具體請(qǐng)參考適配器件私有驅(qū)動(dòng)器件層驅(qū)動(dòng)初始化及注冊(cè)驅(qū)動(dòng)至 HDF 框架部分。
具體調(diào)用邏輯串聯(lián)函數(shù)Input 模型管理層驅(qū)動(dòng) init 函數(shù)初始化了設(shè)備管理鏈表,公共驅(qū)動(dòng)層初始化函數(shù)完成了相關(guān)結(jié)構(gòu)體的內(nèi)存申請(qǐng)。器件驅(qū)動(dòng)相關(guān)信息通過(guò) RegisterChipDevice 函數(shù)對(duì)公共驅(qū)動(dòng)層相關(guān)結(jié)構(gòu)體進(jìn)行信息填充,同時(shí)完成了相關(guān)硬件信息的初始化(如中斷注冊(cè)等),綁定設(shè)備與驅(qū)動(dòng)組成 inputDev 通過(guò) RegisterInputDevice 函數(shù)向驅(qū)動(dòng)管理層進(jìn)行注冊(cè),在 RegisterInputDevice 函數(shù)中主要實(shí)現(xiàn)了將 inputDev 向設(shè)備管理鏈表的添加等功能。如下所示為兩個(gè)函數(shù)的實(shí)現(xiàn)部分:
函數(shù)具體實(shí)現(xiàn)代碼位置
。/drivers/framework/model/input/driver/hdf_touch.cint32_t RegisterChipDevice(ChipDevice *chipDev){…/* 綁定設(shè)備與驅(qū)動(dòng),從而通過(guò)InputDeviceInstance函數(shù)創(chuàng)建inputDev */ DeviceBindDriver(chipDev);…/* 主要包含器件中斷注冊(cè)及中斷處理函數(shù),處理函數(shù)中有數(shù)據(jù)上報(bào)用戶態(tài)的數(shù)據(jù)通道 */ChipDriverInit(chipDev);
… /* 申請(qǐng)內(nèi)存實(shí)例化InputDev */inputDev = InputDeviceInstance(chipDev); … /* 將InputDev設(shè)備注冊(cè)至input驅(qū)動(dòng)管理層 */RegisterInputDevice(inputDev);…}
函數(shù)具體實(shí)現(xiàn)代碼位置
。/drivers/framework/model/input/driver/hdf_input_device_manager.cint32_t RegisterInputDevice(InputDevice *inputDev){… /* 申請(qǐng)ID,該ID對(duì)于不同input設(shè)備唯一 */ ret = AllocDeviceID(inputDev);…/* 該函數(shù)包含了對(duì)hid類設(shè)備的特殊處理,對(duì)于觸摸屏驅(qū)動(dòng),該函數(shù)無(wú)實(shí)質(zhì)操作; */ CreateDeviceNode(inputDev); /* 內(nèi)核態(tài)數(shù)據(jù)傳送至用戶態(tài)需使用IOService能力,需要申請(qǐng)buffer */ AllocPackageBuffer(inputDev); /* 將input設(shè)備添加進(jìn)設(shè)備全局管理鏈表 */ AddInputDevice(inputDev); ···}
TouchScreen器件驅(qū)動(dòng)開(kāi)發(fā)
基于 Input 模型適配一款觸摸屏 IC 需要完成的具體工作見(jiàn)下。
配置設(shè)備描述信息
驅(qū)動(dòng)注冊(cè)到 HDF 框架所需要的設(shè)備驅(qū)動(dòng)描述信息,如驅(qū)動(dòng)是否加載以及加載次序等。
配置文件路徑:
。/drivers/adapter/khdf/linux/hcs/device_info/device_info.hcs
device_info.hcs 中的信息主要提供給 HDF 框架使用,包含了 Input 模型各層驅(qū)動(dòng)注冊(cè)到 HDF 框架所必需的信息,開(kāi)發(fā)者無(wú)特殊場(chǎng)景需求無(wú)需改動(dòng)。各驅(qū)動(dòng)層私有配置信息通過(guò)“deviceMatchAttr”字段與 input_config.hcs 中的“match_attr”相關(guān)內(nèi)容進(jìn)行匹配。
配置文件中與 input 模塊相關(guān)的內(nèi)容如下所示
input :: host {hostName = “input_host”;priority = 100;device_input_manager :: device { // Input管理層設(shè)備描述信息device0 :: deviceNode {policy = 2; // 向內(nèi)核用戶態(tài)均發(fā)布服務(wù)
priority = 100; // input管理層驅(qū)動(dòng)優(yōu)先級(jí)默認(rèn)為100preload = 0; // 加載該驅(qū)動(dòng)permission = 0660; // 驅(qū)動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)權(quán)限moduleName = “HDF_INPUT_MANAGER”; // 與驅(qū)動(dòng)入口moduleName匹配serviceName = “hdf_input_host”; // HDF框架生成的節(jié)點(diǎn)名deviceMatchAttr = “”; // manager目前不需要私有配置,因此為空
}}device_hdf_touch :: device { // Input公共驅(qū)動(dòng)層設(shè)備描述信息device0 :: deviceNode { policy = 2; // 向內(nèi)核用戶態(tài)均發(fā)布服務(wù) priority = 120; // input公共驅(qū)動(dòng)優(yōu)先級(jí)默認(rèn)為120 preload = 0; // 加載該驅(qū)動(dòng) permission = 0660; // 驅(qū)動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)權(quán)限
moduleName = “HDF_TOUCH”; // 與驅(qū)動(dòng)入口的moduleName匹配 serviceName = “hdf_input_event1”; // HDF框架生成的節(jié)點(diǎn)名 deviceMatchAttr = “touch_device1”; // 與 “match_attr”字段一致 }}device_touch_chip :: device { // Input器件驅(qū)動(dòng)層信息
device0 :: deviceNode { policy = 0; // 向內(nèi)核用戶態(tài)均不發(fā)布服務(wù) priority = 130; // input器件驅(qū)動(dòng)優(yōu)先級(jí)默認(rèn)為130 preload = 0; // 加載該驅(qū)動(dòng) permission = 0660; // 驅(qū)動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)權(quán)限 moduleName = “HDF_TOUCH_GT911”; // 與moduleName匹配 serviceName = “hdf_touch_gt911_service”; // HDF框架節(jié)點(diǎn)名 deviceMatchAttr = “zsj_gt911_5p5”; // 與“match_attr”字段一致 }}}
該配置文件中需要重點(diǎn)關(guān)注的字段有:
“priority”決定驅(qū)動(dòng)加載順序;
“preload”決定驅(qū)動(dòng)是否加載;
“moduleName ”需要與驅(qū)動(dòng)注冊(cè)入口處的“moduleName ”字段保持一致;
“serviceName ”HDF 框架依據(jù)該字段創(chuàng)建節(jié)點(diǎn)名;
“deviceMatchAttr ”需要與私有配置信息中的“match_attr”字段保持一致。
通過(guò)配置設(shè)備描述信息,使得 HDF 框架通過(guò) moduleName 與注冊(cè)至驅(qū)動(dòng)入口的代碼相匹配,保證了驅(qū)動(dòng)的正常加載,通過(guò) priority 字段保證了各驅(qū)動(dòng)的加載順序。
配置Touchscreen器件信息
器件私有信息包括上下電時(shí)序等,平臺(tái)硬件信息包括器件連接主板的 GPIO 端口信息等。
配置文件路徑:
。/drivers/adapter/khdf/linux/hcs/input/input_config.hcs
input_config.hcs 中的信息由驅(qū)動(dòng)代碼進(jìn)行讀取解析,主要由公共驅(qū)動(dòng)層的私有配置信息及器件驅(qū)動(dòng)層的私有配置信息組成。文件中的配置包含板級(jí)硬件信息及器件私有配置信息,實(shí)際業(yè)務(wù)開(kāi)發(fā)時(shí),可根據(jù)具體需求增刪及修改對(duì)應(yīng)內(nèi)容。
pinConfig { rstGpio = 3; // 復(fù)位管腳連接主機(jī)芯片的3號(hào)管腳
intGpio = 4; // 中斷管腳連接主機(jī)芯片的4號(hào)管腳 rstRegCfg = [0x112f0094, 0x400]; // 復(fù)位管腳配置信息
intRegCfg = [0x112f0098, 0x400]; // 中斷管腳配置信息 } powerConfig { /* 0:unused 1:ldo 2:gpio 3:pmic */ vccType = 2; // GPIO供電 vccNum = 20; // gpio20 vccValue = 1800; // 電壓幅值為1800mV vciType = 1; // LDO供電 vciNum = 12; // ldo12 vciValue = 3300; // 電壓幅值為3300mV }featureConfig { capacitanceTest = 0; // 容值測(cè)試 gestureMode = 0; // 手勢(shì)模式 gloverMode = 0; // 手套模式
coverMode = 0; // 皮套模式
chargerMode = 0; // 充電模式 knuckleMode = 0; // 指關(guān)節(jié)模式 } } chipConfig { // 器件私有信息配置
template touchChip { // 模板 match_attr = “”; chipName = “gt911”; // 觸摸屏IC型號(hào) vendorName = “zsj”; // 供應(yīng)商 chipInfo = “AAAA11222”; /*1~4字符代表產(chǎn)品名,5~6字符代表IC型號(hào),7~9字符代表模型型號(hào)*/ busType = 0; // 0代表I2C,1代表SPI deviceAddr = 0x5D; // 器件IC通信地址/* 1代表上升沿觸發(fā),2代表下降沿觸發(fā),4代表高電平觸發(fā),8代表低電平觸發(fā)*/ irqFlag = 2; maxSpeed = 400; // 最大通信速率為400Hz chipVersion = 0; // 觸摸屏IC版本號(hào)
powerSequence {/* 上電時(shí)序的配置含義說(shuō)明: [類型, 狀態(tài), 方向 , 延時(shí)] 0代表空,1代表vcc電源1.8V,2代表VCI電源3.3V,3代表復(fù)位管腳,4代表中斷管腳 0代表下電或拉低,1代表上電或拉高,2代表無(wú)操作
代表延時(shí)多少毫秒, 例如20代表延時(shí)20ms */powerOnSeq = [4, 0, 1, 0, // 中斷管腳配置為輸出,且進(jìn)行拉低 3, 0, 1, 10, // 復(fù)位管腳配置為輸出,且進(jìn)行拉低,延時(shí)10ms 3, 1, 2, 60, // 復(fù)位管腳無(wú)操作,且進(jìn)行拉高,延時(shí)60ms 4, 2, 0, 0];
// 中斷管腳配置為輸入suspendSeq = [3, 0, 2, 10]; // 復(fù)位管腳無(wú)操作,且進(jìn)行拉低,延時(shí)10msresumeSeq = [3, 1, 2, 10]; // 復(fù)位管腳無(wú)操作,且進(jìn)行拉高,延時(shí)10mspowerOffSeq = [3, 0, 2, 10, // 復(fù)位管腳無(wú)操作,且進(jìn)行拉低,延時(shí)10ms 1, 0, 2, 20];
// 電源正極管腳無(wú)操作,且進(jìn)行拉低,延時(shí)20ms}}chip0 :: touchChip {/* 與設(shè)備描述配置信息中器件私有配置信息的“match_attr”字段保持一致 */ match_attr = “zsj_gt911_5p5”; /* 產(chǎn)品名+模組編號(hào)+芯片編號(hào)的組合信息 用于給用戶態(tài)區(qū)分當(dāng)前器件 */ chipInfo = “ZIDN45100”; /* IC型號(hào)的版本 */ chipVersion = 0; } } } }}}
示例中“touchConfig”包含了“touch0”,“touch0”包含了“boardConfig”與“chipConfig”;“boardConfig”字段包含了 Hi3516DV300 板級(jí)硬件信息,“chipConfig”包含了觸摸屏器件的私有信息,如果需要替換觸摸屏器件,重新配置“chipConfig”對(duì)應(yīng)的字段信息即可。同時(shí)產(chǎn)品可以配置多款觸摸屏,示例中用“touch0”代表了套件中默認(rèn)的觸摸屏的硬件接口以及器件的配置信息,如產(chǎn)品需要配置副屏,可在與“touch0”并列的位置配置“touch1”的信息。
適配器件私有驅(qū)動(dòng)
Input 模型對(duì) Input 設(shè)備開(kāi)發(fā)流程進(jìn)行了抽象,開(kāi)發(fā)者只需要適配器件驅(qū)動(dòng)層,無(wú)需改動(dòng)管理驅(qū)動(dòng)層以及公共驅(qū)動(dòng)層。
Input 模型由三層驅(qū)動(dòng)組成,開(kāi)發(fā)者適配一款全新觸摸屏驅(qū)動(dòng)只需要適配器件驅(qū)動(dòng)層即可,重點(diǎn)實(shí)現(xiàn)差異化接口,本小節(jié)以代碼示例的形式展示開(kāi)發(fā)者需要重點(diǎn)完成的工作。
觸摸屏器件差異化接口適配
示例代碼路徑
。/drivers/framework/model/input/driver/touchscreen/touch_gt911.cstatic struct TouchChipOps g_gt911ChipOps =
{ // 器件IC接口.Init = ChipInit, // 初始化.Detect = ChipDetect, // 器件檢測(cè).Resume = ChipResume, // 喚醒.Suspend = ChipSuspend, // 休眠.DataHandle = ChipDataHandle, // 器件數(shù)據(jù)讀取.UpdateFirmware = UpdateFirmware, // 固件升級(jí)};
/* 不同觸摸屏廠家使用的IC不一樣,對(duì)應(yīng)的寄存器操作也不一樣,因此器件驅(qū)動(dòng)層代碼重點(diǎn)適配差異化接口部分,如下示例代碼展示了GT911的數(shù)據(jù)解析*/
static int32_t ChipDataHandle(ChipDevice *device){.../* GT911獲取坐標(biāo)之前需先讀取狀態(tài)寄存器 */reg[0] = (GT_BUF_STATE_ADDR >> ONE_BYTE_OFFSET) & ONE_BYTE_MASK; reg[1] = GT_BUF_STATE_ADDR & ONE_BYTE_MASK;ret = InputI2cRead(i2cClient, reg, GT_ADDR_LEN, &touchStatus, 1);
if (ret < 0 || touchStatus == GT_EVENT_INVALID) {return HDF_FAILURE;}.../* 根據(jù)狀態(tài)寄存器的值讀取數(shù)據(jù)寄存器數(shù)據(jù) */
reg[0] = (GT_X_LOW_BYTE_BASE >> ONE_BYTE_OFFSET) & ONE_BYTE_MASK;reg[1] = GT_X_LOW_BYTE_BASE & ONE_BYTE_MASK;pointNum = touchStatus & GT_FINGER_NUM_MASK;if (pointNum == 0 || pointNum > MAX_SUPPORT_POINT) {HDF_LOGE(“%s: pointNum is invalid, %u”, __func__, pointNum); (void)ChipCleanBuffer(i2cClient);OsalMutexUnlock(&device->driver->mutex);return HDF_FAILURE;}frame->realPointNum = pointNum;frame->definedEvent = TOUCH_DOWN;(void)InputI2cRead(i2cClient, reg, GT_ADDR_LEN, buf, GT_POINT_SIZE * pointNum);/* 對(duì)獲取的數(shù)據(jù)進(jìn)行解析 */ParsePointData(device, frame, buf, pointNum);...}
static void ParsePointData(ChipDevice *device, FrameData *frame, uint8_t *buf, uint8_t pointNum){
.../* 每個(gè)坐標(biāo)值由兩個(gè)字節(jié)組成,對(duì)獲取的單字節(jié)數(shù)據(jù)進(jìn)行拼接得到最終的坐標(biāo)值 */for (i = 0; i
< pointNum; i++) {frame->fingers[i].trackId = buf[GT_POINT_SIZE * i + GT_TRACK_ID];frame->
fingers[i].y = (buf[GT_POINT_SIZE * i + GT_X_LOW] & ONE_BYTE_MASK) | ((buf
[GT_POINT_SIZE * i + GT_X_HIGH] & ONE_BYTE_MASK) << ONE_BYTE_OFFSET); frame->fingers[i].x = (buf[GT_POINT_SIZE * i + GT_Y_LOW] & ONE_BYTE_MASK) | ((buf[GT_POINT_SIZE * i + GT_Y_HIGH] & ONE_BYTE_MASK) << ONE_BYTE_OFFSET);/* 對(duì)解析出來(lái)的坐標(biāo)值進(jìn)行打印 */
HDF_LOGD(“%s: x = %d, y = %d”, __func__, frame->fingers[i].x,frame->fingers[i].y);}}
器件層驅(qū)動(dòng)初始化及注冊(cè)驅(qū)動(dòng)至HDF框架
示例代碼路徑
。/drivers/framework/model/input/driver/touchscreen/touch_gt911.cstatic int32_t HdfGoodixChipInit(struct HdfDeviceObject *device){
.../* 器件配置結(jié)構(gòu)體內(nèi)存申請(qǐng)、配置信息解析及掛載 */ chipCfg = ChipConfigInstance(device);
.../* 器件實(shí)例化 */ chipDev = ChipDeviceInstance();
.../* 器件信息掛載及器件私有操作掛載 */ chipDev->chipCfg = chipCfg; chipDev->ops = &g_gt911ChipOps;
.../* 注冊(cè)器件驅(qū)動(dòng)至平臺(tái)驅(qū)動(dòng) */ RegisterChipDevice(chipDev);
...}
struct HdfDriverEntry g_touchGoodixChipEntry = {.moduleVersion = 1,/* 該moduleName與device_info.hcs文件中器件驅(qū)動(dòng)層的moduleName信息相匹配*/.moduleName = “HDF_TOUCH_GT911”,
.Init = HdfGoodixChipInit, // 器件驅(qū)動(dòng)初始化函數(shù)};HDF_INIT(g_touchGoodixChipEntry); // 注冊(cè)器件驅(qū)動(dòng)至HDF框架
器件私有驅(qū)動(dòng)層主要實(shí)現(xiàn)了各器件廠商差異較大的部分,如器件休眠喚醒、數(shù)據(jù)解析以及固件升級(jí)等。
編譯入口添加
編輯 Makefile 文件,添加本示例中的內(nèi)容:
文件路徑:
。/drivers/adapter/khdf/linux/model/input/Makefile
添加內(nèi)容如下:
obj-$(CONFIG_DRIVERS_HDF_TP_5P5_GT911) += $(INPUT_ROOT_DIR)/touchscreen/touch_gt911.o
其中 touch_gt911.o 為本示例中追加的內(nèi)容
至此,基于 HDF 框架及 Input 模型的觸摸屏驅(qū)動(dòng)適配完成。
總結(jié)
本文梳理了 HDF_Input 模型工作流程,重點(diǎn)介紹了器件驅(qū)動(dòng)適配,以 Hi3516dv300 開(kāi)發(fā)板觸屏為例進(jìn)行了詳細(xì)的代碼說(shuō)明,希望通過(guò)本文檔您能初步掌握基于 HDF 框架的 Input 設(shè)備的開(kāi)發(fā)步驟與流程。
責(zé)任編輯:haq
-
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1916瀏覽量
86897 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7659瀏覽量
90742 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2126瀏覽量
32966 -
OpenHarmony
+關(guān)注
關(guān)注
29文章
3851瀏覽量
18570
原文標(biāo)題:OpenHarmony HDF Input驅(qū)動(dòng)模型分析與使用
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
迅為RK3568開(kāi)發(fā)板實(shí)操-HDF驅(qū)動(dòng)配置UART-修改HCS配置
【北京迅為】iTOP-RK3568開(kāi)發(fā)板鴻蒙OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)實(shí)操-HDF驅(qū)動(dòng)配置UART

迅為RK3568開(kāi)發(fā)板篇Openharmony配置HDF控制UART-實(shí)操-HDF驅(qū)動(dòng)配置UART-UART應(yīng)用開(kāi)發(fā)-UART驅(qū)動(dòng)API接口介紹
北京迅為iTOP-RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)實(shí)操-HDF驅(qū)動(dòng)配置LED

北京迅為RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)

迅為RK3568開(kāi)發(fā)板篇Openharmony配置HDF控制UART-實(shí)操-HDF驅(qū)動(dòng)配置UART-UART應(yīng)用開(kāi)發(fā)-UART驅(qū)動(dòng)API接口介紹
轉(zhuǎn)換Keras H5模型,為什么無(wú)法確定--input_shape參數(shù)的值?
迅為RK3568開(kāi)發(fā)板篇Openharmony配置HDF控制UART-實(shí)操-HDF驅(qū)動(dòng)配置UART-修改HCS配置
迅為RK3568開(kāi)發(fā)板篇OpenHarmony實(shí)操HDF驅(qū)動(dòng)控制LED-編寫應(yīng)用APP
迅為RK3568開(kāi)發(fā)板篇OpenHarmony實(shí)操HDF驅(qū)動(dòng)控制LED-添加內(nèi)核編譯
迅為RK3568開(kāi)發(fā)板篇OpenHarmony實(shí)操HDF驅(qū)動(dòng)控制LED-編寫內(nèi)核 LED HDF 驅(qū)動(dòng)程序
迅為RK3568開(kāi)發(fā)板篇OpenHarmony配置HDF驅(qū)動(dòng)控制LED-新增 topeet子系統(tǒng)
迅為RK3568開(kāi)發(fā)板篇OpenHarmony配置HDF驅(qū)動(dòng)控制LED-配置創(chuàng)建私有配置文件
迅為RK3568開(kāi)發(fā)板篇OpenHarmony配置HDF驅(qū)動(dòng)控制LED-修改HCS硬件配置
OpenHarmony程序分析框架論文入選ICSE 2025

評(píng)論