Download presentation
Presentation is loading. Please wait.
1
디바이스 드라이버
2
목차 디바이스 드라이버 구조 디바이스 드라이버 함수 소개 디바이스 드라이버 실습
3
입출력 장치(I/O 디바이스) CPU와 정보를 교환하는 장치 Digital 신호 또는 non-digital 신호를 포함 한다.
제어장치 CPU 인터페이스 버스(BUS) I/O 장치 인터페이스 신호들 어드레스, 데이터 및 제어 신호들 시리얼, 네트워크 등
4
버스 (BUS) 버스란 ? CPU(들), 램 그리고 개인용 컴퓨터에 연결할 수 있는 여러 입출력 장치 사이에 정보가 흘러갈 수 있는 경로 버스의 구성 주소버스 (address bus) 주소를 병렬로 전송하는 라인 모임 메모리 장치 또는 입출력 장치의 위치 정보를 나타낸다 제어버스 (control bus) 연결된 회로에 제어 정보를 전송하는 라인 모임 읽거나 쓰기를 제어하는 용도로 사용된다. 데이터 버스(data bus) 데이터를 병렬로 전송하는 라인 모임
5
I/O 장치의 어드레스 할당 각각의 I/O 장치를 제어하기 위해서는 번지 할당이 필요 표준 I/O-mapped I/O
인텔의 x86 CPU 계열이 대표적 메모리 맵(Memory mapped) I/O 메모리 번지의 일부를 활용하여 사용 대부분의 임베디드 프로세서
6
Memory Mapped I/O 와 I/O-mapped I/O
구분 Memory mapped I/O I/O-mapped I/O 대표적인 CPU ARM, PowerPC, M68K x86 계열 I/O 장치의 영역 메모리의 일부를 I/O 장치로 사용 메모리 영역과는 별도의 I/O 번지 영역이 존재 명령어 메모리와 I/O 장치 모두 메모리 동작 명령으로 엑세스 하며, 각 영역의 구분은 어드레스로 한다. 메모리 엑세스 명령과 I/O 엑세스 명령(in/out)이 구분 하드웨어 어드레스를 해석하는 디코더 회로에 따라 메모리 혹은 I/O 장치가 선택 메모리 번지와 I/O 번지를 구분하는 신호가 존재.
7
디바이스 제어 프로그램 입출력 장치 또는 I/O 디바이스 디바이스 제어 프로그램
네트워크 어댑터, LCD 디스플레이,Audio, 터미널, 키보드, 하드디스크, 플로피디스크, 프린터 등과 같은 주변 장치들을 말함 디바이스 제어 프로그램 디바이스의 구동에 필요한 프로그램 초기화, 입력 및 출력 제어 프로그램으로 구성 디바이스를 사용하기 위해서는 필수적으로 요구됨
8
I/O 자원 관리 Polling 방식 인터럽트
한 프로그램이나 장치에서 다른 프로그램이나 장치들이 어떤 상태에 있는지를 지속적으로 검사하는 전송 제어 방식 I/O 장치의 접속 여부 및 데이터 전송의 요청과 종료를 검사한다. 인터럽트 프로세서는 일련의 처리를 수행하고, 주변장치에서 입출력 처리 동작이 필요한 경우 프로세서에게 진행 중 이던 명령을 멈추고 새로운 동작을 할 수 있도록 한다. 인터럽트를 이용하면 멀티태스킹을 지원할 수 있도록 해서, 사용자는 모든 작업이 동시에 수행되는 것처럼 보이게 동작한다.
9
디바이스 드라이버 하드웨어를 제어하는 프로그램과 애플리케이션에서 디바이스를 제어하기 위한 자료 구조
입출력 장치 제어 프로그램의 주요 기능 하드웨어 초기화 데이터 전송 데이터 수신 응용프로그램이 H/W를 제어할 수 있도록 인터페이스 제공
10
디바이스 드라이버 구조 Application System Call Interface VFS Device Interface
Network Subsystem Buffer Cache Network D/D Block D/D Char Device Driver Device Interface Hardware Application area Kernel area
11
디바이스 파일 리눅스의 디바이스 드라이버 디바이스 파일 또는 디바이스 노드(node)
RTOS와 달리 가상 파일시스템(VFS)에 의해 일반 파일시스템과 공통적인 인터페이스 제공 디바이스 관리를 파일을 관리하는 방법과 동일한 방법으로 관리 응용 프로그램에서는 일반 파일을 처리하는 경우와 동일하한 시스템 콜을 호출하여 디바이스 제어 디바이스 파일 또는 디바이스 노드(node) 루트 파일시스템의 dev 폴더(/dev)에 있다. 디바이스를 표준 파일시스템으로 관리할 수 있는 인터페이스 제공 디바이스 정보 디바이스 이름 문자 디바이스 또는 블록 디바이스 구분 정보 드라이버를 선택하기 위한 주번호와 부번호 접근 권한 정보
12
디바이스 파일 정보
13
디바이스 노드 생성 사용자가 직접 mknod 명령 사용 디바이스 파일시스템에 의한 자동 생성
사용예 : mknod /dev/test c 디바이스 파일시스템에 의한 자동 생성
14
디바이스의 자원 활용 입출력 장치 제어 프로그램 입출력 장치의 자원을 사용하기 위한 주소 공간
입력된 데이터를 어드레스, 데이터 버스 및 제어 신호를 이용하여 읽어서 메모리에 저장하거나 처리 데이터를 보내고자 하는 경우에는 메모리에 이미 만들어진 데이터 또는 새로 생성된 데이터를 입출력 장치에 기록 입출력 장치의 자원을 사용하기 위한 주소 공간 메모리 맵 방식(Memory mapped peripheral) 사용 별도로 입출력 주소를 할당하지 않고, 프로세서가 사용하는 전체 메모리의 일부를 입출력 장치 공간으로 할당하여 사용
15
Character Device 드라이버 디바이스 node
Character 디바이스는 파일시스템의 “/dev” 디렉토리에 있는 디바이스 이름 또는 “node”를 가지고 억세스 된다. Character 디바이스 파일은 첫번째 칼럼이 “c”로 표시된다. Character device driver 구현을 위한 file operations Initialize Character 디바이스 등록 open 하드웨어 초기화 close/release 다바이스를 사용되지 않도록 한다. read 와 write 커널 영역과 사용자(user) 영역 간의 character 단위 데이타를 교환 하기 위한 file operation 함수 ioctl User 영역에서 커널 영역으로 미리 정의된 command를 가지고 제어 할 수 있도록 하는 file operation 함수
16
Character 디바이스 드라이버 등록 Character 디바이스 드라이버 등록
커널의 초기화 시기에 character device driver를 file operation과 함께 등록 하여야 사용이 가능하다. Character 디바이스 드라이버 등록 해제 int register_chrdev( unsigned int major, const char * name, struct file_operations *fops) int unregister_chrdev(unsigned int major, const char * name)
17
문자 디바이스 드라이버 골격 내용 소스 구성 설명 헤더 정보 선언 #include <linux/init.h>
#include <linux/kernel.h> #include <linux/module.h> 디바이스 드라이버 동작에 필요한 헤더 정보를 선언한다. 함수 선언 및 구현 static ssize_t device_read( … ) { ……… } static ssize_t device_write( … ) { ……… } static int device_ioctl( … ) { ……… } ……… static int device_open( … ) { ……… } static int device_release( … ) { ……… } 파일 동작에 의해서 문자 디바이스를 제어하는데 필요한 함수를 구현한다. 함수의 이름은 일반적으로 개발하는 디바이스의 이름과 파일 동작 이름을 사용하여 만든다. 파일 동작 구조체 선언 static struct file_operations device_fops = { … read : device_read, write : device_write, ioctl : device_ioctl, open : device_open, release : device_release } 디바이스를 제어하기 위해 구현된 파일 동작 함수를 파일동작 구조체에 선언한다. 이 구조체는 디바이스를 등록할 때 사용된다. 등록 및 해제 함수 void __init device_init (void) { … register_chrdev( … ) … } void _exit device_exit(void) {… unregister_chrdev( … ) … } 문자 디바이스 드라이버 등록 및 해제 함수 모듈 동작 지정 module_init(device_init) module_exit(device_exit) 모듈을 적재 또는 제거할 때 사용되는 함수를 지정한다
18
문자 디바이스 드라이버 함수 구현 함수 이름 파일 동작 주요 기능 [디바이스 이름]_init
함수 register_chrdev( ) 함수를 사용하여 문자 디바이스 드라이버를 등록한다. [디바이스 이름]_exit 함수 unregister_chrdev( ) 함수를 사용하여 문자 디바이스 드라이버 사용을 해제한다. [디바이스 이름]_open open 디바이스를 사용할 수 있도록 하드웨어를 초기화 하고 필요에 따라 인터럽트를 등록 하여 디바이스가 동작 할 수 있도록 한다. [디바이스 이름]_release release 더 이상 디바이스가 동작 하지 않도록 하드웨어를 중지 시키고 인터럽트의 사용을 해제한다. [디바이스 이름]_read read 사용자(user)의 읽기 요청에 따라 커널 영역의 데이터를 문자 단위로 전달한다([그림 5-19] 참조). 전달되는 데이터는 대부분 입출력 장치에서 입력된 데이터이다. [디바이스 이름]_write write 사용자(user)의 쓰기 요청에 따라 사용자 영역의 데이터를 문자 단위로 가져온다. 사용자 영역의 데이터는 대부분 입출력 장치에 기록된다. [디바이스 이름]_ioctl ioctl 사용자(user) 영역에서 문자 디바이스를 미리 정해진 명령에따라 다양한 방식으로 제어 할 수 있는 기능을 제공한다.
19
어플리케이션과 디바이스 드라이버 데이터 교환
20
디바이스 드라이버 open 어플리케이션에서 디바이스 파일 이름과 함께 open( ) 함수가 호출되면 디바이스 파일 정보에 따라서 아이노드(inode) 와 filp 변수 정보로 분배되어 파일 동작 구조체에 따라 디바이스 드라이버의 device_open() 함수를 호출
21
디바이스 드라이버 close 디바이스를 종료하기 위해서는 close( ) 함수 사용
애플리케이션에서 close가 호출되면 디바이스 드라이버의 device_release( ) 함수 실행
22
디바이스 제어를 위한 IOCTL IOCTL 시스템 콜 디바이스 드라이버 제어에 있어서 다양한 용도로 사용
디바이스 제어 뿐만 아니라 데이터 입출력도 구현 가능
23
디바이스 드라이버에서 데이터 읽기 애플리케이션에서 read( ) 호출
디바이스 드라이버 에서 상용자 영역의 버퍼에 요구하는 크기 만큼 복사 copy_to_user( )라는 함수가 사용 읽기 동작 실행된 후에는 크기 정보를 리턴
24
디바이스 드라이버에 데이터 쓰기 어플리케이션에서 write( ) 호출
사용자 영역에 준비되어 있는 버퍼에 있는 데이터를 디바이스 드라이버내의 버퍼에 요청한 크기만큼 기록 copy_from_user( ) 함수 사용 기록 후에는 기록한 개수를 리턴
25
문자 디바이스 애플리케이션 예 int main(int argc, char *argv[]) { int fd, ret, len;
char buf[8]; unsigned long args; /* 디바이스 장치 파일을 이용하여 오픈, 이때 접근 권한도 설정 */ fd = open ("/dev/device", O_RDWR); if (fd == -1) { /* 에러 처리 */ …… } /* IOCTL을 사용한 문자 장치 제어, 명령(CMD)와 인자를 사용 */ ret = ioctl(fd, CMD,&args); if (ret<0) { /* 커널 영역의 데이터를 읽는다(read) */ len = read(fd, buf, 8); …….. len = write(fd, buf, 8); /* 문자 디바이스 사용 종료 */ ret = close(fd); return ret;
26
Linux Device Driver 특성 커널 코드 커널 인터페이스 커널 메커니즘과 서비스 Loadable
디바이스 드라이버는 커널의 한 부분이므로, 커널의 다른 코드와 마찬가지로 잘못되면 시스템에 치명적인 피해를 줄 수 있다 커널 인터페이스 디바이스 드라이버는 리눅스 커널이나 자신이 속한 서브시스템에 표준 인터페이스를 제공해야 한다. 커널 메커니즘과 서비스 디바이스 드라이버는 메모리 할당, 인터럽트 전달, wait queue같은 표준 커널 서비스를 사용할 수 있다. Loadable 대부분의 리눅스 디바이스 드라이버는 커널 모듈로서, 필요할 때 로드하고 더 이상 필요하지 않을 때 언로드 할 수 있다. 설정가능(Configurable) 리눅스 디바이스 드라이버를 커널에 포함하여 컴파일 할 수 있다. 어떤 장치를 넣을 것인지는 커널을 compile 할 때 설정할 수 있다
27
커널 모듈(Kernel Module) 시스템 부팅 후에 동적으로 loading 할 수 있는 커널 구성요소
커널을 다시 컴파일 하거나 시스템 리부팅 할 필요 없이 커널의 일부분을 교체하는 것이 가능 디바이스 드라이버, 파일 시스템, 네트워크 프로토콜 등이 모듈로 제공됨 컴파일 한 커널 버전 정보가 들어가야 하고, 현재 실행되고 있는 커널 버전과 일치해야 함 <linux/module.h>에 정의되어 있음 모듈 정보는 전체 모듈에서 하나만 존재해야 함 일반 응용 프로그램과의 차이점 main() 함수가 없음 커널에 로딩 및 제거 될 때 불러지는 함수가 존재 Loading 시 - int init_module(void) 함수 호출 Unloading 시 - void cleanup_module() 함수 호출
28
커널 모듈의 컴파일 (1) arm-linux-gcc 이용한 컴파일
arm-linux-gcc -c -D__KERNEL__ -DMODULE -O2 test.c -c : an object file will be linked into the kernel during runtime using insmod. -O2 : the kernel makes extensive use of inline functions. -Wall : All warning flag -D__KERNEL__ : the code will be run in kernel mode, not as a user process. -DMODULE : this symbol tells the header files to give the appropriate definitions for a kernel module.
29
커널 모듈의 컴파일 (2) Makefile을 작성하여 make 하는 방법
CC = arm-linux-gcc INCLUDE = /root/linux/include CFLAGS = -D__KERNEL__ -DMODULE –I$(INCLUDE) -mapcs-32 -march=armv4 -mtune=arm9tdmi all: test.o test.o: test.c $(CC) $(CFLAGS) -c -o test.o test.c clean: rm –rf *.o
30
모듈 적재 및 제거
31
모듈 적재(loading), 제거(unloading) 명령
생성된 모듈(test.o)을 로딩 insmod 드라이버명.o 예) insmod test.o 커널에 적재된 모듈 목록 보기 lsmod 모듈 제거 rmmod 드라이버명 예) rmmod test (주의 .o가 붙지 않음)
32
커널 모듈의 작성 예 (1) 예제 프로그램 커널에 모듈이 로딩될 때 “Hello module”를 출력
모듈이 제거될 때 “Goodbye module”를 출력 Source file : test.c /* test.c */ #include <init.h> #include <linux/module.h> /* 모든 모듈에 필요 */ #include <linux/kernel.h> /* printk() 등에 필요 */ int init_module(void) { // 모듈이 로딩될 때 호출 printk (“Hello module\n”); return 0; // 0: success , 기타 - fail } void cleanup_module(void) { // 제거 될 때 호출 printk (“KERN_ALERT “Goodbye module”);
33
커널 모듈의 작성 예 (2) 매크로 module_init(), module_exit() 사용
__init 지시어와 __exit 지시어 반드시 사용 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int __init init_device(void) { printk(“Hello module\n”); return 0; } static void __exit cleanup_device(void) printk(“Goodbye module\n”); module_init(init_device); module_exit(cleanup_device)
34
커널 모듈의 작성 예 (3) Makefile 이용 컴파일 insmod 이용 커널 적재 rmmod 이용 커널 제거
35
디바이스 드라이버 실행 (1) 7 세그먼트에 숫자 쓰기
36
디바이스 드라이버 실행 (2) LCD에 문자열 쓰기
37
확인 과정 (1) Linux version 확인 디바이스 드라이버를 모듈로 적재하기 위한 확인과정
cat /proc/version 디바이스 드라이버를 모듈로 적재하기 위한 확인과정 커널 소스 디렉토리로 이동 cd /usr/src/kernels/ _FC4-i686 make menuconfig Loadable module support 항목 이동 Enable loadable module support 항목이 * 표시 확인
38
확인 과정 (2)
39
디바이스 드라이버 실습 – example 1 (1)
/root 에 device_driver/example1 디렉토리 생성 mkdir /root/device_driver/example1 test.c , Makefile 을 복사 윈도우 상에서 Share_dir 에 파일 다운로드 Vmware 상에서 복사 cd /mnt/hgfs/Shared_dir cp ./test.c ./Makefile /root/device_driver/example1 cd /root/device_driver/example1 ls 파일 복사 확인
40
디바이스 드라이버 실습 – example 1 (2)
▪ test.c ▪ Makefile #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int hello_init(void) { printk("Hello, world \n"); return 0; } static void hello_exit(void) printk("Goodbye, world\n"); module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("Dual BSD/GPL"); obj-m := test.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: rm -rf *.ko rm -rf *.mod.* rm -rf .*.cmd rm -rf *.o
41
디바이스 드라이버 실습 – example 1 (3)
실행 방법 cd /root/device_driver/example1 make ls test.ko 파일 생성 확인 kernel 2-6 버전 모듈 파일 insmod ./test.ko insmod : 모듈을 커널에 적재하는 명령 dmesg 커널 메시지 출력 명령어를 이용하여 실행 확인
42
디바이스 드라이버 실습 – example 1 (4)
실행 방법 lsmod | grep test lsmod : 커널에 적재된 모듈 목록 보기 명령 grep test : 입력 메시지 중 test를 포함한 메시지 출력 rmmod test rmmod : 모듈을 커널에서 제거하는 명령 dmesg 커널 메시지 출력 명령어를 이용하여 실행 확인
43
디바이스 드라이버 실습 – example 2 (1)
/root 에 device_driver/example2 디렉토리 생성 mkdir /root/device_driver/example2 app, dev 디렉토리를 복사 윈도우 상에서 Share_dir 에 파일 다운로드 Vmware 상에서 복사 cd /mnt/hgfs/Shared_dir cp -r ./app ./dev /root/device_driver/example2 cd /root/device_driver/example2 ls 디렉토리 복사 확인
44
디바이스 드라이버 실습 – example 2 (2)
▪ ./dev/call_dev.c struct file_operations call_fops = { .owner = THIS_MODULE, .read = call_read, .write = call_write, .open = call_open, .release = call_release, }; int call_init(void) { int result; printk( "call call_init \n" ); result = register_chrdev( CALL_DEV_MAJOR, CALL_DEV_NAME, &call_fops); if (result < 0) return result; return 0; } void call_exit(void) { printk( "call call_exit \n" ); unregister_chrdev( CALL_DEV_MAJOR, CALL_DEV_NAME ); module_init(call_init); module_exit(call_exit); MODULE_LICENSE("Dual BSD/GPL"); #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/fcntl.h> #define CALL_DEV_NAME "calldev" #define CALL_DEV_MAJOR int call_open (struct inode *inode, struct file *filp) { int num = MINOR(inode->i_rdev); printk( "call open -> minor : %d\n", num ); return 0; } ssize_t call_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) { printk( "call read -> buf : %08X, count : %08X \n", buf, count ); return 0x33; } ssize_t call_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos) { printk( "call write -> buf : %08X, count : %08X \n", buf, count ); return 0x43; }
45
디바이스 드라이버 실습 – example 2 (3)
./dev/Makefile obj-m := call_dev.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: rm -rf *.ko rm -rf *.mod.* rm -rf .*.cmd rm -rf *.o
46
디바이스 드라이버 실습 – example 2 (4)
▪ ./app/call_app.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #define DEVICE_FILENAME "/dev/calldev" int main() { int dev; char buff[128]; int ret; printf( "1) device file open\n"); dev = open( DEVICE_FILENAME, O_RDWR|O_NDELAY ); if( dev >= 0 ) { printf( "2) read function call\n"); ret = read(dev,0x30, 0x31 ); printf( "ret = %08X\n", ret ); printf( "3) write function call\n"); ret = write(dev,0x40,0x41 ); printf( "4) device file close\n"); ret = close(dev); } return 0;
47
디바이스 드라이버 실습 – example 2 (5)
디바이스 드라이버 모듈 생성 후 커널에 적재 mknod /dev/calldev c /dev 디렉토리에 calldev 파일 생성 확인 cd /root/device_driver/example2 cd ./dev make ls call_dev.ko 파일 생성 확인 insmod call_dev.ko dmesg
48
디바이스 드라이버 실습 – example 2 (6)
응용 프로그램을 컴파일 후, 실행 cd /root/device_driver/example2/app ls gcc –o call_app.exe call_app.c call_app.exe 파일 생성 확인 ./call_app.exe dmesg call_app.exe 실행 동안의 커널 메시지 확인 rmmod call_dev
49
SoC-Master 키트를 이용한 디바이스 드라이버 실행 (1)
7 세그먼트에 숫자 쓰기
50
SoC-Master 키트를 이용한 디바이스 드라이버 실행 (2)
LCD에 문자열 쓰기
51
심화 학습 디바이스 드라이버를 Target 보드에서 실행 7 세그먼트의 드라이버 및 응용 파일을 이해
Cross-Compile을 위한 Makefile 이해 Host-PC에서 드라이버 및 응용 파일을 Cross-Compile Linux Kernel 2.4 버전 소스 이용 Target의 Linux Kernel 버전은 2.4 Target 보드에 다운로드 후 실행
52
SoC-Master 키트의 파일 확인 (1) 응용 프로그램 유무 확인 커널에 적재된 디바이스 드라이버 확인
cd /root ls 7seg_appl, lcd_appl 파일 확인 커널에 적재된 디바이스 드라이버 확인 lsmod txt_lcd, 7_segment 적재 확인 디바이스 드라이버 모듈 확인 find / -name ‘*.o’ find : 파일이나 디렉토리를 찾을 때 사용하는 명령어 / : 찾을 위치 ( 최상위 디렉토리부터 찾음) -name : 이름으로 검색 ‘*.o’ : 확장자가 .o 인 파일 (커널버젼 2.4의 모듈 확장자)
53
SoC-Master 키트의 파일 확인 (2)
54
SoC-Master 키트를 이용한 디바이스 드라이버 실행 (1)
7 세그먼트에 숫자 쓰기
55
SoC-Master 키트를 이용한 디바이스 드라이버 실행 (2)
LCD에 문자열 쓰기
56
7-세그먼트 디바이스 드라이버를 만들기 (1) 커널버젼 2-4인 소스 파일을 작업 디렉토리로 복사
윈도우상에서 Linux_Kernel.tar.bz2를 Shared_dir 복사 mkdir /root/kernel_2_4 cd /root/kernel_2_4 cp /mnt/hgfs/Shared_dir/Linux_Kernel.tar.bz2 ./ ls (복사 확인) tar xvfj Linux_Kernel.tar.bz2 ls linux rmk7-xp100_RAM32M 폴더 생성 확인
57
7-세그먼트 디바이스 드라이버를 만들기 (2) 7Segment_Appl, 7Segment_Drv 디렉토리를 작업디렉토리로 이동
윈도우상에서 7Segment_Appl, 7Segment_Drv 디렉토리를 Shared_dir 복사 cd /root/device_driver mkdir 7Segment cd 7Segment cp -r /mnt/hgfs/Shared_dir/7Segment_Appl ./ cp -r /mnt/hgfs/Shared_dir/7Segment_Drv ./ ls
58
7-세그먼트 디바이스 드라이버를 만들기 (3) 7Segment_Appl 디렉토리의 파일 내용 확인
7seg_appl.h, 7seg_appl.c Makefile INCLUDEDIR := /root/kernel_2_4/linux rmk7-xp100_RAM32M/include CFLAGS := -I$(INCLUDEDIR) -Wall CROSS_COMPILE := arm-linux- CC=$(CROSS_COMPILE)gcc LD=$(CROSS_COMPILE)ld all: 7seg_appl 7seg_appl: $(CC) $(CFLAGS) 7seg_appl.c -o 7seg_appl clean: rm -f 7seg_appl
59
7-세그먼트 디바이스 드라이버를 만들기 (4) 7Segment_Drv 디렉토리의 파일 내용 확인 기존 작업 파일 삭제
7_segment.h, 7_segment.c Makefile 기존 작업 파일 삭제 cd /root/device_driver/7Segment/7Segment_Appl make clean 7seg_appl 실행 파일 삭제 확인 make 7seg_appl 실행 파일 생성 확인 cd ../7Segment_Drv make clean 7_segment.o 모듈 파일 삭제 확인 7_segment.o 모듈 파일 생성 확인
60
7-세그먼트 디바이스 드라이버를 만들기 (5) 생성된 응용 파일과 디바이스 드라이버 모듈을 Shared_dir 로 복사
cd / root/device_driver/7Segment/7Segment_Appl/ cp ./7seg_appl /mnt/hgfs/Shared_dir cd ../7Segment_Drv cp ./7_segment.o /mnt/hgfs/Shared_dir
61
7-세그먼트 디바이스 드라이버를 만들기 (6) 타겟보드에 응용프로그램과 디바이스 드라이버 모듈파일 전송
타겟보드의 리눅스상에서 실행 mkdir ./Test cd Test 응용프로그램인 7seg_appl 전송 디바이스 드라이버 모듈인 7_segment.o 전송 ls 전송된 파일 확인
62
7-세그먼트 디바이스 드라이버를 만들기 (7)
63
7-세그먼트 디바이스 드라이버를 만들기 (8) 임베디드 리눅스에 적재된 7_segment 디바이스 모듈 제거 후 적재
lsmod rmmod 7_segment 디바이스 모듈 제거 dmesg rm /dev/skull 디바이스 파일 제거 mknod /dev/skull c insmod ./7_segment.o 디바이스 모듈 삽입 chmod seg_appl ./7seg_appl
64
7-세그먼트 디바이스 드라이버를 만들기 (9)
65
Text LCD 디바이스 드라이버를 만들기 (1)
Text_LCD_Appl, Text_LCD_Drv 디렉토리를 작업디렉토리로 이동 윈도우상에서 Text_LCD_Appl, Text_LCD_Drv 디렉토리를 Shared_dir 복사 cd /root/device_driver mkdir text_lcd cd text_lcd cp -r /mnt/hgfs/Shared_dir/Text_LCD_Appl ./ cp -r /mnt/hgfs/Shared_dir/Text_LCD_Drv ./ ls
66
Text LCD 디바이스 드라이버를 만들기 (2)
Text_LCD_Appl 디렉토리의 파일 내용 확인 lcd_appl.h, lcd_appl.c Makefile Text_LCD_Drv 디렉토리의 파일 내용 확인 txt_lcd.h, txt_lcd.c
67
Text LCD 디바이스 드라이버를 만들기 (3)
기존 작업 파일 삭제 cd /root/device_driver/text_lcd/Text_LCD_Appl make clean lcd_appl 실행 파일 삭제 확인 make lcd_appl 실행 파일 생성 확인 cd ../Text_LCD_Drv make clean txt_lcd.o 모듈 파일 삭제 확인 txt_lcd.o 모듈 파일 생성 확인
68
Text LCD 디바이스 드라이버를 만들기 (4)
생성된 응용 파일과 디바이스 드라이버 모듈을 Shared_dir 로 복사 cd / root/device_driver/text_lcd/Text_LCD_Appl/ cp ./lcd_appl /mnt/hgfs/Shared_dir cd ../Text_LCD_Drv cp ./txt_lcd.o /mnt/hgfs/Shared_dir
69
Text LCD 디바이스 드라이버를 만들기 (5)
타겟보드에 응용프로그램과 디바이스 드라이버 모듈파일 전송 타겟보드의 리눅스상에서 실행 cd /root/Test 응용프로그램인 lcd_appl 전송 디바이스 드라이버 모듈인 txt_lcd.o 전송 ls 전송된 파일 확인
70
Text LCD 디바이스 드라이버를 만들기 (6)
lsmod rmmod txt_lcd 디바이스 모듈 제거 dmesg rm /dev/txt_lcd 디바이스 파일 제거 mknod /dev/txt_lcd c insmod ./txt_lcd.o 디바이스 모듈 삽입 chmod /lcd_appl ./lcd_appl
71
Text LCD 디바이스 드라이버를 만들기 (7)
Similar presentations