openharmony提供了hdf的驱动框架,今天以gslx680触摸驱动的例子记录一下

openharmony/vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs

 device_touch_chip :: device {
                device0 :: deviceNode {
                    policy = 0;
                    priority = 130;
                    preload = 0;
                    permission = 0660;
                    moduleName = "HDF_TOUCH_GSL3670";
                    serviceName = "hdf_touch_gsl3670_service";
                    deviceMatchAttr = "touch_gsl3670_config";
                }
            }

然后加入针对触摸板硬件连接的信息。

openharmony/vendor/hihope/rk3568/hdf_config/khdf/input/input_config.hcs

root {
    input_config {
        touchConfig {
            touch0 {
                boardConfig {
                    match_attr = "touch_device1";
                    inputAttr {
                        /* 0:touch 1:key 2:keyboard 3:mouse 4:button 5:crown 6:encoder */
                        inputType = 0;
                        solutionX = 1280;
                        solutionY = 800;
                        devName = "main_touch";
                    }

// Hi3516DV300-Runhe  gt911--5p5 & 4p0
                    busConfig {
                        // 0:i2c 1:spi
                        busType = 0;
                        busNum = 1;
                        clkGpio = 86;
                        dataGpio = 87;
                        i2cClkIomux = [0x114f0048, 0x403];
                        i2cDataIomux = [0x114f004c, 0x403];
                    }

                    pinConfig {
                        rstGpio = 14;
                        intGpio = 13;
                        rstRegCfg = [0x112f0094, 0x400];
                        intRegCfg = [0x112f0098, 0x400];
                    }

// Hi3516DV300-Ruishi gt911--7p0
/*
                    busConfig {
                        // 0:i2c 1:spi
                        busType = 0;
                        busNum = 6;
                        clkGpio = 26;
                        dataGpio = 27;
                        i2cClkIomux = [0x114f0048, 0x403];
                        i2cDataIomux = [0x114f004c, 0x403];
                    }

                    pinConfig {
                        rstGpio = 13;
                        intGpio = 12;
                        rstRegCfg = [0x10ff0030, 0x400];
                        intRegCfg = [0x10ff002C, 0x400];
                    }
*/
// Hi3516DV300-Demo board:  ft6336--2p35
/*
                    busConfig {
                        // 0:i2c 1:spi
                        busType = 0;
                        busNum = 3;
                        clkGpio = 2;
                        dataGpio = 1;
                        i2cClkIomux = [0x112f0090, 0x5f1];
                        i2cDataIomux = [0x112f008c, 0x5f1];
                    }

                    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;
                    }

                    featureConfig {
                        capacitanceTest = 0;
                        gestureMode = 0;
                        gloverMOde = 0;
                        coverMode = 0;
                        chargerMode = 0;
                        knuckleMode = 0;
                    }
                }

                chipConfig {
                    template touchChip {
                        match_attr = "";
                        chipName = "gsl3670";
                        vendorName = "zsj";
                        chipInfo = "AAAA11222";  // 4-ProjectName, 2-TP IC, 3-TP Module
                        /* 0:i2c 1:spi*/
                        busType = 0;
                        deviceAddr = 0x40;
                        /* 0:None 1:Rising 2:Failing 4:High-level 8:Low-level */
                        irqFlag = 2;
                        maxSpeed = 400;
                        chipVersion = 0; //parse Coord TypeA
                        powerSequence {
                            /* [type, status, dir , delay]
                                <type> 0:none 1:vcc-1.8v 2:vci-3.3v 3:reset 4:int
                                <status> 0:off or low  1:on or high  2:no ops
                                <dir> 0:input  1:output  2:no ops
                                <delay> meanings delay xms, 20: delay 20ms
                             */
                            powerOnSeq = [4, 0, 1, 5,
                                         3, 0, 1, 10,
                                         3, 1, 1, 60,
                                         4, 2, 0, 50];
                            suspendSeq = [3, 0, 2, 10];
                            resumeSeq = [3, 1, 2, 10];
                            powerOffSeq = [3, 0, 2, 10,
                                           1, 0, 2, 20];
                        }
                    }

                    chip0 :: touchChip {
                        match_attr = "touch_gsl3670_config";
                        chipInfo = "ZIDN45100";  // 4-ProjectName, 2-TP IC, 3-TP Module
                        chipVersion = 0; //parse point by TypeA
                    }

 

match_attr = "touch_gsl3670_config";与 deviceMatchAttr = "touch_gsl3670_config";需要匹配上

hdf中关于触摸的kconfig和Makefile文件。

openharmony/drivers/adapter/khdf/linux/model/input

hdf触摸驱动源文件。

openharmony/drivers/framework/model/input/driver/touchscreen

之后就是驱动的移植了,需要按照hdf框架进行移植

static int32_t ChipDetect(ChipDevice *device)
{
    int ret;
    struct i2c_client *client;
    printk("lhs ------ChipDetect------\n");
    init_chip(device, client);
    check_mem_data(device, client);
    (void)ChipInit(device);
    (void)ChipResume(device);
    (void)ChipSuspend(device);
    HDF_LOGE("%s: ChipDetect, end ret = %d", __func__, ret);
    return HDF_SUCCESS;
}

#define GT_CLEAN_DATA_LEN     3
#define GT_CLEAN_DATA_LEN     3
static int ChipCleanBuffer(InputI2cClient *i2cClient)
{   
    int32_t ret;
    uint8_t writeBuf[GT_CLEAN_DATA_LEN];
    ret = InputI2cWrite(i2cClient, writeBuf, GT_CLEAN_DATA_LEN);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: InputI2cWrite failed, ret = %d", __func__, ret);
    }
    return ret;
}

 

Logo

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

更多推荐