一、Input驱动模型介绍

1、简介

在HDF驱动管理框架的基础上,Input驱动模型通过调用OSAL接口层和Platform接口层提供的基础接口进行开发,涉及的接口包括bus通信接口、操作系统原生接口(memory、lock、thread、timer等)。由于OSAL接口和Platform接口屏蔽了芯片平台的差异,所以基于Input驱动模型实现的Touchscreen驱动可以进行跨平台、跨OS迁移,从而实现驱动的一次开发、多端部署。

2、运作机制

Input模型整体的框架如图1所示。Input驱动模型基于HDF驱动框架、Platform接口、OSAL接口进行开发,向上对接规范化的驱动接口HDI(Hardware Device Interface)层,通过Input-HDI层对外提供硬件能力,即上层Input Service可以通过HDI接口层获取相应的驱动能力,进而操控Touchscreen等输入设备。

Input驱动模型核心部分由设备管理层、公共驱动层、器件驱动层组成。其中:

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

  • 公共驱动层:负责对板级硬件进行初始化、硬件中断处理、向manager注册input设备等。

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

图1 基于HDF驱动框架的Input驱动模型

 

下面来了解下Input驱动模型的工作流程。

注:本文只专注input模型工作流程,对于hdf框架工作原理,如驱动配置解析、驱动加载等不做赘述,可参考以往文章或其他官方文档。

二、驱动配置

注:仅展示Input驱动模型hcs配置层次结构,方便后续Input驱动模型工作流程分析,具体配置说明及配置解析请参考官方文档说明。

1、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";//设备管理层
                    serviceName = "hdf_input_host";
                    deviceMatchAttr = "";
                }
            }
            device_hdf_touch :: device {
                device0 :: deviceNode {
                    policy = 2;
                    priority = 120;
                    preload = 0;
                    permission = 0660;
                    moduleName = "HDF_TOUCH";//公共驱动层
                    serviceName = "hdf_input_event1";
                    deviceMatchAttr = "touch_device1";
                }
            }

            device_touch_chip :: device {
                device0 :: deviceNode {
                    policy = 0;
                    priority = 130;
                    preload = 0;
                    permission = 0660;
                    moduleName = "HDF_TOUCH_GT911";//器件驱动层
                    serviceName = "hdf_touch_gt911_service";
                    deviceMatchAttr = "zsj_gt911_5p5";
                }
            }
        }

2、板级配置及器件私有配置

root {
    input_config {
        touchConfig {
            touch0 {
                boardConfig { //板级配置
                    match_attr = "touch_device1";
                    inputAttr {
                        inputType = 0;
                        solutionX = 720;
                        solutionY = 1280;
                        devName = "main_touch";
                    }

                    busConfig {
                        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];
                    }

                    powerConfig {
                        vccType = 2;
                        vccNum = 20;    
                        vccValue = 1800;
                        vciType = 1;
                        vciNum = 12;   
                        vciValue = 3300;
                    }

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

                chipConfig { //器件私有配置
                    template touchChip {
                        match_attr = "";
                        chipName = "gt911";
                        vendorName = "zsj";
                        chipInfo = "AAAA11222";  
                        busType = 0;
                        deviceAddr = 0x5D;
                        irqFlag = 2;
                        maxSpeed = 400;
                        chipVersion = 0; 
                        powerSequence {
                            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 = "zsj_gt911_5p5";
                        chipInfo = "ZIDN45100";  
                        chipVersion = 0; 
                    }
                }
            }
        }
    }
}

三、Input驱动模型工作流程

  • 加载Input设备管理驱动:由HDF驱动加载Input设备管理驱动,完成设备manager的创建并对其初始化。其中init函数中初始化了设备管理链表。

  • 加载平台驱动:平台驱动由HDF框架加载,主要完成板级配置解析及硬件初始化,并提供器件注册接口。

  • 加载器件驱动:器件驱动也由HDF框架加载,完成器件设备的实例化,包括器件私有配置解析和平台预留的差异化接口适配。

    最后通过RegisterTouchChipDevice函数对公共驱动层相关结构体进行信息填充,同时完成了相关硬件信息的初始化(如中断注册等),绑定设备与驱动组成inputDev通过RegisterInputDevice函数向驱动管理层进行注册,在RegisterInputDevice函数中主要实现了将inputDev向设备管理链表的添加等功能。

四、RegisterTouchChipDevice及相关结构体交互详解

  • 器件设备向平台驱动注册&Input设备注册:将实例化的器件设备注册到平台驱动,实现设备和驱动的绑定,并完成中断注册、上下电等器件初始化工作。在器件初始化完成后,实例化Input设备,并将其注册到Input manager进行管理。

    至此,一个基于HDF Input模型的触摸屏驱动加载完成,后续上层Input Service可以通过HDI接口层获取相应的驱动能力,进而操控Touchscreen等输入设备。接口详情可参考:drivers/peripheral/input/README_zh.md。

Logo

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

更多推荐