ARM-Linux驱动-触摸屏驱动分析
时间:11-20
来源:互联网
点击:
- 寄存器ADC_TSC:0xd3B:11010011
- [8]检测光标按下中断信号
- [7]YM输出驱动有效(GND)
- [6]YP输出驱动无效(AIN5)
- [5]XM输出驱动无效(Hi-z)
- [4]XP输出驱动无效(AIN7)
- [3]XP上拉有效
- [2]普通ADC转换
- [0:1]等待中断模式测量X和Y的坐标
- */
- //printk("ADC_TSC:0x%x\n",WAIT4INT(0));
- writel(WAIT4INT(0),base_addr+S3C2410_ADCTSC);
- /*Initialiseinputstuff*/
- memset(&ts,0,sizeof(structs3c2440ts));
- /*
- 下面的函数
- 为新的输入设备分配内存。
- 使用free_device()释放没有被注册的函数,使用input_unregister_device()解除已经注册的设备
- 定义在/drivers/input/input.c
- structinput_dev*input_allocate_device(void)
- {
- structinput_dev*dev;
- dev=kzalloc(sizeof(structinput_dev),GFP_KERNEL);
- if(dev){
- dev->dev.type=&input_dev_type;
- dev->dev.class=&input_class;
- device_initialize(&dev->dev);
- mutex_init(&dev->mutex);
- spin_lock_init(&dev->event_lock);
- INIT_LIST_HEAD(&dev->h_list);
- INIT_LIST_HEAD(&dev->node);
- __module_get(THIS_MODULE);
- }
- returndev;
- }
- */
- input_dev=input_allocate_device();
- if(!input_dev){
- printk(KERN_ERR"Unabletoallocatetheinputdevice!!\n");
- return-ENOMEM;
- }
- //下面初始化输入设备信息
- ts.dev=input_dev;
- ts.dev->evbit[0]=BIT_MASK(EV_SYN)|BIT_MASK(EV_KEY)|
- BIT_MASK(EV_ABS);
- ts.dev->keybit[BIT_WORD(BTN_TOUCH)]=BIT_MASK(BTN_TOUCH);
- input_set_abs_params(ts.dev,ABS_X,0,0x3FF,0,0);
- input_set_abs_params(ts.dev,ABS_Y,0,0x3FF,0,0);
- input_set_abs_params(ts.dev,ABS_PRESSURE,0,1,0,0);
- //ts.dev->private=&ts;
- ts.dev->name=s3c2440ts_name;
- ts.dev->id.bustype=BUS_RS232;
- ts.dev->id.vendor=0xDEAD;
- ts.dev->id.product=0xBEEF;
- ts.dev->id.version=S3C2410TSVERSION;
- ts.shift=info->oversampling_shift;
- //printk("shift:%d\n",ts.shift);
- /*Getirqs*/
- //申请ADC中断,注意,中断类型为IRQF_SAMPLE_RANDOM|IRQF_SHARED,这样在使用触摸屏的时候
- //可以调试自己的ADC转换驱动,中断处理函数为adc_irq
- if(request_irq(IRQ_ADC,adc_irq,IRQF_SAMPLE_RANDOM|IRQF_SHARED,
- "s3c2440_action",ts.dev)){
- printk(KERN_ERR"s3c2440_ts.c:CouldnotallocatetsIRQ_ADC!\n");
- iounmap(base_addr);
- return-EIO;
- }
- //申请TC中断,中断处理函数为tc_irq
- if(request_irq(IRQ_TC,tc_irq,IRQF_SAMPLE_RANDOM,
- "s3c2440_action",ts.dev)){
- printk(KERN_ERR"s3c2440_ts.c:CouldnotallocatetsIRQ_TC!\n");
- free_irq(IRQ_ADC,ts.dev);
- iounmap(base_addr);
- return-EIO;
- }
- printk(KERN_INFO"%ssuccessfullyloaded\n",s3c2440ts_name);
- /*Allwentok,soregistertotheinputsystem*/
- /*这里注册设备
- 函数功能:
- *Thisfunctionregistersdevicewithinputcore.Thedevicemustbe
- *allocatedwithinput_allocate_device()andallitscapabilities
- *setupbeforeregistering.
- *Iffunctionfailsthedevicemustbefreedwithinput_free_device().
- *Oncedevicehasbeensuccessfullyregistereditcanbeunregistered
- *withinput_unregister_device();input_free_device()shouldnotbe
- *calledinthiscase.
- 函数原型如下:
- intinput_register_device(structinput_dev*dev)
- {
- staticatomic_tinput_no=ATOMIC_INIT(0);
- structinput_handler*handler;
- constchar*path;
- interror;
- __set_bit(EV_SYN,dev->evbit);
- init_timer(&dev->timer);
- if(!dev->rep[REP_DELAY]&&!dev->rep[REP_PERIOD]){
- dev->timer.data=(long)dev;
- dev->timer.function=input_repeat_key;
- dev->rep[REP_DELAY]=250;
- dev->rep[REP_PERIOD]=33;
- }
- if(!dev->getkeycode)
- dev->getkeycode=input_default_getkeycode;
- if(!dev->setkeycode)
- dev->setkeycode=input_default_setkeycode;
- snprintf(dev->dev.bus_id,sizeof(dev->dev.bus_id),
- "input%ld",(unsignedlong)atomic_inc_return(&input_no)-1);
- error=device_add(&dev->dev);
- if(error)
- returnerror;
- path=kobject_get_path(&dev->dev.kobj,GFP_KERNEL);
- printk(KERN_INFO"input:%sas%s\n",
- dev->name?dev->name:"Unspecifieddevice",path?path:"N/A");
- kfree(path);
- error=mutex_lock_interruptible(&input_mutex);
- if(error){
- device_del(&dev->dev);
- returnerror;
- }
- list_add_tail(&dev->node,&input_dev_list);
- list_for_each_entry(handler,&input_handler_list,node)
- input_attach_handler(dev,handler);
- input_wakeup_procfs_readers();
- mutex_unlock(&input_mutex);
- re
ARMLinux驱动触摸屏驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
