2015년 5월 19일 화요일

LCD Driver


LCD Driver
User level에서 전송한 frame buffer dataLCD driver가 수신하여 LCD controllerTFT-LCD에 출력한다. User leveldriver간에 “/dev/fb0”라는 node를 통하여 data를 전송하며, driver가 할당한 memoryuser application에서도 사용할 수 있도록 memory mapping을 한다.
Driver가 하는 역할
- 프레임버퍼를 위치시킬 외부메모리의주소와 LCD의 크기에 따른 프레임 버퍼의 메모리구간을 예약하는 일
- DMA에 프레임 버퍼의 포인터를 주어주는 일
- Passive인지 Active인지 설정하는 일
- Dither Logic을 설정하는 일
- LCD로 데이터를 보내기 위한 각 클럭과 시그널들의 타이밍을 설정하는 일
 
Frame Buffer
frame bufferlinux system에서 그래픽을 표현할 수 있는 hardware를 말한다. PC라면 그래픽 카드, PXA255같으면 LCD controllerframe buffer장치라고 한다. frame bufferuser level application이 제어할 수 있도록 만들어진 device driverframe buffer driver라고 한다.
 
LCD에 출력하는 원리
User level에서 전송한 frame buffer dataLCD driver가 수신하여 LCD controllerTFT-LCD에 출력한다. User leveldriver간에 “/dev/fb0”라는 node를 통하여 data를 전송하며, driver가 할당한 memoryuser application에서도 사용할 수 있도록 memory mapping을 한다.
 
LCD 정보 얻어오기
LCD정보들은 <linux/fb.h>에 정의 되어 있는 fb_var_screeninfofb_fix_screeninfo라는 구조체에 들어 있다. 필요한 정보는 다음과 같다.
X-resolution, Y-resolution, X-resolution(virtual), Y-resolution(virtual)
bpp(bit per pixel), Length of frame buffer memory
 
LCD에 점 찍기
PXA255-PRO 보드의 LCD16bpp를 지원한다. , pixel을 표현하기 위해 16bit의 색 정보가 필요하다.
RED (5bit)
Green (6bit)
Blue (5bit)
makepixel( )함수는 R , G , B 3개의 byte(0~255)값을 받아서 16bit pixel값을 만들어내는 함수이다.
unsigned short makepixel(ubyte r , ubyte g , ubyte b)
{
    return (usigned short)(((r>>3)<<11)|((g>>2)<<5)|(b>>3));
}
빨강, 파랑은 아래 3bit, 녹색은 아래 2bit 버린다.
(MSB) 15 ~ 11
10 ~ 5
4 ~ 0 (LSB)
lseek( ) : 파일 포인터 이동할 때 쓰는 함수이다.
include <sys/type.h>, include <unistd.h>
위의 두개의 header fileinclude 해야 한다.
ex) off_t lseek(int files , off_t offset , int start_flag);
files : 읽고 쓰기 위한 파일 지시자이다.
offset : 시작 위치에서 더할 바이트 수이다.
start_flag : 시작 지점이다.
off_t : typedef long off_t;
lseek( ) 함수를 사용하여 offset을 계산하여 점을 찍는다.
offset = Y_pos × 한줄의 바이트수 + X_pos × 한픽셀당 바이트수
pixel당 바이트 수 = 16 ÷ 8 (16bpp이므로)
한 줄의 바이트 수 = 한줄의 픽셀수 × 한픽셀당 바이트수 =X_res  × (16 ÷ 8)
결국 offset = Y_pos × X_res × (16 ÷ 8) + X_pos  × (16 ÷ 8)
start_flag
SEEK_SET : 파일 포인터가 어디 있든지 맨 앞으로 옮긴다.
SEEK_CUR : 현재의 파일 포인터를 유지한다. 즉 현재의 파일 포인터에서부터 읽고 쓴다.
SEEK_END : 파일 포인터를 맨 끝으로 옮긴다.

댓글 없음:

댓글 쓰기