zhq654473607 发表于 2012-09-30 17:36

一个简单的触摸驱动,为什么没有输出任何信息?


编译完生成ts.ko后
用insmod ts.ko时,出现input: Unspecified device as /devices/virtual/input/input0警告,但是ts.ko还是添加成功。
如果没有出现预期的结果:
按下:输出pen down
松开:输出pen up

我用的板子是s3c6410,求高手指教!在线等候。。。
#include <linux/module.h>

#include <linux/init.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/sysctl.h>
#include <linux/proc_fs.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/io.h>
#include <linux/clk.h>

static struct input_dev *ts_dev;

struct adc_regs {
        unsigned long adccon;
        unsigned long adctsc;
        unsigned long adcdly;
        unsigned long adcdat0;
        unsigned long adcdat1;
        unsigned long adcupdn;
        unsigned long adcclrint;
        unsigned long reserved;
        unsigned long adcclrintpndnup;
};

static struct adc_regs *adc_regs;

static void enter_wait_for_pen_down(void)
{
        adc_regs->adctsc = 0xd3;
}

static void enter_wait_for_pen_up(void)
{
        adc_regs->adctsc = 0x1d3;
}


static irqreturn_t ts_pen_down_up_isr(int irq, void *dev_id)
{
        if (adc_regs->adcdat0 & (1<<15))
        {
                printk("pen up\n");
                enter_wait_for_pen_down();
        }
        else
        {
                printk("pen down\n");
                enter_wait_for_pen_up();
        }

        adc_regs->adcclrintpndnup = 0;

        return IRQ_HANDLED;
}

static int ts_init(void)
{
        struct clk *clk;
       
        /* 1. 分配input_dev */
        ts_dev = input_allocate_device();
       
        /* 2. 设置 */
        /* 2.1 能产生哪类事件 */
        set_bit(EV_KEY, ts_dev->evbit);
        set_bit(EV_ABS, ts_dev->evbit);
       
        /* 2.2 能产生这类事件里的哪些事件 */
        set_bit(BTN_TOUCH, ts_dev->keybit);
        input_set_abs_params(ts_dev, ABS_X, 0, 0xfff, 0, 0);
        input_set_abs_params(ts_dev, ABS_Y, 0, 0xfff, 0, 0);
        input_set_abs_params(ts_dev, ABS_PRESSURE, 0, 1, 0, 0);
       
        /* 3. 注册 */
        input_register_device(ts_dev);
       
        /* 4. 硬件相关 */
        adc_regs = ioremap(0x7E00B000, sizeof(struct adc_regs));

        clk = clk_get(NULL, "adc");
        clk_enable(clk);/* PCLK_GATE设为1 */

        /* bit   : 1 = 12-bit A/D conversion
       * bit   : 1 - enable A/D converter prescaler enable
       * bit : A/D converter prescaler value,
       *             PCLK=66500000, adcclk=pclk/(n+1)
       *             取值13, adclk=66.5MHz/14=4.75
       *
       */
        adc_regs->adccon = (1<<16) | (1<<14) | (13<<6);

        adc_regs->adcclrintpndnup = 0;
        request_irq(IRQ_TC, ts_pen_down_up_isr, IRQF_SHARED, "pen_down_up", 1);

        /* 进入"wait for interrupt mode", 等待触摸笔按下或松开的模式 */
        enter_wait_for_pen_down();
        return 0;
}

static void ts_exit(void)
{
        free_irq(IRQ_TC, 1);
        iounmap(adc_regs);
        input_unregister_device(ts_dev);
        input_free_device(ts_dev);
}

module_init(ts_init);
module_exit(ts_exit);
MODULE_LICENSE("GPL");

zhq654473607 发表于 2012-09-30 22:31

编译内核的时候,除了配置make menuconfig
[ ]   Touchscreens--->   除掉之外,应该在其他地方不用配置什么的了吧!
我在cat /pro/interrupts 时结果如下

/ # cat /proc/interrupts
         CPU0
16:      106    s3c-uarts3c6400-uart
18:      175    s3c-uarts3c6400-uart
35:          0         VICs3c-fimc0
36:          0         VICs3c-fimc1
40:          0         VICs3c-g3d
41:          0         VICs3c-vpp
42:          0         VICs3c-rotator
43:          0         VICs3c-g2d
44:          0         VICTV_ENCODER
45:          0         VICTV_SCALER
47:          0         VICs3c-jpeg
48:          0         VICs3c-mfc
62:      42841         VICs3c-lcd
68:          6         VICAC97
73:          9         VICs3cspi-dma, s3cspi-dma
79:         36         VICohci_hcd:usb1
80:          0         VICs3c-spi
82:          4         VICs3c2440-i2c
88:         22         VICmmc0
89:         41         VICmmc1
90:          1         VICs3c-udc
98:          8   s3c-timerpwm_timer2
100:       5021   s3c-timerpwm_timer4
108:       3600    s3c-einteth0
113:          1    s3c-eintmmc0
151:          0s3c-eint-groupmcp2515

不知道,加入自己的驱动之后,是不是还有某个地方被我忽略了,求各位指点!
页: [1]
查看完整版本: 一个简单的触摸驱动,为什么没有输出任何信息?