임베디드 터치 패드 .. 초보 입니다.. 이 소스가 안돌아 가는 이
터치 패드가 눌려 지면 눌려진 좌표를 찍는 소스라고...그러던데..
돌리니깐 0.0 만 계속 찍히내요..
보드 만든 회사에서 예제라고 준건데..
설명도 하나도 없구.. 휴...
모듈은 재대로 한것 같은데..
소스에 문제가 있는지 답변좀 부탁드립니다..
리눅스 스터디를 시작한지 얼마 안되서 많이 모르내요...
// 이건 디바이스 드라이버 소스 이구요....
#include <linux/module.h>
#include <linux/version.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <asm/types.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
#include <asm/arch/irq.h>
#define ADS7846_MAJOR 11
#define ADS7846_MINOR 240
#define ADS7846_IRQ GPIO_2_80_TO_IRQ(16)
#define SSP_BUSY (( SSSR << 4 ) & 0x1)
#define SSP_RNE (( SSSR << 3 ) & 0x1)
#define ADS7846_XPOS 0x5
#define ADS7846_YPOS 0x1
#define ADS7846_Z1 0x3
#define ADS7846_Z2 0x4
#define X_PLATE_OHMS 340
#define Y_PLATE_OHMS 360
#define PRESSURE_EQUATION_2 0
#define PRESSURE_EQUATION_3 1
#define TS_NAME "touchscreen/ads7846e"
MODULE_AUTHOR("Joonkyu Song");
MODULE_DESCRIPTION("PXA255 Pro touch screen driver");
MODULE_LICENSE("GPL");
struct ts_event{
u16 pressure;
u16 x;
u16 y;
u16 pad;
struct timeval stamp;
};
static struct ts_event ads7846_event;
static struct timer_list ads7846_timer;
static inline unsigned short ads7846_read_pos( unsigned char pos )
{
SSDR = ( pos << 4 | 1 << 7 | 0x1 ) & 0xFFFF;
while( SSP_BUSY );
return SSDR;
}
unsigned short ads7846_read_pressure( char opt )
{
unsigned short pressure_val, z1_raw, z2_raw, x_raw, y_raw;
x_raw = ads7846_event.x;
y_raw = ads7846_event.y;
z1_raw = ads7846_read_pos( ADS7846_Z1 );
if( opt == PRESSURE_EQUATION_2 )
{
pressure_val = ( X_PLATE_OHMS * x_raw * ( 4096 - z1_raw )) / z1_raw;
pressure_val -= ( Y_PLATE_OHMS * y_raw );
pressure_val = ( pressure_val + 2048 ) >> 12;
}
else
{
z2_raw = ads7846_read_pos( ADS7846_Z2 );
pressure_val = ( X_PLATE_OHMS * x_raw * ( z2_raw - z1_raw )) / z1_raw;
pressure_val = ( pressure_val + 2048 ) >> 12;
}
return pressure_val;
}
void ads7846_timedout( unsigned long ptr )
{
// printk("x : 0x%x, y : 0x%x\n", ads7846_read_pos( ADS7846_XPOS ), ads7846_read_pos( ADS7846_YPOS ) );
ads7846_event.x = ads7846_read_pos( ADS7846_XPOS );
ads7846_event.y = ads7846_read_pos( ADS7846_YPOS );
ads7846_timer.expires = jiffies + 10;
add_timer(&ads7846_timer);
// wake_up_interruptible(&ads7846_wait);
}
static void ads7846_interrupt(int irq, void *dev_id, struct pt_regs *regs )
{
ads7846_event.x = ads7846_read_pos( ADS7846_XPOS );
ads7846_event.y = ads7846_read_pos( ADS7846_YPOS );
ads7846_event.pressure = ads7846_read_pressure( PRESSURE_EQUATION_2 );
printk("x : 0x%x, y : 0x%x, z1 : 0x%x, SSSR : 0x%x\n", ads7846_event.x, ads7846_event.y, ads7846_event.pressure, SSSR );
}
ssize_t ads7846_read( struct file *filp, char *buf, size_t count, loff_t *off )
{
struct ts_event *evt = &ads7846_event;
if( copy_to_user( buf, evt, sizeof( struct ts_event ) ) )
{
return -EFAULT;
}
ads7846_event.pressure = 0;
return count;
}
static int ads7846_open( struct inode *inode, struct file *filep )
{
int minor = MINOR( inode->i_rdev );
if( minor != ADS7846_MINOR )
return -1;
MOD_INC_USE_COUNT;
init_timer(&ads7846_timer);
ads7846_timer.function = ads7846_timedout;
ads7846_timer.expires = jiffies + 10;
add_timer(&ads7846_timer);
return 0;
}
static int ads7846_close( struct inode *inode, struct file *filep )
{
del_timer(&ads7846_timer);
MOD_DEC_USE_COUNT;
return 0;
}
struct file_operations ads7846_fops = {
read: ads7846_read,
open: ads7846_open,
release: ads7846_close,
};
static int __init ads7846_init(void)
{
int result;
// SSP enable
CKEN |= CKEN3_SSP;
set_GPIO_mode(GPIO23_SCLK_md);
set_GPIO_mode(GPIO24_SFRM_MD);
set_GPIO_mode(GPIO25_STXD_MD);
set_GPIO_mode(GPIO26_SRXD_MD);
// 12bit data, Microwire, Internal clock, SSP enable, SCR = 102.4 Khz( 0x11(17) )
SSCR0 = 0xB | 0x2 << 4 | 0 << 6 | 1 << 7 | 0x11 << 8;
// Receive/Transmit FIFO INT disable, Normal mode, 8 bit command
SSCR1 = 0;
// Touch screen interrupt pin(GPIO 16) set input mode
GPDR0 &= ~GPIO_16;
set_GPIO_IRQ_edge( IRQ_TO_GPIO_2_80(ADS7846_IRQ), GPIO_FALLING_EDGE );
// set_GPIO_IRQ_edge( IRQ_TO_GPIO_2_80(ADS7846_IRQ), GPIO_BOTH_EDGES );
if( ( result = register_chrdev( ADS7846_MAJOR, TS_NAME, &ads7846_fops ) ) < 0 )
{
printk(KERN_INFO "ads7846 : Can't get major number\n");
return result;
}
if( request_irq( ADS7846_IRQ, ads7846_interrupt, 0, "ADS7846E_IRQ", NULL ) != 0 )
{
printk("Can't request IRQ %d\n", ADS7846_IRQ );
unregister_chrdev( ADS7846_MAJOR, TS_NAME );
return -1;
}
SSCR1 = 0 << 3 | 0 << 4 | 0 << 5 | 0xa << 6 | 0xa << 10;
printk("ads7846 : registered ads7846e ts driver\n");
return 0;
}
static void __exit ads7846_exit( void )
{
// SSP disable
set_GPIO_mode(~GPIO23_SCLK_md);
set_GPIO_mode(~GPIO24_SFRM_MD);
set_GPIO_mode(~GPIO25_STXD_MD);
set_GPIO_mode(~GPIO26_SRXD_MD);
// SSP Clock disable
CKEN &= ~CKEN3_SSP;
free_irq( ADS7846_IRQ, NULL );
unregister_chrdev( ADS7846_MAJOR, TS_NAME );
}
module_init(ads7846_init);
module_exit(ads7846_exit);
======================================
//이건 테스트 파일 입니다.
/* ************************************************* */
/* ******* Touch Pad Test Program ****************** */
/* ******* 2003.10.07 by negi ********************** */
/* ************************************************* */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#define TS_DEV "/dev/ads7846e"
int ts_fd;
struct ts_event{
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
};
int main( void )
{
struct ts_event event;
int count;
if( (ts_fd = open( TS_DEV, O_RDONLY ) ) < 0)
{
printf(" Can't open ts dev\n");
return -1;
}
for( ; ; )
{
if( (count = read( ts_fd, &event, sizeof( struct ts_event ) )) < 0 )
{
return 0;
}
printf("x : 0x%x, y : 0x%x, z : 0x%x\n", event.x, event.y, event.pressure);
usleep(100);
}
}
=============================
어떤 보드쓰세요. 답변못해드리겠네요. 저도임베디드 공부하려는데, ^^ 궁
어떤 보드쓰세요. 답변못해드리겠네요. 저도임베디드 공부하려는데, ^^ 궁금하네요.. 어떤 환경에서 공부하시는지..
힘내세요.
이거 휴인스 보드 맞죠 저도 테스트 해보았는데 안되더군요 ssp 통신
이거 휴인스 보드 맞죠 저도 테스트 해보았는데
안되더군요 ssp 통신쪽에 문제가 있는것 같은데 아직 완전하게
버그 못잡았습니다 통신 비트가 밀리는것 같기도 하고
누구 잡으신분 없나요
struct 를 pack해야 하지 않을까요?
자세히 보진 않았지만서두..
ts_event 의 구조체의 크기가 얼마나 잡히는지 실시간
size를 한번 출력해 볼 필요가 있지 않을까 해서요
휴인스 pxa255-pro
휴인스 pxa255-pro 보드 입니다.. 흠.. 왜 안되는 소스를 올렸지..휴.. 어떻게든 됐으면 좋는데..
많은 도움 부탁드립니다.
잘은 모르겠지만, 간단한 소스로 보아서,,특별히 버그가 될만한것은 없
잘은 모르겠지만, 간단한 소스로 보아서,,
특별히 버그가 될만한것은 없는것 같은데요...
제생각에는 init 하는 부분에서 문제가 있을것 같네요..
매뉴얼을 보면서 정확히 초기화 되었는지를 우선 검사해 보세요...
그럼,,
댓글 달기