|
문제의 파일은 커널빌드루트/drivers/char/eagle_uart123.c 파일인데, menuconfig 시 Character Device 의 EAGLE LowLevel UART 1,2,3 Support 의 소스이다. ADChips 쪽에 문의하여 답변을 받았는데 이 드라이버는 리눅스에서 UART 를 OS 의 제어가 아닌 firmware 에서 다루는 것 처럼 직접 제어하여 사용하기 위한 드라이버라고 한다. 즉, 평소에는 별로 쓸 일이 없는 드라이버. 지금 ADChips(www.adc.co.kr) 홈페이지에 올라와있는 커널 소스가 업데이트 되어있는지는 모르겠지만, 혹시 모르니 eagle_uart123.c 파일 상단부 적당한 위치에 아래 코드를 추가한다. #define BASE_BAUD (BUS_CLOCK / 16) 이 한줄로 위 에러를 해결할 수 있다. |
|
ADChips EAGLE 에서 사용할 uClinux 빌드 중 나온 오류 메세지이다. arch/ae32000cnommu/kernel/kernel.o(.text+0x154): In function `doublefault_interrupt': : undefined reference to `printascii' arch/ae32000cnommu/kernel/kernel.o(.text+0x178): In function `buserror_interrupt': : undefined reference to `printascii' arch/ae32000cnommu/kernel/kernel.o(.text+0x3c70): In function `do_breakpoint_instr': : undefined reference to `printascii' drivers/usb/usbdrv.o(.text+0xc93e): In function `.L1103': : undefined reference to `printascii' printascii 라는게 뭔가 찾아보니 Kernel Debug Message 를 출력하기 위한 함수란다. (printch, printascii 두가지가 존재한다.) 즉... menuconfig 에서 보았을 때 커널 해킹(Kernel Hacking) 메뉴에 커널 디버깅(Kernel Degugging) 에서 커널 로우레벨 디버깅 함수(Kernel low-level debugging functions) 를 빌드 패키지에 포함시키면 해결 된다. 필요하다면 커널 로우레벨 디버깅 함수(Kernel low-level debugging functions) 체크 시 추가로 나오는 커널 로우레벨 디버깅 메세지를 UART0 에 함께 출력(Kernel low-level debugging messages via UART0) 도 추가하면 UART0 를 통해 디버깅 메세지를 받아볼 수 있다. 제길... 잉베디드 리눅스 쪽 프로젝트 하면서 삽질을 하루도 쉴 날이 없는 것 같다. |
일단 LIBUSB 만든분 천재 라고 찬양한번 하고 가자! LIBUSB 는 정말 잘 만들어진 라이브러리임이 틀림없다. 또 윈도우, Mac OS, Linux, Embedded Linux 등 이식성도 좋다는 것. 물론 전용 USB 장치 드라이버를 사용할 때 보다는 USB의 다양한 전송모드를 사용하는데는 제약이 따르지만 Bulk 전송에는 전혀 문제가 없다. (Control, Interrupt 도 지원은 한다.) 필자는 LIBUSB 로 SmartCard Reader 제어 라이브러리를 개발하면서 사용자들이 만들어낼 수 있는 여러가지 액션에 대해서 생각하면서 제어 라이브러리를 만들다 보니 오류처리에 대해 대단히 궁금했다. 소프트웨어 사용 중 사용자가 USB Device 를 포트에서 강제 제거했다고 가정해보자. LIBUSB 는 함수 호출 시 리턴 값으로 오류를 알려주게 된다. usb_bulk_read() 함수를 호출 했을 때, 수신된 데이터 바이트 수를 0 이상의 값으로 리턴하도록 되어있다. 오류 발생시에는 0 미만의 오류코드를 리턴하게 되어있고, 이 오류코드는 errno.h 라는 헤더에 모두 정의되어있다. 물론 errno.h 헤더는 컴파일러에 기본 포함되어있는 오류코드가 Define 되어있다. 또 오류 메세지에 대한 문자열 값을 usb_strerror() 함수로 얻을 수도 있다. errno.h 헤더에 보면 에러코드 19(ENODEV) 가 장치를 찾을 수 없다는 오류코드인데 LIBUSB 는 -19 를 리턴한다. 또 흔히 나타나는 코드로 110(ETIMEDOUT) 코드 또한 errno.h 에 있다. LIBUSB 라이브러리... 정말 쓰기 쉽고, 강력하며, 플랫폼에 관계없이 이식성 좋은 라이브러리는 정말 오랜만에 만나보는 것 같다. |
| 일단.... 아!!!!!!!!!!!!!!!!!!!!!! 이 씨.... 어ㅣㅓㄴㅁㅇ리ㅏㅓㅁㄷ재ㅑ롬ㄴㅇ;ㅣ라ㅓㅁㄴ이라ㅓㅣㅏㅇ너ㅣㅓ 지금 임베디드 리눅스 개발환경에 포팅하면서 개발하기가 귀찮아서 리눅스 상에서 테스트 후 최종만 리눅스에서 돌리고 있다. (물론 전 부분이 아닌 LIBUSB 파트만이다.) 이게... 우분투 만의 문제 같은데... 보안이 강력한 덕분에 개발할 때 짜증을 유발한다. 지금 개발중인 제품에 LIBUSB 처리 부를 3 번 째 갈아 엎으면서 퍼미션 문제에 3 번 당해 몇시간 삽질을 해버렸다. 위에처럼 욕이 나올 수 밖에... 이 짜증나는 상황에 대한 해결 방법은 간단하다. 테스트용 실행파일을 sudo 로 실행하는 방법과 매법 이렇게 하기 짜증나니 아예 USB 포트에 대한 Root 실행권한을 적나라하게 해제해버리는 것이다. 일단 해체 방법은 /usr/share/doc/libusb-0.?-?/README.Debian (? 는 자신이 사용하는 LIBUSB 버전이다.) 에 영어로 친절하게 소게되어있다. 제길슨... 진작에 알았으면..... |
| 오늘 설치하다가 그래픽 메모리 64 MB 이하인 PC 에서 텍스트 모드로 진입하는 것을 발견하였다. 잠깐 삽질을 하긴 했는데.. (뭐... 삽질은 내 생활이니까..) BIOS 에서 AGP 공유 메모리를 128 로 늘려주면 제대로 된다. 뭐... 이게 모든 텍스트 모드로 진입하는 문제에 대한 해결 방법은 아니고, 일부 문제에 대한 해결 방법이므로 이걸로 해결 안되면 구글링 하시길~ |



