전체적인 흐름분석도 벅차서 세부적인 코드분석은 하지 못했다..


Source Tree


 \arch\arm\cpu

각종 vendor별 CPU dependent Initialization code를 가진다.

 \arch\arm\cpu\arm7

entry point인 start.S 파일을 가진다. 

 \arch\arm\cpu\arm7
\exynos

 

 \arch\arm\include

cpu관련 c파일

 \board

각종 vendor별 board dependent Initialization code를 가진다.

 \board\samsung\wmdk5250

clock init, DMC init,.. 

 \common

 각종 명령어, user interface main routine, CLI

archtecture나 target board에 무관한 소프트웨어로 command구현되어 있다.

 \drivers

 각종 디바이스 드라이버를 가지고 있다. 

block , DMA, GPIO, I2C, input, MMC, MTD, net, PCI, RTC(real time clock dirver), serial,SPI, USB 등...

 \include

 u-boot header정보

 \include\config.mk

 컴파일 후 생성되는 파일로 보인다. ARCH, CPU, BOARD, VENDOR, SOC정보를 가짐.

 \include\configs\arndale5250.h

 보드에 대한 설정파일. 

 \lib 

 \net

 




부팅과정



SPL은 u-boot 의 기능 중 초기부분을 떼어서 만든거라고 봐도된다. 초기작업을 수행한 후 u-boot을 로딩한다. mcu에 따라 쓰는 것도 있고 안쓰기도 한다.


u-boot은 하드웨어 초기화를 수행한다음 최종적으로 kernel을 로딩한다.


출처 : http://processors.wiki.ti.com/index.php/The_Boot_Process




bootloader주요 기능


1. 하드웨어 초기화 : CPU clock ,Memory Timing, Interrupt, UART, GPIO등 초기화

코드상에서는 (lowlevel_init, board_init_f,board_init_r)  3가지 routine으로 분류하였다.

초기화라는 말이 상당히 추상적으로 들릴수도 있다. 짧은 지식으로 간단하게 말해보자면, cpu든 gpio든 ethernet이든 모두 구조체로 이루어져 있고, 이 구조체를 세팅해주는 작업이라고 하면 되려나?...


2. Image loading : flash memory에 있는 zImage, file system을 SDRAM으로 복사한다.


3. jump to kernel


전체적인 초기화 routine






임베디드관련 도서에서 u-boot의 흐름.
1. watch dog중지하고 interrupt disable을 수행
2. clock설정 :  PPL
3. 메모리 시스템 초기화
4. stack셋업 : c program을 위해서는 스택이 설정되어 있어야 한다.
5. IRQ, 예외처리 핸들러 설정, IRQ enable
6. C에서 사용되는 변수 초기화



arch\arm\cpu\armv7\start.S


reference : http://blog.naver.com/PostView.nhn?blogId=pjsin865&logNo=120108264029

위의 블로그를 가면 상세한 start.s를 볼 수 있다.





lds파일에 따르면, u-boot의 entry point는 _start 이다.
_start는 0x0번지에 위치하며, 가장 먼저 vector table를 세팅한다.

cpu_init_cp15를 호출한다. :  * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless
 * CONFIG_SYS_ICACHE_OFF is defined.
disable MMU stuff and caches

board\samsung\smdk5250\lowlevel_init.S

start.S의 CPU_init_cirt는 lowlevel_init.S에 있는 lowlevel_init procdure를 호출한다.
(lowlevel_init은 2군데 있음. 진작 makefile 봤으면 쉽게 알았을탠데..)

ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP44XX) $(CONFIG_OMAP54XX)$(CONFIG_TEGRA20),)
arch\arm\cpu\armv7\lowlevel_init.S

board\samsung\smdk5250\lowlevel_init.S


-arch_timer_init[board\samsung\smdk5250\ ]
-tzpc_init[board\samsung\smdk5250\ ]
TZPC[TrustZone Protection Controller] 을 설정한다.
-monitor_init[board\samsung\smdk5250\ ]
-system_clock_init[board\samsung\smdk5250\ ]
 system clock 을 초기화한다.
-mem_ctrl_init[board\samsung\smdk5250\ ]
memory를 초기화한다.

arch\arm\cpu\armv7\start.S




ram상에 stack pointer를 설정.
board_init_f 호출한다.  
start.S 수행 종료됨.


arch\arm\lib\board.c 의 board_init_f 함수

board_init_f 역시 2군데 있음
arch\arm\lib\board.c 
board\samsung\smdk5250\Mmc_boot.c (ifdef CONFIG_SPL_BUILD) : u-boot호출하는 함수.


위 그림의 init_sequence에 있는 init함수를 수행한다.
DRAM bank사이즈 초기화,
dram config 설정 등을 수행.
start.S의 relocate_code함수 호출.


arch\arm\cpu\armv7\start.S 의 relocate_code procedure


u-boot을 ram으로 옮긴다.
마지막에  arch\arm\lib\board.c의 board_init_r 을 호출한다. 


arch\arm\lib\board.c 의 board_init_r함수

enable_caches, 
board_init : boot mode를 확인한다. 
gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
serial_initialize : s5p_serial_initialize in drivers\serial\serial_s5p.c
logbuff_init_ptrs
post_output_backlog
mem_malloc_init : 특정 영역의 메모리를 memset해준다. 근데 그 특정 영역이 DRAM에서 monitor copy??
arch_early_init_r
flash_init
nand_init
onenand_init
mmc_initialize: exynos_dwmci_init [drivers\mmc\exynos_dw_mmc.c] 함수를 호출한다.
AT91F_DataflashInit
env_relocate
arm_pci_init
stdio_init : 다시 다양한 init을 수행한다.
jumptable_init
api_init,
console_init_r.....등 다양한 위치에 있는 각종 init함수들을 호출한다.
arch_misc_init
misc_init_r
interrupt_init
enable_interrupts
board_late_init : mac주소를 ethaddr, usbethaddr에 등록한다.
bb_miiphy_init
eth_initialize : eth_device초기화
post_run
main_loop : 최종적으로 common\main.c의 main_loop함수로 이동.



common\main.c


하드웨어 초기화는 모두 완료되었다.

main loop는 사용자의 입력을 parsing하고, 해당 명령어를 수행한다.

최종적으로 kernel을 로딩한다.


http://www.crashcourse.ca/wiki/index.php/U-Boot_command/file_reference

위의 wiki에서 u-boot의 command확인가능하다.


dhcp는 boot image via network using DHCP/TFTP protocol

nfs는 boot image via network using NFS protocol

dcache는 enable or disable data cache 







출처 : http://jianna6.tistory.com

가) H/W 파악 Device Driver 점검

어떤핀이 어떤 소자에 연결되어있는지 CPU의 레지스터들은 어떤 존재하고, 어떻게 설정해야하는지, 화면출력은 어떤 디바이스를 통해서 하는건지 , 해상도는 어떤지 방식이며 무엇인지 어떤 디바이스들이 연결되고 드라이버는 있는지없는지 디바이스와 CPU가 연결된 방식은 무엇인지 먼저 H/W를 점검한다.


나) 레퍼런스 보드로 관련자료 수집 (회로도,데이터시트,검증된 BSP 등)

포팅하려는 OS가 이미올라간 보드의 회로도와 os관련 자료(bsp)를 확보하는 일이다. 이것을 확보하게 된다면 레퍼런스 보드와의 공통점과 차이점만 밝히면서 쉽게 포팅작업을 진행할수 있다.


다) BSP 포팅 (bootloader, kernel, file system)

Bootloader, kernel , filesystem 등을 Image,바이너리로 지원해주지 않는다면 BSP를 만들 Builder를 사용해야합니다. 참고로 Freescale Imx6 quad SABRE SD 보드에 필요한 BSP를 LTIB(Linux Target Image Builder)를 사용해서 u-Boot.bin, uImage 등을 만들어냈다. SD Card를 메모리로 사용하기때문에 dd 명령어로 부트로더와 커널이미지를 복사한후 file system를 세팅해서 마무리 지었다.


라) 각종 드라이버 (LCD)등에 대한 포팅

포팅과정중에 흔하게 수정하는것이LCD, GPIO등이다. LCD의 종류를 알지못해서 드라이버가 없는경우도 있어 수정 및 작성으로 새로 만들어야하는경우도 있지만 표준 VGA를 통해서 처리할수도있습니다. GPIO라 불리는 핀들은 General Perpose IO라 하여 범용으로 쓰이는 IO핀들이다. 번용이다보니 붙는 위치도 개수도 다양합니다. 그리고 레퍼런스에 없는 디바이스 드라이버는 따로 제작을 해야합니다.


마) 디버깅

OS를 만들었다면 돌려보고 프로그램도 구동하면서 문제가없는지 확인해야합니다.

U-Boot & 부트로더의 이해

부트로더는 시스템을 초기화하고 운영체제를 탑재하거나 실행하기 위해 시스템 초기화코드, 하드웨어 제어 프로그램, 네트워크, USB등의 프로토콜과 일부 파일 시스템을 관리한다.(BIOS와 비슷하다)



1.1 부트로더의 역할


(1) Target 초기화

전원이 입력되면 하드웨어와 소프트웨어 환경을 설정한다.

불필요한 하드웨어의 동작 중지, 시스템 클록 설정, 메모리 제어기 설정, MMU/MPU 설정 등

하드웨어 설정이 완료된 후 실제 프로그램 동작에 필요한 재 배치와 스택 영역 설정 및 C에서 사용하는 변수 영역을 설정하고 C로 작성된 함수를 호출 한다.


(2) Target 동작 환경 설정

BIOS CMOS 설정과 유사하다.(부트 방법, 네트워크 설정, IP 주소 설정 등)


(3) 시스템 운영체제 부팅

임베디드 시스템의 운영체제는 플래시 메모리에 탑재되어 있으므로 부팅시 주메모리에 탑재한 후 실행됨.

부트로더는 플래시 메모리에 있는 OS DRAM에 복사하고 제어권을 OS의 시작점으로 넘겨주는 기능을 함.


(4) 플래시 메모리 관리

보통 플래시 메모리에는 OS이미지와 부트로더가 탑재된다.


(5) 모니터 기능

시스템의 동작 상태 감시, 하드웨어 정상 동작 여부 검사, 메모리 검사와 POST(Power-On Self Test) 등의 기능


1.2 부트로더의 특징

부트로더는 하드웨어 의존성이 강하다.

부트로더를 작성하려면 프로세서의 구조와 특징 및 사용법을 알아야 한다.

부트로더의 시작 부분은 어셈블리어로 작성되기 때문에 명령어 사용법을 알고 있어야 한다.

플래시 메모리의 부트 섹터에 저장되어 유지되므로 크기가 작아야 한다.

좋은 오픈소스가 많으니 오픈 소스 부트로더를 사용하자.


1.3 부트로더의 종류

LILO, GRUB, Loadlin, EtherBoot, Blob, PMON, RedBoot, U-Boot

 

U-Boot 빌드와 설치

U-Boot는 다양한 기능을 가지는 부트로더로 하드웨어 초기화, 하드웨어 검사, 소프트웨어 다운로드 및 실행, 플래시 메모리 관리, 운영체제 부팅등의 기능을 제공한다.

U-Boot는 리눅스와 유사한 구조를 가지고 있으며, 일부는 리눅스 소스를 사용했다.


2.1 U-Boot 소스 설치

ftp://ftp.denx.de/pub/u-boot

소스를 받아 개발하고자 하는 보드에 맞게 포팅해야 한다.


2.2 U-Boot 소스 구성

u-boot top : U-Boot의 최상위 디렉토리. Makefile, board.cfg 등의 주요 파일을 가지고 있으며, 모든 U-Boot의 빌드 동작을 실행하는 디렉터리

arch : arm, mips, powerpc 등 프로세서 아키텍처별로 서로 다른 디렉터리를 구성하고 있다. 각 아키텍처에 따른 소스를 구성하는 디렉토리.

board : 각 제조사별 보드 관련 소스를 구현하는 디렉토리

common : U-Boot에서 공통적으로 사용되는 소스를 구현하는 디렉토리.

disk : DISK를 관리하기 위한 소스

doc : U-Boot 관련 문서를 가지고 있는 디렉토리

drivers: U-Boot에서 지원되는 다양한 장치들에 대한 드라이버를 구현한 디렉토리

examples : U-Boot에서 독립적으로 프로그램을 실행시키는 샘플코드를 포함한 디렉토리

fs : U-Boot에서 지원하는 다양한 파일시스템에 대한 소스를 구현한 디렉토리

include : U-Boot에서 사용되는 헤더 파일을 정리한 디렉토리. 특히 configs 디렉토리는 보드별 동작에 필요한 설정 헤더 파일을 가지고 있음

lib : U-Boot에서 사용되는 각종 라이브러리를 구현한 디렉토리

net : U-Boot에서 지원되는 UDP, IP, TFTP 등 네트워크 프로토콜을 구현한 디렉토리

post : POST를 구현한 디렉토리

tools: U-Boot 사용에 필요한 각종 호스트 유틸리티를 구현하는 디렉토리

 

2.3 U-boot 포팅에 필요한 디렉토리 및 소스 구성

u-boot top/Makefile : 빌드용 Makefile

/board.cfg : 지원되는 보드에 대한 각 옵션. 타겟 이름, 이키텍쳐, CPU, 보드이름, 벤더, SoC

arch/arm/config.mk : ARM 아키텍처에 대한 크로스 컴파일러 및 빌드 옵션을 지정함.

/cpu :  ARM 프로세서 디렉토리를 구현함

/include : ARM 프로세서 및 타겟 SoC 관련 헤더를 정의함

/lib : ARM 프로세서에서 일반적으로 사용되는 기능을 라이브러리로 구현함

board/samsung/dtk4412 : DTK4412 타겟 보드용 소스가 구현됨. 프로그램이 탑재되는 메모리의 위치 및 메모리의 배치를 지정하는 파일을 가지고 있음.

board/ti/beagle : beagle 보드에 대한 파일을 구현

drivers/block : 블록 디바이스 드라이버를 구현함

/mmc : mmc 드라이버를 구현

/mtd : NAND, OneNAND 등 메모리 장치를 블록 디바이스로 사용하기 위한 MTD 드라이버를 구현함.

/net : 각종 네트워크 장치 드라이버를 구현

/serial : 시리얼 디바이스 드라이버가 구현되어 있는 디렉토리.

/usb : usb 장치 드라이버를 구현

/..... : 기타 장치 드라이버가 있음

include/configs/dtk4412.h : configs/dtk4412.h 파일은 대상 보드가 동작하기 위한 각종 하드웨어 및 소프트웨어 설정값을 가짐. U-Boot를 포팅하는데 있어 매우 중요한 정보를 가짐.


U-Boot 포팅

3.1 U-Boot 포팅에 필요한 소스 및 타겟

u-boot top/boards.cfg, arch/arm/cpu, arch/arm/include, board/samsung/dtk4412, driver/mmc, driver/net, driver/serial, driver/usb, include/configs/dtk4412.h


3.2 U-Boot 초기화 동작의 이해

U-Boot는 시스템 리셋 키가 입력되거나 전원이 인가되면 실행되는 부트 코드 이다.

일반적으로 부트코드가 NOR 플래시에 저장되어 사용되는 경우 바로 플래시에서 동작하게 구현할 수 있다.

하지만, 대부분의 시스템은 NAND플래시나 SD/MMC와 같은 장치에 저장되어 있다. 이런 경우,대부분 저장장치의 부트코드를 실행 가능한 주 메모리(DRAM)으로 복사한 후 실행한다.

주메모리 초기화는 초기 설정이 필요없는 칩 내부의 SRAM에서 담당한다. 하지만 SRAM에 비해 U-Boot 코드가 상당히 크기 때문에 모든 코드를 SRAM으로 복사해서 사용할 수 없다. 따라서 클록이나 메모리 장치 초기화를 담당하는 코드와 메인 부트로더 코드를 복사하는 코드를 SRAM에 복사하여 사용한다. 이후 나머지 부트로더 코드를 복사하여 사용한다. 이에따라 BL1과 주U-Boot 코드로 나뉜다.


U-Boot 사용하여 시스템이 부팅되는 과정

전원인가 또는 리셋신호 구동 후 내부 ROM 코드 BL0 실행

BL0에서는 외부 핀 OM(Operating Mode)에 따라 부트 디바이스 선택

선택된 부트 디바이스의 초기 부트코드(BL1)을 내부 SRAM에 복사

SRAM BL1에서 U-Boot 부트 코드를 DRAM에 복사

제어권을 복사된 DRAM U-Boot 영역으로 변경, 변경 후에는 U-Boot 코드 실행


Exynos4412 U-Boot 소스는 어셈블리 파일 arch/arm/cpu/armv7/start.S로부터 시작된다. 이 파일의 앞부분에는 ARM 프로세서의 예외 처리 벡터가 있고 처음 시작은 reset 핸들러로 분기하여 실행된다. reset 핸들러는 SVC32 모드로 전환하고, 캐시 및 MMU의 사용을 중지한 다음에 보드 초기화를 실행한다.

 

 




원문 : ARM으로 배우는 임베디드 리눅스 시스템

■ S3C2443 지원 리스트 
▪ S3C2443의 LCD 컨트롤러는 시스템 메모리의 비디오 버퍼에서 외부의 LCD 드라이버에 LCD 이미지 데이터를 전송하는 로직으로 구성 
▪  LCD 컨트롤러 
   수평/수직 픽셀, 데이터 라인 너비, 인터페이스 타이밍, 리프레쉬 비율과 관련된 스크린 상에 요구되는 기능 지원 프로그래밍이 가능

 

 


■ OVERVIEW 
1. 2가지의 인터페이스 지원 
  (1) RGB Interface
  (2) i-80 System Interface


2. 디스플레이 컨트롤러 지원 내역 
  (1) 2 overlay Image
  (2) 다양한 컬러 포맷 
  (3) 16 단계 알파 블랜딩 
  (4) 컬러 키 
  (5) x-y 축 포지션 컨트롤 
  (6) 소프트 스크롤링 컨트롤 
  (7) 윈도우 크기 변경 등

 

 


■ LCD SUB BLOCK DISCRIPTION (ARM920T BUS INTERFACE)
- AHB (Advanced High-Performance Bus)

 

 

 

■ LCD SUB BLOCK DISCRIPTION (LCD CONTROLLER STRUCTURE)

 

 


1. VSFR
  ▪ 71개의 프로그래밍 레지스터 블록 / 2개의 256x25 Palette Memory 설정 가능


2. VDMA
  ▪ Frame Buffer에 저장 되어 있는 비디오 데이터를 VPRCS로 DMA 방식 전송 담당


3. VPRCS
  ▪ VDMA로 부터 받은 비디오 데이터를 LCD (Device)로 전송 
  ▪ 전송 전 적합한 데이터 포맷으로 변환 
  ▪ 전송 데이터 포트 : RGB_VD, VEN_VD, SYS_VD


4. VTIME
  ▪ Timing Checking 담당

 

 

 

 

■ S3C2443 – LCD Interface (RGB Interface)
* RGB Interface Signal

- SYNC 신호 제어 가능, 일반적인 R,G,B 인터페이스로서 사용자 제어 용이 
(1) RGB Data Signal
(2) Vertical / Horizontal Sync Signal
(3) Data Valid Signal
(4) Data Sync Clock Signal

 

 

 

 

 ■ S3C2443 – LCD Interface (CPU Interface)


* CPU Interface Signal (i80 – System Interface) 
-SYNC 신호 제어 불가능, 별도의 신호 셋팅 없이  Video Mux에서 모든 신호를 관리하며, 단순 Chipset 제어만 거침 
(1) Address Signal
(2) Data Signal
(3) Chip Select Signal
(4) Register / Status Indicating Signal

 

 

 

■ S3C2443 – PIN MAP (RGB Interface)

 

 

■ S3C2443 – Register Setting
* Register Option : Eboot 및 Kernel 단, Driver 단 에서 설정하게 되는 레지스터 설명

 

 

 

■ S3C2443 – Display Driver Structure & Description


 

(1) Eboot 내부 main.c – InitDisplay 함수 (Eboot Entry Point)
  * Eboot 상 LCD 구동을 위한 디스플레이 셋팅 목적 함수 
  * Eboot 단에서 관련 레지스트 셋팅이 LCD Module 과 SYNC 동작하게 되면 Eboot 단 로고 확인 가능

 

(2) Kernel 내부 Init.c – InitDisplay 함수(Kernel Entry Point)

  * Eboot 상에 존재하는 main.c와 동일 한 목적으로 작성 (디스플레이 셋팅 목적)
  * Kernel 단에서 관련 레지스트 셋팅이 LCD Module 과 SYNC 동작하게 되면 Window CE 진입 시 화면 동작 확인 가능(

 

(3) 참조 Header File 정보 
  * src/inc 디렉토리에 존재하는 display.h 헤더파일 참조 (레지스터 셋팅값의 대부분이 이 헤더파일 상에 정의 - 필수)
  * Local 헤더파일 참조하면 Error / 반드시 INC 전역 헤더파일 참조해야 LCD 레지스터 값이 적용이 됨 
    (Eboot 단 및 kernel 단 레지스트 셋팅을 동기화하기 위하여 inc 공용 헤더파일 측을 수정해야 함)
  * Eboot 단에서 레지스트 셋팅이 완료되어 Eboot LCD 동작을 확인 하여도, Kernel 단 셋팅이 틀어지면 CE상 동작 불가

 

(4) src/drivers/Display/S3C2443DISP.cpp – 드라이버 단 소스 파일 
  * Kernel 단에서 모든 동작 관련 셋팅 정의가 되며, 본 소스 파일 상에서는 GWES 기반의 동작 정의 
    (화면 회전 / 블랜더 효과 등 Application 기반의 동작 환경 설정이 가능)
  * src/inc 디렉토리에 존재하는 s3c2443_lcd.h 헤더파일 참조 
    (드라이버 단 동작 정의가 아닌 GWES 기반의 Application 동작 중 필요한 사이즈 및 기타 컬러 옵션 설정 가능)

 

 

 

-----------------------------------------------------------------------------------------------------------




S3C6410 PIP 동작구조 

 

 

S3C6410 PIP의 화면의 위치 선정

 

 

 

---------------------------------------------------------------------------------------------------


S3C6410의 Image Rotator 동작 구조

 

 S3C6410 Image Rotator 동작 원리

 

 

-----------------------------------------------------------------------------------------------------------


 

 

 

-----------------------------------------------------------------------------------------------------------

 

 

<S3C6410의 Overlay 및 Color Key 동작원리>

 

 

 

 

<S3C6410 Frame Buffer>

 

■ S3C6410의 프레임 버퍼 공간

   ◆ S3C6410에서는 기본적으로 Window 1Layer만 사용하여 화면 출력

   ◆ 각 Layer의 Size = 480 X 272 X 2(16/8)

                               = 255 Byte

   ※ 12MB 확보이유 : Post Processor 및 Rotator 등의 여러가지 출력 FrameBuffer와 공용 사용

 

 

 

  

-----------------------------------------------------------------------------------------------------------

 

■ NTSC

 - 초당 29.97 개의 비월 주사된 비디오 프레임으로 이루어짐
 - 각 프레임은 전체 신호인 525 라인 중에서 480 라인으로 구성되며 나머지는 동기 신호나 수직

    귀선 및 자막과 같은 다른 데이터의 전송을 위해 쓰인다
 
■ BT656 (ITU656)

 - 압축되지 않은 PAL 또는 NTSC 표준 화질 텔레비전을 스트리밍하기 위한 단순한 디지털 영상

    프로토콜을 정의
 - BT.656 스트림은 27 MHz 로 동작하는 픽셀 클럭 신호에 따라 동시에 8 비트를 병렬로 전송

 

■ Composite (Video)

 - 색 신호와 휘도 신호를 동시에 혼합
 - 일반적으로 노란색의 출력 단자
 - 음성선 2개와 붙어있는 것을 합쳐서 말하기도 하지만 정확히는 노란 영상선만을 의미
 - 구성 재질은 동축 RCA 케이블이며, 전송 가능한 최대 해상도는 NTSC (480i)
 - 아날로그 케이블 중에서도 화질은 최저수준
 - 서로 상이한 신호를 혼합해 표현하기 때문

 

■ S-Video (Video)

 

 - 화질 개선을 위하여 색 신호와 휘도 신호를 서로 분리
 - S-Video의 앞 굴자 S는 Separate의 약자
 - Y/C Connection이라 명칭 (Y = 휘도 정보, C = 색 정보)
 - 480i 해상도 전송 가능
 - Composite 방식에 비해 고화질

 

 


-----------------------------------------------------------------------------------------------------------



< WMB2443 Board의 NTSC와 RGB I/F 동시 출력 구조 >

 

1. S3C2443의 LCD Controller에서 640 X 480의 RGB I/F 로 출력

2. 640 X 480 Image를 TV Endoer 입력과 LCD 출력으로 분기

3. TV Encoder에서 입력된 RGB I/F 영상을 Scaling과 RGB to NTSC 처리과정 후 모니터에 출력

 

 

-----------------------------------------------------------------------------------------------------------



< S3C6410의 Post Processor를 이용한 PIP 기능 동작구조 및 원리 (Direct Mode) >

 

 

■ Preview Path를 통한 YCbCr420 Format 입력된 영상이 Preview DMA 을 통해 Camera Frame Buffer에 저장 (RGB)

 

■ Post Processor 를 사용하지 않고 LCD Window 0 Frame Buffer에 저장 (RGB565)

 

■ Display Controller에서 두 영상을 Overlay 하여 LCD로 출력

 

 

 

 

-----------------------------------------------------------------------------------------------------------


< S3C6410의 Post Processor를 이용한 PIP 기능 동작구조 및 원리 (FIFO Mode) >

 

 

■ Preview Path를 통한 YCbCr420 Format 입력된 영상이 Preview DMA 을 통해 Camera Frame Buffer에 저장 (RGB)

 

■ Post Processor에서 Source Image를 Scale 및 Video Fomat / 색 공간 변환 후 Display Controller Window 0 FIFO로 전송

 

■ Display Controller에서 두 영상을 Overlay 하여 LCD로 출력

 

 

 

 

-----------------------------------------------------------------------------------------------------------



 < S3C6410의 Post Processor를 이용한 PIP 기능 동작구조 및 원리 (DMA Mode) >

 

 

■ Preview Path를 통한 YCbCr420 Format 입력된 영상이 Preview DMA 을 통해 Camera Frame Buffer에 저장 (RGB)

 

■ Post Processor에서 Source Image Address를 Camera Frame Buffer 주소로 설정,

    Destination Image Address를 LCD Frame Buffer Window 0 Frame Buffer로 설정

 

■ WinCE의 Defalut 출력인 Window 1 Frame Buffer의 Image와 카메라의 영상이 저장된 Window 0 Frame Buffer를

    DMA를 이용하여 LCD 측으로 전송

 

■ Display Controller에서 두 영상을 Overlay 하여 LCD로 출력

 

  

-----------------------------------------------------------------------------------------------------------


■Porch 값의 의미                                                                       

- Vertical Back Porch (VBP)                  : 수직 신호 출력 대기 시간

Vertical Front Porch (VFP)                  : 수직 신호 출력 후 대기 시간

Vertical Sync Pulse Width (VSPW)      : 수직 신호 High Level 유지 시간

Horizontal Back Porch (HBP)            : 수평 신호 출력 대기 시간 

- Horizontal Front Porch (HFP)            : 수평 신호 출력 후 대기 시간

Horizontal Sync Pulse Width (HSPW)  : 수평 신호 High Level 유지 시간

 

 

  ■ Porch 값 적용 전 후의 Frame Buffer 화면                                        

- Porch 값 적용 전

 

- Porch 값 적용 후

 

-----------------------------------------------------------------------------------------------------------


■ S3C2443 CPU Interface Control Sequence                             

 

 

 

- Disable Video Oupput : 출력 정지

- Set Video Signal : Main LDI(S3C2443에서 CPU I/F 방식의 Display 듀얼 출력 지원)선택, 클럭 설정

- System Interface Control : CPU I/F의 제어 신호 동작 설정

                                        CS(Chip Select) - Active Low

                                        WR(Write) - Active Low

 

-----------------------------------------------------------------------------------------------------------


■ SPI Interface Timing                                                                           

 

- Transfer Start Bit에 의해 데이터 전송 시작을 알림

- Device ID Code에 의해 Device 확인 (Value = 0x1D)

- RS Bit 로 인해 Index Data와 Instruction Data 구분

- 16bit Data 전송

- Transfer End bit에의해 데이터 전송 종료 알림

  

-----------------------------------------------------------------------------------------------------------


■ I80 Interface Control Signal                                           



■ I80 Interface Bus Timing 분석                                       


 

- RS 신호 상태를 High에서 Low로 인가 상태에서 Register 주소 값을 전송하는 것을 알림

Low에서 High로 변화 시 Data 값을 입력 받는 Register 주소를 알림

- CS 신호 상태를 High에서 Low로 인가 상태에서 LDI을 Enable을 하여 Address을 활성화

- Write Enable를 High에서 Low로 인가 상태에서 LDI에 Write 할 것이라는 것을 알림

- Write Data 출력 (High = ‘1’, Low = ‘0’)


-----------------------------------------------------------------------------------------------------------



■ S3C2443의 Display Controller의 PAD                          

 

 

 

       - VIDSEL 값이 '1'이고 VIDOUT이 '10'일 경우 VCLK PAD에서는 CPU(I80) Interface의 WE(Write Enable) 신호 출력


       - VIDSEL 값이 '1'이고 VIDOUT이 '00'일 경우 VCLK PAD에서는 RGB Interface의 VCLK 신호 출력


       - SYS_CS0와 SYS_CS1은 I80 Interface에서는 듀얼 출력이 가능하기 때문에 CS(Chip Select)가 2개 존재


       - 이하 VLINE, VFRAM, VM, LEND, VD 동일

 

 

-----------------------------------------------------------------------------------------------------------


■ RGB와 CPU(I80) I/F 구성 비교                                 

 

 

- S3C2410 Display Controller의 I80 Interface 미지원으로 인한 LCD Module을 Memory Controller에 연결

     * LDI의 Register를 이용하여 LCD 초기화

     * Virtual Frame Buffer의 내용을 LCD 모듈 내 SRAM 측으로 전송

 

 

- S3C2443 Display Controller의 I80 Interface를 지원하기 때문에 Display Controller에 연결

     * Virtual Frame Buffer에 화면 구성

     * SDRAM의 Frame Buffer의 내용을 DMA을 통해 Display Controller 측으로 전송

     * Display Controller에서 LCD 모듈 측으로 데이터 전송 

-----------------------------------------------------------------------------------------------------------





■ LCD 인터페이스 종류                                                    
    - RGB 인터페이스
    - CPU 인터페이스 (I80, M68)
    - SPI 인터페이스
    - MDDI 인터페이스
    - MIPI 인터페이스

 

■ LCD 인터페이스 별 제어신호                                            
    - RGB 인터페이스
        * VSYNC (Vertical Sync)
        * HSYNC (Horizontal Sync)
        * ENABLE
        * DOTCLK (Clock)
        * 드라이버 IC 제어를 위한 Serial 인터페이스 사용

 

    - CPU 인터페이스
        * WR (Write) / RD (Read)
        * RS (Command / Data)
        * CS (Chip Select)
        * 드라이버 IC 내부 RAM 사용

 

    - SPI 인터페이스
        * SDI / SDO / SCL 등을 이용하여 데이터 전송

 

    - MDDI 인터페이스
        * 신호선을 감소한 Serial Link Type 인터페이스

 

■ RGB 인터페이스 상세 설명                                              
    - 동영상을 많이 사용하는 TFT-LCD에 주로 적용
    - CPU 인터페이스와는 달리 Display RAM이 필요 없음
    - VSYNC Enable 구간 앞/뒤에 Porch 값과 같은 Non-Display 영역 설정
    - 한개의 HSYNC 발생 시 여러개의 Clock을 가짐
    - Clock 수를 카운트하여 Enable 구간 설정 및 Enable 구간 Active 시 Data 표현
    - VSYNC : VFP, VBP, VSW는 HSYNC가 기준이 됨
    - HSYNC : HFP, HBP, HSW는 Dot Clock 기준이 됨
    - VSYNC, HSYNC, Dot Clock SYNC를 통하애 한 Frame 주파수가 결정 됨
    - 위와 같은 설정이 맞지 않을 시 LCD 화면 상 플리커 현상 발생 (화면 밀림)

 

■ CPU 인터페이스 상세 설명                                              
    - MPU 인터페이스 명칭
    - Intel 80 계열 혹은 Motorola 68 계열 제어신호에 따라 Data 전송 방식
    - RS 신호에 따라 Command와 Data가 분리되어 전송
    - CS : Chip Select 신호로서 Low일 때 Chip이 동작
    - WR : Write 신호로서 Low->High 상태일때 Data를 Display RAM에 기록
    - RS : Read 신호로서 Data를 읽어옴
    - Command 기록 시 : RS = Low / WR 신호를 Address와 Command Latch

----------------------------------------------------------------------------------------------------------------



■ RGB Interface의 LCD Module의 Clock 동기화                        

  

 

        -  LCD Module DCLK Frequency는 33.26MHz
        -  S3C6410 Display Controller의 Clock 신호 관련 Register 

            CLKSEL_F : CPU에서 공급하는 Clock(HCLK)으로 133Mhz 임 (즉, 소스 Clock)
            CLKDIR  : 소스 Clock을 CLKVAL_F Register 값으로 분배하여 사용

            CLKVAL_F : 소스 Clock 분배 값을 나타내는 Register


■ Porch값의 의미                                                          

- Vertical Back Porch (VBP)                  : 수직 신호 출력 대기 시간

Vertical Front Porch (VFP)                  : 수직 신호 출력 후 대기 시간

Vertical Sync Pulse Width (VSPW)      : 수직 신호 High Level 유지 시간

Horizontal Back Porch (HBP)            : 수평 신호 출력 대기 시간 

- Horizontal Front Porch (HFP)            : 수평 신호 출력 후 대기 시간

Horizontal Sync Pulse Width (HSPW)  : 수평 신호 High Level 유지 시간



출처 : http://blog.daum.net/insopack77/268

+ Recent posts