日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

嵌入式驅(qū)動移植之觸摸驅(qū)動初識

發(fā)布者:心懷感恩最新更新時間:2021-07-23 來源: eefocus關(guān)鍵字:嵌入式驅(qū)動  移植  觸摸驅(qū)動 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

開發(fā)環(huán)境

BootLoader:u-boot-1.1.6

kernel:linux-2.6.30.4

CPU:s3c2440

開發(fā)板:TQ2440

參考資料:《天嵌科技Linux移植手冊》


移植步驟

1、觸摸驅(qū)動編寫

此處直接用天嵌提供的源碼,從天嵌科技提供的 2.6.30.4 的源碼中的“drivers/input/touchsreen/”拷貝“tq2440_ts.c”文件到我的內(nèi)核的“drivers/input/touchsreen/”目錄下,然后修改驅(qū)動源碼的 41 行為如下內(nèi)容:


//extern struct semaphore ADC_LOCK; //這個原來的內(nèi)容

DECLARE_MUTEX(ADC_LOCK); //這是修改后的內(nèi)容


說明:修改原因,因?yàn)樘烨犊萍继峁┑挠|摸驅(qū)動中使用了 ADC 驅(qū)動中的 ADC_LOCK,而這里并沒有移植 ADC 驅(qū)動,所以這里做一下簡單的改變。

代碼如下:


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


#include

#include


/* 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))


static char *tq2440ts_name = "TQ2440 TouchScreen";


static struct input_dev *dev;

static long xp;

static long yp;

static int count;


extern struct semaphore ADC_LOCK;

static int OwnADC = 0;


static void __iomem *base_addr;

/*

static inline void tq2440_ts_connect(void)

{

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);

}

*/

static void touch_timer_fire(unsigned long data)

{

  unsigned long data0;

  unsigned long data1;

int updown;


  data0 = ioread32(base_addr+S3C2410_ADCDAT0);

  data1 = ioread32(base_addr+S3C2410_ADCDAT1);


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


  if (updown) {

  if (count != 0)

  {

long tmp;

                                                                                                 

tmp = xp;

xp = yp;

yp = tmp;

                                                                                                 

                        xp >>= 2;

                        yp >>= 2;


  input_report_abs(dev, ABS_X, xp);

  input_report_abs(dev, ABS_Y, yp);


  input_report_key(dev, BTN_TOUCH, 1);

input_report_abs(dev, ABS_PRESSURE, 1);

  input_sync(dev);

  }


  xp = 0;

  yp = 0;

  count = 0;


  iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

  iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

  }

  else

  {

  count = 0;


  input_report_key(dev, BTN_TOUCH, 0);

  input_report_abs(dev, ABS_PRESSURE, 0);

  input_sync(dev);


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

if (OwnADC)

{

OwnADC = 0;

up(&ADC_LOCK);

}

  }

}


static struct timer_list touch_timer =

TIMER_INITIALIZER(touch_timer_fire, 0, 0);


static irqreturn_t stylus_updown(int irq, void *dev_id)

{

unsigned long data0;

unsigned long data1;

int updown;


if (down_trylock(&ADC_LOCK) == 0)

{

OwnADC = 1;

data0 = ioread32(base_addr+S3C2410_ADCDAT0);

data1 = ioread32(base_addr+S3C2410_ADCDAT1);


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


if (updown)

{

touch_timer_fire(0);

}

else

{

OwnADC = 0;

up(&ADC_LOCK);

}

}


return IRQ_HANDLED;

}



static irqreturn_t stylus_action(int irq, void *dev_id)

{

unsigned long data0;

unsigned long data1;


if (OwnADC)

{

data0 = ioread32(base_addr+S3C2410_ADCDAT0);

data1 = ioread32(base_addr+S3C2410_ADCDAT1);


xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;

yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;

count++;


if (count < (1<<2))

{

iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

}

else

{

mod_timer(&touch_timer, jiffies+1);

iowrite32(WAIT4INT(1), base_addr+S3C2410_ADCTSC);

}

}


return IRQ_HANDLED;

}


static struct clk *adc_clock;


static int __init tq2440ts_init(void)

{

struct input_dev *input_dev;


adc_clock = clk_get(NULL, "adc");

if (!adc_clock)

{

printk(KERN_ERR "failed to get adc clock sourcen");

return -ENOENT;

}

clk_enable(adc_clock);


base_addr=ioremap(S3C2410_PA_ADC,0x20);

if (base_addr == NULL)

{

printk(KERN_ERR "Failed to remap register blockn");

return -ENOMEM;

}


/* Configure GPIOs */

// tq2440_ts_connect();


iowrite32(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF),base_addr+S3C2410_ADCCON);

iowrite32(0xffff,  base_addr+S3C2410_ADCDLY);

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


/* Initialise input stuff */

input_dev = input_allocate_device();


if (!input_dev)

{

printk(KERN_ERR "Unable to allocate the input device !!n");

return -ENOMEM;

}


dev = input_dev;

dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);

dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);

input_set_abs_params(dev, ABS_X, 0, 0x3FF, 0, 0);

input_set_abs_params(dev, ABS_Y, 0, 0x3FF, 0, 0);

input_set_abs_params(dev, ABS_PRESSURE, 0, 1, 0, 0);


dev->name = tq2440ts_name;

dev->id.bustype = BUS_RS232;

dev->id.vendor = 0xDEAD;

dev->id.product = 0xBEEF;

dev->id.version = S3C2410TSVERSION;


if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED|IRQF_SAMPLE_RANDOM, tq2440ts_name, dev))

{

printk(KERN_ERR "tq2440_ts.c: Could not allocate ts IRQ_ADC !n");

iounmap(base_addr);

return -EIO;

}

if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM, tq2440ts_name, dev))

{

printk(KERN_ERR "tq2440_ts.c: Could not allocate ts IRQ_ADC !n");

iounmap(base_addr);

return -EIO;

}


printk(KERN_INFO "%s successfully loadedn", tq2440ts_name);


input_register_device(dev);


return 0;

}


static void __exit tq2440ts_exit(void)

{

disable_irq(IRQ_ADC);

disable_irq(IRQ_TC);

free_irq(IRQ_TC,dev);

free_irq(IRQ_ADC,dev);


if (adc_clock)

{

clk_disable(adc_clock);

clk_put(adc_clock);

adc_clock = NULL;

}


input_unregister_device(dev);

iounmap(base_addr);

}



module_init(tq2440ts_init);

module_exit(tq2440ts_exit);


其實(shí)就是將此驅(qū)動程序編譯進(jìn)內(nèi)核中,使內(nèi)核支持觸摸功能,可以采用編譯成模塊,加載進(jìn)內(nèi)核的方式,也可以直接編譯進(jìn)內(nèi)核。此處采用第二種方式。

修改同目錄下的“Kconfig”和“Makefile”文件。

在 Kconfig 文件的 468 行添加如下內(nèi)容:


config TOUCHSCREEN_TQ2440

tristate "EmbedSky TQ2440 TouchScreen input driver"

depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN

help

Say Y here if you have the TQ2440 TouchScreen.

and depends on TQ2440_ADC

If unsure, say N.

To compile this driver as a module, choose M here: the

module will be called tq2440_ts.


在 Makefile 文件的最后添加如下內(nèi)容:


obj-$(CONFIG_TOUCHSCREEN_TQ2440) += tq2440_ts.o


2、配置內(nèi)核

System Type —>

[ ] ADC common driver support

Device Drivers —>

Input device support —>

[* ] Touchscreens —>

<*> EmbedSky TQ2440 TouchScreen input driver

配置完畢后,保存配置,然后編譯內(nèi)核,燒寫鏡像到開發(fā)板中,內(nèi)核就能夠支持觸摸功能了。但是現(xiàn)在還沒有移植QT,所以無法使用觸摸功能,接下來配置一下QT。


3、文件系統(tǒng)中添加Qte

首先要制作帶有Qte的文件系統(tǒng),此處直接從天嵌科技提供的文件系統(tǒng)(rootfs_2.6.30.4 的文件系統(tǒng))源碼里面復(fù)制:“/opt/”目錄和“/root/”目錄到自己建立的文件系統(tǒng)里面,替換掉以前的目錄。使用的qtopia 是 2.2.0 版本的。

然后再在文件系統(tǒng)的“/bin/”目錄下面新建一個名為:“qtopia”的可執(zhí)行文件,內(nèi)容如下:


#!/bin/sh

echo Start Qtopia-2.2.0 > /dev/tq2440_serial0

if [ -f /etc/pointercal ] ; then

$QPEDIR/bin/qpe > /dev/null 2>/dev/null

else

ts_calibrate

$QPEDIR/bin/qpe > /dev/null 2>/dev/null

fi


添加可執(zhí)行權(quán)限:


chmod  u+x  qtopia


修改“/etc/init.d/rcS”文件,下面列出新添加的內(nèi)容:


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

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

#

#Trap CTRL-C &c only in this shell so we can interrupt subprocesses.

#

mount -a

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

mkdir -p /var/lock

mkdir /dev/fb /dev/v4l

ln -s /dev/fb0 /dev/fb/0

ln -s /dev/video0 /dev/v4l/video0

ln -s /dev/ts0 /dev/h3600_tsraw #建立一個觸摸設(shè)備的鏈接


export set TSLIB_TSDEVICE=/dev/event0

export set TSLIB_CONFFILE=/etc/ts.conf

export set TSLIB_PLUGINDIR=/lib/ts

export set TSLIB_CALIBFILE=/etc/pointercal

export set HOME=/root

export set QTDIR=/opt/Qtopia

export set QPEDIR=/opt/Qtopia

export set KDEDIR=/opt/kde

export set QWS_KEYBOARD="TTY:/dev/tty1"

export set QWS_MOUSE_PROTO="TPanel:/dev/event0 USB:/dev/mouse0"

export set PATH=$QPEDIR/bin: $PATH

export set LD_LIBRARY_PATH= $QTDIR/lib: $QPEDIR/lib


qtopia & #啟動 Qte 的腳本,上面幾行是設(shè)置 QT 的環(huán)境變量

/bin/hostname -F /etc/sysconfig/HOSTNAME


然后復(fù)制 tslib 的相關(guān)文件到新建的文件系統(tǒng)中:

復(fù)制“ts.conf”文件到新建的文件系統(tǒng)的“etc/”目錄下,“ts.conf”文件的內(nèi)容如下:

#Uncomment if you wish to use the linux input layer event interface

module_raw input

#Uncomment if you’re using a Sharp Zaurus SL-5500/SL-5000d

#module_raw collie

#Uncomment if you’re using a Sharp Zaurus SL-C700/C750/C760/C860

#module_raw corgi

#Uncomment if you’re using a device with a UCB1200/1300/1400 TS interface

#module_raw ucb1x00

#Uncomment if you’re using an HP iPaq h3600 or similar

#module_raw h3600

#Uncomment if you’re using a Hitachi Webpad

#module_raw mk712

#Uncomment if you’re using an IBM Arctic II

#module_raw arctic2

module pthres pmin=1

module variance delta=30

module dejitter delta=100

module linear


復(fù)制可執(zhí)行程序“ts_calibrate”到新建的文件系統(tǒng)的“sbin/”目錄下,這是觸摸校正程序;

[1] [2]
關(guān)鍵字:嵌入式驅(qū)動  移植  觸摸驅(qū)動 引用地址:嵌入式驅(qū)動移植之觸摸驅(qū)動初識

上一篇:嵌入式驅(qū)動移植之聲卡驅(qū)動移植
下一篇:LCD驅(qū)動移植之背光控制

推薦閱讀最新更新時間:2025-06-16 12:58

mini2440的觸摸驅(qū)動----使用input子系統(tǒng)實(shí)現(xiàn)
沒說程序之前先上圖一張,這個圖方便理解input子系統(tǒng)下的觸摸屏的實(shí)現(xiàn)。 關(guān)于input子系統(tǒng)的實(shí)現(xiàn)在前幾篇博客中已經(jīng)實(shí)現(xiàn)了input子系統(tǒng)的按鍵驅(qū)動。 下面開始說觸摸屏的驅(qū)動程序。 在說之前先結(jié)合上面的圖說一下幾個主要的函數(shù)的調(diào)用情況。 個中斷函數(shù)的調(diào)用次序: 先是stylus_updown TC中斷處理函數(shù), 如果要是壓下則調(diào)用touch_timer_fire來啟動ADC轉(zhuǎn)換, 在ADC轉(zhuǎn)換結(jié)束之后調(diào)用stylus_action。 程序中前面定義的宏和變量: /* For ts.dev.id.version */ #define S3C2410TSVERSION 0x0101 /*定義一個WA
[單片機(jī)]
mini2440的<font color='red'>觸摸</font>屏<font color='red'>驅(qū)動</font>----使用input子系統(tǒng)實(shí)現(xiàn)
電容觸摸MSP430電路與LED驅(qū)動電路設(shè)計(jì)詳解
  MSP430系列單片機(jī)以低功耗和外設(shè)模塊的豐富性而著稱,而針對電容觸摸應(yīng)用,MSP430的PIN RO 電容觸摸檢測方式支持IO口直接連接檢測電極,不需要任何外圍器件,極大的簡化了 電路設(shè)計(jì) ,而本設(shè)計(jì)文檔中使用的MSP430G2XX5 更支持多達(dá)2個IO口,可驅(qū)動24個以上的LED燈,達(dá)到理想的顯示效果。   電容觸摸實(shí)現(xiàn)原理   MSP430根據(jù)型號的不同支持多種電容觸摸檢測方式,有RC 震蕩、比較器、PIN RO,本設(shè)計(jì)使用的是PIN Relaxation Oscillator 方式,原理如圖1,芯片管腳內(nèi)部檢測電路由施密特觸發(fā)器、反向器,以及一個電阻組成,震蕩信號經(jīng)過施密特觸發(fā)器變成脈沖信號,再通過反向器反饋回RC 電
[單片機(jī)]
電容<font color='red'>觸摸</font>MSP430電路與LED<font color='red'>驅(qū)動</font>電路設(shè)計(jì)詳解
基于嵌入式Linux的LCD背光調(diào)節(jié)及驅(qū)動實(shí)現(xiàn)
  在手持式設(shè)備中,液晶顯示屏的使用越來越廣泛。由于LCD自身是不能發(fā)光的,它需要一個強(qiáng)勁的光源來給它提供背光,以便清晰地顯示信息。這樣的光源是非常耗電的,通常液晶顯示屏的功耗常常占到系統(tǒng)總功耗的60%以上。以群創(chuàng)的7寸屏為例,通常背光燈的功耗為2.5W,而LCD的功耗只有0.825W。由此可見,背光光源的功耗在整個電源中的比重是相當(dāng)高的。如果系統(tǒng)在不用顯示屏?xí)r,也全功率的運(yùn)行,系統(tǒng)的電池能量將很快被耗光。所以,調(diào)節(jié)LCD的背光源,降低系統(tǒng)在不用顯示屏?xí)r的能耗是十分必要的工作。   另外,由于手持式設(shè)備工作環(huán)境的變化,也需要根據(jù)外界光線強(qiáng)度的變化,對背光的亮度做出相應(yīng)的調(diào)節(jié),以適合人眼觀看的舒適度。   基于上述2種原因,考慮
[電源管理]
基于<font color='red'>嵌入式</font>Linux的LCD背光調(diào)節(jié)及<font color='red'>驅(qū)動</font>實(shí)現(xiàn)
嵌入式Linux操作系統(tǒng)的驅(qū)動程序開發(fā)要點(diǎn)
在Linux操作系統(tǒng)下有3類主要的設(shè)備文件類型:塊設(shè)備、字符設(shè)備和網(wǎng)絡(luò)設(shè)備。這種分類方法可以將控制輸入/輸出設(shè)備的驅(qū)動程序與其他操作系統(tǒng)軟件分離開來。 字符設(shè)備與塊設(shè)備的主要區(qū)別是:在對字符設(shè)備發(fā)出讀/寫請求時,實(shí)際的硬件I/O一般緊接著發(fā)生。塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作為緩沖區(qū),若用戶進(jìn)程對設(shè)備的請求能滿足用戶的要求,就返回請求的數(shù)據(jù);否則,就調(diào)用請求函數(shù)來進(jìn)行實(shí)際的I/O操作。塊設(shè)備主要是針對磁盤等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過多的CPU時間用來等待。網(wǎng)絡(luò)設(shè)備可以通過BSD套接口訪問數(shù)據(jù)。 每個設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備。另外每個文件都有2個設(shè)備號,第一個是主設(shè)備號,標(biāo)識驅(qū)動程序;第二個是
[嵌入式]
微型硬盤驅(qū)動技術(shù)與嵌入式應(yīng)用整合方案
目前,硬盤驅(qū)動器采用的主流接口是高技術(shù)配置接口標(biāo)準(zhǔn)(ATA),即IDE接口,而且絕大多數(shù)硬盤驅(qū)動器都采用了并行ATA接口。部分硬盤驅(qū)動器同時也支持CF (Compact Flash)規(guī)范、安全數(shù)字輸入/輸出(SDIO)標(biāo)準(zhǔn)和串行ATA規(guī)范。由于并行ATA和CF是便攜手持市場的最普遍的兩個標(biāo)準(zhǔn),因此本文側(cè)重討論這兩個規(guī)范。CF 3.0規(guī)范能夠在與標(biāo)準(zhǔn)IDE完全相同的真IDE模式下操作。與CF2.1相比,CF3.0增加了極端直接內(nèi)存訪問(Ultra DMA)模式。 通常,硬盤驅(qū)動器并不需要支持所有的模式。目前,1.8英寸硬盤能夠支持所有的模式,1英寸硬盤能支持到UDMA4模式。考慮到便攜消費(fèi)類市場對尺寸和功耗的要求,因此本文側(cè)重于
[嵌入式]
6410上移植uboot
由于Uboot2011.06對S3C6410有了很好的支持,所以采用Uboot2011.06版本。 一、 移植環(huán)境 主 機(jī):VMWare-ubuntu 開發(fā)板:ok6410—512M nandflash,Kernel:2.6.30.4 u-boot:u-boot-2011.06 二、 源碼獲得 Uboot源碼到: ftp://ftp.denx.de/pub/u-boot/ 下載 三、 本次移植的功能實(shí)現(xiàn) · 支持Nand Flash讀寫 · 支持從Nand Flash/SD啟動(SD卡啟動只在uboot1.1.6中完成) · 支持CS8900或者DM9000網(wǎng)卡 · 支持Yaffs文件系統(tǒng) ·
[單片機(jī)]
u-boot2010.03 移植篇(一) 建立編譯目標(biāo)
移植篇(一)-----修改Makefile,生成編譯目標(biāo)---S3C6410 ---------------------------------------------------------- 使用環(huán)境 PC: Centos5.4 kernel: 3.0.1 corss: arm-linux-gcc 4.4.1 arm: s3c6410 uboot: uboot-2010-03 ---------------------------------------------------------- 開始教程之前.你需要下載源碼,解壓....此處略過千萬行~~源碼為uboot2010.03這個..別整錯了.錯了
[單片機(jī)]
移植OK6410 LCD驅(qū)動
1.本次移植過程選擇 linux-2.6.28 lcd驅(qū)動為參考移植到 linux-2.6.34 ok6410 開發(fā)板上。 2.移植過程 主要以給內(nèi)核增加驅(qū)動的思想,在/driver/video/ 下增加 samsung目錄,提取 2.6.28 中驅(qū)動相關(guān)源代碼,將源代碼復(fù)制到samsung 下。 修改 /driver/video 下的Makefile 文件,增加進(jìn)入samsung目錄編譯的編譯條目 obj-$(CONFIG_FB_S3C) += samsung/ 修改 /driver/video 下的Kconfig 文件,增加 /samsung/Kconfig 配置條目 comment F
[單片機(jī)]
<font color='red'>移植</font>OK6410 LCD<font color='red'>驅(qū)動</font>
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京B2-20211791 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved