이지랑드로랑 - 14장. 키패드 만들기

 

정말 너무도 오랜만에 강좌를 쓰게 되네요.

이것은 전부 먹고 살다보니 그렇게 되었다는 핑계만을 하게 되는데요, 독자 여러분께는 정말 죄송하게 생각합니다.

이것은 아무래도 중국발 황사로 인해 몸이 약해진 탓이 아닌가 구시렁구시렁 거려봅니다.

그래도 독자 여러분께는 뭐라 드릴 말씀이 없죠. 늦어서 죄송합니다. ㅡ_ㅡ 꾸벅;

 

그래서 오늘은 또 재미난 것을 하나 해볼까 합니다.

바로 버튼을 추가하는 것을 해볼까 해요.

어플리케이션에서 버튼을 추가하는게 아니라 안드로이드에서 사용하는 몇가지 주요 버튼들을 이지보드에 추가해보자~ 뭐, 이런 취지가 되겠습니다.

 

What?! GPIO for Android

일단 버튼을 만들기 전에 GPIO가 무엇일까요?

소프트웨어만을 전공한 저로서는 사실 하드웨어적인 것만 나오면 손발이 오그라 들고 오한이 옵니다. 어려워서요. ^^;

뭘까? 하고 찾아보니 이미 FALinux 포럼에 이쁘게 설명이 되어 있네요.

 

GPIO 가 뭔가요? : http://forum.falinux.com/zbxe/?document_srl=438015

 

General Purpose Input/Output, 뭐 이런 말 입니다.

제가 설명하는 것보다는 FALinux에서 하드웨어를 담당하고 계시는 오재경 이사님의 글을 참고하는게 더 좋을거라 생각됩니다.

위 링크를 클릭하시면 되요.

 

제가 대뜸 하드웨어 이야기를 꺼내는 것은 바로 안드로이드에서 사용할 버튼을 이지보드에 추가해주기 위함 입니다.

여러분들이 안드로이드폰을 직접 보신분들도 있고 사진으로만 보신 분들도 있을텐데요, 안드로이드폰의 대부분은 QWERTY 자판을 부착하고 출시가 되고는 합니다.

물론 국내에서 출시되고 있는 몇몇 제품들은 QWERTY 자판을 내장하고 있진 않습니다. (대부분 SW 입력기를 쓰더라구요)

그래도 최소한 Menu 버튼과 Back 버튼은 하드웨어적으로 외부로 돌출되어 있죠.

 

[그림14-1. QWERTY 자판이 포함된 안드로이드 폰]

 

우리는 QWERTY 는 아니지만 Menu, Back, Enter, Left, Right, Up, Down 버튼을 만들어서 추가해 보도록 할께요.

벌써부터 신나지 않나요? ^^

 

Step1. 버튼을 만들어 보자!

사실 이번 강좌는 할까말까 고민을 많이 한것이 제가 하드웨어를 전혀 모르기 때문에 설명이 막장으로 치달을 수 있다는 점에서 고민을 많이 했었던 것이 사실 입니다.

하지만 원하시는 분들이 조금 있어서 그냥 하기로 마음을 먹은 것이니 틀린 점이 있거나 부족한 것이 있다면 맹 비난보다는 보강설명을 부탁드리는 바 입니다.

 

[그림14-2. 만들고자 하는 제품의 개념도]

 

그림14-2에 그려놓은 그림이 제가 만들고자 하는 물건의 개념도 입니다.

총 7개의 버튼이 달린 기판을 만들어서 이쁘게 이지보드에 하나로 만들어서 사용하겠다는 야심찬 계획이죠.

이걸 만들기 위해서 저는 혼자서 '어떻게 한담~' 하고 고민을 하고 있던 찰라에 FALinux의 장형기 소장님이 하나 던져주신 PCB를 가지고 생각보다 쉽게 작업할 수 있었습니다.

 

[그림14-3. 만들어진 키패드]

 

그렇게 저는 힘겹게 힘겹게 땜질을 해서 처음 계획했던 키패드를 만들 수 있었습니다. 안해본걸 하려니 어렵네요.

그래도 쉽게 구한 기판 덕분에 저는 행복해졌지만 그렇지 못한 여러분은 다소 우울하실 수도 있을 것이라 생각 됩니다.

'너는 기판 쉽게 구하고 난 뭐냐!' '지금 장난하냐!' '놀리는거냐!' 라며 화내실 분들이 있으시겠지만 너무 화내진 마세요.

하드웨어의 '하'자만 나와도 겁에 질리는 저도 생각보다 쉽게 작업할 수 있었습니다.

여러분도 이 강좌를 보시면 쉽게 따라하실 수 있을 겁니다.

 

여러분도 공PCB가 하나 있다면 위와 같이 비슷하게 만드시면 되요.

아마도 아래와 같이 만들면 되지 않을까 생각해 봅니다.

 

[그림14-4. 초간단 버튼판 설계도]

 

하드웨어를 모르는 저는 회로도 그려주는 프로그램을 어떻게 쓰는지도 모르겠고 해서 정말 쉽게, 제가 이해하기 쉽게!

위와 같이 만들어 봤습니다.

검은색 표시는 GND를 의미하고요, 각각 1번 ~ 7번까지의 핀이 각각의 버튼을 연결합니다.

그리고 S3, S4는 이지보드에 이미 만들어져 있는 스위치에서 선을 따오겠다는 의미 이구요, H2-61은 이지보드에 GPIO 연결 핀 중에서 H2 라인에 있는 62번째 핀에 연결하겠다는 의미가 되겠습니다.

'너 정말 하드웨어 모르는구나!' '안타깝다! 내가 대신 설명하겠다!' 이런 분들은 진정 댓글로 자세한 설명 부탁드릴께요. ^^

사실 저희 포럼이 모두가 만들어가는 아름다운 세상 아니겠습니까? 하하하.

 

[그림14-5. 전선을 이쁘게 연결한 모습]

 

설명보다 최고의 예제는 바로 제가 직접한 것을 보여드리는 것이 아닌가 생각 됩니다.

위에서 그림 그리고 만들었던 버튼판을 그림14-5와 같이 이지보드에 연결하는 것으로 하드웨어적인 준비는 다 끝나게 됩니다.

 

Step2. 커널 소스코드 살펴보기

버튼을 저렇게만 연결한다고 해서 되는 것이 아닙니다.

바로 커널에서 키보드 드라이버를 연결을 해줘야 합니다.

커널 소스를 고치자고 하면 정말 눈 앞부터 캄캄해지곤 하지요. (저도 그래요) 하지만 걱정 마세요!

여러분들이 구매하신 EZ-S3C6410 과 함께 제공되는 CD에 포함된 커널에는 이미 이 소스코드가 포함되어 있습니다.

물론, 포럼에서도 커널 소스를 다운로드 받으실 수 있습니다.

 

그럼, EZ-S3C6410에 맞게 포팅된 키보드 드라이버를 한번 살펴보도록 할까요?

# vi {Kernel_SRC}/drivers/input/keyboard/falinux_gpio_key.c

소스코드에서 우리가 한 작업을 기준으로 살펴볼 것은 다음과 같아요.

//... 생략 ...
static const unsigned short falinux_gpio_keycode[FALINUX_GPIO_KEYCODE_MAX] = {
    KEY_MENU,
    KEY_BACK,
    KEY_LEFT,
    KEY_RIGHT,
    KEY_UP,
    KEY_DOWN,
    KEY_ENTER
};
//... 생략 ...
static int falinux_gpio_number[FALINUX_GPIO_KEYCODE_MAX] = {
    S3C64XX_GPF(13),
    S3C64XX_GPH(5),
    S3C64XX_GPN(0),
    S3C64XX_GPN(1),
    S3C64XX_GPN(2),
    S3C64XX_GPN(3),
    S3C64XX_GPN(4)
};
//... 생략 ...
static void gpio_hw_init(void)
{
    unsigned int gpio;

    // GPF Init
    s3c_gpio_cfgpin (S3C64XX_GPF(13), S3C64XX_GPF_INPUT(13));
    s3c_gpio_setpull(S3C64XX_GPF(13), S3C_GPIO_PULL_UP);

    // GPH Init
    s3c_gpio_cfgpin (S3C64XX_GPH(5),  S3C64XX_GPH_INPUT(5));
    s3c_gpio_setpull(S3C64XX_GPH(5),  S3C_GPIO_PULL_UP);

//... 생략 ...

그렇게 어렵지 않죠?

키보드 디바이스 드라이버를 우리가 사용할 핀에 맞게 매치시켜준 것 밖에는 없습니다.

더 추가하고 싶으시다면 이지보드와 함께 제공되는 데이터쉬트를 참고하면 되겠죠? ^^

 

혹시 KEY_MENU와 같은 키 값을 찾아보고 싶다면 {Kernel_SRC}/include/linux/input.h 를 참조하시면 됩니다.

아마도 한번쯤은 찾아보게 될꺼고, 이번 강좌에서도 잠깐 보게 될 겁니다.

 

Step3. 안드로이드 소스코드 살펴보기

이번엔 안드로이드 소스코드를 살펴본다고 되어 있는데... 사실 소스코드라고 할 수는 없네요.

이미 만들어진 파일 중에서 QWERTY 키 배치를 찾아보는 것 뿐이라서 소스라고 하기는 좀 그렇지만 그냥 그렇게 부르죠.

자! 일단 한번 보도록 합시다.

안드로이드가 올라가 있는 보드에서 키배열 스크립트를 열어보는 겁니다.

# vi /system/usr/keylayout/qwerty.kl

파일을 열어보시면 아래와 같은 내용이 확인될 겁니다.

... 생략 ...
key 158   BACK              WAKE_DROPPED
...생략...
key 139   MENU              WAKE_DROPPED

BACK 키와 MENU 키가 잘 등록되어 있네요.

키 번호가 158, 139라고 매칭 되어 있죠?

이것은 커널에서 키 레이어의 번호를 찾아가도록 만들어 놓은 것 입니다. ({Kernel_SRC}/include/linux/input.h)

따라서 키 번호를 여기서 수정 해주면 이미 커널에 등록된 키에 맞게 안드로이드가 알아서 셋팅되는 것이죠.

참 편리하지 않나요?

안드로이드가 신경을 잘 썼다는 말 밖에 나오지 않습니다.

 

Step4. 마무리 하기

자! 여러분이 만든 버튼판을 보드에 이쁘게 부착해 보세요. (따로 붙이는 곳은 없습니다!)

그리고 보드를 켜고 한번 키를 사용해 보세요.

잘 된다면 행복한 겁니다. 저는 잘 되네요. ^^ 아~ 행복하다.

 

[그림14-6. 완성된 안드로이드 자작 키패드]

 

우측 상단에 보이시죠? 제가 만든 키패드!!!

여러분도 만들어서 직접 한번 붙여보세요. 붙이는 위치는 직접 고안해 보시고요. 유용하게 사용할 수 있을 겁니다.

한번 해보세요! 브라우저도 다뤄 보시고, 메뉴도 왔다갔다 해보시고! 생각보다 신기하고 재미있습니다. ^^

 

오늘 간만에 강좌를 올렸는데요, 항상 이렇게 강좌를 끝내고나면 고민이 됩니다.

다음번엔 뭘 올리지!!! ㅜ.ㅜ

한번 고민을 해보고 다음 강좌를 통해서 또 만나 뵙도록 하겠습니다.

자주 올리겠다는 말만 하고 자주 강좌를 올리지 못해서 양치기 소년이 되는 것 아닌가 걱정해보지만 그래도 자주 올릴 수 있도록 노력하도록 하겠습니다.