<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux設備驅動(dòng)開(kāi)發(fā)之:按鍵驅動(dòng)程序實(shí)例

嵌入式Linux設備驅動(dòng)開(kāi)發(fā)之:按鍵驅動(dòng)程序實(shí)例

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257107.htm

按鍵字符設備的file_operations結構定義為:

staticstructfile_operationsbutton_fops=

{

.owner=THIS_MODULE,

.ioctl=button_ioctl,

.open=button_open,

.read=button_read,

.release=button_release,

};

以下為open和release函數接口的實(shí)現。

/*打開(kāi)文件,申請中斷*/

staticintbutton_open(structinode*inode,structfile*filp)

{

intret=nonseekable_open(inode,filp);

if(ret0)

{

returnret;

}

init_gpio();/*相關(guān)GPIO端口的初始化*/

ret=request_irqs();/*申請4個(gè)中斷*/

if(ret0)

{

returnret;

}

init_keybuffer();/*初始化按鍵緩沖數據結構*/

returnret;

}

/*關(guān)閉文件,屏蔽中斷*/

staticintbutton_release(structinode*inode,structfile*filp)

{

free_irqs();/*屏蔽中斷*/

return0;

}

在open函數接口中,進(jìn)行了GPIO端口的初始化、申請硬件中斷以及按鍵緩沖的初始化等工作。在以前的章節中提過(guò),中斷端口是比較寶貴而且數量有限的資源。因此需要注意,最好要在第一次打開(kāi)設備時(shí)申請(調用request_irq函數)中斷端口,而不是在驅動(dòng)模塊加載的時(shí)候申請。如果已加載的占用而在一定時(shí)間段內不使用某些中斷資源,則這些資源不會(huì )被其他驅動(dòng)所使用,只能白白浪費掉。而在打開(kāi)設備的時(shí)候(調用open函數接口)申請中斷,則不同的可以共享這些寶貴的中斷資源。

以下為中斷申請和釋放的部分以及中斷處理函數。

/*中斷處理函數,其中irq為中斷號*/

staticirqreturn_tbutton_irq(intirq,void*dev_id,structpt_regs*regs)

{

unsignedcharucKey=0;

disable_irqs();/*屏蔽中斷*/

/*延遲50ms,屏蔽按鍵毛刺*/

udelay(50000);

ucKey=button_scan(irq);/*掃描按鍵,獲得進(jìn)行操作的按鍵的ID*/

if((ucKey>=1)(ucKey=16))

{

/*如果緩沖區已滿(mǎn),則不添加*/

if(((key_buffer.head+1)(MAX_KEY_COUNT-1))!=key_buffer.tail)

{

spin_lock_irq(buffer_lock);

key_buffer.buf[key_buffer.tail]=ucKey;

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端口,主要是為了恢復中斷端口配置*/

enable_irqs();/*開(kāi)啟中斷*/

returnIRQ_HANDLED;/*2.6內核返回值一般是這個(gè)宏*/

}

/*申請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,BUTTONS_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);

}

}

中斷處理函數在每次中斷產(chǎn)生的時(shí)候會(huì )被調用,因此它的執行時(shí)間要盡可能得短。通常中斷處理函數只是簡(jiǎn)單地喚醒等待資源的任務(wù),而復雜且耗時(shí)的工作則讓這個(gè)任務(wù)去完成。中斷處理函數不能向用戶(hù)空間發(fā)送數據或者接收數據,不能做任何可能發(fā)生睡眠的操作,而且不能調用schedule()函數。

為了簡(jiǎn)單起見(jiàn),而且考慮到按鍵操作的時(shí)間比較長(cháng),在本實(shí)例中的中斷處理函數button_irq()里,通過(guò)調用睡眠函數來(lái)消除毛刺信號。讀者可以根據以上介紹的對中斷處理函數的要求改進(jìn)該部分代碼。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程


蜂鳴器相關(guān)文章:蜂鳴器原理


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>