Frame Buffer.

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

인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
TFT LCD 디바이스 드라이버.
01 화일의 기본 개념 02 화일 저장장치 03 화일 입출력 제어 04 순차화일 05 화일의 정렬 06 화일의 합병
Cross Compiler를이용한 커널 컴파일 및 포팅
Linux System Programming
Department of Computer Engineering
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버.
디바이스 드라이버 개요 가상 디바이스드라이버 실습
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
제2장. 파일 입출력 (File I/O) © 숙대 창병모.
Network Lab. Seoung Hyeon, Lee
Department of Computer Science and Engineering
조 병 규 Software Quality Lab. 한국교통대학교
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
HW#1 Source 파일 제출 3.20(수)까지 제출 학번_이름_01.c
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
Unix Project2 <test character device 생성>
Unix Project-Final <test character device 생성>
S3c6410을 이용한 리눅스 비디오 드라이버 포팅 가이드 – - Linux Video Driver Porting Guide Using s3c6410 – 박영만
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
FND (Flexible Numeric Display)
Department of Computer Engineering
Step Motor Device Driver
Root Filesystem Porting
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
DSP Lab. Week 3 My image Doug Young Suh Media Lab. Rm401
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
시스템 호출 read , write의 효율성 lseek test example – test1.c 실습 – 연습문제 2.8
Linux/UNIX Programming
Root Filesystem Porting
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
(ioctl, mmap, fsync&flush)
4장 파일.
임베디드 실습 # LED, 7’Segment 제어
6장 파일 및 레코드 잠금.
DK-128 실습 EEPROM 제어 아이티즌 기술연구소
프로그래밍 랩 – 7주 리스트.
14주차.
FILE I/O 번째주 Dept. of Computer Science & Engineering
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
Department of Computer Engineering
어서와 C언어는 처음이지 제14장.
문자 디바이스 드라이버 임베디드 시스템.
Raster Scan Display 1970년대 출현. TV기술에서 발달.
Linux Programming Spring 2008
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
Memory & Data Management.
LCD Controller Colorbar
24장. 파일 입출력.
리눅스 디바이스 드라이버 (Linux Device Driver)
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Stepper Motor 디바이스 드라이버
Linux/UNIX Programming
계산기.
Canary value 스택 가드(Stack Guard).
그래픽 메소드.
구조체(struct)와 공용체(union)
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
Department of Computer Engineering
06. 디바이스의 등록과 해제 김진홍
C.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
3장 파일 다루기 한빛미디어(주).
개정판 누구나 즐기는 C언어 콘서트 제12장 파일 입출력 출처: pixabay.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Frame Buffer

Frame Buffer를 이용한 Programming / Frame Buffer란 frame buffer란 linux system에서 그래픽을 표현할 수 있는 hardware를 말함. PC라면 그래픽 카드, Rebis같으면 LCD controller를 frame buffer 장치라고 함. frame buffer를 user level application이 제어할 수 있도록 만들어진 device driver를 frame buffer driver라고 함 The frame buffer device provides an abstraction for the graphic hardware. It represents the frame buffer of some video hardware and allows application software to access the graphics hardware through a well-defined interface, so the software doesn’t need to know anything about the low-level (hardware register) stuff. The device is accessed through special device nodes, usually located in the /dev directory, i.e. /dev/fb* The frame buffer devices are also normal memory devices, this means, you can read and write their contents. You can, for example, make a screen snapshot by cp /dev/fb0 myfile

LCD에 출력하는 원리 LCD에 출력하는 원리 User level에서 전송한 frame buffer data를 LCD driver가 수신하여 LCD controller가 TFT-LCD에 출력한다. User level과 driver간에 “/dev/fb0”라는 node를 통하여 data를 전송하며, driver가 할당한 memory를 user application에서도 사용할 수 있도록 memory mapping을 한다. User application TFT-LCD LCD driver (frame buffer driver) LCD controller (frame buffer) Frame buffer data 프레임버퍼 메모리에 해당정보를 써넣으면 클럭에 맞추어 LCD의 reflash에 DMA에 의해 행당 정보가 LCD로 전송되어 그림, 도형등을 표시한다.

LCD 정보 얻어오기 LCD 정보 얻어오기(1) 실습보드에 있는 TFT-LCD의 해상도와 할당된 메모리의 크기 등 lcd에 관한 정보를 얻어보자. 위의 정보들은 <linux/fb.h>에 정의 되어 있는fb_var_screeninfo 와 fb_fix_screeninfo라는구조체에 들어 있다. 알고자 하는 lcd 정보 x-resolution y-resolution x-resolution(virtual) y-resolution(virtual) bpp (bit per pixel) length of frame buffer memory

length of frame buffer memory에 LCD 정보 얻어오기 LCD 정보 얻어오기(2) #include<stdio.h> #include<stdlib.h> /*for exit*/ #include<unistd.h>/*for open/close..*/ #include<fcntl.h> /*for O_RDWR*/ #include<sys/ioctl.h> /*for ioctl*/ #include<linux/fb.h>/*for fb_var_screeninfo, FBIOGET_VSCREENINFO*/ #define FBDEVFILE "/dev/fb" int main(){ int fbfd; int ret; struct fb_var_screeninfo fbvar; struct fb_fix_screeninfo fbfix; x-resolution, y-resolution, x-resolution(virtual), y-resolution(virtual), bpp (bit per pixel) 에 대한 정보가 들어 있는 구조체 length of frame buffer memory에 대한 정보가 들어있는 구조체

LCD 정보 얻어오기 LCD 정보 얻어오기(3) fb_var_screeninfo 구조체 __u32 는 asm/type.h에 unsigned int로 정의 되어 있음.

LCD 정보 얻어오기 LCD 정보 얻어오기(4) fb_fix_screeninfo

LCD 정보 얻어오기 LCD 정보 얻어오기(5) fbfd = open(FBDEVFILE, O_RDWR); //frame buffer의 node인 /dev/fb 를 open if(fbfd<0){ perror("fbdev open"); exit(1); } ret = ioctl(fbfd, FBIOGET_VSCREENINFO, &fbvar); if(ret < 0){ perror("fbdev ioctl(FSCREENINFO)"); ret = ioctl(fbfd, FBIOGET_FSCREENINFO, &fbfix); Kernel로 부터 fb_var_screeninfo 정보를 가져올 때 쓰는 옵션, fbvar에 저장한다. Kernel로 부터 fb_fix_screeninfo정보를 가져올 때 쓰는 옵션, fbfix에 저장한다. FBIOGET_VSCREENINFO와 FBIOGET_FSCREENINFO는 linux/fb.h에 정의 되어 있음.

LCD 정보 얻어오기 LCD 정보 얻어오기(6) // x-resolution printf("x-resolutionnn: %d\n", fbvar.xres); //y-resolution printf("y-resolution: %d\n", fbvar.yres); //virtual x-resolution printf("x-resolution(virtual): %d\n", fbvar.xres_virtual); //virtual y-resolution printf("y-resolution(virtual): %d\n", fbvar.yres_virtual); //bpp (bit per pixel) printf("bpp: %d\n", fbvar.bits_per_pixel); //the size of frame buffer memory printf("length of frame buffer memory: %d\n", fbfix.smem_len); close(fbfd); exit(0); return 0; }

LCD 정보 얻어오기 LCD 정보 얻어오기(7) Host에서 위에서 배운 source를 fbinfo.c로 저장한 뒤에 아래와 같이 compile 한다. minicom이나 NFS 방식을 이용하여 target으로 fbinfo라는 실행 파일을 download한다.

TFT - LCD LCD에 점 찍기 LCD에 점 찍기(1) TFT-LCD 해상도 : 240 * 320 240 320 (0,0) (239,0) TFT - LCD (0,319) (230,319)

LCD에 점 찍기 LCD에 점 찍기(2) 보드의 LCD는 16bpp를 지원한다. 즉, 한 pixel를 표현하기 위해 16bit의 색 정보가 필요하다 MSB에서 LSB 쪽으로 R,G,B 순이다. 참고로 R=0,G=0,B=0은 black이며, R=255, G=255, B=255는 white이다. RED (5 bit) Green (6 bit) Blue (5 bit)

LCD에 점 찍기 LCD에 점 찍기(3) makepixel() 함수는 r,g,b 3개의 byte(0~255) 값을 받아서 16bit pixel 값을 만들어 내는 함수이다. unsigned short makepixel(ubyte r, ubyte g, ubyte b) { return (unsigned short)(((r>>3)<<11)|((g>>2)<<5)|(b>>3)); } 각 색별로 아래 3bit는 버린다. lseek() 함수를 사용하여 offset을 계산하여 점을 찍는다. offset=ypos*한줄의 바이트수 + xpos*한 픽셀당 바이트수 한픽셀당 바이트수=16/8(16bpp이므로.) 한줄의 바이트수=한줄의 픽셀 수 * 한픽셀당 바이트수=xres*(16/8) 결국 offset=ypos*xres*(16/8)+xpos*(16/8) (MSB)15 ~ 11 10 ~ 5 4 ~ 0(LSB)

LCD에 점 찍기 LCD에 점 찍기(4) lseek() : 파일 포인터 이동할 때 쓰는 함수 include <sys/type.h> include <unistd.h> 위 2 header file을 include해야 함. off_t lseek(int fildes, off_t offset, int start_flag); fildes : 읽고 쓰기 위한 파일 지시자 offset : 시작 위치에서 더할 바이트 수 start_flag : 시작지점 지정 off_t : typedef long off_t; start_flag SEEK_SET : 파일 포인터가 어디 있든지 맨 앞으로 옮긴다. SEEK_CUR : 현재의 파일 포인터를 유지한다. 즉, 현재의 파일 포인터에서부터 읽고 쓴다. SEEK_END : 파일 포인터를 맨 끝으로 옮긴다.

lseek (fd, (off_t)+100, SEEK_CUR) LCD에 점 찍기 LCD에 점 찍기(5) lseek (fd, (off_t)+100, SEEK_CUR) 현재의 위치 -100 +100 SEEK_SET SEEK_CUR SEEK_END

LCD에 점 찍기 LCD에 점 찍기(6) #include <stdio.h> #include <stdlib.h> /* for exit */ #include <unistd.h> /* for open/close.. */ #include <fcntl.h> /* for O_RDONLY */ #include <sys/ioctl.h> /* for ioctl */ #include <sys/type.h> /* for lseek() */ #include <linux/fb.h> /*for fb_var_screeninfo, FBIOGET_VSCREENINFO*/ #define FBDEVFILE "/dev/fb" typedef unsigned char ubyte; //색 정보를 16bit로 변환 해주는 함수 unsigned short makepixel(ubyte r, ubyte g, ubyte b){ return (unsigned short)(((r>>3)<<11)|((g>>2)<<5)|(b>>3)); }

LCD에 점 찍기 LCD에 점 찍기(7) int main(){ int fbfd; int ret; struct fb_var_screeninfo fbvar; unsigned short pixel; int offset; //frame buffer driver file point를 얻는다. fbfd = open(FBDEVFILE, O_RDWR); if(fbfd < 0){ perror("fbdev open"); exit(1); } // 커널로부터 lcd에 관한 정보를 fbvar에 저장한다. ret = ioctl(fbfd, FBIOGET_VSCREENINFO, &fbvar); if(ret < 0){ perror("fbdev ioctl");

LCD에 점 찍기 LCD에 점 찍기(8) if(fbvar.bits_per_pixel!=16){ //bpp가 16bit인지 check fprintf(stderr, "bpp is not 16\n"); exit(1); } //red 점을 (0,0)에 찍는다. if(lseek(fbfd, 0, SEEK_SET) < 0){ //file point를 맨 앞으로 옮김 perror("fbdev lseek"); exit(1); } pixel = makepixel(&fbvar, 255, 0, 0); /*red pixel*/ write(fbfd, &pixel, 2); /*write 2byte(16bit)*/ //green점을 (100,50)에 찍는다. offset = 50*fbvar.xres*(16/8)+100*(16/8); if(lseek(fbfd, offset, SEEK_SET) < 0){ //file point를 맨 앞에서 offset만큼 옮김 exit(1); } pixel = makepixel(&fbvar, 0, 255, 0); /*green pixel */

LCD에 점 찍기 LCD에 점 찍기(9) //blue점을 (50,100)에 찍는다. offset = 100*fbvar.xres*(16/8)+50*(16/8); if(lseek(fbfd, offset, SEEK_SET)<0){ //file point를 맨앞에서 offset만큼 옮김 perror("fbdev lseek"); exit(1); } pixel = makepixel(&fbvar,0,0,255); /*blue pixel */ write(fbfd, &pixel, 2);/*write 2byte(16bit)*/ //white점을 (100,100)에 찍는다. offset = 100*fbvar.xres*(16/8)+100*(16/8); if(lseek(fbfd, offset, SEEK_SET) < 0){ //file point를 맨앞에서 offset만큼 옮김 exit(1); } pixel = makepixel(&fbvar, 255, 255, 255); /*white pixel */ write(fbfd, &pixel, 2); /*write 2byte(16 bit)*/ close(fbfd); exit(0); return 0; }

LCD에 점 찍기 LCD에 점 찍기(10) Host에서 위에서 배운 소스를 fbpixel.c로 저장한 후 아래와 같이 compile한다. minicom이나 NFS 방식을 이용하여 target으로 fbpixel이라는 실행 파일을 download한다. target에서 실행하여 결과를 확인한다. % ./fbpixel