FND 디바이스 드라이버 Lecture #11.

Slides:



Advertisements
Similar presentations
Wireless & Mobile Communication system LAB TinyOS 의 메시지 형식 및 자바 응용 프로그램들 조선대학교 정보통신공학과 변재영 본 자료는 한백전자 교육자료를 이용하여 제작되었음을 밝힙니다.
Advertisements

제10장 디바이스 드라이버.
제 3 장 변수와 자료형.
KEY 디바이스 드라이버 Lecture #12. 2 차례 GPIO 및 Control Registers KEY 하드웨어 구성 KEY Driver 프로그램 key-driver.c 시험 응용 프로그램 key-app.c.
패러럴 포트를 이용한 Text LCD 제어 6월 17일 허정수 나선웅.
FND 디바이스 드라이버 Lecture #13.
5장. Enhanced Char Driver Operations 과제
TextLCD 디바이스.
ARDUINO (센서활용프로그래밍/ICT융합실무) - 아두이노 활용 > 전자 주사위 제작
Cross Compiler를이용한 커널 컴파일 및 포팅
개발 환경 개발 환경 개요 PXA270과 타겟 시스템 툴체인 환경 구축 JTAG 유틸리티 미니컴 Make 유틸리티
08. 디바이스 드라이버의 읽기와 쓰기 김진홍
디바이스 드라이버 (Device Driver)
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버 응용 디바이스와 주소 디바이스 드라이버 구현 일반 LED 디바이스 드라이버 FND 디바이스 드라이버
디바이스 드라이버.
이식성과 데이터형 서로 다른 프로세서 상에서의 이식성을 위해 가급적 리눅스 커널이 제공하는 데이터형을 사용하는 것이 좋다.
디바이스 드라이버 개요 가상 디바이스드라이버 실습
7-Segment FND Controller 구현
Linux System Programming
Unix Project2 <test character device 생성>
MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
FND (Flexible Numeric Display)
Embedded System Porting (2)
GPIO Port 활용 디바이스 드라이버 Lecture #15.
AVR - Chapter 15 황 지 연.
Step Motor Device Driver
07. 디바이스 드라이버의 초기화와 종료 김진홍
4.1 함수(신호)발생기로 클럭펄스 만들기 ② ① - 신호발생기의 출력을 오실로스코프로 보면서 1 Hz 클럭펄스를 만든다.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
냉난방 시스템 설계 논리회로 설계 및 실험 텀 프로젝트 제안서 16조 김태광 정상훈.
임베디드 실습 # LED, 7’Segment 제어
WinCE Device Driver 실습 #3
WinCE Device Driver 실습 #2
HBE-SMIII-SV210 리눅스 커널과 디바이스 드라이버
프로그래밍 랩 – 7주 리스트.
제 3 장 상수와 변수
Microprocessor I/O Port & CLCD Noh Jin-Seok.
9. 아두이노를 이용한 FND 제어 - 스마트 폰으로 제어하는 아두이노 -.
임베디드 시스템을 위한 C프로그래밍 기법 3.7 ~ 4.5 장 Raphael.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
문자 디바이스 드라이버 임베디드 시스템.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
Device Driver 임베디드 시스템 I.
24장. 파일 입출력.
Chapter 4 MPEG-2 부호기 전체 구조와 알고리즘 ( 4.6 ~ 4.10 )
리눅스 디바이스 드라이버 (Linux Device Driver)
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
WinCE Device Driver 실습 #2
패러럴 포트를 이용한 Text LCD 제어 6월 17일 허정수 나선웅.
마이크로소프트 박종호.
2015년 2학기 PULSE 4 전자물리실험 13-카운터, 디코더, FND 회로 - DSU 메카트로닉스 융합공학부 -
Stepper Motor 디바이스 드라이버
02강 아두이노 LED 기본 개념 LED Example1 LED Example2 LED Example3
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
GM7 PLC 모니터링 프로그램 한국 폴리텍 항공대학 항공정보통신과 송 승 일.
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
DK-128 개발환경 설정 아이티즌 기술연구소
구조체(struct)와 공용체(union)
IO FND 소스분석 & 실행결과.
06. 디바이스의 등록과 해제 김진홍
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
WinCE Device Driver 실습 #2
4 LED 출력 LED 점멸 LED 밝기 조절 RGB LED로 색상 표현하기 FND 제어 4-digit FND 제어 Dot matrix 제어 Dot matrix를 이용한 애니메이션.
논리회로 설계 및 실험 8주차.
Presentation transcript:

FND 디바이스 드라이버 Lecture #11

차례 7-Segment FND 구동 원리 디바이스 드라이버 프로그램 시 필요한 함수 FND 디바이스 드라이버 fnd-driver.c FND 응용 프로그램 fnd-app.c FND 디바이스 드라이버 시험

Output Device – 발광다이오드(LED) LED(Light Emitting Diode) 화합물 반도체의 PN접합 다이오드로 양단에 전압의 차를 가하면 빛을 방출하는 발광소자 그림 (A)와 같이 2개의 다리가 나와있는데 긴 쪽이 애노드(+)이며 짧은 쪽이 캐소드(-)이다 약 2.5V정도의 전압차가 2개의 다리 양단에 걸리면 빛을 방출하는데, 보통 디지털소자의 출력이 5V이므로 그림 (B)와 같이 저항을 직렬로 연결하여 다이오드를 보호한다 그림 (A) 그림 (B)

Output Device – 7-Segment LED (1) FND 라고도 불리는데, 숫자나 문자를 표시하는데 사용되는 7개의 발광다이오드(LED)의 모임 공통 애노드(Common Anode) 형 :  다이오드의 애노드를 공통 단자로 사용한다 애노드 단자에 5V를 주고 캐소드의 각 단자 a~g 까지 0V를 주면 다이오드에 전류가 흐르게 되어 발광한다 다이오드의 파손 방지를 위해 저항을 연결 한다 Common Anode 형

Output Device – 7-Segment LED (2) 공통 캐소드(Common Cathode) 형 : 다이오드의 캐소드를 공통 단자로 사용한다 캐소드를 접지 시키고, 다이오드의 애노드 단자에 5V를 주면 전류가 흐른다 다이오드의 파손 방지를 위해 저항을 연결 한다 Common Cathode 형

Output Device – 7-Segment LED Array (1) Common Cathode 형 7-Segment LED 4 ARRAY 7-Segment LED 가 4개 병렬로 있는 것 공통단자가 캐소드형으로 com0, com1, com2, com3로 4개 있으며, 애노드 단자 a,b,c,d,e,f,g,dp는 공통으로 사용한다 LED를 제어하기 위한 전체 핀의 개수를 줄일 수 있는 장점이 있으나 컨트롤은 조금 복잡해진다

Output Device – 7-Segment LED Array (2) Common Cathode 형 7-Segment LED 4 ARRAY Com0=0, Com1=Com2=Com3=1인 경우, 입력 a,b,c,d,e,f,g중의 어느 하나가 1이면 가장 왼쪽에 해당되는 Segment LED가 발광한다

Output Device – 7-Segment LED Array (3) PXA255-FPGA Board – 7-Segment LED 6 Array

Output Device – 7-Segment LED Array (4) FND 포트의 물리 주소 0xC0000002 FND digit 및 segment 위치와 데이터 bit digit 부분(dig1~dig6)에는 0을, segment(a~dp) 부분에는 1을 write하면 주어진 digit의 segment에 불이 켜짐 보기) FND의 digit 3에 숫자 3(=segment abcdg)을 출력하려면 0xC0000002 번지에 0x4FFB을 출력하면 됨 FND dp g f e d c b a x dig6 dig5 dig4 dig3 dig2 dig1 bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Output Device – 7-Segment LED Array (5) FND를 이용한 데이터 표현 예: Common Cathod 단자 Anode 단자

PXA255-FPGA – FND 회로 구성 (1)

PXA255-FPGA – FND 회로 구성 (2)

PXA255-FPGA – FND 회로 구성 (3)

PXA255-FPGA – FND 회로 구성 (4)

디바이스 드라이버 프로그램 시 필요한 함수 get_user(void *x, const void *addr) 사용자 영역의 *addr의 값을 커널 영역인 x로 sizeof(addr) 만큼 복사 put_user(void *x, const void *addr) 커널 영역의 *x의 값을 사용자 영역인 addr로 sizeof(addr) 만큼 복사 copy_to_user(void *to, void *from, unsigned long size) 커널 영역의 from에서 size 만큼을 사용자 영역의 to로 복사 copy_from_user(void *to, void *from, unsigned long size) 사용자 영역의 from에서 size 만큼을 커널 영역의 to로 복사 I/O로 부터 값을 읽는 함수 __u8 inb(unsigned int port) __u16 inw(unsigned int port) __u32 inl(unsigned int port) I/O에 값을 쓰는 함수 void outb(__u8 data, unsigned int port) void outw(__u16 data, unsigned int port) void outl(__u32 data, unsigned int port)

매크로/전역 변수 (fnd-driver.c) #define IOM_FND_MAJOR 241 // fnd device major number #define IOM_FND_NAME "fnds" // fnd device name #define IOM_FND_ADDRESS 0xC000002 // fnd physical address static int fnd_usage = 0; static int fnd_major = 0; static unsigned short *iom_fnd_addr; static unsigned short value_digit[6];static int WaitQ_count = 0; static struct file_operations iom_fnd_fops = { open: iom_fnd_open, write: iom_fnd_write, release: iom_fnd_release, }; static struct tq_struct Task = { { NULL, NULL }, 0, iom_fnd_display, (void *)&value_digit[0], DECLARE_WAIT_QUEUE_HEAD(WaitQ_fnd); //wait queue declare

init/cleanup (fnd-driver.c) int init_module(void) { int result; result=register_chrdev(IOM_FND_MAJOR,IOM_FND_NAME,&iom_fnd_fops); if(result<0) return result; fnd_major=IOM_FND_MAJOR; iom_fnd_addr=ioremap(IOM_FND_ADDRESS,0x02); return 0; } void cleanup_module(void) if(WaitQ_count == 0){ WaitQ_count++; interruptible_sleep_on(&WaitQ_fnd); iounmap(iom_fnd_addr); unregister_chrdev(fnd_major,IOM_FND_NAME)

open/release (fnd-driver.c) int iom_fnd_open(struct inode *minode, struct file *mfile) { if(fnd_usage != 0) return -EBUSY; MOD_INC_USE_COUNT; fnd_usage = 1; return 0; } int iom_fnd_release(struct inode *minode, struct file *mfile) MOD_DEC_USE_COUNT; fnd_usage = 0;

write (fnd-driver.c) ssize_t iom_fnd_write(struct file *inode, const char *gdata, size_t length, loff_t *off_what) { const char *tmp = gdata; unsigned char value,cathode = 0xff; int i; unsigned char fnd_buff[5]; copy_from_user(fnd_buff, tmp, length); // 3 bytes received for(i=0; i<6; i++){ if(i%2) value=Getsegcode((fnd_buff[i/2]>>4)&0xf); else value=Getsegcode(fnd_buff[i/2]&0xf); value_digit[i]=(unsigned short)((value<<8)|(cathode&~(0x1<<(5-i)))); } queue_task(&Task, &tq_timer); // put in the task queue return length;

Getsegcode (fnd-driver.c) char Getsegcode(int x) { char code; switch (x) { case 0x0 : code = 0x3f; break; case 0x1 : code = 0x06; break; case 0x2 : code = 0x5b; break; case 0x3 : code = 0x4f; break; case 0x4 : code = 0x66; break; case 0x5 : code = 0x6d; break; case 0x6 : code = 0x7d; break; case 0x7 : code = 0x07; break; case 0x8 : code = 0x7f; break; case 0x9 : code = 0x6f; break; case 0xA : code = 0x77; break; case 0xB : code = 0x7c; break; case 0xC : code = 0x39; break; case 0xD : code = 0x5e; break; case 0xE : code = 0x79; break; case 0xF : code = 0x71; break; default : code = 0; break; } return code;

display (fnd-driver.c) void iom_fnd_display(void* value) { int i; unsigned short* tmp; tmp =(unsigned short* )value; for(i=0; i<6; i++){ outw(tmp[i],iom_fnd_addr); // fnd output udelay(1000); } if(WaitQ_count){ wake_up_interruptible(&WaitQ_fnd); outw(0x3f,iom_fnd_addr); // fnd turn off } else queue_task(&Task, &tq_timer); // task_queue에 다시 넣음

FND 응용 프로그램 (fnd-app.c) int main(int argc, char **argv) { int dev; unsigned buff; if((dev=open("/dev/fnds",O_WRONLY))==-1){ fprintf(stderr,"can not open /dev/fnds\n"); exit(1); } buff=(unsigned)strtol(&argv[1][0],NULL,16); write(dev,&buff,3); close(dev); return(0);

Makefile all: fnd-driver fnd-app fnd-driver: arm-linux-gcc -Wall -D KERNEL_-DMODULE \ -I/home/et1/lab-03/linux-2.4.19-pxa255_pro2/include \ -c fnd-driver.c fnd-app: arm-linux-gcc fnd-app.c -o fnd-app clean: rm -f *.o fnd-app

FND 디바이스 드라이버 시험 호스트에서 디바이스 드라이버 프로그램 fnd-driver.c 및 응용 프로그램 fnd-app.c를 컴파일 만들어진 디바이스 드라이버 fnd-driver.o 및 응용 프로그램 fnd-app를 테스트 장비로 download 아래 절차에 따라 시험: # mknod /dev/fnds c 241 0 # insmod ./fnd-driver.o # ./fnd-app 123456 # ./fnd-app 654321 ... # rmmod fnd-driver