![FS2410開(kāi)發(fā)板上的按鍵驅(qū)動(dòng)程序(2)續(xù)-基礎(chǔ)電子_第1頁(yè)](http://file4.renrendoc.com/view/b3f42e525dee5491f51694d4d055cdbd/b3f42e525dee5491f51694d4d055cdbd1.gif)
![FS2410開(kāi)發(fā)板上的按鍵驅(qū)動(dòng)程序(2)續(xù)-基礎(chǔ)電子_第2頁(yè)](http://file4.renrendoc.com/view/b3f42e525dee5491f51694d4d055cdbd/b3f42e525dee5491f51694d4d055cdbd2.gif)
![FS2410開(kāi)發(fā)板上的按鍵驅(qū)動(dòng)程序(2)續(xù)-基礎(chǔ)電子_第3頁(yè)](http://file4.renrendoc.com/view/b3f42e525dee5491f51694d4d055cdbd/b3f42e525dee5491f51694d4d055cdbd3.gif)
![FS2410開(kāi)發(fā)板上的按鍵驅(qū)動(dòng)程序(2)續(xù)-基礎(chǔ)電子_第4頁(yè)](http://file4.renrendoc.com/view/b3f42e525dee5491f51694d4d055cdbd/b3f42e525dee5491f51694d4d055cdbd4.gif)
![FS2410開(kāi)發(fā)板上的按鍵驅(qū)動(dòng)程序(2)續(xù)-基礎(chǔ)電子_第5頁(yè)](http://file4.renrendoc.com/view/b3f42e525dee5491f51694d4d055cdbd/b3f42e525dee5491f51694d4d055cdbd5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精品文檔-下載后可編輯FS2410開(kāi)發(fā)板上的按鍵驅(qū)動(dòng)程序(2)續(xù)-基礎(chǔ)電子作者:趙老師,華清遠(yuǎn)見(jiàn)嵌入式學(xué)院講師。
按鍵字符設(shè)備的file_operations結(jié)構(gòu)定義為:
staticstructfile_operationsbutton_fops={.owner=THIS_MODULE,.ioctl=button_ioctl,.open=button_open,.read=button_read,.release=button_release,};
以下為open和release函數(shù)接口的實(shí)現(xiàn)。
/*打開(kāi)文件,申請(qǐng)中斷*/staticintbutton_open(structinode*inode,structfile*filp){intret=nonseekable_open(inode,filp);if(ret0){returnret;}init_gpio();/*相關(guān)GPIO端口的初始化*/request_IRqs();/*申請(qǐng)4個(gè)中斷*/if(ret0){returnret;}init_keybuffer();/*初始化按鍵緩沖數(shù)據(jù)結(jié)構(gòu)*/returnret;}/*關(guān)閉文件,屏蔽中斷*/staticintbutton_release(structinode*inode,structfile*filp){free_irqs();/*屏蔽中斷*/return0;}
在open函數(shù)接口中,進(jìn)行了GPIO端口的初始化、申請(qǐng)硬件中斷以及按鍵緩沖的初始化等工作。在以前的章節(jié)中提過(guò),中斷端口是比較寶貴而且數(shù)量有限的資源。因此需要注意,要在次打開(kāi)設(shè)備時(shí)申請(qǐng)(調(diào)用request_irq函數(shù))中斷端口,而不是在驅(qū)動(dòng)模塊加載的時(shí)候申請(qǐng)。如果已加載的設(shè)備驅(qū)動(dòng)占用而在一定時(shí)間段內(nèi)不使用某些中斷資源,則這些資源不會(huì)被其他驅(qū)動(dòng)所使用,只能白白浪費(fèi)掉。而在打開(kāi)設(shè)備的時(shí)候(調(diào)用open函數(shù)接口)申請(qǐng)中斷,則不同的設(shè)備驅(qū)動(dòng)可以共享這些寶貴的中斷資源。
以下為中斷申請(qǐng)和釋放的部分以及中斷處理函數(shù)。
/*中斷處理函數(shù),其中irq為中斷號(hào)*/staticirqreturn_tbutton_irq(intirq,void*dev_id,structpt_regs*regs){unsignedcharucKey=0;disable_irqs();/*屏蔽中斷*//*延遲50毫秒,屏蔽按鍵毛刺*/udelay(50000);ucKey=button_scan(irq);/*掃描按鍵,獲得進(jìn)行操作的按鍵的ID*/if((ucKey=1)(ucKey=16)){/*如果緩沖區(qū)已滿,則不添加*/if(((key_buffer.head+1)(MAX_KEY_COUNT-1))!=key_buffer.tail){spin_lock_irq(buffer_lock);key_buffer.jiffy[key_buffer.tail]=get_tick_count();key_buffer.tail++;key_buffer.tail=(MAX_KEY_COUNT-1);spin_unlock_irq(buffer_lock);}}init_gpio();/*初始化GPIO端口,主要是為了恢復(fù)中斷端口配置*/enable_irqs();/*開(kāi)啟中斷*/returnIRQ_HANDLED;/*2.6內(nèi)核返回值一般是這個(gè)宏*/}/*申請(qǐng)4個(gè)中斷*/staticintrequest_irqs(void){intret,i,j;for(i=0;iMAX_COLUMN;i++){ret=request_irq(key_info_matrix[i][0].irq_no,button_irq,SA_INTERRUPT,BUTT*_DEVICE_NAME,NULL);if(ret0){for(j=0;ji;j++){free_irq(key_info_matrix[j][0].irq_no,NULL);}return-EFAULT;}}return0;}/*釋放中斷*/static__inlinevoidfree_irqs(void){inti;for(i=0;iMAX_COLUMN;i++){free_irq(key_info_matrix[i][0].irq_no,NULL);}}
中斷處理函數(shù)在每次中斷產(chǎn)生的時(shí)候會(huì)被調(diào)用,因此它的執(zhí)行時(shí)間要盡可能得短。通常中斷處理函數(shù)只是簡(jiǎn)單地喚醒等待資源的任務(wù),而復(fù)雜且耗時(shí)的工作則讓這個(gè)任務(wù)去完成。中斷處理函數(shù)不能向用戶空間發(fā)送數(shù)據(jù)或者接收數(shù)據(jù),不能做任何可能發(fā)生睡眠的操作,而且不能調(diào)用schedule()函數(shù)。
為了簡(jiǎn)單起見(jiàn),而且考慮到按鍵操作的時(shí)間比較長(zhǎng),在本實(shí)例中的中斷處理函數(shù)button_irq()里,通過(guò)調(diào)用睡眠函數(shù)來(lái)消除毛刺信號(hào)。讀者可以根據(jù)以上介紹的對(duì)中斷處理函數(shù)的要求改進(jìn)該部分代碼。
按鍵掃描函數(shù)如下所示。首先根據(jù)中斷號(hào)確定操作按鍵所在行的位置,然后采用逐列掃描法終確定操作按鍵所在的位置。
/***進(jìn)入中斷后,掃描銨鍵碼**返回:按鍵碼(1-16),0xff表示錯(cuò)誤*/static__inlineunsignedcharbutton_scan(intirq){unsignedcharkey_id=0xff;unsignedcharcolumn=0xff,row=0xff;s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_INP);/*GPF0*/s3c2410_gpio_cfgpin(S3C2410_GPF2,S3C2410_GPF2_INP);/*GPF2*/s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_INP);/*GPG3*/s3c2410_gpio_cfgpin(S3C2410_GPG11,S3C2410_GPG11_INP);/*GPG11*/switch(irq){/*根據(jù)irq值確定操作按鍵所在行的位置*/caseIRQ_EINT0:{column=0;}break;caseIRQ_EINT2:{column=1;}break;caseIRQ_EINT11:{column=2;}break;caseIRQ_EINT19:{column=3;}break;}if(column!=0xff){/*開(kāi)始逐列掃描,掃描第0列*/s3c2410_gpio_setpin(S3C2410_GPE11,0);/*將KSCAN0置為低電平*/s3c2410_gpio_setpin(S3C2410_GPG6,1);s3c2410_gpio_setpin(S3C2410_GPE13,1);s3c2410_gpio_setpin(S3C2410_GPG2,1);if(!s3c2410_gpio_getpin(key_info_matrix[column][0].irq_gpio_port)){/*觀察對(duì)應(yīng)的中斷線的輸入端口值*/key_id=key_info_matrix[column][0].key_id;returnkey_id;}/*掃描第1列*/s3c2410_gpio_setpin(S3C2410_GPE11,1);s3c2410_gpio_setpin(S3C2410_GPG6,0);/*將KSCAN1置為低電平*/s3c2410_gpio_setpin(S3C2410_GPE13,1);s3c2410_gpio_setpin(S3C2410_GPG2,1);if(!s3c2410_gpio_getpin(key_info_matrix[column][1].irq_gpio_port)){key_id=key_info_matrix[column][1].key_id;returnkey_id;}/*掃描第2列*/s3c2410_gpio_setpin(S3C2410_GPE11,1);s3c2410_gpio_setpin(S3C2410_GPG6,1);s3c2410_gpio_setpin(S3C2410_GPE13,0);/*將KSCAN2置為低電平*/s3c2410_gpio_setpin(S3C2410_GPG2,1);if(!s3c2410_gpio_getpin(key_info_matrix[column][2].irq_gpio_port)){key_id=key_info_matrix[column][2].key_id;returnkey_id;}/*掃描第3列*/s3c2410_gpio_setpin(S3C2410_GPE11,1);s3c2410_gpio_setpin(S3C2410_GPG6,1);s3c2410_gpio_setpin(S3C2410_GPE13,1);s3c2410_gpio_setpin(S3C2410_GPG2,0);/*將KSCAN3置為低電平*/if(!s3c2410_gpio_getpin(key_info_matrix[column][3].irq_gpio_port)){key_id=key_info_matrix[column][3].key_id;returnkey_id;}}returnkey_id;}
以下是read函數(shù)接口的實(shí)現(xiàn)。首先在按鍵緩沖中刪除已經(jīng)過(guò)時(shí)的按鍵操作信息,接下來(lái),從按鍵緩沖中讀取一條信息(按鍵ID)并傳遞給用戶層。
/*從緩沖刪除過(guò)時(shí)數(shù)據(jù)(5秒前的按鍵值)*/staticvoidremove_timeoutkey(void){unsignedlongtick;spin_lock_irq(buffer_lock);/*獲得一個(gè)自旋鎖*/while(key_buffer.head!=key_buffer.tail){tick=get_tick_count()-key_buffer.jiffy[key_buffer.head];if(tick5000)/*5秒*/break;key_buffer.buf[key_buffer.head]=0;key_buffer.jiffy[key_buffer.head]=0;key_buffer.head++;key_buffer.head=(MAX_KEY_COUNT-1);}spin_unlock_irq(buffer_lock);/*釋放自旋鎖*/}/*讀鍵盤(pán)*/staticssize_tbutton_read(structfile*filp,char*buffer,size_tcount,loff_t*f_pos){ssize_tret=0;remove_timeoutkey();/*刪除過(guò)時(shí)的按鍵操作信息*/spin_lock_irq(buffer_lock);while((key_buffer.head!=key_buffer.tail)(((size_t)ret)count)){put_user((char)(key_buffer.buf[key_bu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 聽(tīng)評(píng)課記錄九年級(jí)物理
- 人教版數(shù)學(xué)七年級(jí)下冊(cè)知識(shí)點(diǎn)
- 粵教版地理八年級(jí)下冊(cè)第六章第4節(jié)《西部地區(qū)》聽(tīng)課評(píng)課記錄4
- 湘教版數(shù)學(xué)八年級(jí)下冊(cè)1.2《直角三角形的性質(zhì)和判定(II)》聽(tīng)評(píng)課記錄
- 小學(xué)二年級(jí)數(shù)學(xué)100道口算題
- 湘教版數(shù)學(xué)七年級(jí)下冊(cè)2.2.2《完全平方公式》聽(tīng)評(píng)課記錄1
- 人教版數(shù)學(xué)七年級(jí)下冊(cè)聽(tīng)評(píng)課記錄9.1.1《 不等式及其解集》
- 2025年水利管理及技術(shù)咨詢服務(wù)項(xiàng)目合作計(jì)劃書(shū)
- 合伙開(kāi)餐飲餐館項(xiàng)目協(xié)議書(shū)范本
- 融資咨詢代理協(xié)議書(shū)范本
- 2024簡(jiǎn)單的租房合同樣本下載
- 2025屆浙江省杭州七縣高三第一次調(diào)研測(cè)試生物試卷含解析
- 跨學(xué)科實(shí)踐活動(dòng)5 基于碳中和理念設(shè)計(jì)低碳行動(dòng)方案-2024-2025學(xué)年九年級(jí)化學(xué)人教版(2024)上冊(cè)
- 2022版義務(wù)教育(歷史)課程標(biāo)準(zhǔn)(附課標(biāo)解讀)
- 第四單元整體教學(xué)設(shè)計(jì)【大單元教學(xué)】2024-2025學(xué)年八年級(jí)語(yǔ)文上冊(cè)備課系列(統(tǒng)編版)
- 中國(guó)慢性腎臟病早期評(píng)價(jià)與管理指南2023
- 陰囊常見(jiàn)疾病的超聲診斷
- 新人教版五年級(jí)上冊(cè)數(shù)學(xué)應(yīng)用題大全及答案
- DZ∕T 0051-2017 地質(zhì)巖心鉆機(jī)型式與規(guī)格系列(正式版)
- 《行業(yè)標(biāo)準(zhǔn)-太陽(yáng)能光熱發(fā)電技術(shù)監(jiān)督導(dǎo)則》
- 壓力管道穿(跨)越施工工藝規(guī)程2015
評(píng)論
0/150
提交評(píng)論