微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S5PV210(TQ210)学习笔记——触摸屏驱动编写

S5PV210(TQ210)学习笔记——触摸屏驱动编写

时间:11-28 来源:互联网 点击:

    1. msgs[0].addr=client->

    2. msgs[1].addr=client->
    3. ret=i2c_transfer(client->
    4. msg.addr=client->

    5. ret=i2c_transfer(client->

    6. config_info[62]=480>>
    7. config_info[64]=800>>
    8. disable_irq_nosync(this_client->

    9. *work){

    10. intret;
    11. unsignedcharpoint_data[19]={0x07,0x21,0};
    12. unsignedshortinput_x=0;
    13. unsignedshortinput_y=0;
    14. unsignedshortinput_p=0;
    15. ret=i2c_read_bytes(this_client,point_data,sizeof(point_data)/sizeof(point_data[0]));
    16. if(ret<=0){
    17. printk("Failed");
    18. return;
    19. }
    20. if(point_data[2]&0x1){
    21. status=1;
    22. input_y=479-((point_data[4]<8)|point_data[5]);
    23. input_x=799-((point_data[6]<8)|point_data[7]);
    24. input_p=point_data[8];
    25. printk("stat:%d,x:%d,y:%d,p:%d",point_data[2],input_x,input_y,
    26. input_p);
    27. }
    28. elseif(status){
    29. status=0;
    30. printk("up");
    31. }
    32. enable_irq(this_client->irq);
    33. }
    34. staticintts_probe(structi2c_client*client,conststructi2c_device_id*id){
    35. intretry,ret;
    36. chartest_data;
    37. printk("ts_probe");
    38. test_data=0;
    39. gt811_rst=S5PV210_GPD0(3);
    40. gt811_int=S5PV210_GPH1(6);
    41. gpio_request(gt811_rst,"reset");
    42. gpio_request(gt811_rst,"tsint");
    43. if(!i2c_check_functionality(client->adapter,I2C_FUNC_I2C))
    44. {
    45. dev_err(&client->dev,"MusthaveI2C_FUNC_I2C.");
    46. return-ENODEV;
    47. }
    48. s3c_gpio_setpull(gt811_rst,S3C_GPIO_PULL_UP);
    49. for(retry=0;retry<5;retry++)
    50. {
    51. gpio_direction_output(gt811_rst,0);
    52. msleep(1);
    53. gpio_direction_input(gt811_rst);
    54. msleep(100);
    55. ret=i2c_write_bytes(client,&test_data,1);
    56. if(ret>0)
    57. break;
    58. dev_info(&client->dev,"GT811I2CTESTFAILED!PleasechecktheHARDWAREconnect");
    59. }
    60. if(ret<=0)
    61. {
    62. dev_err(&client->dev,"Warnning:I2CcommunicationmightbeERROR!");
    63. return-ENODEV;
    64. }
    65. for(retry=0;retry!=5;++retry){
    66. ret=ts_init_panel(client);
    67. if(ret!=0){
    68. continue;
    69. }
    70. else{
    71. break;
    72. }
    73. }
    74. if(ret!=0){
    75. printk("GT811Configuefailed!");
    76. return-ENODEV;
    77. }
    78. this_client=client;
    79. ts_input=input_allocate_device();
    80. if(IS_ERR(ts_input)){
    81. printk("GT811allocatetsinputdevicefailed!");
    82. return-ENOMEM;
    83. }
    84. ts_input->evbit[0]=BIT_MASK(EV_SYN)|BIT_MASK(EV_KEY)|BIT_MASK(EV_ABS);
    85. ts_input->keybit[BIT_WORD(BTN_TOUCH)]=BIT_MASK(BTN_TOUCH);
    86. ts_input->absbit[0]=BIT(ABS_X)|BIT(ABS_Y)|BIT(ABS_PRESSURE);
    87. input_set_abs_params(ts_input,ABS_Y,0,799,0,0);
    88. input_set_abs_params(ts_input,ABS_X,0,479,0,0);
    89. input_set_abs_params(ts_input,ABS_PRESSURE,0,255,0,0);
    90. ts_input->name="tq210-ts";
    91. ts_input->phys="input/ts";
    92. ts_input->id.bustype=BUS_I2C;
    93. ts_input->id.product=0xBEEF;
    94. ts_input->id.vendor=0xDEAD;
    95. ret=input_register_device(ts_input);
    96. if(ret<0){
    97. printk("Unableregister%sinputdevice!",ts_input->name);
    98. input_free_device(ts_input);
    99. return-ENOMEM;
    100. }
    101. client->irq=IRQ_EINT(14);
    102. s3c_gpio_setpull(gt811_int,S3C_GPIO_PULL_UP);
    103. if(request_irq(IRQ_EINT(14),gt811_int_handler,IRQF_TRIGGER_FALLING,"gt811-int",NULL)<0){
    104. printk("Requestirqforgt811failed!");
    105. input_unregister_device(ts_input);
    106. input_free_device(ts_input);
    107. return-ENOMEM;
    108. }
    109. wq=create_workqueue("ts_handle_thread");
    110. if(wq==NULL){
    111. printk(KERN_ALERT"creteworkqueuefailed!");
    112. input_unregister_device(ts_input);
    113. input_free_device(ts_input);
    114. free_irq(IRQ_EINT(14),NULL);
    115. return-ENOMEM;
    116. }
    117. INIT_WORK(&work,ts_work_func);
    118. return0;
    119. }
    120. staticintts_remove(structi2c_client*client){
    121. free_irq(IRQ_EINT(14),NULL);
    122. enable_irq(client->irq);
    123. flush_workqueue(wq);
    124. destroy_workqueue(wq);
    125. input_unregister_device(ts_input);
    126. input_free_device(ts_input);
    127. gpio_free(gt811_rst);
    128. gpio_free(gt811_int);
    129. return0;
    130. }
    131. staticstructi2c_driverts_driver={
    132. .driver={
    133. .name="tq210-ts",
    134. .owner=THIS_MODULE,
    135. },
    136. .probe=ts_probe,
    137. .remove=ts_remove,
    138. .id_table=ts_id,
    139. .address_list=normal_address,
    140. };
    141. staticintts_init(void){
    142. printk("init");
    143. i2c_add_driver(&ts_driver);
    144. return0;
    145. }
    146. staticvoidts_exit(void){
    147. i2c_del_driver(&ts_driver);
    148. printk("exit");
    149. }
    150. module_init(ts_init);
    151. module_exit(ts_exit);
    152. MODULE_LICENSE("GPL");
    153. 这并不是完整的代码,一方面是没有做异常处理,另一方面是没有上报消息,只是简单的驱动了TQ210的触摸屏部分,如果您需要拿去自己略作修改即可使用。

      三 注册TS的I2C模块设备

      注册TS的I2C模块很简单,在Linux内核文件arch/arm/mach-s5pv210/mach-smdkv210.c文件的I2C通道2结构体中加入TS的I2C地址,也就是0x5d,添加后如下

      1. staticstructi2c_board_infosmdkv210_i2c_devs2[]__initdata={
      2. /*ToB

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top