KEY 디바이스 드라이버 Lecture #12. 2 차례 GPIO 및 Control Registers KEY 하드웨어 구성 KEY Driver 프로그램 key-driver.c 시험 응용 프로그램 key-app.c.

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

임베디드 리눅스 시스템 (using EMPOS II)
키보드 보안 순천향대학교 정보보호학과 임강빈 교수.
제10장 디바이스 드라이버.
SOC 연구실 최지호 원천관 339-2호 ABEL 프로젝트 SOC 연구실 최지호 원천관 339-2호
마이크로프로세서설계 - 3 ATmega128 마이크로컨트롤러의 특징 LED 실습 1
Interrupt Programming in Linux
FND 디바이스 드라이버 Lecture #13.
5장. Enhanced Char Driver Operations 과제
다섯째날 : 외부 인터럽트 - 당근이의 AVR 갖고 놀기 - 당근닷컴
제 2장 컴퓨터 구조.
Understanding of Socket and File I/O
Smart IoT 설계 시스템 Lecture 07. 센서와 액츄에이터 실습.
FND 디바이스 드라이버 Lecture #11.
개발 환경 개발 환경 개요 PXA270과 타겟 시스템 툴체인 환경 구축 JTAG 유틸리티 미니컴 Make 유틸리티
Department of Computer Engineering
10장 주변장치 (PIO) Slide 1 (of 28).
DC Motor Control.
RnA DISPLAY 구동 Clcd 구동 Made by Bonobonobono.
임베디드 하드웨어 Lecture #6.
임베디드 프로그래밍 Lecture #
디바이스 드라이버 (Device Driver)
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버 응용 디바이스와 주소 디바이스 드라이버 구현 일반 LED 디바이스 드라이버 FND 디바이스 드라이버
디바이스 드라이버.
14. 입출력 다중화 김진홍
이식성과 데이터형 서로 다른 프로세서 상에서의 이식성을 위해 가급적 리눅스 커널이 제공하는 데이터형을 사용하는 것이 좋다.
PCI가 어렵울 거라는 생각을 지금부터 버리도록 합시다.
디바이스 드라이버 개요 가상 디바이스드라이버 실습
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
Linux System Programming
S3c6410을 이용한 리눅스 비디오 드라이버 포팅 가이드 – - Linux Video Driver Porting Guide Using s3c6410 – 박영만
MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성.
FND (Flexible Numeric Display)
Embedded System Porting (2)
GPIO Port 활용 디바이스 드라이버 Lecture #15.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
Department of Computer Engineering
Step Motor Device Driver
Input/Output Control.
Chapter 12. 직렬 통신과 무선 프로토콜.
(ioctl, mmap, fsync&flush)
커널 모듈 프로그래밍 (Kernel Module Programming)
Department of Computer Engineering
다섯째날 : 외부 인터럽트 - 당근이의 AVR 갖고 놀기 - 당근닷컴
HBE-SMIII-SV210 리눅스 커널과 디바이스 드라이버
전자의료시스템 및 실습 C-언어 구 환 경희대학교 전자정보대학 동서의료공학과.
adopted from KNK C Programming : A Modern Approach
문자 디바이스 드라이버 임베디드 시스템.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
8051 IO-PORT 정보통신•컴퓨터 공학부 송명규
네트워크 프로그래밍의 이해 School of Electronics and Information.
리눅스 디바이스 드라이버 (Linux Device Driver)
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
WinCE Device Driver 실습 #2
Stepper Motor 디바이스 드라이버
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
아두이노 프로그래밍 Lecture #
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
WinCE Device Driver 실습 #2
C.
임베디드 하드웨어 Lecture #6.
Lecture 7 7-Segment LED controller using u-controller
배열, 포인터, 함수 Review & 과제 1, 2.
임베디드 프로그래밍 Lecture #
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
Presentation transcript:

KEY 디바이스 드라이버 Lecture #12

2 차례 GPIO 및 Control Registers KEY 하드웨어 구성 KEY Driver 프로그램 key-driver.c 시험 응용 프로그램 key-app.c

3 GPIO(General-Purpose I/O) PXA255 processor 는 81 개의 GPIO pin 이 있음 GPIO 는 27 개의 제어 register 에 의하여 제어된다 set pin direction (GPDR0~2) read pin level (GPLR0~2) set or clear pin level (GPSR0~2, GPCR0~2) set rising/falling edge detection (GRER0~2, GFER0~2) edge detection (GEDR0~2) alternate function (GAFR_L0~2, GAFR_U0~2) 사용하지 않는 GPIO 는 output 으로 configure 하면 전력 소비를 줄인다

4 GPIO Control Registers (1) Pin Direction (GPDR) - 3 개 해당 GPIO 핀을 input 혹은 output 으로 사용할 것인지 설정함 0 이면 input 이고 1 이면 output 으로 설정됨 Pin Level (GPLR) - 3 개 해당 GPIO 핀의 현재 level 을 표시함 0 이면 low 이고 1 이면 high 임 Set or Clear (GPSR, GPCR) - 각각 3 개 해당 output GPIO 핀의 level 을 high 로 설정함. 1 이면 high 해당 output GPIO 핀의 level 을 low 로 설정함. 1 이면 low

5 GPIO Control Registers (2) Rising or Falling Edge (GRER, GFER) - 각각 3 개 해당 GPIO 핀의 동작을 지정함. 1 이면 rising edge 시 동작됨 해당 GPIO 핀의 동작을 지정함. 1 이면 falling edge 시 동작됨 Edge Detection (GEDR) - 3 개 해당 GPIO 핀의 동작을 감지함 1 이면 rising/falling edge 의 동작이 감지되었음을 표시 해당 bit 를 clear 하려면 그 bit 에 1 을 씀

6 GPIO Control Registers - 3/3 Alternate Functions (GAFR_L, GAFR_U) - 6 개 해당 GPIO 핀을 generic GPIO 핀으로 쓸 것인지 특정 기능을 위 한 핀으로 쓸 것인지 설정함 GPIO 설정 01 - 특정 기능 특정 기능 특정 기능 3

7 Key Switch - 하드웨어 구조 b 9 a

8 Key Encoder – 하드웨어 구조 74C922 chip (Key Encoder) 1. Key Switch 에 연결 2. Key 가 눌러지면 인터럽트 생성 2. 데이타 생성 (4bits) 3. 인터럽트는 GPIO 0 에 연결

9 Bidirectional Transceiver - 하드웨어 구조 4. 데이터 버스로 들어감 3. Key Encoder 에서 생성된 데이타

10 74C922 및 74LVT245 74C922 - Key Encoder KEY_ROW 1~3 과 KEY_COL 1~4 이 Key Switch(3x4) 에 연결 Encoding 된 값은 KEY_1~4 라인으로 출력 KEY_AVAL 라인은 PXA255 GPIO 0 와 연결 (interrupt 생성 ) 74LVT245 - Bidirectional Transceiver KEY_1~4 라인이 입력 DATA00~03 라인이 출력 출력 데이터는 데이터 버스를 통하여 물리 주소 0x 로 전 달

11 커널 Configure/Compile 현재 커널 이미지에는 key driver 가 포함되어 있기 때문에 key driver 프로그래밍을 실습하기 위해서는 커널의 "Character devices" 에 포함된 "KEY GPIO" 기능을 disable 하고 다시 컴파일 하여야 한다

12 Driver start Application start module_init() key_open() Key_read()read() open() Interruptible_sleep_on() key_handler() wakeup_interruptible() key_read() 함수 call waiting key interrupt waiting read() blocking read() waking Key Device Driver - 동작방식 key_open() 함수 call

13 set_GPIO_IRQ_edge() GPDR 을 통하여 GPIO 방향 설정 GAFR 을 통하여 alternate function 설정 함수로 GPIO detect 방향 설정 request_irq() 함수로 interrupt 등록 key_handler() 함수로 인터럽트 핸들러 구현 ioremap(), iounmap() 을 이용하여 물리주소로 access Key Device Driver – 커널 함수

14 #include // 모듈에 관한 정의 ex)MOD_INC_USE_COUNT #include // init_module() 과 cleanup_module() #include // udelay() #include // copy_to_user() #include // GPIO controller 에 관한 정의 #include // interrupt 에 관한 정의 key-driver.c: Header files

15 key-driver.c: 매크로 / 전역 변수 #define DEVICE_NAME "key" #define KEY_MAJOR242 #define KEY_ADDRESS0x static DECLARE_WAIT_QUEUE_HEAD(wq); static char *key_address; static char key_value;

16 /* Prototypes */ int init_module (void ); void cleanup_module(void); int key_open(struct inode *, struct file *); int key_release(struct inode *, struct file *); ssize_t key_read (struct file *inode, char *gdata, size_t length, loff_t *off_what); void key_handler(int irq, void *dev_id, struct pt_regs *regs); static struct file_operations key_fops = { open:key_open, read:key_read, release:key_release, }; key-driver.c: 함수 prototype 선언

17 key-driver.c : init/cleanup int init_module(void) { int i; if((i=register_chrdev(KEY_MAJOR,DEVICE_NAME,&key_fops))<0) return i; GPDR0 &=~(GPIO_0);// GPIO 0 은 input GAFR0_L &=~(0x3);// alternate function 을 generic GPIO 로 // GPIO 0 을 falling edge set_GPIO_IRQ_edge(0,GPIO_FALLING_EDGE); if((i=request_irq(IRQ_GPIO(0),key_handler,SA_INTERRUPT,"key ",NULL))<0) return i; return 0; } void cleanup_module(void) { unregister_chrdev(KEY_MAJOR,DEVICE_NAME); }

18 key-driver.c: open/release int key_open(struct inode *inode, struct file *file) { MOD_INC_USE_COUNT; return 0; } int key_release(struct inode *inode, struct file *file) { MOD_DEC_USE_COUNT; return 0; }

19 key-driver.c : read interrupt ssize_t key_read(struct file *inode, char *gdata, size_t length, loff_t *off_what) { interruptible_sleep_on(&wq); copy_to_user(gdata,&key_value,1); return 1; } void key_handler(int irq, void *dev_id, struct pt_regs *regs) { key_address=(char*)ioremap(KEY_ADDRESS,0x10); key_value=*(key_address)&0x0f; iounmap(key_address); wake_up_interruptible(&wq); }

20 시험 응용 프로그램 (key-app.c) #include int main(void) { int fd; char c; if((fd=open("/dev/key",O_RDONLY))<0){ fprintf(stderr,"can not open /dev/key\n"); return 1; } while(1){ read(fd,&c,1); printf("c=0x%x\n",c); if(c==0x00) break; } close(fd); return 0; }

21 Makefile all: key-driver.o key-app key-driver.o: key-driver.c arm-linux-gcc –O2 –Wall -D__KERNEL__ -DMODULE \ -I/root/pxa255pro/linux /include \ -c key-driver.c -o key-driver.o key-app: key-app.c arm-linux-gcc key-app.c -o key-app clean: rm -f key-driver.o key-app