디바이스 드라이버
글 수 70
2015.11.06 01:43:21 (*.37.214.57)
18392
s5pv210 은 별도의 터치 채널을 공급 합니다.
하지만, adc 채널과 병행해서 사용했더니, 한번씩 튀는 문제가 발견되었습니다.
그래서 결국 i2c 인터페이스로 동작하는 터치 chip 을 사용한 적이 있습니다.
아래는 그 드라이버칩을 포팅한 과정입니다.
1. 드라이버 파일 복사
첨부된 파일 max11801_ts.c 을 아래 위치에 넣습니다.
kernel/linux-2.6.35/drivers/input/touchscreen/
2. Makefile 수정
마지막 줄에 아래 코드 추가
obj-$(CONFIG_TOUCHSCREEN_MAX11801) += max11801_ts.o
3. Kconfig 수정
적당한 위치에 아래 코드 추가
config TOUCHSCREEN_MAX11801
tristate "MAX11801 based touchscreens: MAX11801 I2C Interface"
depends on I2C
select TOUCHSCREEN_MAX11801_I2C
help
Say Y here if you have a touchscreen interface using the
MAX11801 controller, and your board-specific
initialization code includes that in its table of I2C devices.
If unsure, say N (but it's safe to say "Y").
To compile this driver as a module, choose M here: the
module will be called MAX11801.
4. Mach-ezs5pv210.c 파일 수정
위치 : kernel/linux-2.6.35/arch/arm/mach-s5pv210
추가
#define IRQ_MAX11801 IRQ_EINT7 // 터치irq : 위 확장 uart 와 중복임. 주의
#define GPIO_FOR_IRQ_MAX11801 (S5PV210_GPH0(7)) // 터치 irq 용 gpio
수정
// I2C#0 에 연결된 디바이스 나열
static struct i2c_board_info i2c_devs0[] __initdata = {
{
I2C_BOARD_INFO("ds1307", 0x68),
},
{
I2C_BOARD_INFO("max11801", 0x48),
.platform_data = (void *)&max11801_mode,
.irq = IRQ_MAX11801,
},
};
static void __init ezs5pv210_eint_set( void ) 함수에 아래 코드 추가
#ifdef TOUCHSCREEN_MAX11801
gpio = GPIO_FOR_IRQ_MAX11801;
irq = IRQ_MAX11801;
s3c_gpio_cfgpin ( gpio, EINT_MODE );
s3c_gpio_setpull ( gpio, S3C_GPIO_PULL_UP );
set_irq_type ( irq , IRQF_TRIGGER_FALLING );
#endif
5. dev-i2c0.c 파일 수정
위치 : kernel/linux-2.6.35/arch/arm/ plat-samsung
static struct s3c2410_platform_i2c default_i2c_data0 __initdata = {
.flags = 0,
.bus_num = 0,
.slave_addr = 0x10,
.frequency = 400*1000,
.sda_delay = S3C2410_IICLC_SDA_DELAY5 | S3C2410_IICLC_FILTER_ON,
};
100 을 400 으로 수정
6. 커널 컴파일 옵션 변경
아래 항목 선택
Device Drivers ?>Input device support -> Touchscreens
-> Max11801 base touchscreens … 를 선택 하고, 아래 S3C touchscreens driver 체크 해제
끝.
i2c 클럭 속도를 100으로 하면 터치 인식 속도가 늦어 집니다.