最近在调试触摸驱动,分析了一点openharmony的hdf框架下的触摸,将过程记录下,首先肯定是加载input设备管理驱动:input设备管理驱动由HDF驱动加载,完成设备manager的创建并对其初始化。如下图所示,我这里就是先加载了drivers/framework/model/input/driver/hdf_input_device_manager.c驱动文件。这种文件一般不需要修改,直接使用即可。都是提供给其他文件使用的接口居多。
然后就是加载平台驱动过程了,因为我们是触摸屏,所以加载的文件drivers/framework/model/input/driver/hdf_touch.c文件,这个文件可以着重分析下
struct HdfDriverEntry g_hdfTouchEntry = {
.moduleVersion = 1,
.moduleName = "HDF_TOUCH",
.Bind = HdfTouchDriverBind, //驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架
.Init = HdfTouchDriverProbe, //
.Release = HdfTouchDriverRelease,
};
HDF_INIT(g_hdfTouchEntry);
那么首先执行的函数为HdfTouchDriverProbe,
static int32_t HdfTouchDriverProbe(struct HdfDeviceObject *device)
{
int32_t ret;
TouchBoardCfg *boardCfg = NULL;
TouchDriver *touchDriver = NULL;
HDF_LOGI("%s: enter", __func__);
if (device == NULL) {
HDF_LOGE("%s: param is null", __func__);
return HDF_ERR_INVALID_PARAM;
}
boardCfg = BoardConfigInstance(device); //主要实现数据配置解析功能
if (boardCfg == NULL) {
return HDF_ERR_MALLOC_FAIL;
}
touchDriver = TouchDriverInstance(); //只是申请变量并初始化结构体
if (touchDriver == NULL) {
goto EXIT;
}
ret = TouchDriverInit(touchDriver, boardCfg);
if (ret == HDF_SUCCESS) {
touchDriver->hdfTouchDev = device;
touchDriver->boardCfg = boardCfg;
AddTouchDriver(touchDriver);
device->priv = (void *)touchDriver;
HDF_LOGI("%s: %s exit succ", __func__, boardCfg->attr.devName);
return HDF_SUCCESS;
}
EXIT:
OsalMemFree(boardCfg);
if (touchDriver != NULL) {
touchDriver->boardCfg = NULL;
OsalMemFree(touchDriver);
}
return HDF_FAILURE;
}
重点先看下这个函数,是如何解析板级配置信息的,
static TouchBoardCfg *BoardConfigInstance(struct HdfDeviceObject *device)
{
TouchBoardCfg *boardCfg = (TouchBoardCfg *)OsalMemAlloc(sizeof(TouchBoardCfg));
if (boardCfg == NULL) {
HDF_LOGE("%s: instance board config failed", __func__);
return NULL;
}
(void)memset_s(boardCfg, sizeof(TouchBoardCfg), 0, sizeof(TouchBoardCfg));
if (ParseTouchBoardConfig(device->property, boardCfg) != HDF_SUCCESS) {
HDF_LOGE("%s: parse board config failed", __func__);
OsalMemFree(boardCfg);
boardCfg = NULL;
}
return boardCfg;
}
然后drivers/framework/model/input/driver/input_config_parser.c里面执行ParseTouchBoardConfig函数
int32_t ParseTouchBoardConfig(const struct DeviceResourceNode *node, TouchBoardCfg *config)
{
int32_t ret;
struct DeviceResourceIface *parser = NULL;
if (node == NULL || config == NULL) {
HDF_LOGE("%s: input param is null", __func__);
return HDF_FAILURE;
}
parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
if (parser == NULL) {
HDF_LOGE("%s: invalid parser", __func__);
return HDF_FAILURE;
}
config->boardNode = node;
const struct DeviceResourceNode *attrNode = parser->GetChildNode(node, "inputAttr");
const struct DeviceResourceNode *busNode = parser->GetChildNode(node, "busConfig");
const struct DeviceResourceNode *pinsNode = parser->GetChildNode(node, "pinConfig");
const struct DeviceResourceNode *powerNode = parser->GetChildNode(node, "powerConfig");
const struct DeviceResourceNode