[ioctl 디바이스 드라이버 관련] 제대로 한거 같은데 실행이 안?
글쓴이: marubazz / 작성시간: 토, 2005/06/11 - 8:13오후
아래 파일 세개(p.s : Make 파일이 첨부가 안되네요?? --; 아래 부분에 소스 붙이겠습니다) 를 첨부하였으니 참고하여 가르쳐 주시면 정말 감사하겠습니다. (어플리케이션, 드라이버, make파일)
make (메이크 잘 된거 같음, 하기전에 make clean한번 해주고)
insmod hj_ioctl.o(lsmod 해 보면 모듈 올라갔음)
mknod /dev/hj_ioctl c 254 0(dev 폴더 내에 보면 만들어졌음)
gcc hj_app_ioctl.c
./a.out
근데 결과가
Cannot Open the hj_ioctl device file ->( 이건 파일 안열렸을시에 나오게 app에 만들어놓은 문구입니다)
라고 나오면서 ... 안되네요... 아... 디바이스 프로그래밍 너무 어려워요 T.T
왜 안되는지 아시는분 가르쳐 주시면 감사하겠습니다~
<Makefile>
CC = gcc
KERNELDIR = /usr/src/linux-2.4
CFLAGS = -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -g -Wall
PROJ = hj_ioctl
OBJ = $(PROJ).o
all : $(OBJ)
$(OBJ) : $(PROJ).c
$(CC) $(CFLAGS) -c $(PROJ).c
clean:
rm -f core $(OBJ)
File attachments:
첨부 | 파일 크기 |
---|---|
hj_ioctl.c | 2.41 KB |
hj_app_ioctl.c | 929바이트 |
Forums:
register_chrdev에서 major를 0로 주셨네요..majo
register_chrdev에서 major를 0로 주셨네요..
major를 0로주면 자동할당입니다.
254로 써서 해보세요.
아... hj_ioctl.c 파일의 36번째줄if((HJ_Majo
아... hj_ioctl.c 파일의 36번째줄
if((HJ_Major=register_chrdev(0,DEVICE_NAME,&HJ_fops))<0){
이걸
if((HJ_Major=register_chrdev(254,DEVICE_NAME,&HJ_fops))<0){
로 바꾸라는 말씀이신가요? 해보니까 insmod가 안되는데요??
device or resuorce busy 라고 나오면서 안되요..^^;
아.. 뭐가 문젤까요 --;
제 친구 컴에선 된다는데... 음...
mknod 하는 법이 틀렸나요?? 주번호를 0으로 하면 자동으로 비는거 할당되는거 아닌가요? 그렇게 해도 안되네요.. 음...
major 254를 사용하고있는 디바이스가 있는건 아닌가요?0으로 해
major 254를 사용하고있는 디바이스가 있는건 아닌가요?
0으로 해서 자동할당을 했다면 HJ_Major에 리턴받은 값이 할당받은 major입니다.
mknod /dev/hj_ioctl c 254 0
에서 254대신에 HJ_Major에서 리턴받은값으로 노드를 만들어서 해보세요.
저.. HJ_Major에서 리턴받은값을 어떻게 하면 알수 있어요??^^;
저.. HJ_Major에서 리턴받은값을 어떻게 하면 알수 있어요??^^;
그리고... 디바이스들이 부여받은 메이저 번호 정보 어떻게 보는지도 가르쳐 주시면 감사하겠습니다^^;
간단하게는 printk("HJ_Major : %d\n", HJ_Major
간단하게는 printk("HJ_Major : %d\n", HJ_Major); 해보시면 확인할수 있으실거구요 ^^;
중복되지 않는 다른값을 찾아서 사용하시는게 나으실것같습니다.
참고로 include/linux/major.h를 확인하시면 각 디바이스가 사용하는 major를 확인하실수 있구요
devfs를 사용하시면 이런고민 안하셔도 됩니다. :)
댓글 달기