[완료] char devices를 동적으로 찾아서 mknod 추가하는 방법?
글쓴이: bbyongi / 작성시간: 화, 2011/04/12 - 11:42오전
안드로이드 커널에 LED 드라이버를 포팅하였습니다.
작업한 내역을 먼저 말씀드려 보면
이 LED 커널 드라이버를 유저레벨에서 제어하기 위해
동적으로 char device를 생성하도록 하였습니다.
(alloc_chrdev_region, cdev_init, cdev_add 사용)
단말을 부팅시켜서 device를 확인해 보면
# cat /proc/devices (생략) 251 led-ctl
이라고 동적으로 251 번으로 할당된 led char device가 등록되어 있습니다.
그런데 현재 상황이 LED 드라이버를 제어하기 위해서
동적으로 생성된 led-ctl의 주번호를 눈으로 확인한 후에
mknod를 손수해줘야 합니다.
busybox mknod /dev/led-ctl c 251 0
위처럼 mknod를 한 후에야 LED 컨트롤 테스트 어플에서
open, ioctl, release를 통해 LED가 ON/OFF 동작되고 있습니다.
-----------------------------
제가 궁금한 부분은 현재 손수 mknod를 해야하느 상황을 생략하고 싶습니다.
그런데 커널쪽 개발경력이 없다보니 어떤 시퀀스로 해야할지가 막막하네요.
/proc/devices에 led-ctl char device가 동적으로 몇번에 설정되어 있는지 찾아서
자동으로 해당 주번호를 mknod 되게 하려면 커널쪽에다가 어떤 코드를 추가해줘야 하는지
조언 부탁드립니다.
Forums:
busybox 소스 중 docs/mdev.txt 먼저
busybox 소스 중 docs/mdev.txt 먼저 읽어보시고요.
간편하게 misc device API(misc_register()/misc_deregister()) 를 사용하도록 바꾸시거나,
drivers/char/misc.c 소스를 보고 class_create() 사용법을 익혀 사용하세요.
덧.
의미없는 일이지만, misc 장치의 minor 번호를 구태여 알아보고자 한다면,
cat /proc/misc
덧2.
Android 를 사용하신다면 busybox mdev 가 필요없습니다.
init 프로세스가 다른 방식으로 같은 일을 해 줍니다.
답변 감사합니다.
제가 하고싶은 최종 목적은 안드로이드 App에서 LED ON 버튼을 누르면
NDK - JNI를 거쳐서 커널쪽 LED driver의 ioctl로 LED ON 시켜주고,
LED OFF 버튼을 누르면 커널 LED driver를 OFF 시켜주는 처리를 하려고 합니다.
그 첫번째로 LED 드라이버를 포팅하고 mknod를 만든 후에 동작확인만 한 상태입니다.
한단계씩 진행하고는 있지만 워낙 내공이 없어 앞으로 가야할길이 참 막막한데
조언해 주신대로 안드로이드니 init 프로세스를 먼저 분석해 보겠습니다.
주번호를 직접 입력해서는 확인했는데...
init 프로세스 과정을 분석하다 보니 정적 디바이스를 초기화하는 부분이 있어
추가해보니 부팅하면서 자동으로 nod가 생성 되는것을 확인 했습니다.
그런데 의문인 점은 제가 한 방법은
주번호가 251이란걸 알고 있는 상태로 수동으로 fixed 입력한 방식인데...
만약 커널쪽에 동적 char device가 새롭게 추가되어 주번호가 밀리게 된다면
항상 매칭해서 고쳐줘야 하니 문제가 될거 같아 보입니다.
이렇게 무식하게 코딩할것 같지도 않구요.
그렇다면 led-ctl 이란 장치의 주번호가 251 이란걸 읽어내서
make_device를 해줘야 할것 같은데 이렇게 하려면
앞에서 설명해주신 misc API를 이용해서 해야하는건가요?
안드로이드 플랫폼쪽에서 uevent를 받아서 동적으로 생성하는 과정이 소스로 있어 보이는데
제가 커널에 LED Driver를 포팅하면서 동적으로 char device를 생성하는
alloc_chrdev_region, cdev_init, cdev_add 함수들로는
안드로이드 플랫폼(프로요)쪽으로 uevent가 발생되지 않는게 맞는건가요?
현제 해메고 있는 부분은 어떻게 uevent를 커널에서 플랫폼쪽으로
부팅하면서 발생시켜줄 수 있는지를 모르겠습니다.
misc API를 이용해 성공 했습니다.
알려주신 키워드를 중심으로 하루죙일 삽질하면서 찾아보니
misc_register()/misc_deregister()를 이용하면 주번호 생각할 필요없이
바로 /dev/led-ctl 이 생성되는것을 확인 했습니다.
제가 원하던 커널쪽 기능은 완료했으니 이제 JNI로 어떻게 wrapping 해야할지
고민해 보도록 하겠습니다.
모르는게 너무 많아서 막막했는데 중요한 키워드를 알려주셔서 정말 감사했습니다.
댓글 달기