ptz 发布的文章

转自: https://blog.csdn.net/daoshuti/article/details/72972112

AndroidTP驱动之(一)I2C

0. 前言

Android TP 驱动系列主要用来记录自己关于TP的心得体会。 为了完整的梳理TP driver相关的知识,也为了跟好回顾Linux driver的编写流程。 我将参照已有的驱动代码(focaltech的驱动代码)从零开始,一步一步写出一个TP驱动。 驱动模块的名字就叫做mytp。

1. 模块三要素

1.0 header & define

#include <linux/kernel.h>
#include <linux/module.h>

#define PRINT_INFO(fmt, args...) printk(KERN_ERR "[MYTP][%s]"fmt"\n", __func__, ##args)

1.1 module_init

static __init int mytp_init(void)
{
    PRINT_INFO("mytp init start!");
    PRINT_INFO("mytp init end!");
    return 0;
}
module_init(mytp_init);

1.2 module_exit

static __exit void mytp_exit(void)
{
    PRINT_INFO("mytp exit start!");
    PRINT_INFO("mytp exit end!");
}
module_exit(mytp_exit);

1.3 module info

MODULE_AUTHOR("wanghan");
MODULE_DESCRIPTION("TP Driver (ic:ft5435)");
MODULE_LICENSE("GPL");

2. I2C子系统

我们知道TP的IC基本都是使用I2C和CPU通信。所以,我们先通过i2c子系统创建一个字符设备驱动。 注意这里用到了头文件

#include <linux/i2c.h>

2.0 定义相关的i2c结构体变量

#define MYTP_DRIVER_NAME    "mytp_ft5435"

static const struct i2c_device_id mytp_id[] =
{
    {MYTP_DRIVER_NAME, 0},
    {},
};

static const struct of_device_id mytp_match_table[] =
{
    { .compatible = "focaltech,fts", },
    { },
};

static struct i2c_driver mytp_driver =
{
    .probe = mytp_probe,
    .remove = mytp_remove,
    .driver = {
        .name = MYTP_DRIVER_NAME,
        .owner = THIS_MODULE,
        .of_match_table = mytp_match_table,
    },
    .id_table = mytp_id,
};

2.1 实例化probe和remove函数

static int mytp_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    PRINT_INFO("mytp prebo start!");

    PRINT_INFO("mytp prebo end!");
    return 0;
}

static int mytp_remove(struct i2c_client *client)
{
    PRINT_INFO("mytp remove start!");

    PRINT_INFO("mytp remove end!");
    return 0;
}

2.2 创建i2c设备

在mytp_init函数中加入

int ret;
ret = i2c_add_driver(&mytp_driver);
if ( ret != 0 )
{
    PRINT_INFO("TP driver init failed!");
}

2.3 注销i2c设备

i2c_del_driver(&mytp_driver);

End

至此,我们的驱动框架已经搭建好了。

转自: https://blog.csdn.net/xiaocaohuyang/article/details/114120766?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link

文章目录

一、TP的硬件接口
二、代码路径
三、TP代码分析
    1、硬件参数设置
    2、TP设备驱动
    3、TP模组驱动

一、TP的硬件接口

引脚 名称及作用
VDD TP供电
RESET 复位引脚
EINT 中断引脚
SCL、SDA I2C接口

​ TP的工作方式比较简单: +上电后通过RESET脚控制TP芯片复位;

  • 通过I2C接口给TP设置参数或读取TP数据;
  • TP有触摸操作时通过EINT脚通知主控;

二、代码路径

描述 路径 文件
系统设置 device\top\top6737t_36_a_m0 kernel-3.18\arch\arm\configs ProjectConfig.mk user版本和userdebug版本对应:top6737t_36_a_m0_defconfig debug版本对应:top6737t_36_a_m0_debug_defconfig
接口设置 kernel-3.18\arch\arm\boot\dts top6737t_36_a_m0.dts cust_i2c.dtsi
Kernel代码 kernel-3.18\drivers\input\touchscreen\mediatek mtk_tpd.c

- 阅读剩余部分 -

转自: https://blog.csdn.net/MrDongShiYi/article/details/100709633?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link

TP 相关引脚DTS中的定义 我们这个项目TP复位引脚是GPIO158,中断引脚是GPIO1,由下图原理图知道我们的TP挂载在I2c0上,3.3v的供电电压是有PMIC 2.8V供电电压通过i2c电平转换过来的,所以供电电压需要配置pmic 2.8v

- 阅读剩余部分 -

转自: https://blog.csdn.net/memory01/article/details/91895740

做Android bsp开发经常会遇到改了内核config需要快速验证的情况,如果用最简单的编译bootimage方式会很费时

肯定存在更简单的方法 以arm64位的芯片bsp包为例

cd KERNEL_PATH
$ export ARCH=arm64
/*如果你是目标defconfig是 "arch/arm64/msm8150_defconfig" */
$ make msm8150_defconfig
成功之后,这样就会出现 #configutation written to .config 提示

接下来就可以检查KERNEL_PATH 下的 .config 文件是否符合你的改动

当然如果要通过menuconfig方式来配置内核也行,执行上述命令之后再make menuconfig 即可

转自: http://bbs.100ask.net/article/35#:~:text=%E7%94%B1%E4%BA%8Elinux%E7%9A%84IIC%E5%9C%B0%E5%9D%80%E5%9C%A8%E4%BD%8E7%E4%BD%8D%EF%BC%8C%E5%9B%A0%E6%AD%A4gt911%E7%9A%84%E5%AE%9E%E9%99%85%E5%9C%B0%E5%9D%80%E6%98%AF0xBA%3E1%3D0x5d%2C%E8%BF%99%E5%B0%B1%E6%98%AF%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E5%9C%A8%E8%AE%BE%E5%A4%87%E6%A0%91%E4%B8%AD%E5%B0%86GT911%E7%9A%84%E5%9C%B0%E5%9D%80%E9%85%8D%E7%BD%AE%E4%B8%BA0x5d,gt911%E9%9C%80%E8%A6%81%E9%85%8D%E7%BD%AE%E7%9A%84%E5%AF%84%E5%AD%98%E5%99%A8%20gt911%E9%9C%80%E8%A6%81%E9%85%8D%E7%BD%AE186%E4%B8%AA%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%8C%E5%88%86%E5%88%AB%E4%B8%BA0x8047-0x8100

源码在最下面

问题一:资源获取Gt911数据手册

在韦老师给的资料里,路径为\06_Datasheet\Extend_modules\7寸LCD模块\电容触控芯片GT911 Datasheet_121120(海威思.pdf

问题二:需要准备哪些知识

  1. 能够修改设备树
  2. 能够编写字符设备驱动
  3. 能够在linux下编写中断程序
  4. 能够在linux下编写IIC收发程序
  5. 了解input子系统
  6. 移植tslib(用于校准,测试触摸屏)

- 阅读剩余部分 -

原因是 jcenter 在 2021.05 停止服务了。

修改顶层的 build.gradle

在每个 jcenter() 上面增加一行 mavenCentral()

修改 app 目录下的 build.gradle

implementation 'com.gu.android:toolargetool:0.2.1@aar' 改为 implementation 'com.gu.android:toolargetool:0.3.0@aar'

参考:

http://5.9.10.113/67450126/android-project-build-failing-after-bintray-sunset https://www.5axxw.com/questions/content/hm6zjg

这个一般是旧工程在新 android studio 中打开

"No toolchains found in the NDK toolchains folder for ABI" 需要安装ndk

file -> settings -> android sdk -> sdk tools -> ndk(side by side) 勾选进行安装。 file -> project structure -> sdk location -> android ndk location 里面选择 ndk

"NDK does not contain any platforms” 这个需要安装低版本 ndk

file -> settings -> android sdk -> sdk tools -> ndk(side by side) 勾选 右下角的 show package details,选择低版本,比如说 20.0.5594570 ,安装低版本。

file -> project structure -> sdk location -> android ndk location 选择低版本的 ndk.

参考:

https://blog.csdn.net/qq_24118527/article/details/82867864
https://blog.csdn.net/hiphopxiao/article/details/112220228#:~:text=%E5%9C%A8%20Android%20Studio%E4%B8%AD%E9%85%8D%E7%BD%AE%20NDK%20%E6%97%B6%EF%BC%8C%E5%8F%AF%E8%83%BD%20%E5%87%BA%E7%8E%B0NDK%20does%20not,does%20not%20contain%20any%20platforms%20.%20%E6%89%BE%E4%BA%86%E5%BE%88%E5%A4%9A%E8%B5%84%E6%96%99%EF%BC%8C%E4%B8%8D%E7%9F%A5%E9%81%93%E4%BB%80%E4%B9%88%E5%8E%9F%E5%9B%A0%E3%80%82%20%E5%90%8E%E9%9D%A2%E6%98%AF%E9%80%9A%E8%BF%87%E4%B8%8B%E8%BD%BD%E6%97%A9%E5%89%8D%E7%9A%84%E7%89%88%E6%9C%AC%E8%A7%A3%E5%86%B3%E4%BA%86%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%EF%BC%8C%E8%AE%B0%E5%BD%95%E4%B8%8B%3A

android 生成的 kernel config 在 out/target/product/msm8937_32/obj/KERNEL_OBJ/.config 。要想找出到底哪个 config 决定了最后的 config,我们可以选择 CONFIG_TOUCHSCREEN_FT5X06=y 这一项进行测试。

直接在 kernel 目录下面搜索所有的 CONFIG_TOUCHSCREEN_FT5X06=y, 然后修改CONFIG_TOUCHSCREEN_FT5X06=n,再使用 make kernel,然后查看最终的输出 config,查看变化。

最终确定是 msm-4.9/arch/arm/configs/msm8937_defconfig 决定了 out/target/product/msm8937_32/obj/KERNEL_OBJ/.config

参考: https://blog.csdn.net/u013377887/article/details/81328491