작업 환경
-메인 OS : Windows 8.1K(Intel Core i5-4590)
-작업 OS : Ubuntu 14.04.5 LTS 64bit(VirtualBox)
-장 비 명 : Hybus-Smart4412
1. 초기설정
- mkdir device --> device 디렉토리에 mydrv.c 와 Makefile을 만든다.
mydrv.c
Makefile
CC := /usr/local/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-eabi-gcc
obj-m := mydrv.o
KDIR := ~/Smart4412/Development/Source/Kernel/kernel_4412
all:
make -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.mod *.ko *.cmd *.mod.c
2. 빌드
- make (device 디렉토리에서)
- mydrv.ko , mydrv.mod.c , mydrv.mod.o , mydrv.o 파일들이 만들어 진다.
3. Device Driver 등록
- Tera Term에서 포트 설정 후 설정 -> 시리얼 포트 -> 속도를 115200으로 설정
- Hybus-Smart4412 장비 부팅
- 메뉴 -> 전송 -> ZMODEM -> 보내기에서 mydrv.ko 선택
- insmod mydrv.ko (커널(모듈) 등록)
skeleton module init!!
major number=247 (나오면 등록 성공)
- mknod /dev/mydrv c 247 0 (디바이스 등록)
(/dev/mydrv(사용하려는 디바이스이름) , c(캐릭터 디바이스) , 248(주번호) , 0(부번호))
커널에 등록되어진 것을 디바이스드라이버에 등록
(*중요 : 만약 mydrv.c 수정 시 Tera term 에서 rmmod mydrv.ko , rm mydrv.ko를 해준 뒤 cd /dev로 이동후 rm mydrv를 해준다)
4. mydrv Driver 사용 및 테스트
mydrv_test.c
#include <stdio.h>
#include <fcntl.h>
#define MAX_BUFFER 26
char buf_in[MAX_BUFFER];
char buf_out[MAX_BUFFER];
int main(void)
{
int fd, i, c = 65;
if( (fd = open("/dev/mydrv", O_RDWR)) < 0 ){
perror("open error");
return -1;
}
for(i = 0; i<MAX_BUFFER; i++){
buf_out[i] = c++;
buf_in[i] = 65;
}
for(i = 0; i<MAX_BUFFER; i++){
fprintf(stderr, "%c", buf_in[i]);
}
fprintf(stderr, "\n");
write(fd, buf_out, MAX_BUFFER);
read(fd, buf_in, MAX_BUFFER);
for(i = 0; i<MAX_BUFFER; i++){
fprintf(stderr, "%c", buf_in[i]);
}
fprintf(stderr, "\n");
close(fd);
return 0;
}
- /opt/gnueabi/opt/ext-toolchain/bin/arm-linux-gnueabihf-gcc mydrv_test.c -o mydrv_test (해당 디렉토리에서 컴파일)
- Tera term으로 이동 (http://cccding.tistory.com/58 에서 1) 참조)
- 업로드 후 ./mydrv_test 실행
'Embedded > Device Driver' 카테고리의 다른 글
[Device Driver] 대소문자 변환 Device Driver 만들기 (0) | 2016.12.28 |
---|---|
[Device Driver] 커널에 Device Driver 등록 및 실행 (1) | 2016.12.26 |
[Device Driver] 커널에 Systemcall 등록 및 실행 (0) | 2016.12.26 |
[Device Driver] Kernel에 hello.c 등록 (0) | 2016.12.26 |