电容屏幕触摸屏驱动——ft5406 芯片

本文详细介绍了基于s5pv210平台的FT5406电容触摸屏驱动的初始化、注册、中断处理和数据上报过程。驱动通过i2c注册设备,初始化GPIO和中断,读取触摸信息,并使用input子系统上报触摸事件。文中还提及了Android系统中的早期挂起和晚期恢复函数,以适应系统电源管理。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

——我的S5pv210 板子的电容触摸屏也是ft5406 的芯片的,已经调试通了,无意中看到下面这篇文章,很有参考价值,所以转载过来呵呵。

原文地址 http://blog.csdn.net/yunfly163/article/details/7388230#comments



最近刚调试好郭泰的电容触摸屏,现记录下。

 

ft5406数据手册

----------------------------------------------------------------------------------------

cpu:s5pv210

touch ic :FT5406

 平台:android

  1. 首先,分析下 FT5406 的基本电路接口:
    基本都是通用的接口,如 I2C 接口,INT,WAKE,RST。如图:

    以上可知,我们在驱动中必须定义一个中断口,来启动接收触摸数据,一个gpio脚来复位FT5406。
    wake:主要靠cpu发送一个唤醒指令给FT5406。
    #define pin_irq     S5PV210_GPH0(1)
    #define pin_rst     S5PV210_GPB(1)
  2. 再次,需确认FT5406的从地址,以便于I2C访问得到。这个可以根据FT5406数据手册查找到.

    可知从地址高位必须为:3,低位必须根据i2ccon设定的值来确定,这点很奇怪。
    我这边找到的从地址为:0x38
  3. 基本的东西确认好后,剩下的就是根据FT5406数据手册上的指令,开始写驱动了。
    在此之前,我们先了解下驱动如何实现电容屏的多点触摸,其实很简单,主要需要
    触摸屏IC FT5406 能够捕获多点数据,这点电容屏基本多能支持到捕获2点以上,而
    FT5406 可以捕获5个触摸点,编写驱动时,只要去获取这几个点的数据,然后上报
    就行。格式如图:




    解释:
    02h : 捕获的触摸点个数
    03h- 1eh :对应每个点的x,y坐标数值。

----------------------------------------------------------------------------------------------------------------------------------------------

首先配置 i2c_board_info,把从地址提供过去。

//arch/arm/mach-s5pv210/mach-smdk110.c

//i2c_board_info用于构建信息表来列出存在的I2C设备。这一信息用于增长新型I2C驱动的驱动模型树。对于主板,它使用i2c_register_board_info()来静态创建。对于子板,利用已知的适配器使用i2c_new_device()动态创建。
//I2C 
设备创建模板
struct i2c_board_info {
    char type[I2C_NAME_SIZE];  //
芯片类型,用于初始化i2c_client.name
    unsigned short flags;  //
用于初始化i2c_client.flags
    unsigned short addr;  //
存储于i2c_client.addr
    void *platform_data;  //
存储于i2c_client.dev.platform_data

    struct dev_archdata *archdata;  //拷贝至i2c_client.dev.archdata
    int irq;  //
存储于i2c_client.irq
};

 static struct i2c_board_info i2c_devs0[] __initdata = {
#ifdef CONFIG_TOUCHSCREEN_CDTLCD
{
I2C_BOARD_INFO("ft5x0x_ts", 0x38),
.irq = IRQ_EINT1,
},
#endif 
};


//使用Linux I2C驱动栈,系统可以在初始化时宣告板载信息表。这些应该在靠近arch_initcall()时的板子相关的初始化代码或同等情况时,在I2C适配器驱动被注册之前被执行。例如,主板初始化代码可以定义几个设备,也可以在叠板的每个子板初始化代码中定义。
//I2C
设备会在相关的总线适配器被注册后创建。此后,标准驱动模型工具通常绑定新型I2C驱动至I2C设备。对于使用这一函数宣告的设备,在动态分配的情况下总线号是不可用的。
//
传递的板子信息可以安全的是__initdata,但是由于不能拷贝,要小心嵌入式指针(如platform_data,functions等)
//
静态的宣告I2C设备
int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len);
@busnum: 
指定这些设备属于哪个总线
@info: I2C
设备描述符向量
@len: 
向量中描述符的数量;为了预留特定的总线号,可以是0

 

 i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));


 

在你对应的machine配置里会执行“i2c_register_board_info”一个函数,它会将一个i2c_board_info的结构体注册进系统,

可以发现,在目录/sys/bus/i2c/devices下的设备就是这个i2c_board_info结构体里所描述的I2C设备,

 

/sys/bus/i2c/devices下的设备名字就是根据i2c_board_info结构体中定义的I2C Address来命名的。

 

所以添加一个I2C设备时,除了需要编写这个I2C设备的驱动之外,还需要在machine

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值