기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요!

보드 사양

smdk2440 레퍼런스

커널: 2.6.30.9 포팅

사용 클럭

399MHz, 133MHz, 66MHz를 사용합니다.

LCD : 800*480

 

 

 

참고사항 : 5117번 에 질문을 드린 개발자입니다.

 

Falinux 2440 에서 s3c2410-ts.c 파일을 참조하여

 

제 개발 보드에 이식을 하였습니다.

 

 

이렇게 다시 질문을 드리는 이유는

 

아직 해결이 되지 않아서

 

다시 부탁을 한번더 드릴려고 합니다.

클럭 발생부분은

제가 falinux2440과 제 보드를 비교하였으나 동일하게 발생을 하였습니다.

 

하지만

 

x(low value = 0~50) => 950 ~ 1023 값이 나옵니다.

그이후부터는 계속 Max(1023)이 나오고요

 

 

아래 제 보드에 설정한 값을 명기 하였습니다.

 

한달가까이 이부분을 검토하고 있으나 변화가 없습니다.

 

원인이 뭔지 아시는 분은 답변을 부탁드립니다.

추가적으로

delay 부분과 presc 부분에 대한 이해가 부족합니다.

몇번을 읽어서 사실적인 내용은 이해가 가나 보드에 어떻게

적용을 하는지에 대해서 이해가 가질 않습니다.

혹시 아시는분 설명 부탁드립니다.

 

 

보드 셋팅값

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

// TouchScreen Setup
static struct s3c2410_ts_mach_info falinux_s24xx_ts_cfg = {
 .delay = 10000,
 .presc = 49,
 .oversampling_shift = 2,
};

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

/* Touchscreen */
struct platform_device s3c_device_ts = {
 .name     = "s3c2410-ts",
 .id   = -1,
};
EXPORT_SYMBOL(s3c_device_ts);

static struct s3c2410_ts_mach_info s3c2410ts_info;

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));
 s3c_device_ts.dev.platform_data = &s3c2410ts_info;
}
EXPORT_SYMBOL(set_s3c2410ts_info);

 

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

ts.c

-------

/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 * Copyright (c) 2004 Arnaud Patard <[email protected]>
 * iPAQ H1940 touchscreen support
 *
 * ChangeLog
 *
 * 2004-09-05: Herbert P철tzl <[email protected]>
 * - added clock (de-)allocation code
 *
 * 2005-03-06: Arnaud Patard <[email protected]>
 *      - h1940_ -> s3c2410 (this driver is now also used on the n30
 *        machines :P)
 *      - Debug messages are now enabled with the config option
 *        TOUCHSCREEN_S3C2410_DEBUG
 *      - Changed the way the value are read
 *      - Input subsystem should now work
 *      - Use ioremap and readl/writel
 *
 * 2005-03-23: Arnaud Patard <[email protected]>
 *      - Make use of some undocumented features of the touchscreen
 *        controller
 *
 */

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <asm/io.h>
#include <asm/irq.h>

#include <asm/arch/regs-adc.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/ts.h>

/* For ts.dev.id.version */
#define S3C2410TSVERSION 0x0101

#define WAIT4INT(x)  (((x)<<8) | \
                S3C2410_ADCTSC_YM_SEN | \
                S3C2410_ADCTSC_YP_SEN | \
                S3C2410_ADCTSC_XP_SEN | \
                S3C2410_ADCTSC_XY_PST(3))

#define AUTOPST      (S3C2410_ADCTSC_YM_SEN | \
                   S3C2410_ADCTSC_YP_SEN | \
                   S3C2410_ADCTSC_XP_SEN | \
                      S3C2410_ADCTSC_AUTO_PST | \
                      S3C2410_ADCTSC_XY_PST(0))

#define DEBUG_LVL    KERN_DEBUG

MODULE_AUTHOR("Arnaud Patard <[email protected]>");
MODULE_DESCRIPTION("s3c2410 touchscreen driver");
MODULE_LICENSE("GPL");

/*
 * Definitions & global arrays.
 */


static char *s3c2410ts_name = "s3c2410 TouchScreen";

/*
 * Per-touchscreen data.
 */

struct s3c2410ts {
 struct input_dev *dev;
 long xp;
 long yp;
 int count;
 int shift;
};

static struct s3c2410ts ts;
static void __iomem *base_addr;

static inline void s3c2410_ts_connect(void)
{
#ifdef CONFIG_CPU_S3C2410
 s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);
 s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);
 s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);
 s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
#endif 
}

static void touch_timer_fire(unsigned long data)
{
   unsigned long data0;
   unsigned long data1;
 int updown;

   data0 = readl(base_addr+S3C2410_ADCDAT0);
   data1 = readl(base_addr+S3C2410_ADCDAT1);

  updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));

  if (updown) { // down
   if (ts.count != 0) {
    ts.xp >>= ts.shift;
    ts.yp >>= ts.shift;

#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
    {
     struct timeval tv;
     do_gettimeofday(&tv);
     printk(DEBUG_LVL "T: %06d, X: %03ld, Y: %03ld\n", (int)tv.tv_usec, ts.xp, ts.yp);
    }
#endif

    input_report_abs(ts.dev, ABS_X, ts.xp);
    input_report_abs(ts.dev, ABS_Y, ts.yp);

    input_report_key(ts.dev, BTN_TOUCH, 1);
    input_report_abs(ts.dev, ABS_PRESSURE, 1);
    input_sync(ts.dev);
   }

   ts.xp = 0;
   ts.yp = 0;
   ts.count = 0;

   writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
   writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
  } else { // up
   ts.count = 0;

   input_report_key(ts.dev, BTN_TOUCH, 0);
   input_report_abs(ts.dev, ABS_PRESSURE, 0);
   input_sync(ts.dev);

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

static struct timer_list touch_timer =
  TIMER_INITIALIZER(touch_timer_fire, 0, 0);

static irqreturn_t stylus_updown(int irq, void *dev_id, struct pt_regs *regs)
{
 unsigned long data0;
 unsigned long data1;
 int updown;

 data0 = readl(base_addr+S3C2410_ADCDAT0);
 data1 = readl(base_addr+S3C2410_ADCDAT1);

 updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));

 /* TODO we should never get an interrupt with updown set while
  * the timer is running, but maybe we ought to verify that the
  * timer isn't running anyways. */

 if (updown)
  touch_timer_fire(0);

 return IRQ_HANDLED;
}


static irqreturn_t stylus_action(int irq, void *dev_id, struct pt_regs *regs)
{
 unsigned long data0;
 unsigned long data1;

 data0 = readl(base_addr+S3C2410_ADCDAT0);
 data1 = readl(base_addr+S3C2410_ADCDAT1);

 ts.xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;
 ts.yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;
 ts.count++;

 if (ts.count < (1<<ts.shift)) {
  writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
  writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
 } else {
  mod_timer(&touch_timer, jiffies+1);
  writel(WAIT4INT(1), base_addr+S3C2410_ADCTSC);
 }

 return IRQ_HANDLED;
}

static struct clk *adc_clock;

/*
 * The functions for inserting/removing us as a module.
 */
static int __init s3c2410ts_probe(struct platform_device *pdev)
{
 struct s3c2410_ts_mach_info *info;
 struct input_dev *input_dev;

 info = ( struct s3c2410_ts_mach_info *)pdev->dev.platform_data;

 if (!info)
 {
  printk(KERN_ERR "Hm... too bad : no platform data for ts\n");
  return -EINVAL;
 }

#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
 printk(DEBUG_LVL "Entering s3c2410ts_init\n");
#endif

 adc_clock = clk_get(NULL, "adc");
 if (!adc_clock) {
  printk(KERN_ERR "failed to get adc clock source\n");
  return -ENOENT;
 }
 clk_enable(adc_clock);

#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
 printk(DEBUG_LVL "got and enabled clock\n");
#endif

 base_addr=ioremap(S3C2410_PA_ADC,0x20);
 if (base_addr == NULL) {
  printk(KERN_ERR "Failed to remap register block\n");
  return -ENOMEM;
 }


 /* Configure GPIOs */
 s3c2410_ts_connect();

 if ((info->presc&0xff) > 0)
  writel(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(info->presc&0xFF),\
        base_addr+S3C2410_ADCCON);
 else
  writel(0,base_addr+S3C2410_ADCCON);


 /* Initialise registers */
 if ((info->delay&0xffff) > 0)
  writel(info->delay & 0xffff,  base_addr+S3C2410_ADCDLY);

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

 /* Initialise input stuff */
 memset(&ts, 0, sizeof(struct s3c2410ts));
 input_dev = input_allocate_device();

 if (!input_dev) {
  printk(KERN_ERR "Unable to allocate the input device !!\n");
  return -ENOMEM;
 }

 ts.dev = input_dev;
 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);

 ts.dev->private = &ts;
 ts.dev->name = s3c2410ts_name;
 ts.dev->id.bustype = BUS_RS232;
 ts.dev->id.vendor = 0xDEAD;
 ts.dev->id.product = 0xBEEF;
 ts.dev->id.version = S3C2410TSVERSION;

 ts.shift = info->oversampling_shift;

 /* 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_action", ts.dev)) {
  printk(KERN_ERR "s3c2410_ts.c: Could not allocate ts IRQ_TC !\n");
  iounmap(base_addr);
  return -EIO;
 }

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

 /* All went ok, so register to the input system */
 input_register_device(ts.dev);

 return 0;
}

static int s3c2410ts_remove(struct platform_device *pdev)
{
 disable_irq(IRQ_ADC);
 disable_irq(IRQ_TC);
 free_irq(IRQ_TC,ts.dev);
 free_irq(IRQ_ADC,ts.dev);

 if (adc_clock) {
  clk_disable(adc_clock);
  clk_put(adc_clock);
  adc_clock = NULL;
 }

 input_unregister_device(ts.dev);
 iounmap(base_addr);

 return 0;
}

static struct platform_driver s3c2410ts_driver = {
       .driver         = {
        .name   = "s3c2410-ts",
        .owner  = THIS_MODULE,
       },
       .probe          = s3c2410ts_probe,
       .remove         = s3c2410ts_remove,
};


static int __init s3c2410ts_init(void)
{
 return platform_driver_register(&s3c2410ts_driver);
}

static void __exit s3c2410ts_exit(void)
{
 platform_driver_unregister(&s3c2410ts_driver);
}

module_init(s3c2410ts_init);
module_exit(s3c2410ts_exit);
============================================================

 

 

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
5728 S3C6410 Test Firmware 사용법 [1] jclab 2012-05-01 1759
5727 ActiveSync/USB host 동작 관련 [5] 백상은 2007-12-09 1759
5726 ICS S4210 (type password to decrypt storage?) 문제... file [4] 아명 2012-03-14 1759
5725 V4L2 device driver의 node ? [1] 테크 2012-04-18 1756
5724 V210에서 usb메모리 마운트 방법에 대한 질문 입니다. [2] Ike 2012-02-22 1755
5723 ramdisk 제작시 커널의 MTD파티션은 어떻게 해야 하나요? [2] 혜민아빠 2012-03-27 1755
5722 v4l2 는 camera register 관련된 포트에만 쓰일수 있는건가요? [1] biokk 2014-02-25 1755
5721 [V310] request_irq로 등록을 했지만, isr이 불려지지 않습니다.. ... [3] 훌러덩 2011-12-21 1754
5720 ffmpeg 관련하여 examples 이 컴파일이 되지 않습니다. [1] 사랑해요 2012-07-03 1754
5719 kikat 4.2.2 에서 surfaceflinger 초기화 하는 부분에 대해서 질문 ... [3] 시안 2014-07-08 1754
» s3c2440 touch screen 좌표 인식 박용순 2012-01-13 1752
5717 리눅스 질문 : bus 충돌 회피방법 질문 [2] 카보 2013-08-28 1752
5716 Camera ISP Source가 공개된 AP chip 아시는분? [1] 꿈의사람 2014-02-07 1751
5715 busybox 1.14.0 udhcpc 관련 문의드립니다. [7] Tommy 2010-08-18 1750
5714 ARM 멀티코어와 리눅스에서 병렬처리? [4] Supsupi 2014-03-28 1749
5713 vmware 에 설치된 리눅스에서 공유폴더에 파일을 복사하는 방법 [1] blue0sky 2012-09-06 1748
5712 Android.Gingerbread MTD-utils 추가 포팅 문제점. [3] 서유한 2012-03-23 1748
5711 GPIO 설정 [5] 마대렐라 2014-01-24 1748
5710 SDRAM 확장시 에러발생 (64MB -> 128MB) [12] 박진홍 2009-08-15 1746
5709 안녕하세요 사운드 디바이스 관련 질문입니다. [6] 조현호 2013-03-25 1746

사용자 로그인