안녕하세요
얼마전 마이크로 윈도우에서 GPIO를 이용해서 키패드를 구현하려고 합니다.
디바이스 드라이버는 read만하면 ASCII로 키 값이 들어오도록 만들어 두었습니
다. 그냥 test 프로그램으로 돌리니 키 입력이 들어오더라구요... 됐구나 싶어
서 마이크로 윈도우에 연결하려고 하는데 잘 안되네요....어떻게 연결야 하는
지 GPIO OPEN error 만 뜨네요...

우선 마이크로 윈도우에 key_gpio.c를 만들었습니다.
그리고 키 입력을 맵핑 시켜줬습니다. 그다음에 config파일에 NOKEY를Y로 KEY
GPIO를 Y로 했습니다. 그다음 driver안에 Makefile에 Key_gpio.c도 컴파일이
되도록 하였습니다. 그리고 Microwindow에서는 i=GdOpenKeyboard();로 open하
고, GdReadKeyboard(key,mod,scan);로 100ms마다 읽도록 하였는데... Open자체
가 안되네요.....
어떻게 해야 할지 막막하기만 합니다. 혹시 경험이 있으신 분은 답변 부탁드립
니다. 혹은 참조할 만한 자료라도 부탁드리겠습니다

static int
GPIO_Open(KBDDEVICE *pkd)
{
int i;
// char *kbd;

Fd=open("/dev/gpio",O_RDWR|O_NDELAY);
if(Fd<0){
printf("GPIO open error
");
return -1;
}
return Fd;
}

/*
* Close the keyboard.
*/
static void
GPIO_Close(void)
{
if(Fd>=0){
perror("keypad Close");
close(Fd);
}
Fd=-1;
}

/*
* Return the possible modifiers for the keyboard.
*/
static void
GPIO_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers)
{
if (modifiers)
*modifiers = 0; /* no modifiers available
*/
if (curmodifiers)
*curmodifiers = 0;
}

/*
* This reads one keystroke from the keyboard, and the current state of
* the modifier keys (ALT, SHIFT, etc). Returns -1 on error, 0 if no
data
* is ready, 1 on a keypress, and 2 on keyrelease.
* This is a non-blocking call.
*/
static int
GPIO_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *pscancode)
{
int keydown=0;
int cc=0;
char Buff[1];

cc=read(Fd, &Buff,1);
if(cc<0){
if((errno!=EINTR)&&(errno!=EAGAIN)&&(errno!=EINVAL)){
// perror("GPIO KEY ERROR
");
return -1;
}
else
return 0;
}
if(cc==0)
return 0;
*modifiers=0;
keydown = 2; /* key released */
*pscancode = *Buff;

switch(*pscancode)
{
case MENU1_KEY: *kbuf=MWKEY_KP1;
break;
case MENU2_KEY: *kbuf=MWKEY_KP2;
break;
case MENU3_KEY: *kbuf=MWKEY_KP3;
break;
case MENU4_KEY: *kbuf=MWKEY_KP4;
break;
case MENU5_KEY: *kbuf=MWKEY_KP5;
break;
case MENU6_KEY: *kbuf=MWKEY_KP6;
break;
case MENU7_KEY: *kbuf=MWKEY_KP7;
break;
default:
printf("Unknown Scancode %d
",*pscancode);
return 0;
}
return keydown;
}