Linux-2.6.32.2內(nèi)核在mini2440上的移植(九)_第1頁
Linux-2.6.32.2內(nèi)核在mini2440上的移植(九)_第2頁
Linux-2.6.32.2內(nèi)核在mini2440上的移植(九)_第3頁
Linux-2.6.32.2內(nèi)核在mini2440上的移植(九)_第4頁
Linux-2.6.32.2內(nèi)核在mini2440上的移植(九)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Linux-內(nèi)核在mini2440上的移植(九)---觸摸屏驅(qū)動(dòng)移植移植環(huán)境(紅色粗字體字為修改后內(nèi)容,藍(lán)色粗體字為特別注意內(nèi)容)1,主機(jī)環(huán)境:VMare下CentOS5.5,1G內(nèi)存。2,集成開發(fā)環(huán)境:ElipseIDE3,編譯編譯環(huán)境:arm-linux-gccv4.4.3,arm-none-linux-gnueabi-gccv4.5.1。4,開發(fā)板:mini2440,2Mnorflash,128Mnandflash。5,u-boot版本:u-boot-2009.086,linux版本:linux-7,參考文章:嵌入式linux應(yīng)用開發(fā)完全手冊,韋東山,編著。Mini2440之Linux移植開發(fā)實(shí)戰(zhàn)指南博主黃剛嵌入式Linux之我行——S3C2440上ADC驅(qū)動(dòng)實(shí)例開發(fā)講解【1】在內(nèi)核中添加觸摸屏驅(qū)動(dòng)程序Linux-內(nèi)核也沒有包含支持S3C2440的觸摸屏驅(qū)動(dòng),因此友善官方自行設(shè)計(jì)了一個(gè)s3c2410_ts.c,它位于linux-src/drivers/input/touchscreen目錄下,你可以自己增加一個(gè)s3c2410_ts.c文件,并復(fù)制如下內(nèi)容:#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<linux/gpio.h>

#include<asm/io.h>

#include<asm/irq.h>#include<plat/regs-adc.h>

#include<mach/regs-gpio.h>/*Forts.dev.id.version*/

#defineS3C2410TSVERSION0x0101/*定義一個(gè)WAIT4INT宏,該宏將對ADC觸摸屏控制寄存器進(jìn)行操作

S3C2410_ADCTSC_YM_SEN這些宏都定義在regs-adc.h中*/

#defineWAIT4INT(x)(((x)<<8)|\

S3C2410_ADCTSC_YM_SEN|S3C2410_ADCTSC_YP_SEN|S3C2410_ADCTSC_XP_SEN|\

S3C2410_ADCTSC_XY_PST(3))#defineAUTOPST(S3C2410_ADCTSC_YM_SEN|S3C2410_ADCTSC_YP_SEN|S3C2410_ADCTSC_XP_SEN|\

S3C2410_ADCTSC_AUTO_PST|S3C2410_ADCTSC_XY_PST(0))//staticchar*s3c2410ts_name="s3c2410TouchScreen";

#defineDEVICE_NAME"mini2440_TouchScreen"/*設(shè)備名稱*/staticstructinput_dev*ts_dev;/*定義一個(gè)輸入設(shè)備來表示我們的觸摸屏設(shè)備*/staticlongxp;

staticlongyp;

staticintcount;/*定義一個(gè)外部的信號量ADC_LOCK,因?yàn)锳DC_LOCK在ADC驅(qū)動(dòng)程序中已申明

這樣就能保證ADC資源在ADC驅(qū)動(dòng)和觸摸屏驅(qū)動(dòng)中進(jìn)行互斥訪問*/

externstructsemaphoreADC_LOCK;

staticintOwnADC=0;staticvoid__iomem*base_addr;/*定義了一個(gè)用來保存經(jīng)過虛擬映射后的內(nèi)存地址*/staticinlinevoids3c2410_ts_connect(void)

{

s3c2410_gpio_cfgpin(S3C2410_GPG(12),S3C2410_GPG12_XMON);

s3c2410_gpio_cfgpin(S3C2410_GPG(13),S3C2410_GPG13_nXPON);

s3c2410_gpio_cfgpin(S3C2410_GPG(14),S3C2410_GPG14_YMON);

s3c2410_gpio_cfgpin(S3C2410_GPG(15),S3C2410_GPG15_nYPON);

}staticvoidtouch_timer_fire(unsignedlongdata)

{

/*用于記錄這一次AD轉(zhuǎn)換后的值*/

unsignedlongdata0;

unsignedlongdata1;

intupdown;/*用于記錄觸摸屏操作狀態(tài)是按下還是抬起*/data0=ioread32(base_addr+S3C2410_ADCDAT0);

data1=ioread32(base_addr+S3C2410_ADCDAT1);

/*記錄這一次對觸摸屏是壓下還是抬起,該狀態(tài)保存在數(shù)據(jù)寄存器的第15位,所以需要邏輯與上S3C2410_ADCDAT0_UPDOWN*/

updown=(!(data0&S3C2410_ADCDAT0_UPDOWN))&&(!(data1&S3C2410_ADCDAT0_UPDOWN));if(updown)/*判斷觸摸屏的操作狀態(tài)*/

{

/*如果狀態(tài)是按下,并且ADC已經(jīng)轉(zhuǎn)換了就報(bào)告事件和數(shù)據(jù)*/

if(count!=0)//轉(zhuǎn)換四次后進(jìn)行事件匯報(bào)

{

longtmp;

tmp=xp;

xp=yp;

yp=tmp;

//這里進(jìn)行轉(zhuǎn)換是因?yàn)槲覀兊钠聊皇褂脮r(shí)采用的是240*320,相當(dāng)于把原來的屏幕的X,Y軸變換。

//個(gè)人理解,不知是否正確

//設(shè)備X,Y值

xp>>=2;

yp>>=2;

#ifdefCONFIG_TOUCHSCREEN_MINI2440_DEBUG

/*觸摸屏調(diào)試信息,編譯內(nèi)核時(shí)選上此項(xiàng)后,點(diǎn)擊觸摸屏?xí)诮K端上打印出坐標(biāo)信息*/

structtimevaltv;

do_gettimeofday(&tv);

printk(KERN_DEBUG"T:%06d,X:%03ld,Y:%03ld\n",(int)tv.tv_usec,xp,yp);

#endif

input_report_abs(ts_dev,ABS_X,xp);

input_report_abs(ts_dev,ABS_Y,yp);

/*報(bào)告按鍵事件,鍵值為1(代表觸摸屏對應(yīng)的按鍵被按下)*/

input_report_key(ts_dev,BTN_TOUCH,1);

/*報(bào)告觸摸屏的狀態(tài),1表明觸摸屏被按下*/

input_report_abs(ts_dev,ABS_PRESSURE,1);

/*等待接收方受到數(shù)據(jù)后回復(fù)確認(rèn),用于同步*/

input_sync(ts_dev);

//這個(gè)表明我們上報(bào)了一次完整的觸摸屏事件,用來間隔下一次的報(bào)告

}

/*如果狀態(tài)是按下,并且ADC還沒有開始轉(zhuǎn)換就啟動(dòng)ADC進(jìn)行轉(zhuǎn)換*/

xp=0;

yp=0;

count=0;

/*設(shè)置觸摸屏的模式為自動(dòng)轉(zhuǎn)換模式*/

iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE|AUTOPST,base_addr+S3C2410_ADCTSC);

/*啟動(dòng)ADC轉(zhuǎn)換*/

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

//如果還沒有啟動(dòng)ADC或者ACD轉(zhuǎn)換四次完畢后則啟動(dòng)ADC

}

else/*否則是抬起狀態(tài)*/

{

//如果是up狀態(tài),則提出報(bào)告并讓觸摸屏處在等待觸摸的階段

count=0;input_report_key(ts_dev,BTN_TOUCH,0);/*報(bào)告按鍵事件,鍵值為0(代表觸摸屏對應(yīng)的按鍵被釋放)*/

input_report_abs(ts_dev,ABS_PRESSURE,0);/*報(bào)告觸摸屏的狀態(tài),0表明觸摸屏沒被按下*/

input_sync(ts_dev);/*等待接收方受到數(shù)據(jù)后回復(fù)確認(rèn),用于同步*/iowrite32(WAIT4INT(0),base_addr+S3C2410_ADCTSC);

if(OwnADC)

{

OwnADC=0;

up(&ADC_LOCK);

}

}

}

/*定義并初始化了一個(gè)定時(shí)器touch_timer,定時(shí)器服務(wù)程序?yàn)閠ouch_timer_fire*/

staticstructtimer_listtouch_timer=TIMER_INITIALIZER(touch_timer_fire,0,0);/*ADC中斷服務(wù)程序,AD轉(zhuǎn)換完成后觸發(fā)執(zhí)行*/

staticirqreturn_tstylus_updown(intirq,void*dev_id)

{

unsignedlongdata0;

unsignedlongdata1;

intupdown;

//注意在觸摸屏驅(qū)動(dòng)模塊中,這個(gè)ADC_LOCK的作用是保證任何時(shí)候都只有一個(gè)驅(qū)動(dòng)程序使用ADC的

//中斷線,因?yàn)樵趍ini2440adc模塊中也會(huì)使用到ADC,這樣只有擁有了這個(gè)鎖,才能進(jìn)入到啟動(dòng)ADC

if(down_trylock(&ADC_LOCK)==0)

{

OwnADC=1;

data0=ioread32(base_addr+S3C2410_ADCDAT0);

data1=ioread32(base_addr+S3C2410_ADCDAT1);

/*記錄這一次對觸摸屏是壓下還是抬起,該狀態(tài)保存在數(shù)據(jù)寄存器的第15位,所以需要邏輯與上S3C2410_ADCDAT0_UPDOWN*/

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

{

touch_timer_fire(0);//這是一個(gè)定時(shí)器函數(shù),當(dāng)然在這里是作為普通函數(shù)調(diào)用,用來啟動(dòng)ADC

}

else

{

OwnADC=0;

up(&ADC_LOCK);//注意這部分是基本不會(huì)執(zhí)行的,除非你觸摸后以飛快的速度是否,還來

//不及啟動(dòng)ADC,當(dāng)然這種飛快的速度一般是達(dá)不到的,筆者調(diào)試程序時(shí)發(fā)現(xiàn)這里是進(jìn)入不了的

}

}returnIRQ_HANDLED;

}

staticirqreturn_tstylus_action(intirq,void*dev_id)

{

unsignedlongdata0;

unsignedlongdata1;if(OwnADC){//讀取數(shù)據(jù)

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)){//如果小如四次重新啟動(dòng)轉(zhuǎn)換

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{//如果超過四次,則等待1ms后進(jìn)行數(shù)據(jù)上報(bào)

mod_timer(&touch_timer,jiffies+1);

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

}

}returnIRQ_HANDLED;

}staticstructclk*adc_clock;/*用于保存從平臺(tái)時(shí)鐘列表中獲取的ADC時(shí)鐘*/staticint__inits3c2410ts_init(void)

{

structinput_dev*input_dev;

/*從平臺(tái)時(shí)鐘隊(duì)列中獲取ADC的時(shí)鐘,這里為什么要取得這個(gè)時(shí)鐘,因?yàn)锳DC的轉(zhuǎn)換頻率跟時(shí)鐘有關(guān)。

系統(tǒng)的一些時(shí)鐘定義在arch/arm/plat-s3c24xx/s3c2410-clock.c中*/

adc_clock=clk_get(NULL,"adc");

if(!adc_clock){

printk(KERN_ERR"failedtogetadcclocksource\n");

return-ENOENT;

}

/*時(shí)鐘獲取后要使能后才可以使用,clk_enable定義在arch/arm/plat-s3c/clock.c中*/

clk_enable(adc_clock);

//獲取時(shí)鐘,掛載APBBUS上的外圍設(shè)備,需要時(shí)鐘控制,ADC就是這樣的設(shè)備。/*I/O內(nèi)存是不能直接進(jìn)行訪問的,必須對其進(jìn)行映射,為I/O內(nèi)存分配虛擬地址,這些虛擬地址以__iomem

進(jìn)行說明,但不能直接對其進(jìn)行訪問,需要使用專用的函數(shù),如iowrite32

S3C2410_PA_ADC是ADC控制器的基地址,定義在mach-s3c2410/include/mach/map.h中,0x20是虛擬地址長度大小*/

base_addr=ioremap(S3C2410_PA_ADC,0x20);

if(base_addr==NULL){

printk(KERN_ERR"Failedtoremapregisterblock\n");

return-ENOMEM;

}/*ConfigureGPIOs*/

s3c2410_ts_connect();

/*計(jì)算結(jié)果為(二進(jìn)制):111111111000000,再根據(jù)數(shù)據(jù)手冊得知此處是將AD轉(zhuǎn)換預(yù)定標(biāo)器值設(shè)為255、AD轉(zhuǎn)換預(yù)定標(biāo)器使能有效*/

iowrite32(S3C2410_ADCCON_PRSCEN|S3C2410_ADCCON_PRSCVL(0xFF),\

base_addr+S3C2410_ADCCON);//使能預(yù)分頻和設(shè)置分頻系數(shù)

iowrite32(0xffff,base_addr+S3C2410_ADCDLY);//設(shè)置ADC延時(shí),在等待中斷模式下表示產(chǎn)生INT_TC的間隔延時(shí)值為0xffff*//*WAIT4INT宏計(jì)算結(jié)果為(二進(jìn)制):11010011,再根據(jù)數(shù)據(jù)手冊得知此處是將ADC觸摸屏控制寄存器設(shè)置成等待中斷模式*/

iowrite32(WAIT4INT(0),base_addr+S3C2410_ADCTSC);//按照等待中斷的模式設(shè)置TSC

/*Initialiseinputstuff*/

//allocatememoryfornewinputdevice,用來給輸入設(shè)備分配空間,并做一些輸入設(shè)備通用的初始的設(shè)置

input_dev=input_allocate_device();if(!input_dev){

printk(KERN_ERR"Unabletoallocatetheinputdevice!!\n");

return-ENOMEM;

}

//設(shè)置事件類型

ts_dev=input_dev;

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

ts_dev->keybit[BITS_TO_LONGS(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);

/*以上四句都是設(shè)置事件類型中的code,如何理解呢,先說明事件類型,常用的事件類型EV_KEY、

EV_MOSSE,EV_ABS(用來接收像觸摸屏這樣的絕對坐標(biāo)事件),而每種事件又會(huì)有不同類型的編碼code,

比方說ABS_X,ABS_Y,這些編碼又會(huì)有相應(yīng)的value*/ts_dev->name=DEVICE_NAME;

ts_dev->id.bustype=BUS_RS232;

ts_dev->id.vendor=0xDEAD;

ts_dev->duct=0xBEEF;

ts_dev->id.version=S3C2410TSVERSION;

//以上是輸入設(shè)備的名稱和id,這些信息時(shí)輸入設(shè)備的身份信息了,在用戶空間如何看到呢?

//可以通過cat/proc/bus/input/devices,下面是其輸出信息

/*[root@mini2440/]#catproc/bus/input/devices

I:Bus=0013Vendor=deadProduct=beefVersion=0101

N:Name="s3c2410TouchScreen"

P:Phys=

S:Sysfs=/devices/virtual/input/input0

U:Uniq=

H:Handlers=event0

B:EV=b

B:KEY=0

B:ABS=1000003

*//*Getirqs*/

//中斷處理

//stylus_action和stylus_updown兩個(gè)中斷處理函數(shù),當(dāng)筆尖觸摸時(shí),會(huì)進(jìn)入到stylus_updown

if(request_irq(IRQ_ADC,stylus_action,IRQF_SHARED|IRQF_SAMPLE_RANDOM,

"s3c2410_action",ts_dev)){

printk(KERN_ERR"s3c2410_ts.c:CouldnotallocatetsIRQ_ADC!\n");

iounmap(base_addr);

return-EIO;

}

if(request_irq(IRQ_TC,stylus_updown,IRQF_SAMPLE_RANDOM,

"s3c2410_action",ts_dev)){

printk(KERN_ERR"s3c2410_ts.c:CouldnotallocatetsIRQ_TC!\n");

iounmap(base_addr);

return-EIO;

}printk(KERN_INFO"%ssuccessfullyloaded\n",s3c2410ts_name);/*Allwentok,soregistertotheinputsystem*/

//前面已經(jīng)設(shè)置了設(shè)備的基本信息和所具備的能力,所有的都準(zhǔn)備好了,現(xiàn)在就可以注冊了

input_register_device(ts_dev);return0;

}staticvoid__exits3c2410ts_exit(void)

{

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

}

module_init(s3c2410ts_init);

module_exit(s3c2410ts_exit);我們從整體上描述轉(zhuǎn)換的過程:

(1)如果觸摸屏感覺到觸摸,則進(jìn)入updownISR,如果能獲取ADC_LOCK則調(diào)用touch_timer_fire,

啟動(dòng)ADC,

(2)ADC轉(zhuǎn)換,如果小于四次繼續(xù)轉(zhuǎn)換,如果四次完畢后,啟動(dòng)1個(gè)時(shí)間滴答的定時(shí)器,停止ADC,

也就是說在這個(gè)時(shí)間滴答內(nèi),ADC是停止的,

(3)這樣可以防止屏幕抖動(dòng)。

(4)如果1個(gè)時(shí)間滴答到時(shí)候,觸摸屏仍然處于觸摸狀態(tài)則上報(bào)轉(zhuǎn)換數(shù)據(jù),并重啟ADC,重復(fù)(2)

(5)如果觸摸筆釋放了,則上報(bào)釋放事件,并將觸摸屏重新設(shè)置為等待中斷狀態(tài)。然后打開linux-/drivers/input/touchscreen/Makefile,定位到文件末尾,添加該源代碼的目標(biāo)模塊,如下紅色部分:obj-$(CONFIG_TOUCHSCREEN_W90X900)+=w90p910_ts.o

obj-$(CONFIG_TOUCHSCREEN_PCAP)+=pcap_ts.o

obj-$(CONFIG_TOUCHSCREEN_MINI2440)+=s3c2410_ts.o再打開linux-/drivers/input/touchscreen/Kconfig,定位到14行附近,加入如下紅色部分,這樣就在內(nèi)核配置中添加了mini2440的觸摸屏驅(qū)動(dòng)選項(xiàng):ifINPUT_TOUCHSCREENconfigTOUCHSCREEN_MINI2440

tristate"SamsungS3C2440touchscreeninputdriver"

dependsonMACH_MINI2440&&INPUT&&INPUT_TOUCHSCREEN&&MINI2440_ADC

defaulty

help

SayYhereifyouhavethes3c2440touchscreen.

Ifunsure,sayN.

Tocompilethisdriverasamodule,chooseMhere:the

modulewillbecalleds3c2410_ts.configTOUCHSCREEN_MY2440_DEBUG

boolean"S3C2440touchscreensinputdriverdebugmessages"

dependsonTOUCHSCREEN_MINI2440

help

SelectthisifyouwantdebugmessagesconfigTOUCHSCREEN_ADS7846

tristate"ADS7846/TSC2046andADS7843basedtouchscreens"

dependsonSPI_MASTER

dependsonHWMON=n||HWMON

help至此,我們就已經(jīng)在內(nèi)核中添加完了觸摸屏驅(qū)動(dòng)?!?】配置編譯并啟動(dòng)內(nèi)核在命令行執(zhí)行:makemenuconfig,然后依次選擇如下子菜單,找到剛剛添加的觸摸屏驅(qū)動(dòng)選項(xiàng):

DeviceDrivers--->

Inputdevicesupport--->

[*]Touchscreens--->

如圖所示,按空格鍵選中“S3C2440touchscreensinputdriverdebugmessages(NEW)”觸摸屏驅(qū)動(dòng)配置選項(xiàng):退出并保存以上內(nèi)核配置,在命令行輸入:makeuImage,將生成arch/arm/boot/uImage文件,然后復(fù)制到nfsboot/kernel目錄下。啟動(dòng)開發(fā)板,可以在串口終端看到如下啟動(dòng)信息:......mice:PS/2mousedevicecommonforallmice

mini2440_TouchScreensuccessfullyloaded

input:mini2440_TouchScreenas/devices/virtual/input/input0

S3C24XXRTC,(c)2004,2006SimtecElectronics.....說明觸摸屏的驅(qū)動(dòng)加載成功?!?】創(chuàng)建觸摸屏設(shè)備節(jié)點(diǎn)并測試(1)新建一個(gè)測試文件,代碼位于linux-test/codetest/tstest.c,代碼如下:#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<errno.h>#include<sys/poll.h>#include<fcntl.h>#include<stdio.h>#include<stdlib.h>

#include<linux/input.h>structsample{charposition[15];intx;inty;};structsamplesample_array[4]={{"topleft",0,0},{"topright",0,0},{"bottonleft",0,0},{"bottonright",0,0},};intX1,X2,Y1,Y2;getsample(intfd,intposition){

structinput_eventev[128];intrb,sample_cnt,cntx=0,cnty=0;rb=read(fd,ev,sizeof(structinput_event)*128);if(rb<(int)sizeof(structinput_event)){perror("evtest:shortread");exit(1);}for(sample_cnt=0;sample_cnt<(int)(rb/sizeof(structinput_event));sample_cnt++){if(EV_ABS==ev[sample_cnt].type){

if(sample_cnt%20==0){printf("%ld.%06ld",ev[sample_cnt].time.tv_sec,ev[sample_cnt].time.tv_usec);printf("type%dcode%dvalue%d\n",ev[sample_cnt].type,ev[sample_cnt].code,ev[sample_cnt].value);

}if(ABS_X==ev[sample_cnt].code){sample_array[position].x+=ev[sample_cnt].value;cntx++;}if(ABS_Y==ev[sample_cnt].code){sample_array[position].y+=ev[sample_cnt].value;cnty++;}

}}sample_array[position].x/=cntx;sample_array[position].y/=cnty;}intts_coordinate(intvalue,intaxes)

{

inttempX,ret;

if(ABS_X==axes)ret=240-(240*(value-X2)/(X1-X2));

if(ABS_Y==axes)ret=320-(320*(value-Y2)/(Y1-Y2));

returnret;

}

intmain(intargc,char**argv){structpollfdpfd;intn,fd,i=0;if((fd=open("/dev/input/event0",O_RDONLY))<0){printf("openerror!\n");exit(1);}

for(i=0;i<4;i++){printf("Pleasetouchthe%sfor6second!\n",sample_array[i].position);sleep(6);printf("TimeisupPleaserelease\n");getsample(fd,i);

sleep(1);}

for(i=0;i<4;i++){

printf("%12sx=%4d,y=%4d\n",sample_array[i].position,

sample_array[i].x,

sample_array[i].y);

}

X1=(sample_array[0].x+sample_array[2].x)/2;

X2=(sample_array[1].x+sample_array[3].x)/2;

Y1=(sample_array[0].y+sample_array[1].y)/2;

Y2=(sample_array[2].y+sample_array[3].y)/2;printf("Coordinatecomplete,testitnow\n");

for(i=0;i<4;i++){printf("Pleasetouchthe%sfor6second!\n",sample_array[i].position);sleep(6);printf("TimeisupPleaserelease\n");getsample(fd,i);

sample_array[i].x=ts_coordinate(sample_array[i].x,ABS_X);

sample_array[i].y=ts_coordinate(sample_array[i].y,ABS_Y);

sleep(1);}

printf("thedataaftercoordinate\n");

for(i=0;i<4;i++){

printf("%12sx=%4d,y=%4d\n",sample_array[i].position,

sample_array[i].x,

sample_array[i].y);

}

close(fd);

exit(0);}然后保存退出。(2)在主機(jī)終端交叉編譯[root@localhostcodetest]#arm-linux-gcc-otstesttstest.c將其復(fù)制到nfsboot目錄下以便在開發(fā)板掛載該目錄后能夠執(zhí)行[root@localhostcodetest]#cptstest/nfsboot/nfs(3)查看設(shè)備信息由啟動(dòng)信息得知觸摸屏設(shè)備為輸入類設(shè)備,按如下操作:[root@mini2440/]#catproc/devices

Characterdevices:

1mem

2pty

3ttyp

4/dev/vc/0

4tty

5/dev/tty

5/dev/console

5/dev/ptmx

7vcs

10misc

13input

14sound

可以得知輸入類設(shè)備的主設(shè)備號為13,又按如下操作:[root@mini2440/]#catproc/bus/input/devices

I:Bus=0013Vendor=deadProduct=beefVersion=0101

N:Name="mini2440_TouchScreen"

P:Phys=

S:Sysfs=/devices/virtual/input/input0

U:Uniq=

H:Handlers=event0

B:EV=b

B:KEY=0

B:ABS=1000003[root@mini2440/]#可看查看總線的具體輸入設(shè)備輸入設(shè)備的名稱和id等詳細(xì)的身份信息信息。根據(jù)這些信息我們建立好設(shè)備節(jié)點(diǎn),設(shè)置內(nèi)核調(diào)試級別為8,至于為什么設(shè)置內(nèi)核調(diào)試級別為8,可以參考文章內(nèi)核模塊調(diào)試方法[root@mini2440/]#mkdir/dev/input

[root@mini2440/]#mknod/dev/input/event0c1364

[root@mini2440/]#echo8>/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論