一个简单的触摸驱动,为什么没有输出任何信息?
编译完生成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"); 编译内核的时候,除了配置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]