caanoo Device driver

48
Device Driver

Transcript of caanoo Device driver

Page 1: caanoo Device driver

Device Driver

Page 2: caanoo Device driver

Linux Device Driver – Contents

1. Linux Kernel 1) 구조2) 기능

2. Device Driver 개요3) Character Device Driver4) Block Device Driver5) Network Device Driver

3. Linux Device Model 6) udev 7) sysfs, kobject, device class8) Hotplug

4. CAANOO Character Device Driver Example9) Vibration Motor10) Analog Joystick

GPH

Page 3: caanoo Device driver

1. Linux Kernel

Page 4: caanoo Device driver

Linux Device Driver – 1. Linux Kernel

1) 구조

GPH

Page 5: caanoo Device driver

Linux Device Driver – 1. Linux Kernel

GPH

Page 6: caanoo Device driver

Linux Device Driver – 1. Linux Kernel

GPH

2) 기능• 프로세스 관리

- 프로세스 생성 및 소멸 - 프로세스간 통신 - etc.

• 메모리 관리 - 가상 메모리 관리기법 제공 - 시스템에 장착된 메모리 (Hardware) 관리

• 파일 시스템 관리 - 가상 파일 시스템 (VFS) 에 의한 다양한 종류의 파일 시스템 (ext3, ext4, FAT 등 ) 지원 - 파일 ( 정규 파일 , 장치 파일 , 파이프 ), 디렉토리 관리

• 디바이스 관리 - 입출력 요청 처리 및 작업 스케쥴링 - 인터럽트 처리 - 주변 장치와 메모리의 데이터 전송

• 네트워크 관리 - 네트워크 라우팅 및 주소

Page 7: caanoo Device driver

2. Device Driver 개요

Page 8: caanoo Device driver

Linux Device Driver – 2. Device Driver 개요

GPH

▶ Linux Device Driver 란 ? - 시스템이 지원하는 하드웨어를 응용프로그램에서 사용할 수 있도록 Kernel 에서 제공하는 라이브러리 (or Inter-

face). - 일반적으로 문자 , 블록 , 네트워크 디바이스 드라이버로 분류 하며 “ /dev” 에 나타난다 . example:

문자 드라이버

블록 드라이버

주 번호 부 번호

Page 9: caanoo Device driver

GPH

- 각 행의 첫 글자가 디바이스의 유형 (c 는 문자 드라이버 , b 는 블록드라이버 ) 을 나타낸다 .

- 다섯 번째 열의 숫자는 주 번호 , 여섯 번째 숫자는 부 번호를 의미 . (※ 문자와 블록 드라이버는 서로 다른 영역을 차지하므로 동일한 주 번호를 블록 드라이버 뿐만 아니라 문자 드라이버에도 할당 할 수 있다 .)

- 주 번호는 전반적인 드라이버 특징을 지정 , 부 드라이버가 서비스하는 정확한 디바이스 특 징을 지정 (mtdblock0, mtdblock1 참고 ).

Linux Device Driver – 2. Device Driver 개요

Page 10: caanoo Device driver

Linux Device Driver – 2. Device Driver 개요

GPH

1) Character Device Driver ▶ Char Device Driver 의 정의 및 특징 - 문자 디바이스는 하나의 파일처럼 사용할 수 있는 것 ( 버튼 , G-Sensor, Analog Joystic, RTC 등 ) 을 말하고

문자 디바이스 드라이버는 이러한 파일 접근에 필요한 open, close, read, write 등의 시스템 호출을 구현 .

- 디바이스에서 자료에 순차적 (sequentially) 으로 접근 가능한 커널 코드

- 임의의 길이를 갖는 문자열을 다루는 디바이스 드라이버로 응용 프로그램에서 직접적으로 호출되는 버퍼 없는 디바이스 드라이버 .

- 응용프로그램은 open(), close(), read(), write() 와 같은 파일 처리용 함수를 이용하여 디바이스 파일을 일반 파일처럼 다뤄서 하드웨어를 제어할 수 있다 .

- 구조가 매우 간단하다 .

Page 11: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 ▶ Character Device Driver 기능 . - 디바이스를 초기화하며 등록함수를 사용해 커널 영역에 드라이버를 빈틈없이 엮는 ( 등록하는 ) 기능을 책임진

초기화 (init()) 루틴 .

- 관련 /dev 노드를 사용해 사용자 어플리케이션이 호출하는 입출력 시스템 호출과 직접 대응하는 open(), close(), read(), write() 같은 진입점 집합 .

- interrupt handling, bottom half, timer handling 등의 처리 .

Page 12: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 ▶ Character Device Driver 주요 자료구조 . - 디바이스별 구조체 : 드라이버 동작을 위한 정보 저장소로 활용 - struct cdev: 문자 드라이버용 커널 추상화 단위 , 일반적으로 디바이스별 구조체에 포함 .

- struct file_operations: 사용자 어플리케이션과 작동하는 open, close, read, write 의 구현 .

- struct file: 해당 /dev 노드에 대한 정보 . - struct platform_device, struct platform_driver: platform_bus 라는 가상의 플랫폼 버스 상에 새로운

디바이스를 등록 .

Page 13: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 ▶ Character Device Driver example. - 직렬 드라이버 : 컴퓨터의 직렬 포트를 관리하는 문자 드라이버 . (drivers/serial) - 입력 드라이버 : 키보드 , 마우스 , 조이스틱 같은 디바이스를 다루는 책임 . (drivers/input)

- 프레임 버퍼 : 비디오 메모리에 대한 접근 제공 . (drivers/video)

- 이외 많은 유형의 Character Device Driver 들이 존재 . (“grep –r register_chrdev drivers/” 로 확인 )

Page 14: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 2) Block Device Driver - 블록 디바이스는 임의 접근 능력을 갖춘 저장소 매체 .

- 문자 디바이스와 달리 블록디바이스는 파일 시스템 자료를 담을 수 있다 ( 하드디스크와 같은 저장 매체를 다룬다 ).

- 대부분의 저장 디바이스가 블록 (512, 1024, … 4096 Byte) 단위의 입출력을 기반으로 하고 있음 .

- 입출력 스케쥴러가 동작 .

Page 15: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요

PC 시스템의 저장소 매체

Page 16: caanoo Device driver

GPH

Linux 에서의 블록 입출력

Linux Device Driver – 2. Device Driver 개요

Page 17: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 ▶ 입출력 스케쥴러

입출력 스케쥴러 설명 Kernel Source

Deadline - 표준 elevator 알고리즘으로 요청의 첫 섹터 번호를 기준으로 정렬 도는 병합 수행 . - 입출력 요청에 대해서 굶주림 (starvation) 을 방지하기 위해 deadline 을 설정 .

block/deadline-iosched.c (2.6 kernel)

Anticipatory - 기본 알고리즘은 Deadline 과 같지만 , 읽기 요청을 수행한 후 미리 정해놓은 시간만큼 추가 요청을 예상하며 대기 .

Block/as-iosched.c (2.6 kernel)

Complete Fair Queuing (CFQ)

- 요청한 프로세스마다 요청큐를 하나씩 유지함으로써 프로세스마다 입출력에대한 공평한 기회를 얻게 됨 .- 특정 프로세스때문에 다른 프로세스가 굶어 죽는 상황 방지 .

Block/cfq-iosched.c(2.6 kernel)

Noop - 최적화된 삽입 지점을 찾기 위해 요청큐를 탐색하는 데 시간을 소비하지 않음 . - 탐색 지연 시간이 존재하지 않는 SSD 같은 매체에 이상적 .

Block/noop-iosched.c(2.6 kernel)

Page 18: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 ▶ 보조 기억 장치와 디바이스 파일 - 블록 디바이스 드라이버의 주 번호는 블록 디바이스를 구별하고 , 부 번호는 물리적인 보조 기억 장치를

구별하거나 분할 파티션을 구별함 . - 리눅스의 블록 디바이스 장치

brw-rw---- 1 root disk 8, 0 2010-11-03 18:23 sdabrw-rw---- 1 root disk 8, 1 2010-11-03 18:23 sda1brw-rw---- 1 root disk 8, 2 2010-11-03 18:23 sda2brw-rw---- 1 root disk 8, 5 2010-11-03 18:23 sda5brw-rw---- 1 root disk 8, 16 2010-11-15 13:56 sdbbrw-rw---- 1 root disk 8, 17 2010-11-15 13:56 sdb1brw-rw---- 1 root disk 8, 18 2010-11-15 13:56 sdb2

- 블록 디바이스의 마운트 정보파일시스템 크기 사용됨 사용가능 사용율% 마운트 됨/dev/sda1 284G 109G 161G 41% /none 1.7G 284K 1.7G 1% /devnone 1.7G 252K 1.7G 1% /dev/shmnone 1.7G 1.2M 1.7G 1% /var/runnone 1.7G 4.0K 1.7G 1% /var/locknone 1.7G 0 1.7G 0% /lib/init/rw/dev/sdb1 70M 2.6M 67M 4% /media/BOOT/dev/sdb2 3.6G 1.6G 1.9G 46% /media/ROOTFS

파티션이 2 개 (FAT-sdb1, Ext3-sdb2) 인 이동식 디스크

(sdb) 의 블록디바이스 파일

2 개의 파티션 (FAT-sdb1, Ext3-sdb2) 이 mount 되어 있는 정보

Page 19: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 3) Network Device Driver - 네트워크 디바이스 드라이버는 다른 드라이버와 다르게 사용자 영역과 통신하기 위해 /dev 나 /sys 에 의존하지

않는다 .

- 어플리케이션은 기반 프로토콜 스택을 추상화한 네트워크 인터페이스 (ex eth0) 를 거쳐 드라이버와 상호작용 한다 .

Page 20: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요

네트워크 스텍을 설명하는 인터넷 모델

물리층에 접근하는 디바이스 드라이버를 참조 . ( 직렬 연결 혹은 이더넷 디바이스같은 매체 )

패킷을 목적지로 전달 . ( 호스트 사이에서 일어나는 통신을 관리 )

point-to-point 통신을 담당 .( 호스트 내부에서 종단점 사이에 일어나는 통신을 관리 )

일반적으로 이동하는 자료를 이해하는 의미론적인 layer. (HTTP 서버와 클라이언트의 관계에서는 웹 내용의 요청과

응답을 전송 )

Page 21: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요

리눅스 네트워크 스텍 구조

사용자 영역 응용 프로그램이 커널 네트워크 하위 시스템에 접근하는 API 를 제공

프로토콜 중립 계층 ( 소켓 ): 다양한 프로토콜을 위한 공통함수 집합을 제공하는 Interface.

TCP, UDP 등 사용 가능한 특정 네트워킹 프로토콜을 정의 .

다양한 기능의 하드웨어 디바이스 드라이버를 프로토콜로 연결하는 중립 인터페이스 계층 .

물리적인 네트워크 디바이스를 관리하는 디바이스 드라이버 .

Page 22: caanoo Device driver

GPH

Linux Device Driver – 2. Device Driver 개요 ▶ Network Device Driver 자료 구조 . - 소켓 버퍼 (struct sk_buff): 네트워크 프로토콜 스택의 구성 단위를 형성하는 구조체이며 커널의 TCP/IP 스택이

이용하는 핵심 구조체 . (include/linux/sk_buff.h) - struct net_device: Network driver 와 프로토콜 스택 사이의 인터페이스를 정의하는 구조체 . (include/linux/

netdevice.h)

- I/O 버스와 관련있는 구조체 : PCI 또는 CPU Address/Data bus

Page 23: caanoo Device driver

3. Linux Device Model

Page 24: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

▶ Linux Device Model(LDM) 개요 . - Power management and system shutdown: 예를 들어 USB host adaptor 는 host 에 연결된 device 들이 모두 안정적으로 power off(or shut down) 된 후에 power off 되어야 한다 LDM 은 이러한 올바른 절차에의해 이러한 작업을 수행하도록 한다 .

- Communications with user space: 가상 파일 시스템인 sysfs 는 LDM 과 매우 밀접하게 연관되어 있으며 구조화된 LDM 의 자료구조를 user space 에 표현 .

- Hotpluggable devices: USB 이동식 디스크와 같은 장치는 시스템이 동작 중일 때 언제든 삽입(plugging)/ 제거 (unplugging) 될 수 있다 . 커널은 이와 같은 사건 (event) 들을 LDM 을 이용해 다루고 (handling) 사용자 영역과 소통 (communicate) 한다 .

- Device Classes: 때대로 시스템에 어떠한 종류의 디바이스가 연결되어 있는지 알아야할 필요성이 있다 . LDM 은 연결된 디바이스를 그것이 속하게 되는 적절한 상위 클레스로 분류하는 메커니즘을 가지고 있으며 , 디바이스가 사용자 영역 (user space) 에서 발견될 수 있도록 한다 .

Page 25: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

1) udev - 초창기부터 2.4 버전의 커널은 ( 수천 개에 이르는 ) 필요한 디바이스 노드를 /dev 에 정적으로

만들어야만 했다 . - 2.4 버전대에 이르러 동적으로 디바이스 노드를 생성하는 devfs 를 도입하였지만 , 노드 작명은 여전히

디바이스 드라이버에 의존 .

- 디바이스 관리를 사용자 영역으로 옮기기 위해 udev 가 등장 .

Page 26: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

▶ udev 는 아래의 내용에 의존하여 동작 . - Kernel Sysfs 지원 : sysfs 는 리눅스 디바이스 모델에서 중요한 위치를 차지하며 , sysfs 는 메모리 내부 파일 시스템으로 시동 시점에서 /sys 에 mount 된다 . 아래에 나오는 udevd 나 udevinfo 는 sysfs 를 참고하여 동작하게 된다 .

- udevd 나 udevinfo 같은 사용자 영역 demon 과 utility.

- /etc/udev/rules.d/ 디렉터리에 있는 사용자 지정 규칙 .

Page 27: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

▶ udevd 데몬 확인 Example (CAANOO)

Page 28: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

▶ 사용자 지정 규칙 Example(CAANOO SD/MMC)

SD/MMC Insert

SD/MMC Remove

SD/MMC 사용자 규칙 파일

Page 29: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

▶ 임베디드 시스템에서의 udev - 아래와 같은 이유로 인해 특정 임베디드 시스템에서는 udev 를 활용하기 보다 정적으로 생성한 디바이스 노드를

선호하기도 함 .

• udev 는 소프트웨어 설치 과정에서 한 번만 만들어지는 정적 노드와는 달리 시동할 때마다 /dev 노드를 생성한다 . /dev 디렉터리가 플래시 저장소를 사용할 경우 매번 시동 과정에서 지우기 /쓰기 과정을 거치므로 , 플래시 수명이 줄어든다 .

• udev 를 사용하면 시스템 시동 시간이 더 오래 걸린다 .

• /dev 노드를 동적으로 생성하며 모듈을 자동적으로 적재하는 udev 기능에는 특수 목적으로 사용할 임베디드 디바이스에서 피하고 싶은 비결정성이 따라다닌다 . 특히 핫플러그 가능한 버스를 거쳐 외부 세상과 상호작용을 원하지 않은 경우에 문제가 된다 . 이런 관점에 따르면 정적 노드 생성과 시동 시점에 모듈을 메모리에 올리는 방식은 시스템에 대한 통제를 강화하며 , 테스트를 용이하게 한다 .

Page 30: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

2) sysfs, kobject, device class - sysfs, kobject, device class 는 디바이스 모델의 기초적인 구성요소이지만 , 대부분의 경우 밖으로 드러나지

않는다 . (즉 직접적으로 드라이버 작성자나 프로그래머가 다루거나 관련 source 를 수정하는 일은 거의 없다 .) - sysfs 는 커널의 구조화된 디바이스 모델의 사용자 영역으로의 표현이다 . sysfs 는 커널 자료 구조에 대한 정보를

포함하는 메모리 기반 파일 시스템이라는 점에서 procfs 와 유사하지만 , procfs 가 커널 내부로 통하는 일반적인 interface 를 제공하는 반면 , sysfs 는 디바이스 모델에 특화된 interface 로서 udev 의 확장기능 대부분이 sysfs 에 의존한다 .

- kobject 는 참조 카운트 같은 공통 객체 속성의 추성화를 지원한다 . 일반적으로 kobject 는 더 큰 구조체 (e.g. struct device) 에 내장된다 . kobject 구조체의 주요 field 와 내용은 다음과 같다 .• 참조 카운트 관리를 수행하기 위한 kref• kobject 가 속하는 객체 집합인 kset 에 대한 포인터• Kobject 를 기술하는 객체 유형인 kobj_type

- kobject 는 sysfs 와 밀접한 관련이 있다 . 커널 내부에서 인스턴스로 만들어지는 모든 kobject 가 sysfs 에서

나타난다 .

- 디바이스 클래스 개념은 디바이스 모델의 또 다른 특징이며 , 드라이버에서 사용하기를 원하는 interface 이다 . 클래스 인터페이스는 디바이스마다 더 큰 디바이스 클래스 (또는 범주 ) 에 속한다는 생각을 추상화한다 . (e.g. usb 마우스 , ps/2 키보드 , 조이스틱은 입력 클래스에 속하며 /sys/class/input 이라는 독자적인 항목을 소유하게 된다 .)

Page 31: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

USB Mouse 가 삽입되었을때 디바이스 클래스

Page 32: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

USB Mouse 의 sysfs 계층

[/sys] +[block] -[bus]—[usb]—[devices]—[usb2]—[2-2]—[2-2:1.0]-[usbendpoint:usbdev2.2-ep81] -[class]-[input]—[mouse2]—[device]—[bus]—[usbendpoint:usbdev2.2-ep81] -[usb_device]—[usbdev2.2]—[device]—[bus] -[usb_endpoint]—[usbdev2.2-ep00]—[device] —[usbdev2.2-ep81]—[device] -[devices]—[pci0000:00]—[0000:00:1d:1]—[usb2]—[2-2]—[2-2:1.0] +[firmware] +[fs] +[kernel] +[module] +[power]

Page 33: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

RTC 드라이버 모듈을 커널에 올렸을 때 처리 경로

Page 34: caanoo Device driver

GPH

Linux Device Driver – 3. Linux Device Model

2) Hotplug - 동작중인 시스템에 동적으로 연결되는 것을 Hotplug 라고 표현한다 . - 최신의 리눅스 커널은 hotplug 를 감지하면 netlink 소켓을 거쳐 사용자 영역으로 uevent 를 보낸다 . - netlink 소켓은 소켓 API 를 이용해 커널영역과 사용자 영역 사이에 통신이 가능하게 만드는 효율적인 매커니즘 이

다 .

- 사용자 영역 끝에서 디바이스 노드 생성과 삭제를 관리하는 udevd 데몬이 uevent 를 받아 핫플러그를 관리한다 .

Page 35: caanoo Device driver

4. CAANOO Example

Page 36: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

1) Vibration Motor - Hardware 구성 :

• 2EA AC-type Vibration Motor• 2EA Vibration Motor Controller chip (ISA1200)

- Hardware 연결 :

• 두 개의 ISA1200 이 i2c 로 연결되어 있고 , 이를 통해 MCU(POLLUX) 로부터 각종 command (enable/disable, AC/DC motor type 등 ) 을 받는다 .

• 두 개의 ISA1200 은 MCU 로부터 하나의 PWM 라인을 공유하며 MCU 는 PWM 의 duty 비를 이용하여 모터의 세기 (강 /약 ) 를 조절한다 .

- source file location: <Kernel Top Dir>/drivers/haptic/simple_isa1200.c

Page 37: caanoo Device driver

GPH

RAM

Vibration Motor Block Diagram

Linux Device Driver – 4. CAANOO Example

ISA1200Command

Vibration Strength control

Page 38: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

PWM 신호와 진동의 세기

Page 39: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – 디바이스 드라이버의 시작 지점 (init) 과 종료 지점 (exit)

디바이스 드라이버의 시작 지점 : - 플 랫 폼 디 바 이 스 구 조 체 를 동 적 으 로 할 당 하 고 디 바 이 스 와 드라이버를 등록

디바이스 드라이버의 종료 지점 : - 등 록 된 플 랫 폼 디바이스와 드라이버 제거

드라이버 시작 / 종료지점 명시

Page 40: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – platform_device, platform_driver

- platform_device 의 동적할당을 위한 포인터 선언

- platform_driver 선언

Page 41: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – platform_device, platform_driver

- probe() method.

- remove() method. cdev 와 file_operations 등록

i2c Driver register

Page 42: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – struct file_operations

fd = open(const char *pathname, int flags);

사용자 영역 Application Code Source

int xxx_open(struct inode * inode, struct file *filp) { /* … … */ return ret;}

Device driver Code Source

Page 43: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – struct file_operations

▶ source code – /sys 와 /dev 에서 Vibration Motor

▶ File operations Example – Haptic_test

Page 44: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

2) Analog Joystick - Hardware 구성 :

• X, Y 2 개 축으로 구성된 Analog Joystick - Hardware 연결 :

• X, Y 각각의 축이 MCU 의 ADC(Analog to Digital Converter) Pin 2EA 에 연결

- source file location: <kernel top dir>/drivers/i2c/chips/ad7993.c

Page 45: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – 디바이스별 구조체

Page 46: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – platform_device 의 probe() 루틴에서 Input Device 초기화

CAANOO 의 Ana-log Joystick 과 Button 을 Linux Input Device In-terface 로 사용하기 위한 처리

Page 47: caanoo Device driver

GPH

Linux Device Driver – 4. CAANOO Example

▶ source code – Device 속성 파일 Sysfs 에 만들기 .

▶ 파일 생성 결과 확인

Page 48: caanoo Device driver

root@wiz:/usr/gp2x# cat /sys/devices/platform/pollux-analog.0/calibration 861 161 511 861 161 511 1 0root@wiz:/usr/gp2x# root@wiz:/usr/gp2x# echo "0 0 0 0 0 0 0 0" > /sys/devices/platform/pollux- analog.0/calibration

GPH

Linux Device Driver – 4. CAANOO Example

▶Sysfs Examplescalibration 파일의 내용 (Text) 를 출력

calibration 파일에 특정 내용 (Text) 을 입력 !결과는… ?