Input输入驱动模型

Input驱动模型核心部分由设备管理层、公共驱动层、器件驱动层组成。器件产生的数据借助平台数据通道能力从内核传递到用户态,驱动模型通过配置文件适配不同器件及硬件平台,提高开发者的器件驱动开发效率。如下部分为模型各部分的说明:

  • Input设备管理:为各类输入设备驱动提供Input设备的注册、注销接口,同时统一管理Input设备列表。

  • Input平台驱动:指各类Input设备的公共抽象驱动(例如触摸屏的公共驱动),负责对板级硬件进行初始化、硬件中断处理、向manager注册Input设备等。

  • Input器件驱动:指各器件厂家的差异化驱动,通过适配平台驱动预留的差异化接口,实现器件驱动开发量最小化。

  • Input数据通道:提供一套通用的数据上报通道,各类别的Input设备驱动均可用此通道上报Input事件。

  • Input配置解析:负责对Input设备的板级配置及器件私有配置进行解析及管理。

Input驱动程序实现

私有配置信息解析

示例代码路径

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

根据 OSAL 提供的配置解析函数,可以将 hcs 文件中各字段含义进行解析,具体请参考 input_config_parser.c 中各函数的实现。如模板不满足要求,在hcs文件添加信息,在下面接口开发相应的解析函数。

static int32_t ParseAttr(struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode,BoardAttrCfg *attr)
{
    int32_t ret;
    //获取input字段信息,保存在BoardAttrCfg结构体中
    ret = parser->GetUint8(attrNode, "inputType", &attr->devType, 0);
    CHECK_PARSER_RET(ret, "GetUint8");
    .........
    .........
    return HDF_SUCCESS;
}

管理层驱动注册

//./drivers/hdf_core/framework/model/input/driver/hdf_input_device_manager.c
static int32_t HdfInputManagerInit(struct HdfDeviceObject *device)
{
/* 分配内存给manager,manager中将存放所有input设备 */
g_inputManager = InputManagerInstance();
...
}
struct HdfDriverEntry g_hdfInputEntry = {
.moduleVersion = 1,
.moduleName = "HDF_INPUT_MANAGER",
.Bind = HdfInputManagerBind,
.Init = HdfInputManagerInit,
.Release = HdfInputManagerRelease,
};
HDF_INIT(g_hdfInputEntry); //驱动注册入口

公共驱动层注册

//./drivers/hdf_core/framework/model/input/driver/hdf_touch.c
static int32_t HdfTouchDriverProbe(struct HdfDeviceObject *device)
{
.........
.........
/* 板级信息结构体内存申请及hcs配置信息解析 */
boardCfg = BoardConfigInstance(device);
.........
.........
}
struct HdfDriverEntry g_hdfTouchEntry = {
.moduleVersion = 1,
.moduleName = "HDF_TOUCH",
.Bind = HdfTouchDriverBind,
.Init = HdfTouchDriverProbe,
.Release = HdfTouchDriverRelease,
};

HDF_INIT(g_hdfTouchEntry); //驱动注册入口

器件驱动注册

//./drivers/hdf_core/framework/model/input/driver/touchscreen/touch_gt911.c
static void HdfGoodixChipRelease(struct HdfDeviceObject *device)
{
 .........
 .........
}
HDF_LOGI("%s: goodix chip is release", __func__);
}
struct HdfDriverEntry g_touchGoodixChipEntry = {
.moduleVersion = 1,
.moduleName = "HDF_TOUCH_GT911",//与驱动入口的moduleName匹配
.Init = HdfGoodixChipInit,
.Release = HdfGoodixChipRelease,
};
HDF_INIT(g_touchGoodixChipEntry);//驱动注册入口

配置设备描叙信息

主要配置的驱动注册到HDF框架做需要的设备驱动描叙信息,如驱动的加载与否及加载次序等。

配置文件路径:

.\vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs

该文件提供了 Input 模型各层驱动注册到 HDF 框架所必需的信息,各驱动层私有配置信息过“deviceMatchAttr”字

段与 input_config.hcs 中的“match_attr”相关内容进行匹配。

配置文件中与input模块相关的部分内容说明:

input :: host {
            hostName = "input_host";
            priority = 100;
            device_input_manager :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 100;
                    preload = 0;
                    permission = 0660;
                    moduleName = "HDF_INPUT_MANAGER";//与驱动入口moduleName匹配
                    serviceName = "hdf_input_host";
                    deviceMatchAttr = "";
                }
            }
            device_hdf_touch :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 120;
                    preload = 0;
                    permission = 0660;
                    moduleName = "HDF_TOUCH";//与驱动入口moduleName匹配
                    serviceName = "hdf_input_event1";//HDF框架生成的节点名
                    deviceMatchAttr = "touch_device1";//与“match_attr”字段一致
                }
            }
            .........
            .........
}

配置器件信息

包括了设备类型、上下电时序等,平台硬件信息包含了器件使用的GPIO的电口信息等。

配置文件路径:

.\vendor\hihope\rk3568\hdf_config\khdf\input\input_config.hcs

input_config.hcs 中的信息由驱动代码进行读取解析,主要由公共驱动层的私有配置信息及器件驱动层的私有配置信息组成。文件中的配置包含板级硬件信息及器件私有配置信息。

部分内容说明:

boardConfig {
   match_attr = "touch_device1";//与上面deviceMatchAttr匹配
   inputAttr {//与私有信息解析对应
   		/* 0:touch 1:key 2:keyboard 3:mouse 4:button 5:crown 6:encoder */
   		inputType = 0;
   		solutionX = 720;
   		solutionY = 1280;
   		devName = "main_touch";
   	}
pinConfig {
   rstGpio = 3;//管脚设置
   intGpio = 4;
   rstRegCfg = [0x0, 0x0];//管脚信息
   intRegCfg = [0x112f0098, 0x5f0];
}
powerConfig {//电源供电相关设置
   /* 0:unused 1:ldo 2:gpio 3:pmic */
   vccType = 2;
   vccNum = 20;    // gpio20
   vccValue = 1800;
   vciType = 1;
   vciNum = 12;    // ldo12
   vciValue = 3300;
}

## 编译入口添加

编辑Makefile文件,示例:

文件路径:
.\drivers\hdf_core\adapter\khdf\linux\model\input\Makefile

添加input相关驱动引用,示例:

INPUT_ROOT_DIR = ../../../../../framework/model/input/driver

obj-$(CONFIG_DRIVERS_HDF_INPUT) += \
               $(INPUT_ROOT_DIR)/input_bus_ops/input_i2c_ops.o \
               $(INPUT_ROOT_DIR)/hdf_input_device_manager.o \
               $(INPUT_ROOT_DIR)/input_config_parser.o \
               $(INPUT_ROOT_DIR)/event_hub.o \
               $(INPUT_ROOT_DIR)/hdf_touch.o \
               $(INPUT_ROOT_DIR)/hdf_key.o \
               $(INPUT_ROOT_DIR)/hdf_hid_adapter.o

obj-$(CONFIG_DRIVERS_HDF_TP_5P5_GT911) += \
              $(INPUT_ROOT_DIR)/touchscreen/touch_gt911.o
obj-$(CONFIG_ARCH_NXP_TOUCH) += \
              $(INPUT_ROOT_DIR)/touchscreen/touch_ft5x06.o
obj-$(CONFIG_DRIVERS_HDF_TP_2P35_FT6236) += \
              $(INPUT_ROOT_DIR)/touchscreen/touch_ft6336.o
obj-$(CONFIG_DRIVERS_HDF_INPUT_INFRARED) += \
              $(INPUT_ROOT_DIR)/hdf_infrared.o
obj-$(CONFIG_DRIVERS_HDF_TP_5P43_FT5406) += \
              $(INPUT_ROOT_DIR)/touchscreen/touch_ft5406.o

ccflags-y +=-I$(srctree)/drivers/hdf/framework/model/input/driver \
            -I$(srctree)/drivers/hdf/framework/model/input/driver/input_bus_ops \
            -I$(srctree)/drivers/hdf/framework/include/core \
            -I$(srctree)/drivers/hdf/framework/core/common/include/host \
            -I$(srctree)/drivers/hdf/framework/include/utils \
            -I$(srctree)/drivers/hdf/framework/include/osal \
            -I$(srctree)/drivers/hdf/framework/include/platform \
            -I$(srctree)/drivers/hdf/framework/include/config \
            -I$(srctree)/drivers/hdf/framework/core/host/include \
            -I$(srctree)/drivers/hdf/framework/core/shared/include \
            -I$(srctree)/drivers/hdf/framework/utils/include \
            -I$(srctree)/drivers/hdf/khdf/osal/include
ccflags-y +=-I$(srctree)/bounds_checking_function/include \
            -I$(srctree)/drivers/hdf/evdev

修改对应的config文件,为驱动器件创建的编译模块开始编译,示例:

//.\kernel\linux\config\linux-5.10\arch\arm64\configs\rk3568_standard_defconfig
在文件下添加
CONFIG_DRIVERS_HDF_INPUT=y
CONFIG_DRIVERS_HDF_TP_5P5_GT911=y

最后通过命令可以查看是否有相关的设备节点

ls /dev/input

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐