修改kernel-3.18\drivers\misc\mediatek\mach\mt6797\amt6797_evb_m\dct\dct\codegen.dws目录下的DWS文件,在对应的I2C_CHANNEL上添加GOODIX的设备,并设定I2C的地址,如下代码段1中所示:

代码段1

kernel-3.18\drivers\misc\mediatek\mach\mt6797\amt6797_evb_m\dct\dct\codegen.dws

<device16>

<varName>CAP_TOUCH</varName>

<channel>I2C_CHANNEL_4</channel>

<address>0x5D</address>

</device16>

该DWS文件,在内核编译后会在\out\arch\arm64\boot\dts目录下生一个cust.dtsi文件,在该文件中会出现刚在DWS文件中添加的设备,此文件对应的设备下仅包含有设备的: compatible, reg, status等信息,而GPIO、IRQ、PINCTRL等信息都不在该cust.dtsi文件中,如下代码段2中所示。

代码段2

\out\arch\arm64\boot\dts

&i2c4 {
         #address-cells = <1>;

#size-cells = <0>;

clock-frequency = <400000>;

mediatek,use-open-drain;

cap_touch@5d {
                   compatible = "mediatek,cap_touch";

reg = <0x5d>;

status = "okay";

};

fts_touch@70 {
                   compatible = "mediatek,fts_touch";

reg = <0x70>;

status = "okay";

};

};

这里的“compatible”就是用于与驱动中的MODULE_INIT相匹配的ID,两者一致了驱动的probe函数才能正常运行起来。比如这个例子中的“cap_touch”,驱动中设置相应的compatible也为“cap_touch”即可保证probe函数能起来。

Linux内核在启动的过程中会加载设备树文件,并最终生成相应的i2c_client对象,设备树中的相关资源信息都会被内核保存到“i2c_client->dev.of_node”中,驱动中使用该“of_node”通过of_get_named_gpio等方法即可获取到dts中的信息。比如下面的代码段3,我们在驱动中调用of_get_named_gpio(node,"goodix,reset-gpio", 0),该方法即可为我们返回DTS中与"goodix,reset-gpio"相对应的信息,非常简便。

我们刚才也说过了i2c_client->dev.of_node中的信息是内核从DTS中抽取并存放到该对象中的,内核中不止一个i2c_client,DTS中也不止一个设备的信息,内核是怎样将它们进行对应的呢?在DTS中,每个设备都会有一个设备名,在该设备下我们可以设置compatible, addr以及GPIO、IRQ等资源,内核最终在生成i2c_client时会将这些资源存放在of_node中。但MTK有些特殊,它将设备的compatible, addr设备和GPIO、IRQ等资源的设置分散在了不同的文件中。因此,如代码段3中所示,开头的“&touch”,代表的就是对设备名为“touch”的设备的资源信息补充。

在目前MTK开发板的内核中,对于设备“cap_touch”仅仅只设置了其compatible, addr,而且还是从DWS中生成过来的,其它的,GPIO、IRQ等资源都没有声明,而是将这些资源全都放了在kernel-3.18/arch/arm64/boot/dts/amt6797_evb_m.dts文件中的设备名为“touch”的设备下。那么肯定的,驱动是无法从i2c_client->dev.of_node获取资源信息的,因为我们在DTS中根本就没有为“cap_touch”声明任何资源。

那在驱动中如何去获取资源信息呢?在MTK平台上,使用

of_node = of_find_node_by_name(NULL,"goodix,touch");

将of_node指向了设备“touch”,有了of_node,后面即可一样地通过of_get_named_gpio等函数去获取资源了。

这是MTK平台比较坑的几点:

1、  从DWS去生成设备,而不是直接在DTS中修改/添加设备;

2、  设备树中设备compatible,addr的声明与GPIO、IRQ等资源的声明分散在不同的文件中;

3、  MTK平台上的驱动中对of_node进行了重新的定位,将其将向了”touch”设备;

其实完全可以将MTK平台做的与高通平台一样的,不修改DWS,而是直接去修改DTC,并且将设备相关的信息放在一起而不要再分散开来,最后,不要在驱动中去修改of_node的指向,而是将对应设备的资源信息都放在对应的设备下。

设备的GPIO、IRQ、PINCTRL等信息是写在以下文件中:

kernel-3.18/arch/arm64/boot/dts/amt6797_evb_m.dts

具体代码如下所示:

代码段3

kernel-3.18/arch/arm64/boot/dts/amt6797_evb_m.dts

&touch {
         tpd-resolution = <1080 1920>;

use-tpd-button = <1>;

tpd-key-num = <3>;

tpd-key-local= <139 172 158 0>;

tpd-key-dim-local = <90 883 100 40 230 883 100 40 370 883100 40 0 0 0 0>;

tpd-max-touch-num = <5>;

tpd-filter-enable = <1>;

tpd-filter-pixel-density = <192>;

tpd-filter-custom-prameters = <0 0 0 0 0 0 0 0 0 0 00>;

tpd-filter-custom-speed = <0 0 0>;

pinctrl-names = "default","state_eint_as_int", "state_eint_output0", "state_eint_output1",

"state_rst_output0","state_rst_output1";

pinctrl-0 = <&ctp_pins_default>;

pinctrl-1 = <&ctp_pins_eint_as_int>;

pinctrl-2 = <&ctp_pins_eint_output0>;

pinctrl-3 = <&ctp_pins_eint_output1>;

pinctrl-4 = <&ctp_pins_rst_output0>;

pinctrl-5 = <&ctp_pins_rst_output1>;

status = "okay";

goodix,touch {
                   goodix,reset-gpio = <&pio 256 0>;

goodix,irq-gpio = <&pio 86 0>;

goodix,irq-flags = <2>; /* 1:trigger rising,2:trigger falling;*/

goodix,power-on-delay-us = <10000>; /* 10ms*/

goodix,power-off-delay-us = <10000>; /* 10ms*/

goodix,panel-max-id = <10>;

goodix,panel-max-x = <1080>;

goodix,panel-max-y = <1920>;

goodix,panel-max-w = <1000>;

goodix,panel-max-p = <1000>;

//goodix,swap-axis;

goodix,panel-key-map = <172 158>;/*KEY_HOMEPAGE, KEY_BACK*/

sensor0 {
                            /*goodix,panel-max-x = <401>;

goodix,panel-max-y = <401>;

goodix,panel-max-w = <401>;

goodix,panel-max-p = <254>;*/

};

};

观察以上代码可知,这些设备信息是对“touch”对象的扩充,而不是“cap_touch”

需要注意的是:无论是直接修改DSW文件,还是修改dts文件,compatible都应该是在i2cXX里面,XX对应是触控设备挂在哪个I2C下面,比如前面例子中的I2C4.

另外,在dts文件中添加的中断、GPIO、pinctrl等信息可以不放在i2cXX下面,驱动调用内核函数通过相应的名字都可以找到对应的信息,但为了统一最好也放在i2cXX下面。

Compatible可以在DWS文件中修改,然后由内核编译时生成;也可以直接在dts中相应的i2cXX中修改,都是一样的。目前所知的,如果DWS和dts都有compatible,那么应该是以后加载的为准,也即dts为准,具体是不是这样,还需要进一步的验证

MTK(mt6797)-DTS修改---I2C设备(Kernrl3.18)相关推荐

  1. MTK开发板设备树的修改---I2C设备 3.18内核

    修改kernel-3.18\drivers\misc\mediatek\mach\mt6797\amt6797_evb_m\dct\dct\codegen.dws目录下的DWS文件,在对应的I2C_C ...

  2. 树莓派学习笔记——wiringPi I2C设备使用详解

    1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的&quo ...

  3. MTK开发之—添加aw21024 i2c设备驱动

    从供应商处拿到一驱动led模块的 i2c设备驱动,人家驱动已经基本给我们写好,我们需要做的就是将驱动添加进我们的内核,烧录进我们的板子为我们所用,aw21024驱动与资料:https://downlo ...

  4. Android 系统(123)---MTK android 常用修改点

    MTK android 常用修改点 1. *#06#等关键码判断文件 SpecialCharSequenceMgr.java 2.音效 ControlPanelEffect.java 3.版本号修改 ...

  5. 使用RT-Thread Studio DIY 迷你桌面时钟| 获取温湿度传感器数据(I2C设备驱动+SHT3x软件包)...

    1. 项目进度 桌面Mini时钟项目用来演示如何使用RT-Thread Stduio开发项目,整个项目的架构如下: 在上一篇博文中简单的介绍了RT-ThreadStudio一站式工具,基于STM32L ...

  6. Linux 设备驱动篇之I2c设备驱动

    ******************************************************************************************** 装载声明:希望 ...

  7. MTK android 常用修改点

    1. *#06#等关键码判断文件 SpecialCharSequenceMgr.java 2.音效 ControlPanelEffect.java 3.版本号修改 bulid/core/build_i ...

  8. 从零开始学习linux的I2C设备驱动框架——写一个简单的SHT20驱动

    目录 0.测试环境说明 1.设备树的修改 2.设备驱动框架 3.I2C数据传输过程 3.1 struct i2c_msg 3.2 SHT20的数据收发 4.I2C适配器超时等待时间的修改 本文资源 参 ...

  9. Linux设备驱动篇——[I2C设备驱动-1]

    Linux 设备驱动篇之I2c设备驱动 fulinux 一.I2C驱动体系 虽然I2C硬件体系结构和协议都很容易理解,但是Linux I2C驱动体系结构却有相当的复杂度,它主要由3部分组成,即I2C设 ...

最新文章

  1. Java XML解析工具 dom4j介绍及使用实例
  2. 面试官问:Kafka 会不会丢消息?怎么处理的?
  3. python csv读取-python如何读取csv数据
  4. suse php5,简简单单搭建linux SuSE LAMP环境
  5. 播放内核的“瘦身”,你只需要这样做!
  6. java clob 操作_java操作clob字段
  7. Java 移位操作符
  8. 【随笔】一个可爱的圆函数模型
  9. 光伏谋定生态农村-农业大健康·万祥军:太阳能改革生产方
  10. python量化交易入门教程_搞金融的同学三小时快速入门python从零入门量化交易系列...
  11. java鸭子类型_Python语言中的“Duck type”,鸭子,类型
  12. 线性代数的本质(第二部分)
  13. MySQL必知必会2
  14. 《“理想我”与“现实我”》
  15. 泛函,变分与变分不等式
  16. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Finding Unexpected Intents
  17. 关于手机店、电脑城,存在的物联卡的情况说明
  18. keep 虚拟路线修改器_王者无限技能10.2最新版-王者无限技能修改器下载
  19. ZOJ 3864 Quiz for EXO-L
  20. 凝心聚力,不负好时光——慧慧兔团建拓展之旅

热门文章

  1. [SVA]SystemVerilog Assertion常用操作符总结及案例
  2. oracle max相同,关于oracle:具有相同名称的材料化视图和表
  3. 开源系统搭建私有云盘,育网校园云盘系统
  4. 移动机器人 | 手势识别
  5. 所谓的“哑巴英语”对中国是利大于弊(收藏)
  6. 双隐藏层BP网络的matlab仿真,求遗传算法优化含有两个隐含层的BP神经网络的matlab程序...
  7. k-近邻算法(鸢花草)
  8. 形容语言aab c,形容aab成语有哪些_四字词语 - 成梦词典
  9. 飞思卡尔Kinetis 60(K60)时钟系统分析
  10. 曙光i620c20用户手册_技术白皮书I620-G20