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 : 파일 포인터를 맨 끝으로 옮긴다.

Device Driver


Device DriverKernel Source 포함 시 요구사항
Device Driver module 추가해야 한다.
리눅스 부팅 시 Kernel에 모듈로 포함되기 때문에 Major번호를 정한다.
Kernel은 모듈 시작을 위해 자동으로 함수를 호출한다.
module_init( );
Kernel은 모듈 제거를 위해 자동으로 함수를 호출한다.
module_exit( );
make menuconfig를 통해 Kernel에 포함시키기 위해 Config.in파일에 추가해 주어야 한다.
Device Driver를 컴파일 해서 Kernel에 포함하기 위해서 Makefile을 수정한다.
 
Kernel에 포함시키는 방법
LED Device Driver 수정
Major 번호 지정 및 Kernel 자동 모듈 초기화 제거를 한 함수 추가한다.
LED Device DriverMajor번호를 243으로 고정
#define LED_MAJOR 243
Kernel이 자동으로 module_init를 통해 led_gpio_init을 이용해 초기화 한다.
module_init(led_gpio_init);
Kernel 종료 시 module_exit를 통해 led_gpio_shutdown을 이용해 Driver를 제거한다.
module_exit(led_gpio_shutdown);
수정 Code Kernel 폴더에 복사한다.
cp led_driver.c /root/linux-2.4.19-pxa255_pro2/drivers/char/
make menuconfig 메뉴에 나타내기 위해 Config.in 파일을 수정한다.
vi /root/linux-2.4.19-pxa255_pro2/driver/char/Config.in
파일을 vi로 열어서 아래 코드를 추가한다.
Bool ‘LED GPIO’ CONFIG_LED
make menuconfig를 통한 Kernel에 추가를 선택한다.
LED_GPIO항목이 추가되어 있다. 사용을 선택하고 나간다.
추가 내용을 확인한다.
vi /root/linux-2.4.19-pxa255_pro2/.config
파일 내용에서 CONFIG_LED 부분 검색하고 CONFIG_LED = y 확인한다.
led_driver.c파일을 컴파일 하여 Kernel에 포함한다.
vi /root/pxa255/linux-2.4.19-pxa255_pro2/driver/char/Makefile
obj-$(CONFIG_LED)를 검색하여
obj-$(CONFIG_LED) += led_driver.o 입력한다.
의존성 검사를 한다.
cd /root/linux-2.4.19-pxa255_pro2/
make clean;make dep
Kernel 이미지를 만든다.
make zImage

STEP MOTOR


STEP MOTOR
스텝 모터는 입력 펄스에 맞추어 일정 각도 단위로 회전하므로 펄스 모터라고도 하는데 일정 각도로 회전하므로 위치 정보를 궤환 시키지 않고 현재의 위치 정보를 알 수 있으므로 마이크로 마우스 등 간단한 이동 제어 시스템에 많이 사용 한다.
장점
- 펄스 신호에 따라 고정밀도로 정해진 각도까지 회전시켜 정지가 가능하므로 궤환 소자(엔코더, 포텐시오미터)가 불필요하여 제어가 쉽다.
- 디지털 신호형태로 직접 제어하므로 마이크로프로세서에 접속이 용이하다.
- 회전 오차 각이 누적되지 않는다.
- 정지할 때 큰 유지 토크(정지 토크)가 있다.
- 모터 브러시 등의 접속 부분이 없으므로 유지 보수 신뢰성이 좋다.
- 초 저속으로 높은 토크 운전을 할 수 있다.
단점
- 직류 모터에 비해 효율이 떨어진다.
- 관성 부하에 약하여 큰 부하가 걸리면 탈조 현상이 일어나기 쉽다.
- 특정 주파수에서 진동, 공진 현상이 발생하는 일이 있다.
- 무게에 비해 출력이 약하다.
 
STEP MOTOR의 구동 방식
Half Step Operation (1)
고정자의 1개 코일만을 차례로 전류를 흘려 회전자계를 만드는 방법이다. 이 방법에서는 회전자가 정지하는 위치가 고정자와 회전자가 일치하는 점이 된다. 이 방법은 효율은 좋으나 damping 특성이 나쁘기 때문에 일정한 펄스 비로 사용할 때에는 진동이 발생하기 쉽다.
Full Step Operation (2)
모터에 있는 2개 고정자의 코일에 동시에 전류를 흘리고 각 권선 사이에 발생한 자계를 이용하여 회전 시키는 방법이다. 이 방법에서 회전자의 안정점은 고정자의 사이에 있게 된다. 이 방법은 1상에 비해 2배의 입력신호를 필요로 하게 되어 효율은 저하되지만 damping 특성이 양호하므로 가장 널리 이용되는 방식이다.
Full Step Operation (1·2 )
1상과 2상을 교대로 행하는 것으로 1 펄스에 대한 스텝 각은 1상과 2상에 의한 스텝각의 반이 된다. 이를 하프 스텝이라 하며 만일 스텝 각이 3.6의 모터를 1-2상으로 구동 시키면 1.8의 스텝 각을 얻을 수 있는 것이다. 이 방법은 고 분해능을 요구하는 위치결정 제어에 사용될 수 있으며 진동과 소음을 줄일 수 있으나 스텝의 정확도는 떨어진다.
 
STEP MOTOR를 이용한 가속 구동
너무 빠른 가속은 탈조 현상을 일으키므로 낮은 속도로 일정의 Torque를 얻고 가속을 시작한다. 속도가 선형을 이루는 것이 가속에 가장 좋다.

2015년 5월 11일 월요일

TEXT LCD


LCD 구조
내부 구성
Text LCD 내부구조는 일반적으로 LCD 컨트롤러, LCD 드라이버, LCD패널, 백라이트로 구성되어 있다.
IR(Instruction Register) = 여러 기능을 제어하는 명령을 저장한 레지스터
DR(Data Register) = 글자를 나타내기 위해 데이터를 저장하는 레지스터
CG ROM(Character Generator ROM) = 표시할 문자 데이터를 저장하는 ROM
CG RAM(Character Generator RAM) = 문자코드를 실제 문자 폰트로 변환 하는 ROM
DD RAM(Display Data RAM) = 사용자 정의문자를 저장하는 RAM
레지스터 (Registers)
LCD 컨트롤러는 2개의 8비트 레지스터가 존재한다. , 인스트럭션 레지스터(IR) 와 데이터 레지스터(DR)인데 이들은 LCD모듈의 4번 핀인 RS(Register Select) 신호단자에 어떠한 신호가 인가되느냐에 따라서 선택된다.
IR(Instruction Register)
LCD화면 클리어, 커서 쉬프트, 글자 ON/OFFLCD의 제어명령 정보를 저장한다. DD RAMCG RAM의 표시를 위한 어드레스 정보를 저장한다.
DR(Data Register)
DD RAM혹은 CG RAM에 써넣기 위한 데이터를 저장하거나, DD RAM 혹은 CG RAM으로부터 읽어진 데이터가 일시적으로 저장되는 레지스터이다. CPU로부터 데이터 레지스터(DR)에 써넣은 데이터는 LCD의 내부적인 동작에 의해서 DD RAM 또는, CG RAM에 자동적으로 써넣어 진다. LCD로부터 데이터를 읽기 위해서 어드레스 정보를 명령 레지스터(IR)에 써넣으면 DD RAM 또는 CG RAM으로부터 DR에 내부적인 동작에 의해서 자동 저장되고, DR에 저장된 데이터가 CPU 로 읽어지게 된다.
 
Instruction의 종류
Instruction
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
표시 클리어
0
0
0
0
0
0
0
1
엔트리 모드
0
0
0
0
0
0
I/D
S
Cursor Home
0
0
0
0
0
0
1
X
표시 On/Off
0
0
0
0
1
D
C
B
Address Set
1
A6
A5
A4
A3
A2
A1
A0
커서 shift
0
0
0
1
S/C
R/L
X
X
Function Set
0
0
1
DL
N
FL
X
X
표시 클리어
LCD의 화면의 내용들을 클리어하고 나서 커서 위치는 홈(0번지)으로 돌아간다.
엔트리 모드
DB2번 비트가 1인 경우로서 커서의 움직이는 방향을 설정하거나, 글자가 표기된 표시부분(디스플레이)을 시프트 할 것인지를 결정하는 것이다. 또한 이들의 동작은 데이터 쓰기/읽기 동안에 수행된다. 이 명령이 실행되는 시간은 37μs 이 걸리므로 시간지연을 주어야 한다.
- I/D : D.D.RAM의 어드레스를 증가(증가:I/D =1) 혹은 감소(감소:I/D =0)를 결정한다.
- S : 글자가 표기된 전체 디스플레이를 오른쪽/왼쪽으로 이동시키기 위한 변수이다.
S=1, I/D =1 : 글자가 표기된 디스플레이는 왼쪽으로 시프트 한다.
S=1, I/D =0 : 글자가 표기된 디스플레이는 오른쪽으로 시프트 한다. (이때 커서위치는 변하지 않는다.)
S=0 : 글자가 표기된 디스플레이는 시프트 되지 않는다.
Cursor Home
LCD에 글자가 표기되는 밑 부분에 커서가 존재하는데 이 커서를 홈의 위치(0번지)로 돌아가게 하는 것으로 DD RAM의 내용은 변하지 않는다.(, 표시된 글자는 변하지 않는다.) 명령의 실행 시간은 1.52ms시간이 걸리므로 시간지연을 하여주어야 한다.
표시 On/Off Control
DB3번 비트가 1인 경우로서 전체 디스플레이(D)ON/OFF 제어, 커서(C)ON/OFF 제어, 그리고 커서위치에 있는 문자를 깜빡(B)이게 하는 기능을 한다.
- D : 글자가 표기되는 디스플레이를 ON/OFF하기 위한 변수이다.
D=1 이면 글자가 표기되는 디스플레이부분이 ON되어서 글자가 나타난다.
D=0 이면 글자가 표기되는 디스플레이부분이 OFF되어서 글자가 나타나지 않는다.
( 이때, 디스플레이부분의 글자 데이터가 DD RAM에 남아 있기 때문에 D=1로 하면 글자가 디스플레이 부분에 다시 나타난다. )
- C : 커서부분의 ON/OFF 제어하는 변수이다.
C=1 이면 커서가 나타난다.
C=0 이면 커서가 나타나지 않는다. (5×8의 문자 폰트의 경우 8행째에, 5×10도트 경우 11행째에 커서가 존재한다. )
- B : 커서의 위치에 있는 문자를 깜박이게 하는 변수이다.
B=1 이면 커서 위치의 문자를 깜박인다.
B=0 이면 커서 위치의 문자를 깜박이지 않는다.
Address Set
DB7번의 비트가 1인 경우로서 DD RAM의 어드레스를 설정하는데 이용된다. 어드레스의 설정 후 DD RAM의 데이터를 받거나 전송할 수 있다. DD RAM의 어드레스는 DB7~DB0 7비트까지 설정가능하며 이 번지가 설정되면 디스플레이 라인은 설정하는 N의 값에 따라서 번지가 결정된다.
(, N = 0 : ADD0x00 ~ 0x4F, N =1 : ADD0x00~0x27(첫 번째 라인) , 0x40~ 0x67(두 번째 라인)의 번지 값을 갖는다.)
커서 shift
B4번 비트가 1인 경우로서 DD RAM의 내용을 변화하지 않는 상태에서 커서를 움직이게 하고, 글자가 표기되는 디스플레이부분을 시프트 하기 위한 명령어이다. 이들의 기능은 S/C, R/L에 어떠한 값을 설정하느냐에 따라서 결정되어진다.
-S/C =0, R/L =0 : 커서는 왼쪽으로 이동한다.(어드레스 카운터를 -1 감소한다)
-S/C =0, R/L =1 : 커서는 오른쪽으로 이동한다.(어드레스 카운터를 +1증가한다)
-S/C =1, R/L =0 : 전체의 디스플레이와 커서를 왼쪽으로 쉬프트 한다.
-S/C =1, R/L =0 : 전체의 디스플레이와 커서를 오른쪽으로 쉬프트 한다.
Function Set
DB5번 비트가 1인 경우로서 LCD를 사용하기에 앞서 우선되어야할 LCD의 초기화를 설정하기 위한 명령을 나타낸다. 이 명령어가 설정하는 기능은 몇 비트로서 인터페이스를 할 것인지를 결정하는 데이터라인(DL), 글자를 표기하는 디스플레이의 총 라인수(N), 글자 폰트를 나타내기 위한 폰트(F)로서 구성되어져 있으며, 이 명령어가 실행되기 위한 시간은 37μs이다.
- DL : 몇 비트의 라인으로서 인터페이스를 할 것인지를 결정한다.
DL =1 이면 8비트(DB7~DB0)라인을 사용해서 인터페이스 할 수 있다.
DL =0 이면 4비트(DB7~DB4)라인을 사용해서 인터페이스 할 수 있다.
(이때는 상위 4비트의 데이터 전송을 하고, 다음에 하위 4비트의 데이터를 전송해야 한다. )
- N : 글자를 표기하는 디스플레이 라인의 수를 결정한다.
- F : 글자 폰트를 결정한다.
N
F
표시행수
문자폰트
듀티비
0
0
1
5X7 도트
1/8
0
1
1
5X10 도트
1/11
1
X
2
5X7 도트
1/16
 
LCD 구동(초기화)
Rs
R/W
DR
DB6
DB5
DB4
DB3
DB2
DB1
DB0
15ms 이상 delay
0
0
0
0
1
1
*
*
*
*
4.1ms 이상 delay
0
0
0
0
1
1
*
*
*
*
100us 이상 delay
0
0
0
0
1
1
*
*
*
*
0
0
0
0
1
1
N
FL
*
*
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
I/D
S