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