3504|3

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

嵌入式的高手们 有谁能进来帮小弟看 下面这段有关键盘驱动的代码啊 小弟实在看不懂 先说声"谢谢啦"~ [复制链接]

#include
#include
#include
#include
#include
#include "kbd_types.h"

#define KEYBOARD "/dev/mcu/kbd"
#ifndef _KBD_H
#define _KBD_H

int  KBD_Open(void);
void KBD_Close(void);

void KBD_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers);

int  KBD_Read(char *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode);


#endif

static int fd;

typedef struct
{
        unsigned short mwkey;
        int scancode;
}KeyMap;

static unsigned short scancodes[64];

#define __I2C_MEGA8__
#ifdef __ZLG7289__
static KeyMap keymap[] = {
      {MWKEY_KP0,  0x1d},
      {MWKEY_KP1,  0x21},
      {MWKEY_KP2,  0x25},
      {MWKEY_KP3,  0x23},
      {MWKEY_KP4,  0x29},
      {MWKEY_KP5,  0x2d},
      {MWKEY_KP6,  0x2b},
      {MWKEY_KP7,  0x31},
      {MWKEY_KP8,  0x35},
      {MWKEY_KP9,  0x33},
      {MWKEY_NUMLOCK,         0x11},
      {MWKEY_KP_DIVIDE,        0x15},
      {MWKEY_KP_MULTIPLY, 0x13},
      {MWKEY_KP_MINUS,  0x0b},
      {MWKEY_KP_PLUS,        0x34},
      {MWKEY_KP_ENTER,        0x24},
      {MWKEY_KP_DEL,        0x1b},
};
#else
#ifdef __I2C_MEGA8__
static KeyMap keymap[] = {                //update map policy
      {MWKEY_KP0,  0x0b},
      {MWKEY_KP1,  0x02},
      {MWKEY_KP2,  0x03},
      {MWKEY_KP3,  0x04},
      {MWKEY_KP4,  0x05},
      {MWKEY_KP5,  0x06},
      {MWKEY_KP6,  0x07},
      {MWKEY_KP7,  0x08},
      {MWKEY_KP8,  0x09},
      {MWKEY_KP9,  0x0a},
      
      {MWKEY_NUMLOCK,         0x2a},
      {MWKEY_KP_DIVIDE,        0x35},
      {MWKEY_KP_MULTIPLY, 0x37},
      {MWKEY_KP_MINUS,        0x4a},
      {MWKEY_KP_PLUS,        0x4e},
      {MWKEY_KP_ENTER,        0x1c},
      {MWKEY_KP_DEL,        0x53},
};

#endif //__I2C_MEGA8__
#endif //__ZLG7289__

int KBD_Open(void)
{
        int i;       
        fd = open(KEYBOARD, O_RDONLY | O_NONBLOCK);//以只读、非阻塞的方式打开键盘设备

        if (fd < 0)
        {
                printf("%s - Can't open keyboard!\n", __FUNCTION__);
                return -1;
        }

        for (i=0; i                 scancodes=MWKEY_UNKNOWN;

        for (i=0; i< sizeof(keymap)/sizeof(keymap[0]); i++)
                scancodes[keymap.scancode]=keymap.mwkey;

        return fd;
}


void KBD_Close(void)
{
        close(fd);
        fd = -1;
}

void KBD_GetModifierInfo(unsigned int * modifiers, unsigned int * curmodifiers)
{
        if (modifiers)
                *modifiers = 0;        /* no modifiers available */
        if (curmodifiers)
                *curmodifiers = 0;
}


int KBD_Read(char* kbuf, unsigned int * modifiers, unsigned short * scancode)
{
        int keydown = 0;
        int cc = 0;
        char buf,key;

        cc = read(fd, &buf, 1);

        if (cc < 0)
        {
                if ((errno != EINTR) && (errno != EAGAIN)
                    && (errno != EINVAL))
                        {
                                perror("KBD KEY");
                                return (-1);
                        }
                else
                        {
                                return (0);
                        }
        }
        if (cc == 0)
                return (0);

        /* If the code is big than 127, then we know that */
        /* we have a key down.  Figure out what we've got */

        *modifiers = 0;

        if (buf & 0x80)
        {
                keydown = 1;        /* Key pressed but not released */
        }
        else
        {
                keydown = 2;        /* key released */
        }

        buf &= (~0x80);
        *scancode = scancodes[(int) buf];
        *kbuf = *scancode ;
        return keydown;
       
}

char GetKey(void)
{
        int keydown=0;
        char  key=0;
        char  temp=0;
        unsigned int modifiers;
        unsigned short  scancode;
        keydown=KBD_Read(&key, &modifiers, &scancode);
        if(keydown==1)
          return key;
        else         
          return temp;
       
}

最新回复

楼主啊,这个不是驱动啊,你的这个是上层测试应用程序,也不知道楼主有没有写底层驱动模块。有没有加载驱动模块。  详情 回复 发表于 2010-4-30 15:12
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
兄弟,我看着不像是驱动啊。更像是个自定义.h文件。找错了吧。
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
KBD_Open(void)  打开键盘设备,并初始化scancodes;
KBD_Close(); 关闭设备
KBD_Read(char* kbuf, unsigned int * modifiers, unsigned short * scancode); 用来从键盘设备中读取字符
{
     ...
     ...
     cc = read(fd, &buf, 1);//一次读取一个字符,放入buf
     if (cc < 0); 没读到东西
     {
        if ((errno != EINTR) && (errno != EAGAIN) && (errno != EINVAL)) ;这个条件是不是有问题? 应该使用 || 才对,errno != EINTR 又怎么会等于 EAGAIN呢???
        {
            perror("KBD KEY");
            return (-1);
        }
     }

     if (buf & 0x80) //如果读到数据,最高位为按键标志位,1为按下
     {
         keydown = 1; /* Key pressed but not released */
     }
     else
     {
         keydown = 2; /* key released */
     }

     buf &= (~0x80); //将标志位拿掉,剩下的就是扫描码
     *scancode = scancodes[(int) buf];//转换成ascii码
     *kbuf = *scancode ;
     return keydown;
}
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼主啊,这个不是驱动啊,你的这个是上层测试应用程序,也不知道楼主有没有写底层驱动模块。有没有加载驱动模块。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表