ARM-Linux驱动-触摸屏驱动分析
时间:11-20
来源:互联网
点击:
- turn0;
- }
- */
- rc=input_register_device(ts.dev);
- if(rc){
- free_irq(IRQ_TC,ts.dev);
- free_irq(IRQ_ADC,ts.dev);
- clk_disable(adc_clock);
- iounmap(base_addr);
- return-EIO;
- }
- return0;
- }
- staticints3c2440ts_remove(structplatform_device*pdev)
- {
- disable_irq(IRQ_ADC);
- disable_irq(IRQ_TC);
- free_irq(IRQ_TC,ts.dev);
- free_irq(IRQ_ADC,ts.dev);
- if(adc_clock){
- clk_disable(adc_clock);
- clk_put(adc_clock);
- adc_clock=NULL;
- }
- input_unregister_device(ts.dev);
- iounmap(base_addr);
- return0;
- }
- #ifdefCONFIG_PM
- staticints3c2440ts_suspend(structplatform_device*pdev,pm_message_tstate)
- {
- writel(TSC_SLEEP,base_addr+S3C2410_ADCTSC);
- writel(readl(base_addr+S3C2410_ADCCON)|S3C2410_ADCCON_STDBM,
- base_addr+S3C2410_ADCCON);
- disable_irq(IRQ_ADC);
- disable_irq(IRQ_TC);
- clk_disable(adc_clock);
- return0;
- }
- staticints3c2440ts_resume(structplatform_device*pdev)
- {
- structs3c2440_ts_mach_info*info=
- (structs3c2440_ts_mach_info*)pdev->dev.platform_data;
- clk_enable(adc_clock);
- msleep(1);
- enable_irq(IRQ_ADC);
- enable_irq(IRQ_TC);
- if((info->presc&0xff)>0)
- writel(S3C2410_ADCCON_PRSCEN|S3C2410_ADCCON_PRSCVL(info->presc&0xFF),\
- base_addr+S3C2410_ADCCON);
- else
- writel(0,base_addr+S3C2410_ADCCON);
- /*Initialiseregisters*/
- if((info->delay&0xffff)>0)
- writel(info->delay&0xffff,base_addr+S3C2410_ADCDLY);
- writel(WAIT4INT(0),base_addr+S3C2410_ADCTSC);
- return0;
- }
- #else
- #defines3c2440ts_suspendNULL
- #defines3c2440ts_resumeNULL
- #endif
- /*
- 下面是/linux/platform_device.h定义的platform_driver结构体
- structplatform_driver{
- int(*probe)(structplatform_device*);//设备的检测,所以需要先前的设备注册
- int(*remove)(structplatform_device*);//删除该设备
- void(*shutdown)(structplatform_device*);//关闭该设备
- int(*suspend)(structplatform_device*,pm_message_tstate);
- int(*suspend_late)(structplatform_device*,pm_message_tstate);
- int(*resume_early)(structplatform_device*);
- int(*resume)(structplatform_device*);
- structpm_ext_ops*pm;
- structdevice_driverdriver;//设备驱动,定义在include/linux/device.h中
- };
- 内核提供的platform_driver结构体的注册函数为platform_driver_register(),该函数定义在driver/base/platform.c中
- */
- staticstructplatform_drivers3c2440ts_driver={
- .driver={
- .name="s3c2440-ts",
- .owner=THIS_MODULE,
- },
- .probe=s3c2440ts_probe,
- .remove=s3c2440ts_remove,
- .suspend=s3c2440ts_suspend,
- .resume=s3c2440ts_resume,
- };
- staticint__inits3c2440ts_init(void)
- {
- intrc;
- rc=platform_driver_register(&s3c2440ts_driver);
- if(rc<0)
- printk(KERN_ERR"platform_driver_registererror!\n");
- returnrc;
- }
- staticvoid__exits3c2440ts_exit(void)
- {
- platform_driver_unregister(&s3c2440ts_driver);
- }
- module_init(s3c2440ts_init);
- module_exit(s3c2440ts_exit);
- MODULE_AUTHOR("YANMING");
- MODULE_DESCRIPTION("Mys3c2440touchscreendriver");
- MODULE_LICENSE("GPL");
从触摸屏被按下到系统相应的过程如下:
(1) 当触摸屏感觉到触摸,触发IRQ_TC中断,然后读取触摸屏控制寄存器的值,判断是否被按下,如果被按下,启动定时器,执行touch_timer_fire()函数启动ADC转换。
(2) ADC转换完成后,会触发IRQ_ADC中断,执行相应的中断处理函数,如果ADC转换次数小于4,再次启动ADC转换;如果ADC转换次数为4,则启动一个系统滴答定时器,执行touch_timer_fire()函数
(3) 执行定时器服务程序时,如果此时触摸屏仍被按下,则上报事件和坐标数据,重复(2);如果没有被按下,上报时间和坐标数据,将触摸屏控制寄存器设置为中断等待状态
可见,触摸屏驱动的服务是一个封闭的循环过程。
ARMLinux驱动触摸屏驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
