libnfc 포팅

pn532 디바이스를 안드로이드 내부의 NFC 기능으로 포함시키려면 커널 드라이버를 개발해야 하므로 시간상 불가능하다고 판단.

사용자 모드에서 직접 pn532와 통신하여 NFC 통신을 할 수 있는 방법을 찾기 시작한다.

libnfc 라는 오픈소스가 i2c, spi, uart, usb 등으로 연결된 nfc 모듈을 지원한다는 사실을 발견하고 포팅 작업을 시작한다.

먼저 ~/rk3128/external/libnfc 에 프로젝트를 클론한다.

안드로이드 system 빌드에 자동으로 추가하기 위해서 Android.mk 파일을 작성한다.

포팅 작업 시작하였지만, 크로스 컴파일 환경에서 autoconfig 하기 어려운 상황이라, config.h 없이 다양한 매크로를 하나씩 추가하면서 컴파일한다. 다음은 여러번 반복 시도하여 알아낸 최종 매크로들이다.

설정 파일은 다음과 같다.

이 설정 파일은 시스템 빌드시에 다음과 같은 명령으로 타깃에 이미지에 /etc/nfc/libnfc.conf 이름으로 복사된다. (~/rk3128/external/libnfc/Android.mk 파일)

nfc가 정상적으로 동작하는지 확인하기 위해서 2가지 유틸리티를 만들도록 한다.

시스템을 빌드하고 다운로드 한다.

다음과 같은 명령으로 nfc 동작을 확인할 수 있다.

앱에서 해당 명령을 호출하거나 /dev/i2c-3 을 열고 ioctl 할 수 있는 권한이 없기 때문에 su 하지 않으면 동작하지 않는다. 이 문제를 해결하기 위해서 /dev/i2c-3 의 퍼미션을 0666 으로 변경하도록 init.rc 파일을 수정한다.

시스템을 다시 빌드하고 다운로드 한다음 다음과 같이 권한이 정상적으로 변경되었는지 확인한다. 이제부터 해당 디바이스는 루트가 아니어도 사용할 수 있게 된다.

기존 시스템 소스중 libnfc-nxp 의 라이브 이름을 수정해준다. (새 libnfc와 충돌)