亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 5694 | 回復(fù): 11
打印 上一主題 下一主題

[驅(qū)動(dòng)] 6410 矩陣鍵盤(pán) input類型驅(qū)動(dòng) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-11-07 15:50 |只看該作者 |倒序?yàn)g覽
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/input.h>
#include <linux/poll.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <mach/map.h>

#include <plat/gpio-cfg.h>
#include <plat/regs-clock.h>
#include <plat/regs-gpio.h>
#include <mach/gpio.h>

#include <plat/gpio-bank-n.h>

#define key1  1
#define key2  2
#define key3  3
#define key4  4
#define key5  5
#define key6  6
#define key7  7
#define key8  8
#define key9  9
#define key10 10
#define key11 11
#define key12 12

MODULE_AUTHOR("liutao");
MODULE_LICENSE("GPL");

unsigned long gpn_virt,gpncon,gpndat;

struct input_dev* button_devp;
static char *name = "my6410_buttons";

struct button_irq_desc{
        int irq;
        int pin;
        int number;
        char *name;
};

int key_code[] = {
        key1,key2,key3,key4,
        key5,key6,key7,key8,
        key9,key10,key11,key12,
};
static struct button_irq_desc button_irqs[] = {
        { IRQ_EINT(0),S3C64XX_GPN(0),  0,  "KEY1"},
        { IRQ_EINT(1),S3C64XX_GPN(1),  1,  "KEY2"},
        { IRQ_EINT(2),S3C64XX_GPN(2),  2,  "KEY3"},
};

static int cval , rval;


/*具體判斷是哪個(gè)按鍵按下*/
static void check_key(int Cval,int Rval,int reportval)
{
        printk("key check ....\n");
        if(Cval == 1 )
        {
                switch(Rval){
                        case 1:
                                printk("key1 down...\n");
                                input_report_key(button_devp, key1, reportval);
                                break;
                        case 2:
                                printk("key2 down...\n");
                                input_report_key(button_devp, key2, reportval);
                                break;
                        case 3:
                                printk("key3 down...\n");
                                input_report_key(button_devp, key3, reportval);
                                break;
                        case 4:
                                printk("key4 down...\n");
                                input_report_key(button_devp, key4, reportval);
                                break;
                }
        }
        else if(Cval == 2 )
        {
                switch(Rval){
                        case 1:
                                printk("key5 down...\n");
                                input_report_key(button_devp, key5, reportval);
                                break;
                        case 2:
                                printk("key6 down...\n");
                                input_report_key(button_devp, key6, reportval);
                                break;
                        case 3:
                                printk("key7 down...\n");
                                input_report_key(button_devp, key7, reportval);
                                break;
                        case 4:
                                printk("key8 down...\n");
                                input_report_key(button_devp, key8, reportval);
                                break;
                }
        }
        else if(Cval == 3)
        {
                switch(Rval){
                        case 1:
                                printk("key9 down...\n");
                                input_report_key(button_devp, key9, reportval);
                                break;
                        case 2:
                                printk("key10 down...\n");
                                input_report_key(button_devp, key10, reportval);
                                break;
                        case 3:
                                printk("key11 down...\n");
                                input_report_key(button_devp, key11, reportval);
                                break;
                        case 4:
                                printk("key12 down...\n");
                                input_report_key(button_devp, key12, reportval);
                                break;
                }
        }
}
/*掃描鍵盤(pán)判斷是Rval */
static int Scan_Keyboard(void)
{
        printk("key scan...\n");
        //
        //pan duan chu na hang zhihou zai pan duan chu na lie
        //int readval;

        //writel(readl(S3C64XX_GPNDAT),readval);
       
        if((*((unsigned long *)gpndat) & 0x00000080) == 0)       
                cval = 1;
        else if ((*((unsigned long *)gpndat) & 0x00000200) == 0)
                cval = 2;
        else if        ((*((unsigned long *)gpndat) & 0x00000800) == 0)
            cval = 3;
        else if ((*((unsigned long *)gpndat) & 0x00020001) == 0)
                cval = 4;
        else{
                printk("the key is unknown..\n");
                return -1;
        }
        return 0;
}

/*案件中斷函數(shù)*/
static irqreturn_t  button_interrupt(int irq, void* dev_id)
{

        struct button_irq_desc *button_irqs = (struct button_irq_desc*)dev_id;
        int updown,retval;
       
        updown = readl(S3C64XX_GPNDAT) & ( 0x1 << button_irqs->number);
        retval = updown ? 0 : 1;
       
        switch(button_irqs->irq)
        {
                case IRQ_EINT(0):
                        rval = 1;
                        break;
                case IRQ_EINT(1):
                        rval = 2;
                        break;
                case IRQ_EINT(2):
                        rval = 3;
                        break;
                default:
                        break;
        }   
        Scan_Keyboard();
        check_key(cval,rval,retval);

        input_sync(button_devp);
        return IRQ_RETVAL(IRQ_HANDLED);

}
/*GPN0-GPN2 input  |||| GPN4---6 和 GPN9 output  */
static int port_init(void)
{
        gpn_virt = ioremap(0x7f008000,SZ_4K);
        gpncon = gpn_virt + 830;
        gpndat = gpn_virt + 834;

        *((unsigned long *)gpncon) &= ~0xffffffff;
        *((unsigned long *)gpncon) |=  0xfff7d5c0; //GPN(4-6 9 output) -> GPN(0-2 input)

        return 0;
}
/*申請(qǐng)中斷*/
static int Request_Irq(void)
{
        int err = 0;
        int i;
        for(i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++)
        {
                err = request_irq(button_irqs[i].irq, button_interrupt, IRQ_TYPE_EDGE_BOTH, button_irqs[i].name, (void *)&button_irqs[i]);
                if(err)
                {
                        break;
                }
        }

        if(err)
        {
                i--;
                for(; i >= 0; i--)
                {
                        if(button_irqs[i].irq < 0)
                        {
                                continue;
                        }
                        disable_irq(button_irqs[i].irq);
                        free_irq(button_irqs[i].irq, (void*)&button_irqs[i]);
                }
                return -EBUSY;
        }
        set_bit(EV_KEY, button_devp->evbit);
        for(i = 0; i < 12; i++)
        {
                set_bit(key_code[i],button_devp->evbit);
        }

        return 0;
}
/*模塊入口函數(shù)*/
static int __init button_init(void)
{
        struct input_dev *input_dev;
        int ret;

        port_init();
        input_dev = input_allocate_device();
        if(!input_dev){
                printk(KERN_ERR"Unable to alloc the input device!!\n");
        }

        button_devp = input_dev;
        button_devp->name = name;

        Request_Irq();
        ret = input_register_device(button_devp);
       
        if(ret < 0){
                printk("input_register_device(): failed !! \n");
        }

        return ret;
}
/*模塊退出執(zhí)行*/
static void __exit button_exit(void)
{
        int i;
        for(i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++)
        {
                disable_irq(button_irqs[i].irq);
                free_irq(button_irqs[i].irq, (void*)&button_irqs[i]);
        }
        input_unregister_device(button_devp);
}

module_init(button_init);
module_exit(button_exit);

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-11-07 16:03 |只看該作者
我一直有個(gè)疑惑,input類型的按鍵,用自己寫(xiě)去抖嗎?

你們幫我看看我的Scan_Keyboard函數(shù)這么去判斷是某一列低電壓對(duì)嗎?

set_bit是什么意思?等input_report_key的時(shí)候應(yīng)用層獲得的是什么值?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-11-07 16:28 |只看該作者
再把GPIO口設(shè)置成輸出之后,那個(gè)位的電壓自動(dòng)變成高電壓,等按下鍵后變成低電壓,在掃描是時(shí),還用每次在某一行上輸出一個(gè)數(shù)嗎?

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-11-07 16:29 |只看該作者
我這是3x4矩陣鍵盤(pán)的

論壇徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
5 [報(bào)告]
發(fā)表于 2011-11-08 11:29 |只看該作者
說(shuō)說(shuō)你的內(nèi)核版本。

我記得比較新的內(nèi)核都幫你把GPIO鍵盤(pán)做好了,你只需要在板子的定義里面加一個(gè)按鍵對(duì)應(yīng)行列的數(shù)組就可以了。

具體到mach-s3c6410目錄下面找一個(gè)有GPIO鍵盤(pán)的板子看下。
去抖動(dòng)啥的應(yīng)該也做好了。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-11-09 13:50 |只看該作者
回復(fù) 5# l2y3n2


    我的內(nèi)核是linux-2.6.28.6  有嗎!

論壇徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
7 [報(bào)告]
發(fā)表于 2011-11-09 14:44 |只看該作者
看下你的mach目錄下面有沒(méi)有板子有用到的。

另外如果有的話menuconfig的input device里面應(yīng)該有類似s3c-keypad之類的設(shè)備的。

論壇徽章:
1
水瓶座
日期:2014-10-18 20:17:41
8 [報(bào)告]
發(fā)表于 2011-11-09 15:18 |只看該作者
高手啊,學(xué)習(xí)了!

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-11-10 09:40 |只看該作者
回復(fù) 5# l2y3n2


    linux/arch/arm/mach-s3c6410/mach-smdk6410.c是不是這個(gè)目錄啊!這好像是添GPIO按鍵的,怎么添加矩陣的呢!

論壇徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
10 [報(bào)告]
發(fā)表于 2011-11-10 10:13 |只看該作者
http://lxr.linux.no/linux+v3.1/d ... rd/samsung-keypad.c
這是新內(nèi)核的samsung通用keypad驅(qū)動(dòng)文件。
http://lxr.linux.no/linux+v3.1/a ... e/plat/keypad.h#L33
要填的結(jié)構(gòu)體應(yīng)該是這個(gè)。

搜了一通好像mach下面的板子都沒(méi)用到keypad,自己看下那個(gè)matrix_keymap_data怎么填吧。

老內(nèi)核的話可以直接參考下samsung-keypad文件寫(xiě)驅(qū)動(dòng)。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP