s3c2440触摸屏驱动

来源:互联网 发布:java入门课程 编辑:程序博客网 时间:2024/05/22 03:32

以下程序来自韦东山视频里讲解的驱动,我只是在其中添加了些注释

#include <linux/errno.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/input.h>#include <linux/init.h>#include <linux/serio.h>#include <linux/delay.h>#include <linux/platform_device.h>#include <linux/clk.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/plat-s3c24xx/ts.h>#include <asm/arch/regs-adc.h>#include <asm/arch/regs-gpio.h>struct s3c_ts_regs {unsigned long adccon;unsigned long adctsc;unsigned long adcdly;unsigned long adcdat0;unsigned long adcdat1;unsigned long adcupdn;};static struct input_dev *s3c_ts_dev;static volatile struct s3c_ts_regs *s3c_ts_regs;static void enter_wait_pen_down_mode(void){s3c_ts_regs->adctsc = 0xd3;}static void enter_wait_pen_up_mode(void){s3c_ts_regs->adctsc = 0x1d3;}static irqreturn_t pen_down_up_irq(int irq, void *dev_id){if (s3c_ts_regs->adcdat0 & (1<<15)){printk("pen up\n");enter_wait_pen_down_mode();}else{printk("pen down\n");enter_wait_pen_up_mode();}return IRQ_HANDLED;}static int s3c_ts_init(void){struct clk* clk;/* 1. 分配一个input_dev结构体 */s3c_ts_dev = input_allocate_device();/* 2. 设置 *//* 2.1 能产生哪类事件 */set_bit(EV_KEY, s3c_ts_dev->evbit);                //可产生按键类事件set_bit(EV_ABS, s3c_ts_dev->evbit);                //可产生绝对位移类事件/* 2.2 能产生这类事件里的哪些事件 */               //可产生触摸事件set_bit(BTN_TOUCH, s3c_ts_dev->keybit);               input_set_abs_params(s3c_ts_dev, ABS_X, 0, 0x3FF, 0, 0);           input_set_abs_params(s3c_ts_dev, ABS_Y, 0, 0x3FF, 0, 0);input_set_abs_params(s3c_ts_dev, ABS_PRESSURE, 0, 1, 0, 0);/* 3. 注册 */input_register_device(s3c_ts_dev);/* 4. 硬件相关的操作 *//* 4.1 使能时钟(CLKCON[15]) */clk = clk_get(NULL, "adc");clk_enable(clk);/* 4.2 设置S3C2440的ADC/TS寄存器 */s3c_ts_regs = ioremap(0x58000000, sizeof(struct s3c_ts_regs));//这种写法很巧妙,先定义一个结构体s3c_ts_regs,然后定义一个结构体变量s3c_ts_regs,再地址映射,这样//当操作结构体变量s3c_ts_regs里的元素时就相当于操作以地址0x58000000开始,后面的寄存器。/* bit[14]  : 1-A/D converter prescaler enable * bit[13:6]: A/D converter prescaler value, *            49, ADCCLK=PCLK/(49+1)=50MHz/(49+1)=1MHz * bit[0]: A/D conversion starts by enable. 先设为0 */s3c_ts_regs->adccon = (1<<14)|(49<<6);request_irq(IRQ_TC, pen_down_up_irq, IRQF_SAMPLE_RANDOM, "ts_pen", NULL);enter_wait_pen_down_mode();return 0;}static void s3c_ts_exit(void){free_irq(IRQ_TC, NULL);iounmap(s3c_ts_regs);input_unregister_device(s3c_ts_dev);input_free_device(s3c_ts_dev);}module_init(s3c_ts_init);module_exit(s3c_ts_exit);MODULE_LICENSE("GPL");



0 0
原创粉丝点击