移植openharmony之调试gt911触摸

本文详细记录了在OpenHarmony系统中移植和调试GT911触摸屏驱动的过程,涉及HDF驱动加载、输入设备管理、平台驱动、器件驱动的初始化及I2C通信问题的解决。在调试过程中遇到的I2C通信异常和触摸点错位问题,通过分析代码和修改配置解决了这些问题。
摘要由CSDN通过智能技术生成

最近在调试触摸驱动,分析了一点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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值