




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租充氣皮艇合同范本
- 幾人共同購房合同范本
- 電纜外貿(mào)合同范本
- 包裝合同范本8篇
- 公司合同范本梳理審核
- 倉庫流轉(zhuǎn)合同范本
- 單位集資建房轉(zhuǎn)讓合同范本
- 勞防用品采購合同范本
- 出售立軸制砂機(jī)合同范本
- 出售玻璃蓋板合同范本
- 電子商務(wù)運(yùn)營(第二版) 課件 項(xiàng)目1 認(rèn)識(shí)電商運(yùn)營
- 冰淇淋店選址與競爭環(huán)境分析
- 領(lǐng)導(dǎo)干部離任交接表
- 儲(chǔ)運(yùn)安全檢查分析(SCL)評價(jià)記錄
- 人教版六年級上冊道德與法治教案(5篇)
- 2024年無人駕駛環(huán)衛(wèi)行業(yè)研究報(bào)告-通渠有道
- (中職)中職生創(chuàng)新創(chuàng)業(yè)能力提升教課件完整版
- 中班健康課件《我不挑食》
- 人教版(2024新版)七年級上冊英語各單元重點(diǎn)語法知識(shí)點(diǎn)講義
- 生豬屠宰獸醫(yī)衛(wèi)生人員考試題庫答案(414道)
- 《完善中國特色社會(huì)主義法治體系》課件
評論
0/150
提交評論