작업 환경
-메인 OS : Windows 8.1K(Intel Core i5-4590)
-작업 OS : Ubuntu 14.04.5 LTS 64bit(VirtualBox)
-장 비 명 : Hybus-Smart4412
1. 초기설정
- mkdir device --> device 디렉토리에 examdrv.c 와 Makefile을 만든다.
examdrv.c
Makefile
CC := /usr/local/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-eabi-gcc
obj-m := examdrv.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 디렉토리에서)
- examdrv.ko , examdrv.mod.c , examdrv.mod.o , examdrv.o 파일들이 만들어 진다.
3. Device Driver 등록
- Tera Term에서 포트 설정 후 설정 -> 시리얼 포트 -> 속도를 115200으로 설정
- Hybus-Smart4412 장비 부팅
- 메뉴 -> 전송 -> ZMODEM -> 보내기에서 examdrv.ko 선택
- insmod examdrv.ko (커널(모듈) 등록)
skeleton module init!!
major number=247 (나오면 등록 성공)
- mknod /dev/examdrv c 247 0 (디바이스 등록)
(/dev/examdrv(사용하려는 디바이스이름) , c(캐릭터 디바이스) , 248(주번호) , 0(부번호))
커널에 등록되어진 것을 디바이스드라이버에 등록
(*중요 : 만약 examdrv.c 수정 시 Tera term 에서 rmmod examdrv.ko , rm examdrv.ko를 해준 뒤 cd /dev로 이동후 rm examdrv를 해준다)
4. examdrv Driver 사용 및 테스트
examdrv_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/examdrv", O_RDWR)) < 0 ){
perror("open error");
return -1;
}
for(i = 0; i<MAX_BUFFER; i++){
buf_out[i] = c++;
buf_in[i] = 65;
}
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 examdrv_test.c -o examdrv_test (해당 디렉토리에서 컴파일)
- Tera term으로 이동 (http://cccding.tistory.com/58 에서 1) 참조)
- 업로드 후 ./examdrv_test 실행
'Embedded > Device Driver' 카테고리의 다른 글
[Device Driver] A~Z 출력 (0) | 2016.12.27 |
---|---|
[Device Driver] 커널에 Device Driver 등록 및 실행 (1) | 2016.12.26 |
[Device Driver] 커널에 Systemcall 등록 및 실행 (0) | 2016.12.26 |
[Device Driver] Kernel에 hello.c 등록 (0) | 2016.12.26 |