블로그

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (15)

  1. Main FW 바이너리 빌드 분리

부트 로더를 분리하기로 마음 먹었기에, 키보드 펌웨어는 두 개가 나와야 한다. 부트 로더와 메인 펌웨어. 그래서 makefile등 빌드에 관계된 파일을 수정해서 바이너리를 분리해야 하고 소스 코드에서도 condition flag로 부트 로더 전용 코드와 메인 펌웨어 전용 코드, 그리고 공통 코드를 식별해야 한다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (14)

  1. MSC를 부트로더로 변경

NOR 플래시 메모리에서 펌웨어가 동작 중인데 펌웨어 데이터가 저장되 있는 플래시 메모리 영역에 데이터를 업데이트 하면 현재 그 업데이트 동작을 수행하고 있는 펌웨어 코드를 지워버리거나 덮어서 써 버리는 문제가 생긴다. 두 개 정도 해결 방법을 생각해 봤다.

내가 설명할 두 가지 방법 외에도 여러 해결 방법이 있을 것이다. 현재 동작하고 있는 있는 코드가 손상되지 않기만 하면 된다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (13)

  1. 펌웨어 다운로더 만들기

키맵 다운로더를 만들었으면 펌웨어 다운로더는 쉽게 만들 수 있다. 조금만 확장하면 된다. 그러나 펌웨어 다운로드 기능은 키맵과는 다르게 고려해야할 사항이 몇개 더 있다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (12)

  1. 키맵 다운로더 만들기

FAT16 데이터를 펌웨어에서 만들어서 운영체제에 보내면 드라이브로 마운트 된다. 그러면 사용자는 키맵 바이너리나 펌웨어 바이너리를 직관적이고 단순하게 그냥 복사하면 된다. 펌웨어는 파일 데이터만 내장 플래시 메모리에 저장하고 그 데이터를 잘 쓰는 것이다. 이 과정에서 펌웨어는 사용자가 보낸 데이터가 키맵인지 펌웨어인지 구분해야 한다. 우선 키맵을 어떻게 구분할지 방법을 궁리해 보자.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (11)

  1. FAT16 만들기

MSC 스펙을 구현해서 디바이스를 대용량 저장장치로 연결하면 장치로 연결까지는 되는데 드라이브로 마운트는 되지 않는다. 윈도우면 E:, F: 이렇게 드라이브로 뜨지 않는다는 말이고 리눅스면 /mnt나 /media 디렉터리 밑에 뭐가 생기지 않는다는 말이다. 호스트에서 디바이스로 파일을 보내는 실질적인 작업을 하려면 드라이브로 마운트를 해야 한다. 그러려면 디바이스에 파일 시스템을 만들어야 한다.

디바이스에 파일 시스템을 만드는 방법은 두 가지 방법이 있다. 디바이스 스토리지 영역을 실제로 호스트에 공개해서 호스트에서 포멧하는 방법. 디바이스에서 파일 시스템에 해당하는 데이터를 호스트로 보내서 호스트가 이 디바이스는 이미 파일 시스템이 있다고 인식하게 만드는 방법. STM32F103은 스토리지라고 해 봐야 인터널 플래시 64KB ~ 128KB 뿐이고 내가 MSC를 구현한건 호스트에서 파일을 받기 위함이지 디바이스 내부의 바이너리 데이터를 호스트로 보내려고 하는 것은 아니다. 그래서 굳이 내가 호스트에서 디바이스 스토리지 영역을 제어하게 할 필요는 없다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (10)

  1. MSC USB 만들기

MSC USB 펌웨어를 작성하는 것도 UART 펌웨어나 HID 펌웨어를 만들 때랑 같은 전략을 썻다. 인터넷에서 적당한 예제를 찾은 다음, 그대로 가져다 붙이고 필요한 부분만 수정하는 것이다. 진지하게 시간들여 공부할 필요도 없고 결과도 빨리 나오고 재미있다. 오픈 소스란 좋은 것이다. 물론 나도 그렇게 만든 결과물을 공개해야 한다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (9)

  1. 키맵 업데이트와 펌웨어 업데이트 구상

키맵을 런타임에 업데이트 할 수 있도록 코드를 작성했다. 문제는 어떻게 업데이트 하느냐를 결정하는 것이다. 여러가지 방법이 가능하다. 먼저 가장 단순한 방법으로 UART 터미널을 통해 XMODEM으로 전송하는 것이다. 전통적이고 오래된 방법이다. 그런만큼 구현이 쉽다. 또는 DFU(Device Firmware Upgrade)라고 부르는 표준도 있다. 그리고 내가 사용하기로 결정한 방법인 MSC(Mass Storage Class)를 이용하기도 한다. MSC는 쉽게 말해서 대용량 저장 장치를 펌웨어로 만든는 것이다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (8)

  1. HTML 키맵 에디터

키보드 핵심 기능을 하는 펌웨어는 모두 구현했다. 지금까지 펌웨어만으로도 키보드 사용에는 문제 없다. 앞으로는 부가 기능과 편의 기능 구현에 대한 이야기를 쓸 것이다. 없어도 되지만 있으면 좋은 그런 기능들이다. 첫 번째로 키맵 에디터다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (7)

  1. 키 입력 폴링과 호스트 전송 태스크

하드웨어 GPIO에서 전기 신호를 읽어서 몇 행, 몇 열에 있는 키보드 스위치가 눌렸는지 이제 펌웨어는 알 수 있다. 그러면 다음에 할 일은 이 행열 정보를 가지고 어떤 키가 눌렸는지 변한하는 것이다. 다시 말해 그저 (x, y)로 전달 받은 매트릭스 위치 정보를 호스트 운영체제가 활용하는 HID 키보드 스캔 코드로 변환하는 것이다.

나빌레라의 이미지

키보드를 만듭시다. 어때요~ 참 쉽죠? (6)

  1. 키맵 처리 만들기 (HW detection to HID scancode)

지금까지는 사실 키보드 기능 자체에 대한 기능 보다 펌웨어 자체를 동작하는데 집중했다. 키보드 관련한 것이라고는 HID USB 관련 코드를 추가한 것 뿐이다. 그러나 정작 HID 모듈로 보내는 데이터는 유닛 테스트 수준으로 만들어 넣고 있다. 이제 진짜로 키보드 스위치 입력을 펌웨어에서 인식해서 키 스캔 코드를 만드는 작업을 한다.

페이지

RSS - 블로그 구독하기