新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux設備驅動開發之:按鍵驅動程序實例

        嵌入式Linux設備驅動開發之:按鍵驅動程序實例

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257107.htm

        按鍵掃描函數如下所示。首先根據中斷號確定操作按鍵所在行的位置,然后采用逐列掃描法最終確定操作按鍵所在的位置。

        /*

        **進入中斷后,掃描銨鍵碼

        **返回:按鍵碼(1~16),0xff表示錯誤

        */

        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)

        {/*根據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))

        {/*觀察對應的中斷線的輸入端口值*/

        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函數接口的實現。首先在按鍵緩沖中刪除已經過時的按鍵操作信息,接下來,從按鍵緩沖中讀取一條信息(按鍵ID)并傳遞給用戶層。

        /*從緩沖刪除過時數據(5s前的按鍵值)*/

        staticvoidremove_timeoutkey(void)

        {

        unsignedlongtick;

        spin_lock_irq(buffer_lock);/*獲得一個自旋鎖*/

        while(key_buffer.head!=key_buffer.tail)

        {

        tick=get_tick_count()-key_buffer.jiffy[key_buffer.head];

        if(tick5000)/*5s*/

        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();/*刪除過時的按鍵操作信息*/

        spin_lock_irq(buffer_lock);

        while((key_buffer.head!=key_buffer.tail)(((size_t)ret)count))

        {

        put_user((char)(key_buffer.buf[key_buffer.head]),buffer[ret]);

        key_buffer.buf[key_buffer.head]=0;

        key_buffer.jiffy[key_buffer.head]=0;

        key_buffer.head++;

        key_buffer.head=(MAX_KEY_COUNT-1);

        ret++;

        }

        spin_unlock_irq(buffer_lock);

        returnret;

        }

        以上介紹了中的主要內容。

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

        linux相關文章:linux教程


        蜂鳴器相關文章:蜂鳴器原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 桓台县| 阿勒泰市| 东阿县| 资溪县| 廉江市| 商都县| 丹江口市| 武鸣县| 嘉义市| 永安市| 仁化县| 嘉义县| 泸水县| 武清区| 高雄县| 麦盖提县| 南木林县| 定襄县| 南华县| 阳东县| 望奎县| 东丽区| 万宁市| 尚志市| 河北区| 襄樊市| 平山县| 龙南县| 黑河市| 理塘县| 买车| 海南省| 司法| 颍上县| 桂平市| 凭祥市| 寻甸| 南投市| 山丹县| 达日县| 永仁县|