Chapter #01 Subject

Similar documents
untitled

KEY 디바이스 드라이버

Embeddedsystem(8).PDF

K&R2 Reference Manual 번역본


<4D F736F F F696E74202D205BBAB0C3B75D20B8AEB4AABDBA20B5F0B9D9C0CCBDBA20B5E5B6F3C0CCB9F620B8F0B5A82E >

Microsoft Word doc

슬라이드 1

UI TASK & KEY EVENT

슬라이드 1

Microsoft PowerPoint - e9.pptx

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

chap7.key

Frama-C/JESSIS 사용법 소개

1장. 유닉스 시스템 프로그래밍 개요

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Chapter 4. LISTS

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

10.

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft PowerPoint - lab14.pptx

슬라이드 1

교육지원 IT시스템 선진화

¼ÒÇÁÆ®-12È£-ÃÖÁ¾¿Ï¼º

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

untitled

- 코드로읽는리눅스디바이스드라이버 강남용

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

PowerPoint 프레젠테이션

Microsoft PowerPoint - polling.pptx

PowerPoint 프레젠테이션

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

11장 포인터

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - chap10-함수의활용.pptx

교육지원 IT시스템 선진화

untitled

디바이스드라이버 (Device Driver) Driver is literally a subject which drive a object. 응용프로그램에서하드웨어장치를이용해서데이터를직접읽고쓰거나제어해야하는경우에디바이스드라이버를이용 하드웨어를제어하는프로그램과애플리케이션에서

The Pocket Guide to TCP/IP Sockets: C Version

UI TASK & KEY EVENT

Adding a New Dev file

Microsoft PowerPoint - Chapter_09.pptx

Abstract View of System Components

ECE30076 Embedded System Programming - LED Device Driver

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft Word - MPC850 SPI Driver.doc

슬라이드 1

chap 5: Trees

Microsoft Word - FunctionCall

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

Chapter 4. LISTS

좀비프로세스 2

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

10주차.key

Chapter 4. LISTS

06Àå

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

제1장 Unix란 무엇인가?

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

5.스택(강의자료).key

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

13주-14주proc.PDF

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

The Pocket Guide to TCP/IP Sockets: C Version

임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

윤성우의 열혈 TCP/IP 소켓 프로그래밍

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

API 매뉴얼

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

歯9장.PDF

Microsoft PowerPoint - IOControl [호환 모드]

운영체제 실습 - Introduction -

슬라이드 1

Microsoft PowerPoint - chap11-포인터의활용.pptx

교육지원 IT시스템 선진화

Microsoft PowerPoint APUE(File InO).pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft Word - KPMC-400,401 SW 사용 설명서

鍮뚮┰硫붾돱??李⑤낯

Microsoft PowerPoint - 10-EmbedSW-11-모듈

204

Microsoft PowerPoint - 06-Pointer and Memory.pptx

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

ABC 11장

untitled

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

(Microsoft PowerPoint - Device Driver [\310\243\310\257 \270\360\265\345])

03장.스택.key

인터럽트 * 인터럽트처리메커니즘 ATmega128 인터럽트 2

본 강의에 들어가기 전

본 강의에 들어가기 전

Transcription:

Device Driver March 24, 2004 Kim, ki-hyeon

목차 1. 인터럽트처리복습

1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned long frags, const char *device, void *dev_id); 인터럽트서비스제거함수 void free_irq(unsigned int irq, void *dev_id); 인터럽트금지및허용 하나의인터럽트처리중이나두개가동시발생시우선권을준다. request_irq() 에서 frags부분에 SA_INTERRUPT를포함시켜주어서인터럽트처리에우선권을준다. 그래서 SA_INTERRUPT가포함된서비스루틴을빠른인터럽트핸들러라고하고없는것은느린인터럽트핸들러라고한다. 일반함수수행시에인터럽트발생을금지하고자한다면 Void disable_irq(int irq); Void enable_irq(int irq);

프로세스 실행상태에있는프로그램의인스턴스 프로세스가잔다? 프로그램에게할당된시간을다른프로그램에게넘기고수행을중지함을뜻한다. 프로세스처리함수 변수선언및초기화 대기큐 (WaitQueue) : linked list 구조로이루어져있다. 을경우, 동일한장치파일을두개이상의프로세스가동시에열었 하나의프로세스만을선택적으로깨우기위해프로세스의정보를가지는변수. 선언 : wait_queue_head_t waitqueue;

struct wait_queue_head wq_lock_t lock; struct list_head task_list; #if WAITQUEUE_DEBUG long magic; long creator; #endif ; typedef struct wait_queue_head wait_queue_head_t; struct wait_queue unsigned int flags; struct task_struct * task; struct list_head task_list; ; typedef struct wait_queue wait_queue_t;

초기화함수 init_waitqueue_head(&waitqueue); static inline void init_waitqueue_head(wait_queue_head_t *q) #if WAITQUEUE_DEBUG if (!q) WQ_BUG(); #endif q->lock = WAITQUEUE_RW_LOCK_UNLOCKED; INIT_LIST_HEAD(&q->task_list); #if WAITQUEUE_DEBUG q-> magic = (long)&q-> magic; q-> creator = (long)current_text_addr(); #endif

INIT_LIST_HEAD() #define INIT_LIST_HEAD(ptr) do (ptr)->next =(ptr); (ptr)->prev =(ptr); while(0) * struct list_head struct list_head struct list_head *next, *prev; ; * DECLARE_WAIT_QUEUE_HEAD(waitQueue); * #define DECLARE_WAIT_QUEUE_HEAD(x) struct wait_queue *x = NULL

프로세스를재우는함수 Interruptible_sleep_on(&waitQueue); Interruptible_sleep_on_timeout(&waitQueue, msecwait); void sleep_on(wait_queue_head_t *q) unsigned long flags; wait_queue_t wait; wait.flags =0; wait.task =current; current->state = TASK_UNINTERRUPTIBLE; add_wait_queue(q, &wait); schedule(); remove_wait_queue(q, &wait);

프로세스를깨우기위한함수 wake_up_interruptible(&waitqueue); wake_up(&waitqueue); 대기큐에저장된프로세스들을깨운다. #define wake_up_interruptible(x) wake_up((x),task_interruptible, 1)

소스분석 wait_queue_head_t waitqueue; // 인터럽트처리함수 void PRN_interrupt(int irq, void *dev_id, struct pt_regs *regs) // 잠든프로세스를깨운다. wake_up_interruptible(waitqueue);

// 어플리케이션에서 read 함수호출시호출됨 ssize_t PRN_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) unsigned char prnstat; int loop; // 프로세스를잠들어버린다. interruptible_sleep_on(&waitqueue); for(loop=0; loop<count; loop++) prnstat = inb(prn_address_status); put_user(prnstat, (char *)&buf[loop]; return count;

// 어플리케이션에서 open 함수호출시호출 int PRN_open(struct inode *inode, struct file *filp) // 인터럽트핸들러를등록한다. //linux/sched.h 에선언한다. if(!request_irq(prnsleep_irq, PRN_interrupt, SA_INTERRUPT, PRN_DEV_NAME, NULL)) outb(irq_enable, PRN_ADDRESS_CTRL); printk("interrupt Register OK... n"); MOD_INC_USE_COUNT; return 0;

// 어플리케이션에서 write 함수호출시호출 ssize_t PRN_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos) unsigned char c; get_user(c, (char *)buf); outb(c, PRN_ADDRESS); return 1; // 어플리케이션에서 close 함수호출시호출 int PRN_release(struct inode *inode, struct file *flip) // 인터럽트해제 outb(0x00, PRN_ADDRESS_CTRL); free_irq(prnsleep_irq,null); MOD_DEC_USE_COUNT; return 0;

// 함수구조체 struct file_operations PRN_fops = read : PRN_read, write : PRN_write, open : PRN_open, release : PRN_release, ; //insmod 에의해호출되는함수 int PRN_init(void) int result; init_waitqueue_head(&waitqueue); result = register_chrdev(prn_dev_major, PRN_DEV_NAME, &PRN_fops); if(result < 0) return result; return 0;

//rmmdo에의해호출되는함수 void PRN_exit(void) unregister_chrdev(prn_dev_major,prn_dev_name); module_init(prn_init); module_exit(prn_exit);