Android touch详解(2) touch bringup

前言

  本篇文章是根据本人实际项目的touch开发流程编写的,如有遗漏欢迎补充

了解需求

  在一个项目的起始阶段,首先要了解该项目要用的touch 模组或touch IC;阅读touch模组和touch Ic spec;整理touch相关的需求,包括时序要求、电压要求、I2C从机地址、wakeup的实现等。确认有无特殊的功能要求。

电路图

  review硬件电路图,确认touch使用的gpio只有touch使用、检查soc的spec确认中断gpio是否具有wakeup能力;I2C是否有上拉,有没有对应测试点。
  确认touch需要enable的电源,一般包括,I2C上拉电源、touch IC电源、level shift电源;确保touch相关电源都是畅通的;

驱动移植

1. 添加touch driver

  将驱动代码移植到目录" \drivers\input\touchscreen\sis_i2c_95xx " 下,“sis_i2c_95xx” 是touch驱动代码所在的文件夹,一般命名方式为:厂商缩写_(i2c/usb_)芯片型号
在这里插入图片描述

2. 修改Makefile

\drivers\input\touchscreen\sis_i2c_95xx\Makefile
#
# # Makefile for the sis95xx touchscreen drivers.
#

obj-$(CONFIG_TOUCHSCREEN_SIS_I2C_95XX)   += sis_i2c.o

修改上级目录Makefile

obj-$(CONFIG_TOUCHSCREEN_SIS_I2C_95XX)	+= sis_i2c_95xx/

  obj-$(CONFIG_XXX) += sis_i2c.o,表示在这个目录中有一个名为sis_i2c.o的目标文件。sis_i2c.o将从sis_i2c.c 或sis_i2c.S文件编译得到
  其中 $(CONFIG_XXX)代表引用了CONFIG_XXX变量,CONFIG_XXX一般定义在.ini文件中,可以为y(编译进内核)或m(编译成模块),如果CONFIG_XXX的不是y或m就不会编译连接

3. kconfig

\drivers\input\touchscreen\sis_i2c_95xx\Kconfig
#
# STMicroelectronics touchscreen driver configuration
#

config TOUCHSCREEN_SIS_I2C_95XX
	tristate "SiS95xx series I2C touchscreen driver"
	depends on I2C
	help
	  Say Y here to enable support for I2C connected ilitek touch panels.

	  If unsure, say N.

	  To compile this driver as a module, choose M here: the
	  module will be called sis_i2c.

修改上级目录Kconfig

source "drivers/input/touchscreen/sis_i2c_95xx/Kconfig"

  config是关键字,表示一个配置选项的开始;紧跟着的TOUCHSCREEN_SIS_I2C_95XX是配置选项的名称。编译过程中会以arch\arm64\Kconfig为起点逐层解析Kconfig,在TOUCHSCREEN_SIS_I2C_95XX前面加入前缀"CONFIG_"
  tristate表示变量类型,即"CONFIG_TOUCHSCREEN_SIS_I2C_95XX"的类型,有5种类型:bool、tristate、string、hex和int,其中 tristate和string是基本的类型
  depends on:表示依赖于XXX,“depends on I2C”表示只有当I2C配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项

4. .ini文件

\mpos_config\hw_config\hw_common.ini
CONFIG_TOUCHSCREEN_SIS_I2C_95XX=y

  设置CONFIG_TOUCHSCREEN_SIS_I2C_95XX的值,y为编译进内核、m为编译成模块。在编译过程中会通过Makefile、Kconfig和.ini中的定义一起结合生成.config文件。总结来说,Kconfig中去定义"CONFIG_XXX"变量,Makefile中引用变量看是否编译,.ini定义变量的值。
\android_out\ …\target\product\ …\obj\KERNEL_OBJ\ .config

CONFIG_TOUCHSCREEN_SIS_I2C_95XX=y

若没有定义变量的值,则"CONFIG_XXX"的值为n(不编译)

5. DTS

  修改对应dts文件,通过I2C SCL和SDA的gpio确定touch挂在哪个I2C下面,设置compatible匹配的driver、addr,设置irq、reset、电源的gpio,设置pinctrl的名字和状态。

 \arch\arm64\boot\dts\qcom\ 
&tlmm {
   
	sis_ts_default {
   
		sis_ts_reset_default: sis_ts_reset_default {
   
			mux {
   
				pins = "gpio66";
				function = "gpio";
			};

			config {
   
				pins = "gpio66";
				drive-strength = <2>;
				bias_disable;
			};
		};

		sis_ts_int_default: sis_ts_int_default {
   
			mux {
   
				pins = "gpio107";
				function = "gpio";
			};

			config {
   
				pins = "gpio107";
				drive-strength = <2>;
				bias_pull_down;
			};
		};

		sis_ts_through_default: sis_ts_through_default {
   
			mux {
   
				pins = "gpio113";
				function = "gpio";
			};

			config {
   
				pins = "gpio113";
				drive-strength = <2>;
				bias_disable;
			};
		};
	};
};

&i2c_4 {
   
	status = "okay";
	/* sis touch configuration */
	sis_touchscreen@5c {
   
		compatible = "sis,sis_touch"; //和驱动中保持一致
		reg = <0x5c>;// I2C地址
		interrupt-parent = <&tlmm>;
		interrupts = <107 0x0>;
		sis,irq-gpio = <&tlmm 107 0x00>;
		sis,reset-gpio = <&tlmm 66 0x00>;
		sis,through-gpio = <&tlmm 113 0x00>;

		// 电源
		p5v_usb-supply = <&p5v_usb>;
		vregl13-supply = <&pm660_l13>;
		vregl11-supply = <&pm660_l11>;
		p3v3-supply = <&p3v3>;

		pinctrl-names = "sis_ts_default";
		pinctrl-0 = <&sis_ts_reset_default 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值