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

歷史上的今天

今天是:2025年07月23日(星期三)

2021年07月23日 | 嵌入式驅(qū)動(dòng)移植之觸摸驅(qū)動(dòng)初識(shí)

發(fā)布者:心懷感恩 來源: eefocus關(guān)鍵字:嵌入式驅(qū)動(dòng)  移植  觸摸驅(qū)動(dòng) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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

BootLoader:u-boot-1.1.6

kernel:linux-2.6.30.4

CPU:s3c2440

開發(fā)板:TQ2440

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


移植步驟

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

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


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

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


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

代碼如下:


#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ū)動(dòng)程序編譯進(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/”目錄下面新建一個(gè)名為:“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 #建立一個(gè)觸摸設(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 & #啟動(dòng) 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ū)動(dòng)  移植  觸摸驅(qū)動(dòng) 引用地址:嵌入式驅(qū)動(dòng)移植之觸摸驅(qū)動(dòng)初識(shí)

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

推薦閱讀

2018年7月23日,致力于亞太地區(qū)市場(chǎng)的領(lǐng)先半導(dǎo)體元器件分銷商---大聯(lián)大控股宣布,為協(xié)助臺(tái)灣地區(qū)的學(xué)生與產(chǎn)業(yè)接軌,第三屆「大聯(lián)大創(chuàng)新設(shè)計(jì)大賽」,以【智慧芯城市,馳騁芯未來】為主題,特別規(guī)劃了臺(tái)灣地區(qū)限定的「設(shè)計(jì)思考工作坊」,邀請(qǐng)?jiān)O(shè)計(jì)思考的專業(yè)講師,同時(shí)集結(jié)16位大聯(lián)大旗下世平、品佳、詮鼎、友尚集團(tuán)技術(shù)專家群,運(yùn)用超過20年業(yè)界經(jīng)驗(yàn)共同協(xié)助...
全球領(lǐng)先的半導(dǎo)體解決方案供應(yīng)商瑞薩電子株式會(huì)社宣布推出三款全新15Mbps光電耦合器,用于應(yīng)對(duì)工業(yè)及工廠自動(dòng)化設(shè)備的惡劣工作環(huán)境。在追求更高電壓、緊湊型系統(tǒng)的趨勢(shì)下,需要更嚴(yán)格的國際安全標(biāo)準(zhǔn)和環(huán)保解決方案,而這些解決方案則要求更小IC及更低功耗。RV1S9x60A系列擁有最佳的低閾值輸入電流(IFHL)額定值:RV1S9160A(SO5)工作電流為2.0mA,RV1S90...
Bosch Sensortec正在啟動(dòng)一項(xiàng)“長期供貨計(jì)劃”,同時(shí)擴(kuò)展其產(chǎn)品組合,滿足工業(yè)應(yīng)用的特定需求。通過確保長達(dá)十年的產(chǎn)品供貨期[i],這項(xiàng)全新計(jì)劃不僅能夠令客戶高枕無憂,更為其提供高性能、堅(jiān)固耐用的傳感器。此外,由于卷軸尺寸較小,因此購買靈活度更高。 在工業(yè)和物聯(lián)網(wǎng)應(yīng)用方面,客戶通常希望制造商能夠在較長時(shí)間(通常為十年)內(nèi)提供零部件。因?yàn)榇?..
1. 問題描述在用STM32CubeMX生成 STM32F103C8T6 的MDK工程后,在main.c中更改定時(shí)器占空比計(jì)數(shù)值的時(shí)候,報(bào)錯(cuò):總之就是HAL庫內(nèi)部API函數(shù)__HAL_TIM_SetCompare找不到。2. 解決方案經(jīng)過搜索,該函數(shù)在stm32_hal_legacy.h文件中:所以出錯(cuò)原因肯定是:調(diào)用此函數(shù)的時(shí)候沒有包含進(jìn)來這個(gè)頭文件,再次通過文件名查找:果然,包含此頭文件需要定義宏USE_HAL...

史海拾趣

問答坊 | AI 解惑

運(yùn)算放大器、比較器設(shè)計(jì)指南

運(yùn)算放大器、比較器設(shè)計(jì)指南 第十四版 運(yùn)算放大器、比較器設(shè)計(jì)指南 第十六版…

查看全部問答∨

求助各位大仙高手指點(diǎn)一下,如何在wince下實(shí)現(xiàn)放截屏的功能!非常感謝!

求助各位大仙高手指點(diǎn)一下,如何在wince下實(shí)現(xiàn) 防截屏 的功能!非常感謝!…

查看全部問答∨

程序在執(zhí)行掃描時(shí)老是在一個(gè)地方進(jìn)行判斷該怎么辦

大家好,我的程序(不是自己寫的)在執(zhí)行判斷掃描時(shí)老是停留在一個(gè)地方,怎么辦? 程序段如下: main: nop nop nop        mov wdt_contr,#00111110B  ;喂狗              ...…

查看全部問答∨

廣東北電 or 小公司?

廣東北電做vxwork應(yīng)用(cdma基站控制器),小公司做嵌入式linux應(yīng)用(voip),該選擇哪個(gè)? 其中小公司離家很近,北電離家遠(yuǎn)一點(diǎn)(隔壁城市) 本人有嵌入式linux兩年經(jīng)驗(yàn)了 兩者待遇差不多…

查看全部問答∨

2440 CAMERA CODE DMA地址在CONFIG.BIB中設(shè)置的疑惑?

我的CONFIG.BIB一段如下: MEMORY ;NK         NK  8C200000  01D00000  RAMIMAGE ;RAM         RAM         8E800000  0 ...…

查看全部問答∨

請(qǐng)教運(yùn)算放大器的使用問題

我現(xiàn)在用一個(gè)運(yùn)算放大器調(diào)整單片機(jī)的采樣信號(hào).放大器的型號(hào)為LF412,資料里電源連接方式是雙電源供電,如接+/-15v,由于我現(xiàn)在的輸入信號(hào)只有正的.我把負(fù)電源接地,正電源接+15v,請(qǐng)問這樣做行嗎?…

查看全部問答∨

大家覺得這個(gè)4*4鍵盤掃描程序怎樣,我修改了一點(diǎn)點(diǎn)。

這個(gè)程序不是原創(chuàng)的,但是我修改了一點(diǎn)點(diǎn),理解起來輕松了很多。大家覺得怎樣,如果有較好的不妨拿出來分享討論一下吧 !                   & ...…

查看全部問答∨

穩(wěn)壓管的用法

打算通過24V直流 串個(gè)10K電阻 然后再通過個(gè)5V穩(wěn)壓管接地,最后在穩(wěn)壓管2端取得一個(gè)接近5V的穩(wěn)定電壓,可行否? 穩(wěn)壓管要如何選擇其參數(shù),請(qǐng)賜教…

查看全部問答∨

06.23【每周討論】我們年輕,富有正義。對(duì)于社會(huì)中的不文明現(xiàn)象該怎樣看待呢?

06.23【每周討論】年輕的我們,富有正義、滿懷激情。對(duì)于社會(huì)中的不文明現(xiàn)象該怎樣看待呢?我們年輕人,富有正義、滿懷激情,眼里容不下一粒沙。社會(huì)中那些不文明的現(xiàn)象經(jīng)常在我們的周圍發(fā)生,卻讓我們感到無可奈何。若為此感到懊惱的話,那你永遠(yuǎn) ...…

查看全部問答∨

燒寫程序的過程中對(duì)程序memory的處理

1.在燒寫程序時(shí),是不是芯片的所有memory都要先進(jìn)行校驗(yàn)?   2.在程序沒使用內(nèi)部flash的情況下,會(huì)不會(huì)在燒寫程序也要對(duì)flash的memory進(jìn)行校驗(yàn)。     3.以上校驗(yàn)memory時(shí),是要先對(duì)flash解鎖的嗎?   經(jīng)過查閱TI的CSM相 ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

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

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