Category Archives: 삽질

벨킨 블루투스 키보드(F5L150/F5L107) 매트릭스

meh에서 지난 달에 샀던 갤럭시 탭 2/노트 1세대 10.1용 벨킨 블루투스 키보드를 잘 쓰고 있었으나, 평소 쓰는 키보드가 해피해킹 프로 2와 주옥션이었던 탓에 극악의 키감을 이기지 못하고 개조의 충동을 느꼈다. 주옥션이 고장난 지 좀 되었기 때문에 스위치를 추출해서 이식해 보려는 시도를 하고 있었고, winkeyless 사이트에서 파는 기판에 주옥션에서 적출한 스위치를 이식해서 성공시켜 보았다. 곁다리로 얻은 정보 중에 삼성 DT-35와 같은 멤브레인 키보드에서 컨트롤러만 적출해서 쓰는 사례가 있었고, 마침 2개 중 1개는 내다 버려도 되는 상황이었기 때문에 부술 각오를 하고 작업을 시작했다.

문제의 블루투스 키보드는, 멤브레인 스위치와 보강판이 양면 테이프로 붙어 있고, 그 아래에는 고무판과 플라스틱 케이스가 있는데 모든 게 다 양면 테이프로 붙어 있다. 컨트롤러 및 배터리는 고무판 아래에 숨겨진 나사를 돌려서 적출할 수 있으나, 멤브레인 스위치에 접근하려면 키보드를 거의 부숴야 한다. 아, iFixit 같은 데 파는 열을 가해서 접착제 떼내는 걸 모르는 건 아니지만 원래 키보드 그 자체는 하나 더 있기 때문에 컨트롤러만 적출한다는 생각으로 미련없이 부쉈다. 이 와중에 접착제로 붙어 있는 190mAh 리튬 이온 배터리가 분해 중에 걸리적거려서 이걸 먼저 떼야 했다. 떼는 과정에서 배터리에 생긴 생채기 때문에 다시 쓰기는 좀 꺼려지긴 한다.

멤브레인 스위치와 기판이 연결되는 부분을 보면 L1-L24 인덕터 부품이 있고 그 옆으로 TP12-TP35 테스트 패드가 있다. 주의해야 할 점이 L1-L5까지는 L1, L2, L5, L3, L4 순서대로 되어 있고 TP35와 TP34는 순서가 바뀌어 있다. 이 매트릭스에 나와 있는 것은 회로 기판 내에 배치된 순서를 따른다. 이 키보드는 L12-L19와 그 나머지로 Row/Column이 구분된다.

belkin_f5l107_matrix주옥션에서 적출한 스위치를 직접 연결하여 확인하였다. 이제 기판을 만들어야 하는데 어떻게 하나.

자급제 단말기 SKT/KT 3G HD 보이스(와이드밴드 오디오) 사용법

국내에 단말기 자급제가 정착된 지도 제법 오래 되었지만, 아직까지는 유럽 국가처럼 아무 설정 없이 단말기의 모든 기능을 완벽하게 사용하기는 전산을 완전히 갈아 엎지 않는 한 어렵다. 한때는 외국산 LTE 단말기를 사용하려면 이통사 전산에 등록해야 하는 시절도 있었지만, 이제는 LTE 밴드만 맞으면 등록시켜 주는 정도까지 되었고, 이제 남아있는 것은 3G HD 보이스, VoLTE 등의 기능 정도다.

3G HD 보이스(와이드밴드 오디오)는 3G 서킷 스위치(CS) 망에서 AMR-WB 코덱을 사용하는 음성 통화이다. 소니 에릭슨 시절 정발된 엑스페리아 일부 기종이 AMR-WB를 지원하기는 했지만, 통화 양방이 모두 AMR-WB를 사용해야 하고 그것도 통신사 안에서만 가능하였기 때문에 아이폰 5가 등장하기 전까지는 국내에서 거의 기억하지 않았다.

아이폰 5가 정발된 이후 통신사 전산이 개선되어 KT는 3G HD 보이스를 모든 자급제 단말기에 대해서 개방하였고, SKT는 한동안 자사를 통해 유통되는 단말만 3G HD 보이스를 허용하였다가 최근에서야 자급제 단말에도 개방하였다. 물론 바로는 안 되고 별도로 IMEI를 등록(통신사 지점에서 모델명 변경)해야 한다. KT의 경우 해외 단말기에 최초로 USIM을 장착하면 전산상에서 “OPENMODEL1/2″로 인식하고, SKT의 경우 “OMD DEFAULT 핸드셋”으로 인식한다. (홈페이지 상 기기 모델로 구분 가능) 이 모델을 변경해 주어야 3G HD 보이스를 사용할 수 있다. VoLTE와 비슷하게 현재는 같은 통신사를 사용하고 VoLTE/3G HD 보이스를 사용하는 사람끼리만 HD 보이스 통화가 가능하다.

KT의 경우 3G 전용 휴대폰은 PTA-TYPE1HD(PTA-TYPE1과는 다름), LTE 지원 휴대폰은 PTA-TYPE3HD(PTA-TYPE3과는 다름)로 모델명을 변경하면 된다. PTA-TYPE2/4는 각각 3G/LTE 태블릿에 해당한다. (출처: 토렌트고고) SKT의 경우 한동안 이렇게 사용하는 것이 불가능하였다가, 최근에서야 ODH2(OMD DEFAULT 핸드셋_3G HD Voice)로 모델명 변경이 허용되었다. (출처: 뽐뿌클리앙) 이 외 통신사를 통해 정발된 3G HD 보이스 지원 단말기는 유통한 통신사마다 정책이 다르다. MVNO(알뜰폰)을 사용하는 경우, 알뜰폰 회사마다 모회사(SKT/KT) 전산 접근 권한이 다르기 때문에 알뜰폰 고객센터에서 변경이 불가능하면 모회사 휴대폰을 사용하는 사람을 USIM 기변 상태로 모델명 변경을 하면 가능하다.

kt_pta_type3

문제는 이러한 작업을 동네 대리점에서는 해 주지 않으려고 하고 114에 전화를 걸면 신분증을 팩스로 보내야 하기 때문에 오프라인으로 하려면 각 통신사 지점을 찾아가야 한다. KT의 경우 대전 시내 서로 다른 2개 지점에서 모델명 변경 요청 시 신분증만 제시하면 가능하였다. (안드로이드나 iOS가 아닌 휴대폰은 IMEI 화면을 표시해 두는 것을 추천) KT 개통 이력이 없는 단말기의 경우 전산상에서 미등록 단말기로 분류되므로, 한 번은 USIM 기변을 한 상태로 대리점을 찾는 것을 추천한다. 여러 대의 단말을 동시에 등록할 경우 USIM 기변 이력만 있으면 된다. 아직까지 SKT는 시도해 보지 않았다.

3G HD 보이스는 표준 요금제에서도 사용 가능하다. 자신의 휴대폰이 3G HD 보이스를 지원하는 지 여부는 제조사에 문의해야 한다. 블랙베리 10 OS를 탑재한 휴대폰은 모두 지원하며, Jolla 역시 지원한다. 소니 휴대폰의 경우 다이얼러에 *#*#7378423#*#*(SERVICE)을 입력한 다음 Service Info -> Configuration과 같은 메뉴에서(기종마다 세부 항목은 다를 수 있음) 부트로더 언락 상태와 함께 Available Speech Codec에 AMR-WB가 있는 지 여부로 판단 가능하다. 블랙베리 10 OS의 전화 통화 화면에서는 HD 보이스 사용 여부가 시간 표시줄 위에 나타나지만, 표시기가 없는 휴대폰의 경우 통화 음질 등으로 판단하는 방법밖에 없다.

IMG_20141030_202035

Enabling Qualcomm diagnostic mode on Jolla

Since Jolla uses Qualcomm MSM8930AA, it is possible to use Qualcomm diagnostic tools in theory. They are not available by default and the way to enable this functionality is not yet discovered. I poked various options of usb-moded but diagnostic mode did not came out. I ended up editing some files and finally managed to get the diagnostic mode on my Jolla.

DISCLAIMER: you may void your warranty, especially poking with various Qualcomm-related tools. You have been warned.

usb-moded files are located under /etc/usb-moded and there are several ini files defining modes. USB mode selection UI gives options for PC Suite, Developer mode, Charging only. Those two modes are defined in /etc/usb-moded/dyn-modes/developer_mode-android.ini and pc_suite-android.ini. The file contains USB gadget settings like vendor and product ID, and most importantly, USB mode.

What is exposed via USB interface is determined by /sys/class/android_usb/android0/functions file. Directly modifying sysfs values seems not to work, only via editing usb-moded configuration files. usb-moded changes these values accordingly to the INI file. This is setting for developer mode.

$ cat /etc/usb-moded/dyn-modes/developer_mode-android.ini 
[mode]
name = developer_mode
module = none
network = 1
network_interface = rndis0

[options]
sysfs_path = /sys/class/android_usb/android0/functions
sysfs_value = rndis
sysfs_reset_value = none
softconnect_path = /sys/class/android_usb/android0/enable
softconnect = 1
softconnec_disconnect = 0
idProduct = 0A02

To enable diagnostic mode, you can append diag into sysfs_value and extra lines like this (you must be root to edit INI files):

$ cat /etc/usb-moded/dyn-modes/developer_mode-android.ini 
[mode]
name = developer_mode
module = none
network = 1
network_interface = rndis0

[options]
sysfs_path = /sys/class/android_usb/android0/functions
sysfs_value = rndis,diag
sysfs_reset_value = none
softconnect_path = /sys/class/android_usb/android0/enable
softconnect = 1
softconnec_disconnect = 0
idProduct = 0A02
android_extra_sysfs_path = /sys/class/android_usb/android0/f_diag/clients
android_extra_sysfs_value = diag

You need to restart phone or “systemctl restart usb-moded.service” to take the effect. When the file is modified, selecting developer mode on USB connection also activates diagnostics interface on USB. On Windows system there is no driver available for newly added diagnostics port. You can use driver from other Qualcomm-based devices, but the device name should include “diagnostics port”. I used driver from LTE USB stick.

If device is normally detected, you can now use Qualcomm tools to poke Jolla’s radio. Be careful not to brick this part! They are independent from OS!

When there are problems in USB usage, restore the values to original. Back up your system before potentially dangerous operations!

Extracting official firmware image of Casio G’zOne LTE (C811)

Most stock rom of Casio G’zOne 4G LTE (C811) is extracted from stock devices after uploading corresponding firmware. Verizon also supports firmware restoration tool from PC. There were some efforts to extract real stock firmware from that image but that never happened. I analyzed the Verizon firmware restoration tool and how to extract (not flash) firmware images uploaded on NEC Casio server.

There are some INI files bundled with Verizon tool (TL-Bootstrap). It specifies base address where all required tools are uploaded. When executed, the program checks all required tools’ version from http://baseaddress/ToolVersion.txt, downloads newer version when available. Real upgrade processes are hidden in the tool downloaded by bootstrap. Latest version of firmware is checked via /files.txt which contains version, size and some other information. Downloading firmware itself is straightforward by using filename from the text file, but only latest version is available from official server. All previous versions were deleted.

The firmware consists of single ZIP file, which then contains single MBN file for flashing. Despite same extension as Qualcomm tools, it uses proprietary format to encode and encrypt the image. Metadata is located at the last 2KB of MBN file. It starts with header, something like version and number of partitions. Each partition record basic information of partition and “flags”. EXT4 partition images are stored in standard sparce format which could be restored using simg2img. Other images stored with trailing zero bytes stripped, with separate original size information. All binary data except header is XOR encrypted, which differs among partition and even among firmware version.

I deduced XOR keys by comparing “extracted” file system images with encrypted images, which share same header bytes. XOR key of EXT4 sparce partition is also easily deducible since they use standard Android magic numbers. Attached source code calculates XOR key and extracts file system image. Probably works on Linux and OS X.

eut_extract.c code is here: https://gist.github.com/peremen/71330cbb4a6556358b938e0e353255a6

Using the attached source code, you can obtain “pure” stock ROM which is not altered by flashing and dumping.

Jolla/Sailfish OS용 한글 입력기, 돛단배

Jolla를 사자마자 준비 땅! 하고 한 일은 한글 입력기 제작이긴 했지만, 만들어 놓고 테스팅하느라 공개를 미룬 덕분에 다른 누군가가 한글 입력기를 먼저 공개하는 불상사가 터졌다. 먼저 공개된 입력기의 소스를 분석해 보니 뭐 그렇게 나쁜 것 같지는 않지만, 바퀴를 다시 발명할 필요는 없지 않은가. 그래서 한글 두벌식 입력 쪽은 바퀴를 다시 발명하는 대신 온라인 한글 입력기의 소스를 사용하였다. 돛단배 입력기는 두벌식 및 나랏글을 지원하는 Sailfish OS용 입력기이며, 개발 관련 이야기를 읽지 않고 싶다면 End 키를 누른 다음 맨 아래에 있는 다운로드 링크를 보면 된다.

Sailfish OS의 키보드 레이아웃은 QML로 작성되며, 여기에 사용자 정의 InputHandler를 붙이는 방식으로 단어를 입력하기 전에 조합하는 것과 같은 처리를 할 수 있다. 공식적인 InputHandler를 추가할 수 있는 API가 따로 없기 때문에 Sailfish OS용 일본어 입력기는 Hack에 가까운 방법으로 InputHandler를 전환하고 있었다. 먼저 공개된 일본어 입력기의 경우 Anthy 라이브러리를 QML 플러그인으로 만들어서 붙인 방식을 취하고 있었기 때문에 libhangul을 같은 방식으로 붙일까 생각했으나, 네이티브 코드를 쓰지 않는 것이 덜 번거로울 것이라고 판단하여 온라인 한글 입력기 기반으로 소스 코드를 전환하였다. InputHandler를 붙이는 것은 입력기 소스 코드의 ko_2set.qml, ko_naratgeul.qml 파일을 참고하면 된다.

아무튼 공개 시간을 놓쳐 버린 사태가 일어나고 나서, 바퀴를 다시 발명하는 것이 안타깝기도 하고 많은 ‘한국에서 개발되고 사용된’ 한글 입력기의 구현체와는 거리가 있기 때문에 내 소스 코드를 그냥 묻어 버릴 수는 없다고 판단하여 기능을 하나 더 추가하여 공개하기로 결심하였다. 눈에 들어온 것은 10키 방식 키보드였다. 서드파티 키보드 API를 사용할 수 있는 OS 중 안드로이드로는 키보드 제작이 활발하지만, 다른 모바일 OS의 경우에는 두벌식 키보드 하나 구현해 놓고 끝내는 일이 많아서 10키 키보드 제작에 신호탄을 쏘는 게 좋지 않을까 하는 생각이 들었다. 게다가 Sailfish OS용 키보드 레이아웃을 만드는 사람들도 10키 레이아웃에는 그다지 관심이 없는 것 같아서 내가 직접 레이아웃을 구현하는 게 더 빠를 것 같았다.

현재 국내 표준으로 지정된 모바일 입력기는 크게 천지인, 나랏글, SKY 한글이다. 이 중 나랏글을 먼저 구현한 데에는 감정적 및 기술적인 이유가 있다. 2004년부터 지금까지 휴대폰을 써 오면서 QWERTY 키보드가 없는 환경에서 가장 오랫동안 사용한 키보드 레이아웃이 나랏글이기 때문에 지금도 나랏글 자판에서는 손이 쭉쭉 나가고, 천지인은 그렇게 오랜 기간을 사용하지 않아서 그런지 아직까지 그렇게 익숙하지 않다. 또한 나랏글의 경우 자음을 입력하는 데 같은 키를 여러 번 누르는 것이 아니라 자음+획추가 방식을 사용하기 때문에 자음을 입력한 후 잠시 기다리거나 방향 키를 누를 필요가 없다. (모음은 아쉽게도 제외되지만 완전히 조합된 한글을 입력할 때 모음을 연속으로 입력하는 경우는 없다) 컴퓨터로 이것을 구현하려면 타이머 이벤트를 붙여서 조합 중 상태를 해제시켜 주어야 하는데 이것이 지원되는 지 여부를 확신할 수 없었다. 천지인의 경우 자음 충돌 문제 때문에 이 기능이 필수적이고 SKY 한글의 경우에는 ‘ㅢ’를 입력하는 경우에 모음 충돌이 발생할 수도 있지만 2번 키를 3회 연타하는 식으로 ㅢ를 입력하는 경우도 있다. 그래서 키보드 입력과 조합된 글자를 1:1 대응시키기 가장 쉬운 나랏글부터 먼저 구현하기로 했다.

표준으로 지정된 모바일 입력기 소스 코드를 구하려면 TTA에 연락하면 된다고는 하지만, 거기에서 제공하는 소스에 어떤 NDA가 걸려 있을지도 모르고 F/OSS 호환성도 확신할 수 없기 때문에 바닥에서부터 새로 구현하기로 결심했다. 모바일 입력기 중 천지인 입력기는 F/OSS로 구현한 게 몇 개 있는 것 같지만, 나랏글의 경우에는 자유 소프트웨어로 구현한 게 없는 것 같았다. 그래서 맨땅에 헤딩했다. 하나의 글자를 길이가 6인 배열로 자소별로 나누었고, 키를 입력하면 이 임시 배열에 자소별로 채워진 다음 최종적으로 음절로 변환하는 단계를 거쳐서 preedit 문자열이 생긴다.

한 글자를 입력하고 바로 커밋하는 방식을 취하기보다는 긴 preedit 문자열을 사용하여 단어 단위로 입력하게 만든 것은 나랏글 입력기의 특성 때문이다. (소스 코드의 inputQ 부분에 해당한다.) 예를 들어서 ‘안’이라는 글자를 입력한 다음 ‘ㄴ녕’을 입력하게 되면 ‘안ㄴ녕’이 나오게 되는데, 이 글자들을 입력하는 중간 과정에서 preedit 문자열에 최대 2개의 독립된 자음이 들어가게 된다. 받침이 있는 글자를 입력한 다음 또 다른 자음을 입력하면 그 자음이 이전에 입력한 글자와 결합되어 겹받침이 될 수도 있고, 다른 글자로 분리될 수도 있기 때문이다. 가령 ‘삭신’을 입력한다고 했을 때 중간 상태로는 ‘삯’이 존재하는데 이 경우 입력기는 사용자가 앞으로 여기에 자음을 입력할지 모음을 입력할지 모르기 때문에 최소 하나의 자음 정보는 더 달고 있어야 한다. 겹받침만 따로 상태를 관리할 수도 있겠냐고 생각할 수도 있지만, ‘앉다’와 같이 ㄵ 받침을 입력하는 경우에는 중간에 ㄴㅅ 상태를 거쳐야 하지만 이것은 올바른 겹받침이 아니기 때문이다. 따라서 종성 부분을 길이 2인 배열로 관리하며 이 배열에는 임의의 두 자음이 올 수 있도록 설계하였지만, 글자를 조합하는 과정에서 올바른 겹받침이 아닌 경우 다음 글자의 초성으로 표시되도록 설계하였고 이렇게 올바른 겹받침이 오지 않은 상태에서 또 다른 자음을 입력하면 중간에 있었던 자음을 별도의 한 글자로 배당한 다음 두 번째 글자의 초성으로 입력한 자음을 배당시켜야 하기 때문에 preedit 문자열의 길이를 충분히 확보해 두어야 한다. 모음 결합 부분은 의외로 구현이 간단하다.

입력 큐에 쌓여 있는 자모를 중간 결합하는 부분에서 첫가끝 대신 한글 호환성 자모를 사용한 것은 글꼴 문제보다는 이 면이 논리적으로 더 맞기 때문이다. 첫가끝 자모는 초성인지 종성인지에 대한 정보를 포함하고 있지만 호환성 자모는 초중종성 정보를 따로 포함하고 있지 않기 때문이다. 기타 commit/preeedit 스트링을 관리하는 부분은 libhangul API의 의미론을 최대한 반영하려고 하였다. 단어 단위로 입력 큐를 들고 있으면 차후에 자동 완성을 구현하는 것이 더 쉬워지는데, 이미 커밋된 글자를 따로 들고 있을 필요 없이 preedit 문자열을 그대로 검색하게 만들면 된다. 아쉽게도 F/OSS로 구현된 한글 단어 완성 라이브러리 및 데이터가 없는 것 같지만, 필요한 경우 나중에 추가하는 것도 가능하다.

나랏글 한글 입력기의 코어 로직은 src/ko_common/naratgeul_handler.js 파일에 포함되어 있다. process 함수에 1~12까지의 숫자를 전달하면(*: 10, 0: 11, #: 12) 이들을 숫자 입력으로 간주하여 해당하는 나랏글 자판에서의 키를 누른 것으로 간주한다. merge_q 함수는 현재 입력 큐에 들어 있는 글자를 보여줄 때 사용할 수 있으며, 입력 큐 길이는 8글자로 되어 있지만 부족하다면 늘일 수 있다. 조합 중 상태에서의 백스페이스 구현은 마지막으로 입력된 자모를 없애고 preedit 문자열을 업데이트하는 것 정도로 충분하다.

입력기의 원본 코드는 GNU General Public License 버전 2 이상으로 공개한다. 다른 오픈소스 입력기에서 이 코드를 사용하고 문제점을 지적하고 Pull Request를 보내는 것은 얼마든지 환영하지만, 소스 코드를 공개하지 않는 무료 및 유료 입력기에 이 코드를 무단 도용하는 것은 컴퓨터 프로그램 보호법에 의하여 대처하겠다. GPL 라이선스는 이 라이선스 하에 배포된 코드를 사용하는 파생 저작물 전체의 소스 코드를 공개할 것을 강제하고 있다. Xvid 코덱을 사용한 PS2 게임 ICO가 이 사실이 발각된 이후 게임 전체의 소스 코드가 공개된 것을 생각해 보면 된다.

돛단배 입력기의 소스 코드는 GitHub에 공개되어 있으며, OpenRepos에도 업로드되어 있어서 다운로드할 수 있다. 나랏글 입력기의 구현체를 다른 GPL 기반 한글 입력기에서 사용하는 것은 얼마든지 환영하며, 입력기 코드를 최초로 작성하는 만큼 소스 코드를 최적화한 Pull Request는 환영한다.

돛단배 입력기를 설치하면 Sailfish OS에서 선택할 수 있는 키보드에 한글(두벌식)과 한글(나랏글)이 추가되며, 다른 언어 키보드처럼 선택하면 된다. 단 한글(두벌식)에서 한글(나랏글)로 바로 가는 것은 API의 한계로 인하여 바로 지원되지 않으며 다른 언어를 경유하면 된다. 나랏글 키보드가 가로 화면에서 일그러지는 것 역시 알고 있는 문제이며 이는 차후 버전에서 개선할 예정이다. SKY 한글 및 천지인 입력기는 차후 버전에서 구현할 예정이다.

아래는 Jolla 휴대폰에서 구동시킨 돛단배 입력기의 스크린샷이며 각각 두벌식과 나랏글 모드이다.

두벌식 입력기

두벌식 입력기

나랏글 입력기

나랏글 입력기