Download presentation
Presentation is loading. Please wait.
1
리눅스 디바이스 드라이버 (Linux Device Driver)
Lecture #11
2
목 차 (1) 리눅스 장치 개요 (2) 리눅스 장치 파일 (3) 리눅스 장치 드라이버 개요
목 차 (1) 리눅스 장치 개요 (2) 리눅스 장치 파일 (3) 리눅스 장치 드라이버 개요 (4) 리눅스 장치 드라이버 제작 및 테스트
3
리눅스 장치 (1) I/O 장치(I/O device) I/O 장치 파일(I/O device file) 장치 분류 장치 번호
키보드, 마우스, 터미널, 프린터, 디스크 등과 같은 입출력용의 하드웨 어 주변 장치 I/O 장치 파일(I/O device file) 리눅스에서는 I/O 장치를 ‘파일’로 추상화 각 장치를 추상화시킨 장치 파일에 파일 입출력 시스템 호출(예: open/read/close 등)을 사용하여 접근 장치 분류 character(문자)/block(블록)/network(네트워크) 장치 번호 사용자 및 응용 프로그램에서는 장치 파일명을 사용하여 장치를 식별 character/block device는 major/minor 장치 번호를 가짐 리눅스 내부에서는 major/minor 장치 번호를 이용하여 식별
4
리눅스 장치 (2) 문자 장치(Character Device) 파일시스템에서 하나의 노드 형태로 존재
자료의 순차성을 지닌 하드웨어 데이터를 문자 단위 또는 연속적 바이트 흐름으로 전달하고 읽음. 버퍼 캐시를 사용하지 않음. 터미널, 콘솔, 키보드, 사운드카드, 스캐너, 프린터, 직렬/병렬 포트, 마 우스, 조이스틱 등
5
리눅스 장치 (3) 블록 장치(Block Device) 파일시스템에서 하나의 노드 형태로 존재 데이터를 블록 단위로 입출력
효율을 향상하기 위하여 버퍼를 이용 버퍼 캐시를 통해 임의 접근이 가능함 블록의 크기를 관리하고 블록 데이터의 전달을 담당하는 기능이 있음 하드디스크, 플로피 디스크, 램디스크, 테이프, CD-ROM, DVD 등
6
리눅스 장치 (4) 네트워크 장치(Network Device) 패킷 단위로 접근
네트워크 통신을 통해 네트워크 패킷을 송수신할 수 있는 디바이스 파일시스템의 노트 형태가 아닌 특별한 인터페이스를 사용 이더넷, PPP, SLIP, ATM, 네트워크 인터페이스 카드
7
장치 파일(Device File) (1) 장치 파일(Device File) 리눅스 시스템에서는 장치를 파일로 추상화
응용 프로그램은 장치에 접근하기 위하여 열기, 읽기, 쓰기 등과 같은 파일 연산을 이용 사용자에게 보이는 장치 드라이버의 인터페이스 부분를 제공 장치 파일은 파일시스템의 데이터 영역을 차지하지 않고 단지 장치 드라이버를 접근할 수 있는 관문 역할을 수행 장치 파일은 파일시스템에서 고유한 번호와 이름을 할당받음 사용자 및 응용 프로그램에서는 파일 이름을 이용하여 식별 리눅스 시스템 내부에서는 장치 번호를 이용하여 식별 mknod 명령으로 장치 드라이버에 접근할 수 있는 장치 파일 생성 mknod [device file name] [type] [major] [minor] mknod /dev/test c
8
장치 파일(Device File) (2) 장치 번호(Device Number) 주 번호(Major number)
리눅스 커널이 장치와 연관된 장치 드라이버를 구분하는 데 사용 부 번호 (Minor number) 장치 드라이버가 같은 유형의 장치를 개별적으로 구분하는 데 이용 주번호 및 부번호는 파일의 정보를 담고 있는 inode의 i_rdev에 16bit 로 저장된다 상위 8bit는 major, 하위 8bit는 minor documentation/devices.txt
9
장치 파일 번호 디바이스 종류 주번호, 부번호 장치파일 이름
10
Device Driver (1) - 정의 물리적인 hardware 장치를 다루고 관리하는 커널 프로그램
user application이 driver에게 요청을 하면, driver는 hardware를 구동시켜서 목적을 달성 장치와 응용 프로그램 사이에 존재하여 하드웨어 제어 및 데이터 전 달 등의 기능을 담당 디바이스와 시스템 사이에 데이터를 주고받기 위한 인터페이스
11
Device Driver (2) - 정의 장치에 대한 표준적으로 동일한 서비스 제공
장치를 추상화한 장치 파일에 대한 입출력 시스템 호출(예: open/ read/write/close 등)을 제공 장치의 복잡하고 고유한 특성을 사용자에게 숨기고 장치 입출력 프로 그래밍을 일반 파일 입출력 프로그램과 유사하고 쉽게 할 수 있도록 지원함 커널의 일부분으로 내장 장치의 고유한 특성을 별도의 인터페이스(ioctl 시스템 호출)를 통해 지원 서브루틴과 데이터의 집합체로서 커널의 일부분으로 내장
12
Device Driver (3) - 종류 문자 장치 드라이버(Character Device Driver)
파일 시스템에서 노드 형태로 존재 파일처럼 취급하고 접근하여 직접 읽기/쓰기를 수행 대부분 순차적인 접근 가능, 임의의 크기로 데이터 전송 콘솔, 키보드, 시리얼 포트 드라이버 등 블록 장치 드라이버(Block Device Driver) 버퍼 캐쉬 이용 블록 단위의 데이터 이동 플로피 디스크, 하드 디스크, CDROM 드라이버 등 네트워크 장치 드라이버(Network Device Driver) 파일 형태가 아닌 특별한 인터페이스 사용(대응하는 장치파일이 없다.) 스트림 기반이 아닌 패킷 단위의 접근 이더넷 디바이스 드라이버(eth0)
13
Device Driver (4) - 구조 Application System Call Interface VFS
Network Subsystem Buffer Cache Network D/D Block D/D Character D/D Device Interface Hardware area Kernel
14
Device Driver (5) - 구조 kernel user program device driver open close
file operations device_open device_close device_read device_write system call user program open close read write device
15
Device Driver 작성 (1) Device Driver의 구현 및 테스트 과정
16
Device Driver 작성 (2) 문자 장치 드라이버의 전형적인 형태
Printf와 같은 기능의 커널 코드를 위한 함수 “파일시스템”헤더는 디바이스 드라이버를 쓰는데 필요한 헤더파일 필요한 header. 모듈소스가 include해야함 Device Opertations static struct file_operations device_fops={ open : device_open, release : device_release, read : device_read, write : device_write, ioctl: device_ioctl, }; Function Prototypes int device_open(); int device_release(); ssize_t device_read(); static ssize_t device_write(); int device_ioctl(); Module 제거 시 반환작업 수행 void sample_cleanup(void); Module 설치 시 초기화 수행 int sample_init(void); Header Files #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> Module_init()과 module_exit() 정의됨 insmod로 모듈을 적재하면 이 함수가 불려진다. 이 함수 안에서 regiseter_chrdev() 커널 함수를 뷸러서 모둘을 적재한다. rmmod로 적재된 모듈을 삭제할 경우 이 함수가 불려진다. unregister_chrdev() 커널 함수를 불려서 모듈을 삭제한다. application에서 쓰는 함수와 driver에서 쓰는 함수를 mapping
17
Device Driver 작성 (2) #include <linux/module.h> #include <linux/fs.h> #include <linux/kernel.h> #include <linux/init.h> #define DEV_NAME "test_dd" int test_major = 0; int result; ///////////// 함 수 정 의 ////////////// int device_open (struct inode *inode, struct file *filp); int device_release (struct inode *inode, struct file *filp); ssize_t device_read (struct file *filp, unsigned int *buf, size_t count, loff_t *f_pos); ssize_t device_write (struct file *filp, unsigned int *buf, size_t count, loff_t *f_pos); int device_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned int arg); int sample_init(); void sample_cleanup(); 모듈을 커널에 적재하는 함수 register_chrdev()의 parameter로써 0으로 설정하면 major값을 뒤에서부터 자동으로 빈자리로 등록시킨다 register_chrdev()함수가 return하는 값을 넘겨받음. 0보다 적으면 모듇 등록 실패 application에서 open()함수로 driver를 호출할때 실행되는 함수 application에서 close()함수로 driver를 닫을때 실행되는 함수
18
Device Driver 작성 (3) 이 함수가 호출될때마다 count가 증가한다.
int device_open (struct inode *inode, struct file *filp) { printk("test_open start!!!\n"); MOD_INC_USE_COUNT; return 0; } int device_release (struct inode *inode, struct file *filp) MOD_DEC_USE_COUNT; ssize_t device_read (struct file *filp, unsigned int *buf, size_t count, loff_t *f_pos) printk("read() ^^\n"); ssize_t device_write (struct file *filp, unsigned int *buf, size_t count, loff_t *f_pos) 이 함수가 호출될때마다 count가 증가한다. 이 함수가 호출될때마다 count가 감소한다. Application에서 read함수를 호출하면 terminal에 문자 출력
19
Device Driver 작성 (4) Ioctl()호출이 성공하면 문자 출력
int device_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned int arg) { printk("ioctl() ^^\n"); return 0; } struct file_operations test_fops = { open: device_open, read: device_read, write: device_write, ioctl: device_ioctl, release: device_release, }; module_init(sample_init); module_exit(sample_cleanup); Ioctl()호출이 성공하면 문자 출력 파일연산구조체는 char device driver에 대한 모든 연산을 포함한다. 즉 여기에 정의된 함수를 통해서 커널이 접근하게 된다. 즉 application에서 open함수를 호출하면 이는 driver의 test_open()과 mapping되어있어 이를 실행하게 된다. insmod로 불려지는 함수 rmmod로 불려지는 함수
20
driver를 커널에 모듈로 등록하는 함수, result에 major 값이 넘어옴
Device Driver 작성 (5) int sample_init(void) { result = register_chrdev(test_major, DEV_NAME, &test_fops); if (result < 0) { printk(KERN_WARNING "%s: can't get major %d\n", DEV_NAME, test_major); return result; } printk("<1> init module success!!.. %s major number : %d\n", DEV_NAME, result); return 0; void sample_cleanup(void) if( !unregister_chrdev(result, DEV_NAME) ) printk("%s cleanup_module success...\n", DEV_NAME); else printk("%s cleanup_module fail...\n", DEV_NAME); driver를 커널에 모듈로 등록하는 함수, result에 major 값이 넘어옴 driver를 커널에서 삭제하는 함수
21
Device Driver 작성 (6) 장치 드라이버 등록 방법 문자 장치 드라이버의 등록과 해제
외부와 장치 드라이버는 file interface (node를 의미)를 통해 연결 장치 드라이버는 자신을 구별하기 위해 고유의 major number를 사용 문자 장치 드라이버의 등록과 해제 등록 : int register_chrdev(unsigned int major, const char *name, stuct file_operations *fops) Major : major number가 0이면 사용하지 않는 번호 중 자동으로 할당 Name : device의 이름 /proc/devices에 표시됨 Fops : device에 대한 file 연산 함수들 해제 : int unregister_chrdev(unsigned int major, const char *name)
22
Device Driver 작성 (7) 구조체 struct file_operations
static struct file_operations skeleton_fops = { THIS_MODULE, /* struct module *owner;*/ NULL, /* skeleton_llseek */ skeleton_read, /* skeleton_read */ skeleton_write, /* skeleton_write */ NULL, /* skeleton_readdir */ NULL, /* skeleton_poll */ skeleton_ioctl, /* skeleton_ioctl */ NULL, /* skeleton_mmap */ skeleton_open, /* skeleton_open */ NULL, /* skeleton_flush */ skeleton_release, /* skeleton_release */ NULL, /* skeleton_fsync */ NULL, /* skeleton_fasync */ NULL, /* skeleton_lock */ NULL, /* skeleton_readv */ NULL /* skeleton_writev */ };
23
Device Driver 작성 (8) 문자 디바이스 드라이버의 등록 과정
24
Device Driver 작성 (9) 블록 장치 드라이버의 등록과 해제 네트워크 장치 드라이버의 등록과 해제
major : 주번호로, 0이면 사용하지 않는 주번호 중에서 동적으로 할당 name : 블록 장치 이름 반환값 : 오류 코드(0이나 양수이면 성공적인 수행. 음수이면 오류 발생 ) 네트워크 장치 드라이버의 등록과 해제 dev : net_device 구조체 이름 반환값 : 등록에 성공하면 0. 실패하면 0이 아닌 값을 반환 int register_blkdev(unsigned int major, const char *name) int unregister_blkdev(unsigned int major, const char *name) int register_netdev(struct net_device *dev) void unregister_netdev(struct net_device *dev)
25
문자 장치 드라이버 동작
26
Device Driver 테스트 프로그램 작성
#include <stdio.h> #include <fcntl.h> #include <string.h> #include <errno.h> int fd; int main(int argc, char **argv) { if( (fd = open("/dev/test_d", O_RDWR)) < 3) { fprintf(stderr, "/dev/test_d device file open error!! .. %s\n",strerror(errno)); return 0; } read(fd, 0, 0); write(fd, 0, 0); ioctl(fd, NULL,0); close(fd); File에 대한 제어와 설정 Error에 관한 header file mknod를 통하여 /dev에 만들어진 node(file)을 open한다.
27
Device Driver 및 테스트 프로그램 컴파일(1)
Makefile 작성
28
Device Driver 및 테스트 프로그램 컴파일(2)
앞에서 만든 드라이버 소스를 test_dd.c, test application은 test_app.c, 그리고 makefile은 Makefile로 작성 make 명령어를 이용하여 위의 2 files을 컴파일한다. % make 생성된 test_dd.ko 와 test_app를 nfs 디렉토리로 복사한다
29
문자 장치 드라이버 테스트 (1) Step 1. 문자 장치 드라이버 적재
30
문자 장치 드라이버 테스트 (2) Step 1. 문자 장치 드라이버 적재 (계속)
/proc/devices 파일을 통해 현재 적재된 장치 드라이버 확인 #cat /proc/devices
31
문자 장치 드라이버 테스트 (3) Step 2. 문자 장치 파일 생성
mknod 명령으로 장치 드라이버가 접근할 수 있는 장치 파일 생성 mknod [device file name] [type] [major] [minor] e.g) #mknod /dev/test_d c 245 0
32
문자 장치 드라이버 테스트 (4) Step 2. 문자 장치 파일 생성 (계속) 장치 파일 번호 접근 방법
kdev_t : 장치의 major, minor number를 표현하는 자료구조 MAJOR() : kdev_t에서 major number를 얻어내는 매크로 e.g) MAJOR(inode->i_rdev); MINOR() : kdev_t에서 minor number를 얻어내는 매크로
33
문자 장치 드라이버 테스트 (5) Step 3. 테스트 프로그램 실행
34
문자 장치 드라이버 테스트 (6) Step 4. 문자 장치 드라이버 모듈 제거
35
문자 장치 드라이버 테스트 (7) Step 4. 문자 장치 드라이버 모듈 제거 (계속) 장치 드라이버 제거 확인
36
문자 장치 드라이버 제작방법 (1) 모듈 시작 및 종료에서 문자 장치의 등록과 해제
등록 : int register_chrdev(unsigned int major, const char *name, struct file_operations *fops) major : 등록할 major number. 0이면 사용하지 않는 번호 중 동적으로 할 당 name : 장치의 이름 fops : 장치에 대한 파일 연산 함수들 해제 : int unregister_chrdev(unsigned int major, const char *name)
37
문자 장치 드라이버 제작방법 (2) file_operations의 구조체 정의 -<linux/fs.h>참조
struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*aio_fsync) (struct kiocb *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void __user *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area) (struct file *, unsigned long, unsigned long, unsigned long, unsigned long); };
38
문자 장치 드라이버 제작방법 (3) onwer:어떤 모듈로 올라간 디바이스 드라이버와 연관을 가지는지를 나타내는 포인터
lseek : 파일에서 현재의 read/write 위치를 옮기며 새로운 위치가 양수 값으로 return된다. error는 음수가 return 된다. read : 디바이스에서 데이터를 가져오기 위해 사용된다. write : 디바이스에 데이터를 보낸다. readdir : 디바이스 노드에서는 NULL이어야 하며 디렉토리에 대해서 사용한다. poll : 현재 프로세스에 대기 큐를 넣는다 (2.0에서 select_wait과 같다) ioctl : 디바이스에 종속적인 명령을 만들 수 있도록 한다.(플로피의 한 트랙을 포맷하는 명령) mmap : 디바이스 메모리를 프로세스 메모리에 맵핑 시키도록 요청에 사용 open : 디바이스 노드에 대해 수행되는 첫 번째 동작,application의해 장치가 열릴 때 호출 flush : 열린 디바이스를 닫기 전에 모든 데이터를 쓰도록 하기 위해 사용 release : 노드를 닫을 때 수행된다 fsync : 디바이스에 대한 모든 연산의 결과를 지연하지 않고 즉시 일어나도록 한다. fasync : FASYNC 플레그에 변화가 있는 디바이스를 확인하기 위해 사용한다. check_media_change : 블록 디바이스에 사용되는데 플로피처럼 제거가능 미디어에 사용 revalidate : check_media_change와 관련 버퍼 캐쉬의 관리에 상관이 있다. lock : 파일체계에서만 유효하며 사용자가 파일을 잠그게 하기 위해 사용 한다.
39
문자 장치 드라이버 제작방법 (4) Open에서 할 일 Release에서 할 일 처음으로 장치를 연 경우 장치 초기화
Minor번호를 확인하고 필요한 경우 f_op 포인터 수정 필요한 경우 메모리를 할당 받아 filp-private_data삽입 참조 횟수(usage count)를 증가 Release에서 할 일 참조 횟수를 감소 filp-private_data에 할당된 데이터가 있으면 삭제 Close하는 경우 장치 종료
40
문자 장치 드라이버 제작방법 (5) Read의 return value Write
요구한 만큼 읽은 경우 count와 같은 값을 리턴 요구한 값보다 작을 경우 count보다 작은 양수 리턴 EOP(End of file)인 경우 0을 리턴 에러가 발생하면 음수 리턴 Write 요구한 만큼 기록한 경우 count와 같은 값을 리턴 요구한 크기보다 적게 쓴 경우 count보다 작은 양수 리턴 하나도 쓰지 못한 경우 0 리턴, write()함수 재시도 에러가 발생한 경우 음수 리턴
41
문자 장치 드라이버 제작방법 (6) 데이터 전달 함수 App 디바이스 kernel 드라이버
get_user(void *, Const void *addr) 사용자 공간의 어드레스 addr로 부터 변수x로 바이트(1,2,4)를 복사 put_user(void *, Const void *addr) addr로부터 변수 x까지 사용자 공간으로 바이트를 복사 copy_to_user(void *to, void *from, unsinged long size) copy_from_user(void *to, void *from, unsinged long size) <asm/uaccess.h> 참조 kernel 디바이스 드라이버 App get_user(),copy_from_user() put_user(),copy_to_user()
42
문자 장치 드라이버 제작방법 (7) ioctl 읽기/쓰기 이외의 부가적인 연산을 위한 인터페이스
디바이스 설정 및 하드웨어 제어 (향상된 문자 드라이버 작성 가능) ioctl 시스템 콜은 디바이스에 특화된 명령을 나타내는 방법을 제공 한다. 예) /linux/driver/cdrom/cdrom.c reading이나 writing이 아닌 CDROMEJECT, CDROMSTART, CDROMSTOP 등 것과 같은 명령
43
문자 장치 드라이버 제작방법 (8) ioctl에 전달되는 cmd와 관련 매크로 함수
xxx_ioctl(, , unsigned int cmd, ) 단순한 구별 숫자 이외에 처리에 도움을 주는 몇 가지 정보를 포함한 형태 구분 번호: 명령을 구분하는 명령어의 순차 번호 매직 번호: 다른 디바이스 드라이버의 ioctl 명령과 구분하기 위한 값 데이터 크기: 매개변수 arg를 통해 전달되는 메모리의 크기 읽기 쓰기 구분: 읽기 명령인지, 쓰기 명령인지 구분하는 속성
44
문자 장치 드라이버 제작방법 (9) ioctl에 전달되는 cmd와 관련 매크로 함수 매크로 함수
앞에서 본 cmd의 4가지 필드 형식에 맞춰 cmd상수값을 만드는 매크로 함수와 cmd상수값에서 필요한 필드값을 추출하는 매크로 함수를 제공 cmd명령을 만드는 매크로 함수 _IO: 부가적인 데이터가 없는 명령을 만드는 매크로 _IOR: 디바이스 드라이버에서 데이터를 읽어오기 위한 명령을 만드는 매크로 _IOW: 디바이스 드라이버에서 데이터를 써넣기 위한 명령을 만드는 매 크로 _IOWR: 읽고 쓰기를 수행하기 위한 명령을 만드는 매크로
45
문자 장치 드라이버 제작방법 (10) ioctl에 전달되는 cmd와 관련 매크로 함수 매크로의 형태
_IOR(매직 번호, 구분 번호, 변수형) _IOW(매직 번호, 구분 번호, 변수형) _IOWR(매직 번호, 구분 번호, 변수형) 매직번호: 0~255 사이값, 특별한 의미는 없다. 매직번호의 잘못된 사용을 막는 간단한 보안 장치 구분번호: 각 명령을 구분하기 위해 사용. 보통 0부터 순서대로 붙 여나간다. 변수형: 변수형은 arg매개변수가 가리키는 데이터의 전달 크기를 지정하는데 사용. 숫자가 아닌 변수형을 넣는다.
46
문자 장치 드라이버 제작방법 (11) ioctl에 전달되는 cmd와 관련 매크로 함수 _IO 매크로 함수 _IOR 매크로 함수
전달되는 매개변수가 없고, 단순히 명령만 전달할 때 사용. #define TEST_DRV_RESET _IO(12, 0) _IOR 매크로 함수 디바이스에서 데이터를 읽어오는 명령을 만들 때 사용. #define TEST_DRV_READ _IOR(12,1,int) 디바이스에서 응용프로그램이 읽어올 데이터의 크기가 int크기 만큼이 라는 의미
47
블록 장치 드라이버 제작 블록 장치 특성, 주번호와 부번호 및 장치 이름 정의
register_blkdev() 함수를 사용한 블록 장치 드라이버의 등록 블록 장치 연산 구조체 처리 요구 큐에 관련된 처리 및 함수를 선언 블록 장치 추가를 위한 gendisk 구조체 생성 및 등록 블록 장치의 크기 설정 및 기타 속성을 처리
48
네트워크 장치 드라이버 제작 모듈 적재 혹은 커널 부팅에 의한 초기화 처리 모듈 제거를 위한 마무리 처리
네트워크 디바이스 검출 네트워크 디바이스 초기화 및 등록 네트워크 디바이스 열기 및 닫기 네트워크 데이터 전송 및 수신 인터럽트 처리 네트워크 디바이스 제어를 위한 ioctl() 함수 구현 멀티 캐스트 처리 설정 정보의 재설정 처리
49
Test Board I/O Port Address (1)
I/O device 비고 PXA255Pro1 0x0c000002 LED LED 출력 포트 0x0c000004 FND FND 출력 포트 0x0c00001e DOT #1 DOT #1 출력 포트 0x0c000018 Step Motor Step Motor 제어 포트 0x0c00001c Text LCD 명령어 포트 0x0c00001a 데이터 포트 0x0c ~0x0c000014 ADC ADC 입력값 FIFO(16Btes) 0x0d000016 DAC DAC 출력값FIFO(16Btes)
50
Test Board I/O Port Address (2)
I/O device 비고 PXA255Pro3 0x0c000016 LED LED 출력 포트 0x0c000002 FND FND 출력 포트 0x0c000004 DOT #1 DOT #1 출력 포트 0x0c00000c Step Motor Step Motor 제어 포트 0x0c000014 Text LCD 명령어 포트 0x0c000012 데이터 포트 0x0c800000 ADC ADC 입력값 FIFO(16Bytes) 0x0d000000 ~0x0d000020 DAC DAC 출력값FIFO(16Bytes) 0x0c800004 CDS CDS 출력값
Similar presentations