FT5406触摸屏驱动

学习要点:1、驱动程序入口点,在哪个阶段被加载,如何调整驱动加载的先后;

2、设备和驱动之间如何关联上;

3、I2C总线的操作,I2C协议;

4、电源管理,包括电源的申请、打开、待机处理等;

5、Input设备的注册,事件的上报;

6、多点触摸设备的事件,参数;

7、方向调整;


1.首先,分析下FT5406的基本电路接口

[html]  view plain copy
  1. External Interface   
  2.     I2C/SPI: an interface for data exchange with host  
  3.     INT: an interrupt signal to inform the host processor that touch data is ready for read   
  4.     WAKE: an interrupt signal for the host to change F5x06 from Hibernate to Active mode   
  5.     /RST: an external low signal reset the chip.    


WAKE:主要靠cpu发送一个唤醒指令给FT5406。
INT:GPIO0_A2。
/RST:复位,先输出低后输出高电平。

2.需确认FT5406的从地址,以便于I2C访问得到。这个可以根据FT5406数据手册查找到——0x38
    首先配置 i2c_board_info,把从地址提供过去。
    i2c_board_info用于构建信息表来列出存在的I2C设备。这一信息用于增长新型I2C驱动的驱动模型树。对于主板,它使用i2c_register_board_info()来静态创建。对于子板,利用已知的适配器使用i2c_new_device()动态创建。
    //I2C 设备创建模板

[html]  view plain copy
  1. //mach-rk29/board-rk29-ddr3sdk.c  
  2. struct i2c_board_info {  
  3.     char type[I2C_NAME_SIZE];  //芯片类型,用于初始化i2c_client.name  
  4.     unsigned short flags;  //用于初始化i2c_client.flags  
  5.     unsigned short addr;  //存储于i2c_client.addr  
  6.     void *platform_data;  //存储于i2c_client.dev.platform_data  
  7.     struct dev_archdata *archdata;  //拷贝至i2c_client.dev.archdata  
  8.     int irq;  //存储于i2c_client.irq  
  9. };  

//使用Linux I2C驱动栈,系统可以在初始化时宣告板载信息表。这些应该在靠近arch_initcall()时的板子相关的初始化代码或同等情况时,在I2C适配器驱动被注册之前被执行。例如,主板初始化代码可以定义几个设备,也可以在叠板的每个子板初始化代码中定义。
//I2C设备会在相关的总线适配器被注册后创建。此后,标准驱动模型工具通常绑定新型I2C驱动至I2C设备。对于使用这一函数宣告的设备,在动态分配的情况下总线号是不可用的。
//传递的板子信息可以安全的是__initdata,但是由于不能拷贝,要小心嵌入式指针(如platform_data,functions等)
//静态的宣告I2C设备
在你对应的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里面加入I2C设备的i2c_board_info内容。

[html]  view plain copy
  1. int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len);  
  2. @busnum: 指定这些设备属于哪个总线  
  3. @info: I2C设备描述符向量  
  4. @len: 向量中描述符的数量;为了预留特定的总线号,可以是0。  
  5.    
  6.  i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));  
  7.   
  8. static struct i2c_board_info __initdata board_i2c0_devices[] = {  
  9. #if defined (CONFIG_TOUCHSCREEN_FT5406)  
  10.     {  
  11.         .type   ="ft5x0x_ts",  
  12.         .addr   = 0x38,    //0x70,  
  13.         .flags      =0,  
  14.         .irq        =RK29_PIN0_PA2, // support goodix tp detect, 20110706  
  15.         .platform_data = &ft5406_info,  
  16.     },  
  17. }  
  18.   
  19. struct ft5406_platform_data ft5406_info = {  
  20.   .init_platform_hwft5406_init_platform_hw, // TOUCH_RESET_PIN为输出,并先置高后置低;TOUCH_INT_PIN为输入IO。  
  21.   .exit_platform_hwft5406_exit_platform_hw,  
  22.   .platform_sleep  = ft5406_platform_sleep,  
  23.   .platform_wakeup = ft5406_platform_wakeup,  
  24. };  

内核配置项中:
CONFIG_TOUCHSCREEN_FT5406:    
\kernel\drivers\input\touchscreen
obj-$(CONFIG_TOUCHSCREEN_FT5406) += ft5x0x_i2c_ts.o

[html]  view plain copy
  1. fts_ts_probe(,)  
  2.     pdata->init_platform_hw();   //初始化IO口  
  3.     gpio_to_irq(client->irq);    //设置IO口为IRQ  
  4.     request_irq(_sui_irq_num, fts_ts_irq, GPIOEdgelFalling, client->dev.driver->name, ft5x0x_ts);  
  5.             //    中断号     中断处理函数    下降沿触发  
  6.     disable_irq(_sui_irq_num);  //关中断  
  7.     input_allocate_device();    //分配输入子系统  
  8.     __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);    //配置响应的事件类型  
  9.     __set_bit(EV_ABS, input_dev->evbit);  
  10.     input_set_abs_params(input_dev,  
  11.             ABS_MT_POSITION_X, 0, SCREEN_MAX_X/* + SCREEN_BOUNDARY_ADJUST_VALUE*/, 0, 0);  
  12.     input_set_abs_params(input_dev,  
  13.             ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y/* + SCREEN_BOUNDARY_ADJUST_VALUE*/, 0, 0);  
  14.     input_mt_init_slots(input_dev, CFG_MAX_POINT_NUM);  
  15.     input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);  
  16.     input_register_device(input_dev);   //注册输入设备  
  17.            ft5x0x_ts->early_suspend.suspend = ft5x0x_ts_early_suspend;  
  18.          ft5x0x_ts->early_suspend.resume = ft5x0x_ts_late_resume;  
  19.          init_timer(&ft5x0x_ts_timer);      
  20.          ft5x0x_ts_timer.function = ft5x0x_ts_do_timer; //fts_ts_release();超时未释放则释放中断  
  21.     enable_irq(_sui_irq_num);   

 

[html]  view plain copy
  1. irqreturn_t fts_ts_irq(int irq, void *dev_id)  
  2.     queue_work(ft5x0x_ts->ts_workqueue, &ft5x0x_ts->pen_event_work);  //具体任务是fts_work_func  
  3.         //fts_work_func(,)  
  4.         mod_timer(&ft5x0x_ts_timer ,jiffies + 6);  
  5.         fts_read_data();      
  6.         enable_irq(this_client->irq);  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于ESP32驱动FT5446触摸屏,你可以按照以下步骤进行操作: 1. 确保你的ESP32开发板已经正确连接了FT5446触摸屏。FT5446触摸屏一般通过I2C总线与ESP32连接。 2. 在你的ESP32项目中,包含Wire库,该库用于I2C通信。 3. 在代码中引入FT5446库。你可以在Arduino库管理器中搜索并安装适用于ESP32的FT5446触摸屏库。常用的库包括Adafruit_FT6206或Adafruit_FT6236。 4. 初始化I2C总线。在代码中使用`Wire.begin()`来初始化I2C总线。 5. 初始化FT5446触摸屏。根据所选库的不同,初始化方法可能会有所不同。通常,你需要使用`begin()`或`init()`方法来初始化FT5446触摸屏。 6. 读取触摸数据。根据所选库的不同,读取触摸数据的方法可能会有所不同。通常,你需要使用`touched()`来检测是否有触摸事件发生,然后使用`touchX()`和`touchY()`来获取触摸点的坐标。 下面是一个简单的示例代码: ```cpp #include <Wire.h> #include <Adafruit_FT6206.h> // 或者其他适用于ESP32的FT5446库 Adafruit_FT6206 touchScreen; void setup() { Wire.begin(); touchScreen.begin(); } void loop() { if (touchScreen.touched()) { TS_Point p = touchScreen.getPoint(); if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { // 打印触摸点的坐标 Serial.print("X = "); Serial.print(p.x); Serial.print("\tY = "); Serial.println(p.y); } } delay(100); } ``` 请根据你所选择的库的文档或示例代码进行具体设置和操作,以实现ESP32与FT5446触摸屏的正常通信和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值