안녕하세요.. 전에 안드로이드 세미나때 인사드린 비트 컴퓨터 임베디드 반에있는 장성민입니다.
저번에 모임 끝나고 저도 인사를 드렸어야 했는데, 머뭇거리다가 시간을 놓쳐서 인사를 못했습니다.
그동안 인사도 없다가 갑자기 질문을 드려 죄송합니다. 너그럽게 이해해주시길 부탁드립니다.
저는 아직 비트 컴퓨터에서 프로젝트를 진행하고 있는데, udev로 인해 고생을 하고 있습니다.
혹시 udev에 대해 아시는 분이 있으면 많은 조언을 부탁드립니다.
저는 사용자 역역 드라이버인 libusb-1.0 를 이용하여 X86 PC에서 만들어 놓은 프로그램을 받아서 XPA320 ARM CPU를 사용한
하이버스의 X-Hyper-320- 보드에 올리려하고 있습니다.
한 달 정도 고생을 했지만 특별한 성과도 없이 삽질만 계속하느라 마음만 타들어 가고있습니다. 지금 까지 조사한 결과를 보면
우선 커널에서 hotplug과 sysfs를 지원해야 하는 데 ( hotplugs는 usb 커넥터 연결을 커널에 알리고, sysfs를 /sys에 마운트 하여
드라이버 정보를 생성한다고 함.), 제가 가지고 있는 arm 커널( 2.6.14) 에는 아래의 관련 설정을 모두 적용했습니다
========================
Kernel Configuration
Hotplugging support
# General stup
CONFIG_HOTPLUG=y
Networking support, for netlink socket
# Networking, networking options
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_NETLINK_QUEUE=y
Pseudofilesystems, to manage /dev
#Pseudofilesystems
CONFIG_PROC_FS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_RAMFS=y
--=============
하지만 이 것 외에도 사용자 영역 드라이버를 실행하기 위해서는 udev와 libusb 관련 자료가 있어야 된다고 하더군요.
libusb는 소스를 받아서 arm-linux-gcc로 컴파일하여 file sysytem의 /usr/lib/에 올렸고, udev (udev-100)도 arm-linx-gcc로 컴파일하여
file system에 올렸습니다.
그 다음에는 보드 올려서 다음의 명령을 실행하라고 하는데,
Starting udev
$ mount -t tmpfs udev /dev ( tmpfs 는 파일 시스템타입, /dev를 udev로 mount 시키는 내용이고 )
$ cp -a -f /lib/udev/devices/* /dev ( static device files 파일 모두 copy하라고 합니다.)
$ ls -la /lib/udev/devices ( 내부의 파일을 보면 아래의 파일들이 보인다고 하는데, )
==============
crw------- 1 root root 5, 1 2007-01-31 04:18 console
lrwxrwxrwx 1 root root 11 2007-01-31 04:18 core -> /proc/kcore
lrwxrwxrwx 1 root root 13 2007-01-31 04:18 fd -> /proc/self/fd
crw-r----- 1 root kmem 1, 2 2007-01-31 04:18 kmem
brw------- 1 root root 7, 0 2007-01-31 04:18 loop0
lrwxrwxrwx 1 root root 13 2007-01-31 04:18 MAKEDEV -> /sbin/MAKEDEV
drwxr-xr-x 2 root root 4096 2007-01-31 04:18 net
crw------- 1 root root 1, 3 2007-01-31 04:18 null
crw------- 1 root root 108, 0 2007-01-31 04:18 ppp
drwxr-xr-x 2 root root 4096 2007-01-31 04:18 pts
drwxr-xr-x 2 root root 4096 2007-01-31 04:18 shm
lrwxrwxrwx 1 root root 24 2007-01-31 14:39 sndstat -> /proc/asound/oss/sndstat
lrwxrwxrwx 1 root root 15 2007-01-31 14:39 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 2007-01-31 04:18 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 2007-01-31 04:18 stdout -> /proc/self/fd/1
=========
저는 file system에 /lib/udev 디렉토리가 없습니다.
위의 내용을 실행하면 대략 아래와 같은 결과가 나온다고 하는데..
/sbin/udevd ( 의 udev daemon 이 실행 실행되고 )
/etc/udev/rules.d/ ( 에서 .rules 파일의 내용을 읽어서 메모리에 올린다고 합니다. )
usb 디바이스가 연결되면 hotplug 가 실행되고 /etc/udev/rules.d 내의 파일의 내용을 참조하여
/dev 밑에 usb 디렉토리와 device 파일이 생성된다고 합니다.
한지만 저는 udevd 데몬이 올라가지 않는 것 같습니다. 그리고 mount -t tmpfs udev /dev 를 만들고 staic device file 을 populate 할고 하는데(cp -a -f /lib/udev/devices/* /dev ) , 정확히 어떤 뜻인지 모르겠고요..
그리고 udev 를 시험하기 위한 명령들이 udevmonitor 등 여러가지 있다고 하느데, 혹시 시험하는 방법을 아시면 좀 알려주시길 부탁드립니다.
댓글 4
-
김남형
2011.01.11 16:19
-
장성민
2011.01.12 17:10
김남형 강사님... 답변주셔서 감사합니다.
지금 설치된 udev 는 udev-100 인데, udevadm 명령이 없습니다. 버전이 오래되어 명령이 다른 것 같습니다.
그래서 최근 udev-164를 설치하려고 해보니 make 파일이 없어서 컴파일을 할 수 가 없네요..
몇가지 config 파일과 스크립트 파일 그리고 Makefile.am Makefile.in 파일등이 있는데, make 파일을 만드는 법을 잘 모르겠습니다.
혹시 방법을 좀 알수 있을 까요?
-
김남형
2011.01.12 21:58
보통 소스와 함께 들어있는 INSTALL 혹은 README 문서에 빌드 방법이 나와있을 것입니다.
autotools를 지원하는 프로그램의 경우 일반적으로 다음과 같은 방식으로 빌드하는 것이 보통입니다.
$ ./configure # 아마 --target=arm-linux 등의 옵션이 추가되어야 할 것입니다..
$ make
$ sudo make install
-
장성민
2011.01.14 10:07
감사합니다. 말씀대로 INSTALL 파일을 참조해서 설치해보고 있습니다. 내부의 설명자료를 보니 좀 정리가 되는 것 같아서 README 파일이나 DOC 파일도 보고 있는데, 아직 커널 버전과의 관계등에 관해서는 이해가 되질 않습니다. ㅜㅜ
.
udev는 장치 파일을 user space에서 동적으로 만들어내기 위한 기능입니다.
커널이 장치를 인식하면 uevent를 통해 udev에게 정보를 보내주고
udev 대몬이 이 정보와 /etc/udev/rules.d 아래의 파일들을 참조하여 적절한 장치 파일을 생성하게 됩니다.
이렇게 생성되는 장치 파일들을 /dev 디렉터리에 존재하게 되므로 메모리 파일 시스템인 tmpfs를 /dev에 마운트하는 것입니다.
하지만 아마도 uevent를 지원하지 않거나 오래된 장치의 경우에는
커널 정보 없이도 이러한 장치 파일을 수동으로 만들어야 하는 듯 합니다. (확실친 않습니다만.. ;;)
/lib/udev/devices에 이러한 장치 파일들을 보관하고 있었던 것이라 생각되니
만약 해당 디렉터리가 존재하지 않는다면 직접 만드신 후에 mknod를 이용해서 각 장치 파일들도 만들어 두시면 될 것 같습니다.
udevd가 설치되었다면 다음과 같이 udevadm을 통해 정보를 살펴볼 수 있을 것입니다.
$ udevadm monitor --property