这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » linux移植之触摸屏

共5条 1/1 1 跳转至

linux移植之触摸屏

专家
2013-03-08 15:05:54     打赏
  1. 以下copy 是指需要飞凌提供的内核里的驱动源码, dev-ts.c  ts 板载初始化和platform 资源初始化 文件。

    arch/arm/mach-s3c64xx/mach-smdk6410.c

    注销掉头文件  #include<plat/ts.h>
    添加头文件    #include<mach/ts.h>
    copy arch/arm/mach-s3c64xx/include/mach/ts.h 到目标内核目录

    copy arch/arm/mach-s3c64xx/dev-ts.c 到目标内核目录在 arch/arm/mach-s3c64xx/Makefile 中添加 
       obj-$(CONFIG_TOUCHSCREEN_S3C)   += dev-ts.o

    在里面 添加宏定义arch/arm/mach-s3c64xx/dev-ts.c

        #define SZ_256 0x00000100

    添加头文件#include <linux/slab.h>,这就有很多linux3.3和2.6不同的地方

  2. 添加 ts  设备初始化 ,在smdk6410_machine_init ()  结构体中

    //s3c24xx_ts_set_platdata(NULL);

    s3c_ts_set_platdata(&s3c_ts_platform);

 

    添加结构体s3c_ts_platform

static struct s3c_ts_mach_info s3c_ts_platform __initdata = {

    .delay            = 10000,

    .presc            = 49,

    .oversampling_shift    = 2,

    .resol_bit        = 12,        

    .s3c_adc_con        = ADC_TYPE_2,    

 

};

  1. 把飞凌官方的s3c-tc.c拷贝到drivers/input/touchscreen/这里建议拷贝他3.0的系统的
  2. 修改 drivers/input/touchscreen/Makefile 
              添加 obj-$(CONFIG_TOUCHSCREEN_S3C)     += s3c-ts.o
  3. 修改 drivers/input/tourch/screen/Kconfig
              添加 config TOUCHSCREEN_S3C 

    config TOUCHSCREEN_S3C

    tristate "S3C touchscreen driver"

    depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5P64XX || ARCH_S5PC1XX

    default y

    help

    Say Y here to enable the driver for the touchscreen on the

    S3C SMDK board.

  4. 注释掉arch/arm/plat-samsung/devs.c里面大概1223到1277行的如下代码:

    /* Touchscreen */

     

    //#ifdef CONFIG_PLAT_S3C24XX

    /*static struct resource s3c_ts_resource[] = {

        [0] = DEFINE_RES_MEM(S3C24XX_PA_ADC, S3C24XX_SZ_ADC),

        [1] = DEFINE_RES_IRQ(IRQ_TC),

    };

     

    struct platform_device s3c_device_ts = {

        .name        = "s3c2410-ts",

        .id        = -1,

        .dev.parent    = &s3c_device_adc.dev,

        .num_resources    = ARRAY_SIZE(s3c_ts_resource),

        .resource    = s3c_ts_resource,

    };

     

    void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)

    {

        s3c_set_platdata(hard_s3c2410ts_info,

                 sizeof(struct s3c2410_ts_mach_info), &s3c_device_ts);

    }

    */

    //#endif /* CONFIG_PLAT_S3C24XX */

     

    /*#ifdef CONFIG_SAMSUNG_DEV_TS

    static struct resource s3c_ts_resource[] = {

        [0] = DEFINE_RES_MEM(SAMSUNG_PA_ADC, SZ_256),

        [1] = DEFINE_RES_IRQ(IRQ_TC),

    };

    */

    /*static struct s3c2410_ts_mach_info default_ts_data __initdata = {

        .delay            = 10000,

        .presc            = 49,

        .oversampling_shift    = 2,

    };

     

    struct platform_device s3c_device_ts = {

        .name        = "s3c64xx-ts",

        .id        = -1,

        .num_resources    = ARRAY_SIZE(s3c_ts_resource),

        .resource    = s3c_ts_resource,

    };

     

    void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)

    {

        if (!pd)

            pd = &default_ts_data;

     

        s3c_set_platdata(pd, sizeof(struct s3c2410_ts_mach_info),

                 &s3c_device_ts);

    }

    */

    //#endif /* CONFIG_SAMSUNG_DEV_TS */

  5. 在arch/arm/ plat-samsung/include/plat/regs-adc.h的后面添加以下代码:

    #define S3C_ADCREG(x)             (x)

     

    #define S3C_ADCCON             S3C_ADCREG(0x00)

    #define S3C_ADCTSC             S3C_ADCREG(0x04)

    #define S3C_ADCDLY             S3C_ADCREG(0x08)

    #define S3C_ADCDAT0             S3C_ADCREG(0x0C)

    #define S3C_ADCDAT1             S3C_ADCREG(0x10)

    #define S3C_ADCUPDN            S3C_ADCREG(0x14)

    #define S3C_ADCCLRINT            S3C_ADCREG(0x18)

    #define S3C_ADCMUX            S3C_ADCREG(0x1C)

    #define S3C_ADCCLRWK            S3C_ADCREG(0x20)

     

    /* ADCCON Register Bits */

    #define S3C_ADCCON_RESSEL_10BIT        (0x0<<16)

    #define S3C_ADCCON_RESSEL_12BIT        (0x1<<16)

    #define S3C_ADCCON_ECFLG        (1<<15)

    #define S3C_ADCCON_PRSCEN        (1<<14)

    #define S3C_ADCCON_PRSCVL(x)        (((x)&0xFF)<<6)

    #define S3C_ADCCON_PRSCVLMASK        (0xFF<<6)

    #define S3C_ADCCON_SELMUX(x)        (((x)&0x7)<<3)

    #define S3C_ADCCON_SELMUX_1(x)        (((x)&0xF)<<0)

    #define S3C_ADCCON_MUXMASK        (0x7<<3)

    #define S3C_ADCCON_RESSEL_10BIT_1    (0x0<<3)

    #define S3C_ADCCON_RESSEL_12BIT_1    (0x1<<3)

    #define S3C_ADCCON_STDBM        (1<<2)

    #define S3C_ADCCON_READ_START        (1<<1)

    #define S3C_ADCCON_ENABLE_START        (1<<0)

    #define S3C_ADCCON_STARTMASK        (0x3<<0)

     

    /* ADCTSC Register Bits */

    #define S3C_ADCTSC_UD_SEN        (1<<8)

    #define S3C_ADCTSC_YM_SEN        (1<<7)

    #define S3C_ADCTSC_YP_SEN        (1<<6)

    #define S3C_ADCTSC_XM_SEN        (1<<5)

    #define S3C_ADCTSC_XP_SEN        (1<<4)

    #define S3C_ADCTSC_PULL_UP_DISABLE    (1<<3)

    #define S3C_ADCTSC_AUTO_PST        (1<<2)

    #define S3C_ADCTSC_XY_PST(x)        (((x)&0x3)<<0)

     

    /* ADCDAT0 Bits */

    #define S3C_ADCDAT0_UPDOWN        (1<<15)

    #define S3C_ADCDAT0_AUTO_PST        (1<<14)

    #define S3C_ADCDAT0_XY_PST        (0x3<<12)

    #define S3C_ADCDAT0_XPDATA_MASK        (0x03FF)

    #define S3C_ADCDAT0_XPDATA_MASK_12BIT    (0x0FFF)

     

    /* ADCDAT1 Bits */

    #define S3C_ADCDAT1_UPDOWN        (1<<15)

    #define S3C_ADCDAT1_AUTO_PST        (1<<14)

    #define S3C_ADCDAT1_XY_PST        (0x3<<12)

    #define S3C_ADCDAT1_YPDATA_MASK        (0x03FF)

    #define S3C_ADCDAT1_YPDATA_MASK_12BIT    (0x0FFF)

    #endif /* __ASM_ARCH_REGS_ADC_H */

     

     

     

  6. 配置内核:

     

    System Type --->

        [*] ADC common driver support

Device Drivers --->

    Input device support --->

        [*] Touchscreens --->

<*> S3C touchscreen driver (只选这一个,其他的不要选)

<*> Event interface

  1. 如果触摸屏驱动没有问题的会就会出现以下驱动信息:

S3C Touchscreen driver, (c) 2008 Samsung Electronics

S3C TouchScreen got loaded successfully : 12 bits

input: S3C TouchScreen as /devices/virtual/input/input0

 

tslib移植及测试

在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。

  Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。

  1. https://github.com/kergoth/tslib下载了最新的tslib
  2. 为虚拟机里的Linux系统安装工具:

    sudo apt-get install autoconf

    sudo apt-get install automake

    sudo apt-get install libtool

  3. 解压后编译

    mv xxx(解压后名字) tslib  //名字改为tslib 

    cd tslib

    ./autogen.sh 

    mkdir tmp

    echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

    ./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp

    make

    make install

  4. 打开tmp目录,里面有四个文件夹,分别是bin、etc、include、lib。将etc目录下的ts.conf里的第2行去掉注释。即:

    # module_raw input

    改为:

    module_raw input

  5. 将bin/etc/lib目录下的文件及连接拷贝到文件系统下对应同名目录。include目录估计是编译应用程序时用的,在此可以不使用
  6. 在文件系统的/etc/profile后面添加以下环节变量:

    export USER LOGNAME PS1 PATH

    export TSLIB_TSDEVICE=/dev/event0

    export TSLIB_CALIBFILE=/etc/pointercal

    export TSLIB_CONFFILE=/etc/ts.conf

    export TSLIB_PLUGINDIR=/lib/ts

    export TSLIB_CONSOLEDEVICE=none

    export TSLIB_FBDEVICE=/dev/fb0

  7. 重启开发板执行env命令,查看是否有以下环境变量:

    TSLIB_TSDEVICE=/dev/event0

    USER=id -un

    HOME=/

    TSLIB_FBDEVICE=/dev/fb0

    PS1=[\u@\h \w]#

    TSLIB_PLUGINDIR=/lib/ts

    TSLIB_CONSOLEDEVICE=none

    LOGNAME=id -un

    TERM=vt102

    PATH=/sbin:/usr/sbin:/bin:/usr/bin

    TSLIB_CONFFILE=/etc/ts.conf

    SHELL=/bin/sh

    PWD=/

    TSLIB_CALIBFILE=/etc/pointercal

    这个TSLIB_TSDEVICE=/dev/event0环境变量所指的位置很重要,错了就会出现

    ts_open:ts_open no such file or directory这样的错误

  8. 执行ts_test命令,就会出现以下画面:

    如果出现-/bin/sh: ts_test: not found这样的错误,说明交叉编译器里面的库没有拷贝进来,对于交叉编译器4.3.2是arm-none-linux-gnueabi/libc/lib

    执行ts_calibrate命令就会出现以下画面:

移植qt-everywhere-opensource-src-4.8.1
  1. 解压qt-everywhere-opensource-src-4.8.1,在解压目录下我们自己先写一个autu.sh的脚本,脚本内容如下:

./configure -prefix /usr/local/Qt \
> -no-qt3support \
> -qt-zlib \
> -qt-libtiff \
> -qt-libpng \
> -qt-libmng \
> -qt-libjpeg \
> -make libs \
> -nomake examples \ (因为这个是arm版本,所以编译出来的程序只能在arm开发板上运行,编译时把这些给去掉,加快编译过程)
> -nomake demos \
> -nomake docs \
> -no-nis \
> -no-cups \
> -no-iconv \
> -xplatform qws/linux-arm-g++ \
> -embedded arm \
> -little-endian \
> -qt-freetype \
> -depths 8,16,24,32 \
> -qt-gfx-linuxfb \
> -no-gfx-transformed \
> -no-gfx-qvfb \
> -no-gfx-vnc \
> -no-gfx-multiscreen \
> -qt-kbd-usb \
> -qt-kbd-tty \
> -qt-mouse-pc \
> -no-glib \
> -qt-mouse-tslib

-I /usr/local/Tslib/include \

-L /usr/local/tslib/lib
make
make install

至于这些选项的含义搭建可以直接到Qt官网上去查。

如果最后出现这个错误:

./autoconfig.sh: 行 37: -I/usr/local/tslib/include: 没有那个文件或目录最后直接用

export QMAKE_INCDIR=/usr/local/tslib/include/

         export QMAKE_LIBDIR=/usr/local/tslib/lib/

这样的设置经验证好像只有在arm-linux-gcc-4.4.1的版本中可行

  1. 在rootfs/usr/下新建一个文件为qtlib,将/usr/local/Qt/lib下的所有文件复制到qtlib目录下
  2. 设置环境变量:将rootfs/etc/profile里面添加一下环境变量:

    export QTDIR=/usr/qilib

    export QPEDIR=$QTDIR

    export QT_PLUGIN_PATH=/usr/qilib

    export T_ROOT=/usr/tslib

    export PATH=$QTDIR/:$PATH

    export QWS_MOUSE_PROTO=Tslib:/dev/event0

    export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR

    export QT_QWS_FONTDIR=/usr/qilib/fonts

  3. 修改启动设置,修改rootfs/etc/init.d/rcS,添加一下内容:

    source /etc/profile

    echo "" > /dev/tty1

    echo "" > /dev/tty1

    echo "Designer is Pillar !" > /dev/tty1

    echo "Staring touch calibrate..." > /dev/tty1

    echo "" > /etc/tty1

    sleep 1

    /bin/ts_calibrate & #开机运行ts_calibrate

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




关键词: linux     触摸屏    

高工
2013-03-08 17:16:55     打赏
2楼

这么多的文件真的不知道该从何入手,顶一个


菜鸟
2015-04-25 16:36:52     打赏
3楼
哥们,你在板子上运行qt程序,会不会出现两个鼠标光标,用手触摸屏,出现界面凌乱的现象啊,我现在就遇到这种问题,求解决....

工程师
2015-04-28 07:51:20     打赏
4楼
hhhhhhhhh

工程师
2015-04-28 07:54:13     打赏
5楼
沙发、、持续关注楼主跟新哈

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]