도와주세요!!
안녕하세요..
ATMEL의 AT91sam9g45를 사용해서 Touch Screen을 구현하려 합니다.
그런데 동작이 안되네요.
Touch 연결을 하고 make menuconfig에서도 설정은 Atmel 디폴드 를 사용한다고 했구요.
아래와 같이 부팅 메시지도 출력은 됩니다.
atmel_tsadcc atmel_tsadcc: Master clock is set at: 100000000 Hz
atmel_tsadcc atmel_tsadcc: Prescaler is set at: 165
input: atmel touch screen controller as /devices/platform/atmel_tsadcc/input/input0
아래와 같이 확인도 되었습니다.
# cat /proc/bus/input/devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="atmel touch screen controller"
P: Phys=atmel_tsadcc/input0
S: Sysfs=/devices/platform/atmel_tsadcc/input/input0
U: Uniq=
H: Handlers=mouse0 event0 evbug
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=3
타겟보드의 dev폴더에서도 아래와 같이 mknod를 해주었구요.
ls -al /dev/input/event0
crw-r----- 1 root root 13, 64 Feb 23 2013 /dev/input/event0
타켓에서 #hexdump /dev/input/event0를 이용하면 Touch 할때 마다 어떠한 값들이
나온다고 하더군요.
그런데 제것에서는 아무런 변화가 없습니다.
그래서 Atmel_tsadcc.c파일을 찾아 보니 제가 적용한 코드와 비슷하더군요...
당췌 어떻게 접근을 해야 할지를 모르겠습니다.
혹시 at91sam9계열의 Touch를 해보신분 계시면 조언을 좀 부탁드립니다.
드라이버 파일도 같이 첨부를 해봅니다.,,;
몇 일째 이걸 가지고 허우적 거리는지 모르겠네요..
그럼....
atmel_tsadcc.c의 Interrupt부분을
#if 1
if((x > 0) || (y > 0)) {
value_valid = 1;
}
else {
value_valid = 0;
}
if(value_valid){
input_report_abs(input_dev, ABS_X, x);
input_report_abs(input_dev, ABS_Y, y);
input_report_key(input_dev, BTN_TOUCH, 1);
input_report_abs(input_dev, ABS_PRESSURE, 7500);
input_sync(input_dev);
//printk("Touch Evnet Send [%d], [%d], Type[%d], vlaue[%d]\n", x, y,BTN_TOUCH,1);
}
#else
count_value++;
if(count_value < COUNT_VALUE_MAX){
standard_x = x;
standard_y = y;
}
if((abs(x-standard_x) > VALUE_VALID_MAX) || (abs(y-standard_y) > VALUE_VALID_MAX))
{
value_valid = 0;
// printk(KERN_ERR "standard_x: %d, standard_y: %d\n", standard_x, standard_y);
// printk(KERN_ERR "x: %d, y: %d\n", x, y);
// printk(KERN_ERR "abs_x: %d, abs_y: %d\n", abs(x-standard_x),abs(y-standard_y));
}
else
value_valid = 1;
if((count_value<COUNT_VALUE_MAX) || value_valid){
input_report_abs(input_dev, ABS_X, x);
input_report_abs(input_dev, ABS_Y, y);
input_report_key(input_dev, BTN_TOUCH, 1);
input_report_abs(input_dev, ABS_PRESSURE, 7500);
input_sync(input_dev);
printk("Touch Evnet Send [%d], [%d], Type[%d], vlaue[%d]\n", x, y,BTN_TOUCH,1);
// printk(KERN_ERR "x: %d, y: %d\n", x, y);
}
#endif
으로 수정은 하니 hexdump에서는 Touch할때마다 어떤 값들이 나오기는 하더군요.
그리고 이상항게 Touch Screen을 init을 하고 바로 ATMEL_TSADCC_PENCNT의 인터럽트가 발생이
되는것 같습니다. Touch를 하지 않았는데도 말입니다.
아래의 것은 boot메시지 입니다.
atmel_tsadcc atmel_tsadcc: Master clock is set at: 100000000 Hz
atmel_tsadcc atmel_tsadcc: Prescaler is set at: 165
init TSADCC_MR[d026a541]
input: atmel touch screen controller as /devices/platform/atmel_tsadcc/input/input0
rtc-at91sam9 at91_rtt.0: rtc core: registered at91_rtt as rtc0
IRQ 1/rtc0: IRQF_DISABLED is not guaranteed on shared IRQs
rtc-at91sam9 at91_rtt.0: rtc0: SET TIME!
Touch Screen PEN Contect <- inteterrupt에 ATMEL_TSADCC_PENCNT이 발생되면 출력 메시지
Touch Screen PEN Contect Mode Register[d026a541] [26a541]
I2C /dev entries driver
i2c-gpio i2c-gpio.0: using pins 52 (SDA) and 53 (SCL)
i2c-gpio i2c-gpio.1: using pins 74 (SDA) and 75 (SCL)
Linux video capture interface: v2.00
그런수 Touch를 해도 ATMEL_TSADCC_PENCNT, ATMEL_TSADCC_NOCNT의 이벤트가 발생이 되야 하는데.
이것이 한개도 발생이 안됩니다.
그래서 tslib를 설치하고 Calibrate을 하려고 하니 이게 또 동작이 안되네요.