微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM-Linux驱动-触摸屏驱动分析

ARM-Linux驱动-触摸屏驱动分析

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

  1. 寄存器ADC_TSC:0xd3B:11010011
  2. [8]检测光标按下中断信号
  3. [7]YM输出驱动有效(GND)
  4. [6]YP输出驱动无效(AIN5)
  5. [5]XM输出驱动无效(Hi-z)
  6. [4]XP输出驱动无效(AIN7)
  7. [3]XP上拉有效
  8. [2]普通ADC转换
  9. [0:1]等待中断模式测量X和Y的坐标
  10. */
  11. //printk("ADC_TSC:0x%x\n",WAIT4INT(0));
  12. writel(WAIT4INT(0),base_addr+S3C2410_ADCTSC);
  13. /*Initialiseinputstuff*/
  14. memset(&ts,0,sizeof(structs3c2440ts));
  15. /*
  16. 下面的函数
  17. 为新的输入设备分配内存。
  18. 使用free_device()释放没有被注册的函数,使用input_unregister_device()解除已经注册的设备
  19. 定义在/drivers/input/input.c
  20. structinput_dev*input_allocate_device(void)
  21. {
  22. structinput_dev*dev;
  23. dev=kzalloc(sizeof(structinput_dev),GFP_KERNEL);
  24. if(dev){
  25. dev->dev.type=&input_dev_type;
  26. dev->dev.class=&input_class;
  27. device_initialize(&dev->dev);
  28. mutex_init(&dev->mutex);
  29. spin_lock_init(&dev->event_lock);
  30. INIT_LIST_HEAD(&dev->h_list);
  31. INIT_LIST_HEAD(&dev->node);
  32. __module_get(THIS_MODULE);
  33. }
  34. returndev;
  35. }
  36. */
  37. input_dev=input_allocate_device();
  38. if(!input_dev){
  39. printk(KERN_ERR"Unabletoallocatetheinputdevice!!\n");
  40. return-ENOMEM;
  41. }
  42. //下面初始化输入设备信息
  43. ts.dev=input_dev;
  44. ts.dev->evbit[0]=BIT_MASK(EV_SYN)|BIT_MASK(EV_KEY)|
  45. BIT_MASK(EV_ABS);
  46. ts.dev->keybit[BIT_WORD(BTN_TOUCH)]=BIT_MASK(BTN_TOUCH);
  47. input_set_abs_params(ts.dev,ABS_X,0,0x3FF,0,0);
  48. input_set_abs_params(ts.dev,ABS_Y,0,0x3FF,0,0);
  49. input_set_abs_params(ts.dev,ABS_PRESSURE,0,1,0,0);
  50. //ts.dev->private=&ts;
  51. ts.dev->name=s3c2440ts_name;
  52. ts.dev->id.bustype=BUS_RS232;
  53. ts.dev->id.vendor=0xDEAD;
  54. ts.dev->id.product=0xBEEF;
  55. ts.dev->id.version=S3C2410TSVERSION;
  56. ts.shift=info->oversampling_shift;
  57. //printk("shift:%d\n",ts.shift);
  58. /*Getirqs*/
  59. //申请ADC中断,注意,中断类型为IRQF_SAMPLE_RANDOM|IRQF_SHARED,这样在使用触摸屏的时候
  60. //可以调试自己的ADC转换驱动,中断处理函数为adc_irq
  61. if(request_irq(IRQ_ADC,adc_irq,IRQF_SAMPLE_RANDOM|IRQF_SHARED,
  62. "s3c2440_action",ts.dev)){
  63. printk(KERN_ERR"s3c2440_ts.c:CouldnotallocatetsIRQ_ADC!\n");
  64. iounmap(base_addr);
  65. return-EIO;
  66. }
  67. //申请TC中断,中断处理函数为tc_irq
  68. if(request_irq(IRQ_TC,tc_irq,IRQF_SAMPLE_RANDOM,
  69. "s3c2440_action",ts.dev)){
  70. printk(KERN_ERR"s3c2440_ts.c:CouldnotallocatetsIRQ_TC!\n");
  71. free_irq(IRQ_ADC,ts.dev);
  72. iounmap(base_addr);
  73. return-EIO;
  74. }
  75. printk(KERN_INFO"%ssuccessfullyloaded\n",s3c2440ts_name);
  76. /*Allwentok,soregistertotheinputsystem*/
  77. /*这里注册设备
  78. 函数功能:
  79. *Thisfunctionregistersdevicewithinputcore.Thedevicemustbe
  80. *allocatedwithinput_allocate_device()andallitscapabilities
  81. *setupbeforeregistering.
  82. *Iffunctionfailsthedevicemustbefreedwithinput_free_device().
  83. *Oncedevicehasbeensuccessfullyregistereditcanbeunregistered
  84. *withinput_unregister_device();input_free_device()shouldnotbe
  85. *calledinthiscase.
  86. 函数原型如下:
  87. intinput_register_device(structinput_dev*dev)
  88. {
  89. staticatomic_tinput_no=ATOMIC_INIT(0);
  90. structinput_handler*handler;
  91. constchar*path;
  92. interror;
  93. __set_bit(EV_SYN,dev->evbit);
  94. init_timer(&dev->timer);
  95. if(!dev->rep[REP_DELAY]&&!dev->rep[REP_PERIOD]){
  96. dev->timer.data=(long)dev;
  97. dev->timer.function=input_repeat_key;
  98. dev->rep[REP_DELAY]=250;
  99. dev->rep[REP_PERIOD]=33;
  100. }
  101. if(!dev->getkeycode)
  102. dev->getkeycode=input_default_getkeycode;
  103. if(!dev->setkeycode)
  104. dev->setkeycode=input_default_setkeycode;
  105. snprintf(dev->dev.bus_id,sizeof(dev->dev.bus_id),
  106. "input%ld",(unsignedlong)atomic_inc_return(&input_no)-1);
  107. error=device_add(&dev->dev);
  108. if(error)
  109. returnerror;
  110. path=kobject_get_path(&dev->dev.kobj,GFP_KERNEL);
  111. printk(KERN_INFO"input:%sas%s\n",
  112. dev->name?dev->name:"Unspecifieddevice",path?path:"N/A");
  113. kfree(path);
  114. error=mutex_lock_interruptible(&input_mutex);
  115. if(error){
  116. device_del(&dev->dev);
  117. returnerror;
  118. }
  119. list_add_tail(&dev->node,&input_dev_list);
  120. list_for_each_entry(handler,&input_handler_list,node)
  121. input_attach_handler(dev,handler);
  122. input_wakeup_procfs_readers();
  123. mutex_unlock(&input_mutex);
  124. re

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

网站地图

Top