⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 移植文档.txt

📁 包含触摸屏驱动源码(for s3c2410)以及触摸屏驱动,USB键盘鼠标移植详细步骤,tslib触摸屏校准程序的移植使用,包括错误解决方法.
💻 TXT
📖 第 1 页 / 共 2 页
字号:

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* Initialise registers */

if ((info->delay&0xffff) > 0)

writel(info->delay & 0xffff, base_addr+S3C2410_ADCDLY);

<!--[if !supportEmptyParas]--> <!--[endif]-->

writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);

/* Initialise input stuff */

memset(&ts, 0, sizeof(struct s3c2410ts));

init_input_dev(&ts.dev);

ts.dev.evbit[0] = ts.dev.evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);

ts.dev.keybit[LONG(BTN_TOUCH)] = BIT(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);

<!--[if !supportEmptyParas]--> <!--[endif]-->

sprintf(ts.phys, "ts0");

<!--[if !supportEmptyParas]--> <!--[endif]-->

ts.dev.private = &ts;

ts.dev.name = s3c2410ts_name;

ts.dev.phys = ts.phys;

ts.dev.id.bustype = BUS_RS232;

ts.dev.id.vendor = 0xDEAD;

ts.dev.id.product = 0xBEEF;

ts.dev.id.version = S3C2410TSVERSION;

<!--[if !supportEmptyParas]--> <!--[endif]-->

ts.shift = info->oversampling_shift;

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* Get irqs */

if (request_irq(IRQ_ADC, stylus_action, SA_SAMPLE_RANDOM,

"s3c2410_action", &ts.dev)) {

printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_ADC !\n");

iounmap(base_addr);

return -EIO;

}

if (request_irq(IRQ_TC, stylus_updown, SA_SAMPLE_RANDOM,

"s3c2410_updown", &ts.dev)) {

printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_TC !\n");

iounmap(base_addr);

return -EIO;

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

printk(KERN_INFO "%s successfully loaded\n", s3c2410ts_name);

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* All went ok, so register to the input system */

input_register_device(&ts.dev);

<!--[if !supportEmptyParas]--> <!--[endif]-->

return 0;

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

static int s3c2410ts_remove(struct device *dev)

{

disable_irq(IRQ_ADC);

disable_irq(IRQ_TC);

free_irq(IRQ_TC,&ts.dev);

free_irq(IRQ_ADC,&ts.dev);

<!--[if !supportEmptyParas]--> <!--[endif]-->

if (adc_clock) {

clk_disable(adc_clock);

clk_unuse(adc_clock);

clk_put(adc_clock);

adc_clock = NULL;

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

input_unregister_device(&ts.dev);

iounmap(base_addr);

<!--[if !supportEmptyParas]--> <!--[endif]-->

return 0;

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

static struct device_driver s3c2410ts_driver = {

.name = "s3c2410-ts",

.bus = &platform_bus_type,

.probe = s3c2410ts_probe,

.remove = s3c2410ts_remove,

};

<!--[if !supportEmptyParas]--> <!--[endif]-->

<!--[if !supportEmptyParas]--> <!--[endif]-->

int __init s3c2410ts_init(void)

{

return driver_register(&s3c2410ts_driver);

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

void __exit s3c2410ts_exit(void)

{

driver_unregister(&s3c2410ts_driver);

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

module_init(s3c2410ts_init);

module_exit(s3c2410ts_exit);

<!--[if !supportEmptyParas]--> <!--[endif]-->

/*

Local variables:

compile-command: "make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux- -k -C ../../.."

c-basic-offset: 8

End:

*/

2、将s3c2410_ts.h文件拷贝到include/asm/arch-s3c2410/目录下,其内容为:

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* linux/include/asm/arch-s3c2410/s3c2410_ts.h

*

* Copyright (c) 2005 Arnaud Patard 

*

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License version 2 as

* published by the Free Software Foundation.

*

*

* Changelog:

* 24-Mar-2005 RTP Created file

*/

<!--[if !supportEmptyParas]--> <!--[endif]-->

#ifndef __ASM_ARM_S3C2410_TS_H

#define __ASM_ARM_S3C2410_TS_H

<!--[if !supportEmptyParas]--> <!--[endif]-->

struct s3c2410_ts_mach_info {

int delay;

int presc;

int oversampling_shift;

};

<!--[if !supportEmptyParas]--> <!--[endif]-->

void __init set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info); 

<!--[if !supportEmptyParas]--> <!--[endif]-->

#endif /* __ASM_ARM_S3C2410_TS_H */

3、添加include/asm-arm/arch-s3c2410/regs-adc.h文件,其内容为:

/* linux/include/asm/arch-s3c2410/regs-adc.h

*

* Copyright (c) 2004 Shannon Holland 

*

* This program is free software; yosu can redistribute it and/or modify

* it under the terms of the GNU General Public License version 2 as

* published by the Free Software Foundation.

*

* S3C2410 ADC registers

*

* Changelog:

* 27-09-2004 SAH Created file

*/

<!--[if !supportEmptyParas]--> <!--[endif]-->

#ifndef __ASM_ARCH_REGS_ADC_H

#define __ASM_ARCH_REGS_ADC_H "regs-adc.h"

<!--[if !supportEmptyParas]--> <!--[endif]-->

#define S3C2410_ADCREG(x) (x)

<!--[if !supportEmptyParas]--> <!--[endif]-->

#define S3C2410_ADCCON S3C2410_ADCREG(0x00)

#define S3C2410_ADCTSC S3C2410_ADCREG(0x04)

#define S3C2410_ADCDLY S3C2410_ADCREG(0x08)

#define S3C2410_ADCDAT0 S3C2410_ADCREG(0x0C)

#define S3C2410_ADCDAT1 S3C2410_ADCREG(0x10)

<!--[if !supportEmptyParas]--> <!--[endif]-->

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* ADCCON Register Bits */

#define S3C2410_ADCCON_ECFLG (1<<15)

#define S3C2410_ADCCON_PRSCEN (1<<14)

#define S3C2410_ADCCON_PRSCVL(x) (((x)&0xFF)<<6)

#define S3C2410_ADCCON_PRSCVLMASK (0xFF<<6)

#define S3C2410_ADCCON_SELMUX(x) (((x)&0x7)<<3)

#define S3C2410_ADCCON_MUXMASK (0x7<<3)

#define S3C2410_ADCCON_STDBM (1<<2)

#define S3C2410_ADCCON_READ_START (1<<1)

#define S3C2410_ADCCON_ENABLE_START (1<<0)

#define S3C2410_ADCCON_STARTMASK (0x3<<0)

<!--[if !supportEmptyParas]--> <!--[endif]-->

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* ADCTSC Register Bits */

#define S3C2410_ADCTSC_YM_SEN (1<<7)

#define S3C2410_ADCTSC_YP_SEN (1<<6)

#define S3C2410_ADCTSC_XM_SEN (1<<5)

#define S3C2410_ADCTSC_XP_SEN (1<<4)

#define S3C2410_ADCTSC_PULL_UP_DISABLE (1<<3)

#define S3C2410_ADCTSC_AUTO_PST (1<<2)

#define S3C2410_ADCTSC_XY_PST(x) (((x)&0x3)<<0)

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* ADCDAT0 Bits */

#define S3C2410_ADCDAT0_UPDOWN (1<<15)

#define S3C2410_ADCDAT0_AUTO_PST (1<<14)

#define S3C2410_ADCDAT0_XY_PST (0x3<<12)

#define S3C2410_ADCDAT0_XPDATA_MASK (0x03FF)

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* ADCDAT1 Bits */

#define S3C2410_ADCDAT1_UPDOWN (1<<15)

#define S3C2410_ADCDAT1_AUTO_PST (1<<14)

#define S3C2410_ADCDAT1_XY_PST (0x3<<12)

#define S3C2410_ADCDAT1_YPDATA_MASK (0x03FF)

<!--[if !supportEmptyParas]--> <!--[endif]-->

#endif /* __ASM_ARCH_REGS_ADC_H */

二、修改内核其他文件

1、在arch/arm/mach-s3c2410/devs.c文件中添加如下几行:

#include 

<!--[if !supportEmptyParas]--> <!--[endif]-->

/* Touchscreen */

static struct s3c2410_ts_mach_info s3c2410ts_info;

<!--[if !supportEmptyParas]--> <!--[endif]-->

void __init set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
{

memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(struct s3c2410_ts_mach_info));

}

EXPORT_SYMBOL(set_s3c2410ts_info);

<!--[if !supportEmptyParas]--> <!--[endif]-->

struct platform_device s3c_device_ts = {

.name = "s3c2410-ts",

.id = -1,

.dev = {

.platform_data = &s3c2410ts_info,

}

};

EXPORT_SYMBOL(s3c_device_ts);

2、在arch/arm/mach-s3c2410/devs.h文件中添加:

extern struct platform_device s3c_device_ts;

3、在arch/arm/mach-s3c2410/mach-smdk2410.c中添加:

#include 

<!--[if !supportEmptyParas]--> <!--[endif]-->

<!--[if !supportEmptyParas]--> <!--[endif]-->

static struct s3c2410_ts_mach_info sbc2410_ts_cfg __initdata = {

.delay = 10000,

.presc = 49,

.oversampling_shift = 2,

};

<!--[if !supportEmptyParas]--> <!--[endif]-->

在smdk2410_devices结构中,添加:

&s3c_device_ts,

<!--[if !supportEmptyParas]--> <!--[endif]-->

在smdk2410_map_io函数中添加:

set_s3c2410ts_info(&sbc2410_ts_cfg);

4、在drivers/input/touchscreen/Kconfig中添加:

config TOUCHSCREEN_S3C2410

tristate "Samsung S3C2410 touchscreen input driver"

depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN

select SERIO

help

Say Y here if you have the s3c2410 touchscreen.

<!--[if !supportEmptyParas]--> <!--[endif]-->

If unsure, say N.

<!--[if !supportEmptyParas]--> <!--[endif]-->

To compile this driver as a module, choose M here: the

module will be called s3c2410_ts.

<!--[if !supportEmptyParas]--> <!--[endif]-->

config TOUCHSCREEN_S3C2410_DEBUG

boolean "Samsung S3C2410 touchscreen debug messages"

depends on TOUCHSCREEN_S3C2410

help

Select this if you want debug messages

5、在drivers/input/touchscreen/Makefile中添加:

obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o


注:这个驱动在内核注册为/dev/input/mouse0
准备用QT来测试,未加载QT之前,系统启动完后,按触摸屏,能够响应中断,并且能看到坐标,但是之后再去按,就没反应了。运行QT的hello程序后,按触摸屏也是没反应。下一步就是该测试了。
还是用QT去测试吧,用QT去测试要改QT的驱动接口。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -