版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精品文檔-下載后可編輯FS2410開發(fā)板上的按鍵驅(qū)動(dòng)程序(2)續(xù)-基礎(chǔ)電子作者:趙老師,華清遠(yuǎ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)。
/*打開文件,申請(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é)中提過,中斷端口是比較寶貴而且數(shù)量有限的資源。因此需要注意,要在次打開設(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)掉。而在打開設(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();/*開啟中斷*/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)單起見,而且考慮到按鍵操作的時(shí)間比較長,在本實(shí)例中的中斷處理函數(shù)button_irq()里,通過調(diào)用睡眠函數(shù)來消除毛刺信號(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){/*開始逐列掃描,掃描第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)過時(shí)的按鍵操作信息,接下來,從按鍵緩沖中讀取一條信息(按鍵ID)并傳遞給用戶層。
/*從緩沖刪除過時(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);/*釋放自旋鎖*/}/*讀鍵盤*/staticssize_tbutton_read(structfile*filp,char*buffer,size_tcount,loff_t*f_pos){ssize_tret=0;remove_timeoutkey();/*刪除過時(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《化工制圖基本知識(shí)》課件
- 甘肅政法大學(xué)《先進(jìn)復(fù)合材料》2023-2024學(xué)年第一學(xué)期期末試卷
- 企業(yè)培訓(xùn)課件題目
- 三年級(jí)數(shù)學(xué)上冊(cè)四兩位數(shù)除以一位數(shù)的除法兩位數(shù)除以一位數(shù)說課稿西師大版
- 《考試習(xí)慣指導(dǎo)》課件
- 三年級(jí)科學(xué)上冊(cè)第1單元水8它們發(fā)生了什么變化教案2教科版
- 《作文復(fù)習(xí)分析論據(jù)》課件
- 化工生產(chǎn)安全用電課件
- 動(dòng)物解剖生理學(xué)-25體溫
- 初一安全食品課件
- 初中音樂欣賞課型互動(dòng)教學(xué)策略的構(gòu)建及實(shí)踐
- 2020-2021學(xué)年北京市西城區(qū)七年級(jí)(上)期末數(shù)學(xué)試卷(附答案詳解)
- DB13-T 5821-2023 預(yù)拌流態(tài)固化土回填技術(shù)規(guī)程
- 《新媒體運(yùn)營》高職新媒體運(yùn)營全套教學(xué)課件
- 第四單元“家鄉(xiāng)文化生活”系列教學(xué)設(shè)計(jì) 統(tǒng)編版高中語文必修上冊(cè)
- 2024年蘭州大學(xué)專業(yè)課《金融學(xué)》科目期末試卷B(有答案)
- 初中物理寶典
- 工業(yè)園區(qū)臨時(shí)管理公約
- GB/T 26527-2024有機(jī)硅消泡劑
- 形象與禮儀智慧樹知到期末考試答案2024年
- 化工建設(shè)綜合項(xiàng)目審批作業(yè)流程圖
評(píng)論
0/150
提交評(píng)論