임베디드 터치 패드 .. 초보 입니다.. 이 소스가 안돌아 가는 이

uh605의 이미지

터치 패드가 눌려 지면 눌려진 좌표를 찍는 소스라고...그러던데..
돌리니깐 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);
}
}

=============================

jyj9782의 이미지

어떤 보드쓰세요. 답변못해드리겠네요. 저도임베디드 공부하려는데, ^^ 궁금하네요.. 어떤 환경에서 공부하시는지..

힘내세요.

hook의 이미지

이거 휴인스 보드 맞죠 저도 테스트 해보았는데
안되더군요 ssp 통신쪽에 문제가 있는것 같은데 아직 완전하게
버그 못잡았습니다 통신 비트가 밀리는것 같기도 하고
누구 잡으신분 없나요

blee의 이미지

자세히 보진 않았지만서두..
ts_event 의 구조체의 크기가 얼마나 잡히는지 실시간
size를 한번 출력해 볼 필요가 있지 않을까 해서요

uh605의 이미지

휴인스 pxa255-pro 보드 입니다.. 흠.. 왜 안되는 소스를 올렸지..휴.. 어떻게든 됐으면 좋는데..

많은 도움 부탁드립니다.

datamind의 이미지

잘은 모르겠지만, 간단한 소스로 보아서,,
특별히 버그가 될만한것은 없는것 같은데요...
제생각에는 init 하는 부분에서 문제가 있을것 같네요..
매뉴얼을 보면서 정확히 초기화 되었는지를 우선 검사해 보세요...
그럼,,

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.