embedded system

192
: 2011. 10. 14. : 2011. 10. 14. : 2011. 10. 14. : 2011. 10. 14. 발표자 발표자 발표자 발표자 : : : : 이제현 이제현 이제현 이제현, , , , 김학주 김학주 김학주 김학주, , , , 박종길 박종길 박종길 박종길, , , , 김창곤 김창곤 김창곤 김창곤, , , , 윤동 윤동 윤동 윤동, , , , 김형섭 김형섭 김형섭 김형섭, , , , 김용 김용 김용 김용 하드커널 하드커널 하드커널 하드커널 공개 공개 공개 공개 세미나 세미나 세미나 세미나 www.hardkernel.com

Upload: sagesonm

Post on 29-Oct-2014

570 views

Category:

Documents


9 download

DESCRIPTION

CPU informatoin

TRANSCRIPT

날날날날 짜짜짜짜 : 2011. 10. 14. : 2011. 10. 14. : 2011. 10. 14. : 2011. 10. 14.

발표자발표자발표자발표자 : : : : 이제현이제현이제현이제현, , , , 김학주김학주김학주김학주, , , , 박종길박종길박종길박종길, , , , 김창곤김창곤김창곤김창곤, , , , 윤동열윤동열윤동열윤동열, , , , 김형섭김형섭김형섭김형섭, , , , 김용오김용오김용오김용오

하드커널하드커널하드커널하드커널 공개공개공개공개 세미나세미나세미나세미나

www.hardkernel.com

� 임베디드임베디드임베디드임베디드 시스템용시스템용시스템용시스템용 안드로이드안드로이드안드로이드안드로이드 플랫폼플랫폼플랫폼플랫폼 구성구성구성구성

� Samsung S5P6450Samsung S5P6450Samsung S5P6450Samsung S5P6450를를를를 이용한이용한이용한이용한 ODROIDODROIDODROIDODROID----E E E E 회로회로회로회로 및및및및 PCB PCB PCB PCB 설계설계설계설계

� Samsung S5P6450Samsung S5P6450Samsung S5P6450Samsung S5P6450를를를를 이용한이용한이용한이용한 ODROIDODROIDODROIDODROID----E E E E 안드로이드안드로이드안드로이드안드로이드 포팅포팅포팅포팅

� Samsung S5P6450Samsung S5P6450Samsung S5P6450Samsung S5P6450를를를를 이용한이용한이용한이용한 ODROIDODROIDODROIDODROID----E WinCE 6.0 E WinCE 6.0 E WinCE 6.0 E WinCE 6.0 포팅포팅포팅포팅

� Android Camera PortingAndroid Camera PortingAndroid Camera PortingAndroid Camera Porting

� Linux Server on ARM Linux Server on ARM Linux Server on ARM Linux Server on ARM

� Android Open AccessoryAndroid Open AccessoryAndroid Open AccessoryAndroid Open Accessory기반의기반의기반의기반의 임베디드임베디드임베디드임베디드 시스템시스템시스템시스템 구성구성구성구성

� 스마트폰과스마트폰과스마트폰과스마트폰과 동작하는동작하는동작하는동작하는 프린터프린터프린터프린터 개발개발개발개발

순순순순 서서서서

www.hardkernel.com

발표자 : 이제현www.hardkernel.com

순순순순 서서서서

�임베디드임베디드임베디드임베디드 시스템에시스템에시스템에시스템에 안드로이드가안드로이드가안드로이드가안드로이드가 적절한가적절한가적절한가적절한가????

�임베디드임베디드임베디드임베디드 안드로이드안드로이드안드로이드안드로이드 기기의기기의기기의기기의 최소최소최소최소 시스템시스템시스템시스템 구성구성구성구성 전략전략전략전략

�시스템시스템시스템시스템 메모리메모리메모리메모리 (RAM / FLASH) (RAM / FLASH) (RAM / FLASH) (RAM / FLASH) 구성구성구성구성 동향동향동향동향

�Application Processor Application Processor Application Processor Application Processor 동향동향동향동향

�가격가격가격가격 경쟁력이경쟁력이경쟁력이경쟁력이 높은높은높은높은 삼성삼성삼성삼성 S5P6450 S5P6450 S5P6450 S5P6450 탐구탐구탐구탐구www.hardkernel.com

임베디드임베디드임베디드임베디드 시스템에시스템에시스템에시스템에 안드로이드가안드로이드가안드로이드가안드로이드가 적절한가적절한가적절한가적절한가????

� 기존기존기존기존 임베디드임베디드임베디드임베디드 플랫폼플랫폼플랫폼플랫폼(WinCE, Linux, Qt, QNX) (WinCE, Linux, Qt, QNX) (WinCE, Linux, Qt, QNX) (WinCE, Linux, Qt, QNX) 대비대비대비대비 장단점장단점장단점장단점

� Connectivity 관련 기능의 완성도가 매우 높음

� 3G/WiFi/Bluetooth/NFC/USB/MicroSD/Camera/OpenCV 등등

� User Interface / MM가 수려함

� OpengGL/SurfaceFligner/Stagefright

� 어플리케이션 개발 용이

� 수많은 서적과 교육

� 수많은 개발자

� 효율적인 개발툴(SDK)

� JAVA의 강점

� 단점단점단점단점

� 느린 부팅

� 고속/대용량 플랫폼

� 과다한 기능

� 잦은 업데이트

www.hardkernel.com

Application Processor Application Processor Application Processor Application Processor 동향동향동향동향

� Cortex-A9 Dual core

� Exynos-4210/4220

� MSM8960 (S4)

� Tegra-2

� OMAP-4

� EMMA Mobile

� Spear 13xx

� i.MX6

� Cortex-A8

� Exynos-3110 (S5PC110)/C100

� i.MX53/51

� Sitara AM35/7/8

� ARMADA 600 Series

� Telechips/CoreLogic/ARMLogic

/WonderMedia(VIA)

� ARM11 / ARM9 (낮은 가격, 쓸만한 3D 가속기 조건을 찾아라!)

S5P6450S5P6450S5P6450S5P6450www.hardkernel.com

임베디드임베디드임베디드임베디드 안드로이드안드로이드안드로이드안드로이드 기기의기기의기기의기기의 시스템시스템시스템시스템 구성구성구성구성 전략전략전략전략

� 가격 경쟁력있는 쓸만한 임베디드 기기의 하드웨어 구성의 어려움

� 장기간 공급 가능한가? 단종의 우려는?

� 메모리 크기 및 종류 (RAM/FLASH)

� 확장성 (USB 2.0 Host/Device, SDIO, UART, SPI, I2C, Static Bus 등등)

� 소비전류 및 배터리

� PMIC

� 디스플레이 및 터치스크린

� 오디오 코덱

� 센서

� 무선랜 및 블루투스

� NFC

� ZigBee

� 3G / LTE

� GPSwww.hardkernel.com

시스템시스템시스템시스템 메모리메모리메모리메모리 (RAM / FLASH) (RAM / FLASH) (RAM / FLASH) (RAM / FLASH) 구성구성구성구성 동향동향동향동향

� RAM� SDRAM � DDR � DDR2 � DDR3 (PC 시장의 급변)

� 주요 메모리 제조사에서는 2010년 부터 SDRAM은 단종 시작 (2440의 위험요인)

� mDDR � LPDDR2 (2~3년 뒤에는 LPDDR2개 대세?)

� SDRAM 256Mbit (x16) / $1 (12월 단종 예정), SDRAM 512Mbit (x16) / 10년 단종

� DDR2 512Mbit (x16) / $1, DDR2 1Gbit (x16) / $1.5, DDR3 1Gbit (x16) / $1.3

� mDDR 512Mbit (x16) / $2, mDDR 1Gbit (x16) / $3, mDDR 2Gbit (x32) / $5

� FLASH

� NOR : OS/App 영역의 대형화로 점차 사용이 안되고 있음

� NAND

� NAND의 급격한 구조(세대) 변경 반복 � AP에서 지원하기 어려워짐

� NAND � eMMC (FTL의 은닉으로 개발/유지보수 편함)

� iNAND/MoviNAND (고속/대용량/DDR-100Mhz-8bit[eMMC4.5])

� NAND � Micro-SD / SDHC / MMC

� 소량생산/유지보수/수급용이

www.hardkernel.com

가격가격가격가격 경쟁력이경쟁력이경쟁력이경쟁력이 높은높은높은높은 삼성삼성삼성삼성 S5P6450 S5P6450 S5P6450 S5P6450 소개소개소개소개

삼성삼성삼성삼성 24xx 24xx 24xx 24xx 시리즈시리즈시리즈시리즈, TI , TI , TI , TI SitaraSitaraSitaraSitara AM1xxx AM1xxx AM1xxx AM1xxx 시리즈시리즈시리즈시리즈, , , , FreescaleFreescaleFreescaleFreescale i.MX2x i.MX2x i.MX2x i.MX2x 시리즈시리즈시리즈시리즈

- 5~7$ 정도의 ARM9은 대부분 200~400Mhz로 동작

- 저가형 PND나 e-book 같은 소비재

- POS / 계측기 / PDA / 공장 자동화 / 계측제어장치 같은 다양한 산업용 기기에 적용

Samsung S5P6450비슷한비슷한비슷한비슷한 가격으로가격으로가격으로가격으로 2~32~32~32~3배의배의배의배의 처리처리처리처리 속도속도속도속도 제공제공제공제공 가능가능가능가능

월등한월등한월등한월등한 3D 3D 3D 3D 성능성능성능성능 / / / / 안드로이드안드로이드안드로이드안드로이드 고속고속고속고속 UI UI UI UI 제공제공제공제공 가능가능가능가능

USB 2.0 High speed Host USB 2.0 High speed Host USB 2.0 High speed Host USB 2.0 High speed Host 기능기능기능기능

800Mhz 800Mhz 800Mhz 800Mhz 고속이면서도고속이면서도고속이면서도고속이면서도 저소비저소비저소비저소비 전류전류전류전류 구동구동구동구동

MigrationMigrationMigrationMigration

www.hardkernel.com

S5P6450 S5P6450 S5P6450 S5P6450 내부내부내부내부 구조구조구조구조 및및및및 특징특징특징특징

Specification Specification Specification Specification - ARM1176JZF-S based CPU system and Memory Mapping Unit (MMU).

- Manufactured with the 45nm process for low power and low cost.

- Package is 409 pin FBGA type and dimension is 14.0 x 14.0 mm with 0.65mm pitch.

- 16KB I-cache and 16KB D-cache CPU memories.- 64-/32-bit 166MHz AMBA 3.0 AXI bus structure.- 32-bit Mobile DDR and DDR2 Interface.- Embedded 64kByte SRAM and 64kByte ROM on AXI.- 8-bit 5 Megapixel (MP) capable Camera Interface- 24-bit 3x I2S and 16-bit 3x PCM Interface

- 5xUART / 2xSPI / 2xI2C / 3xSDIO interface

- On-chip USB 2.0 OTG - USB HOST 2.0- Hardware Rotator- Transport Stream Interface- GPS baseband (Option)- Security SubSystem (SSS)- Mali400 3D engine- 13-ch/12bit ADC (TSADC)- MPEG2/4, H.263 Video decoder(D1)

- Muxed RGB and Bus interface

제품군제품군제품군제품군X: No GPS, None Secure Booting

S: No GPS, Secure Booting

G: GPS, None Secure Booting

533/667/800Mhz

www.hardkernel.com

발표자 : 김학주www.hardkernel.com

�Hardware StructureHardware StructureHardware StructureHardware Structure

�High speed High speed High speed High speed –––– Return Path, Crosstalk ,,,ETCReturn Path, Crosstalk ,,,ETCReturn Path, Crosstalk ,,,ETCReturn Path, Crosstalk ,,,ETC

�Knee FrequencyKnee FrequencyKnee FrequencyKnee Frequency

�Calculation of Calculation of Calculation of Calculation of DecapDecapDecapDecap

�Characteristic Impedance of PCBCharacteristic Impedance of PCBCharacteristic Impedance of PCBCharacteristic Impedance of PCB

�Strip line and Micro strip Strip line and Micro strip Strip line and Micro strip Strip line and Micro strip

�PCB Design recommendPCB Design recommendPCB Design recommendPCB Design recommend

�Lower Power DDRLower Power DDRLower Power DDRLower Power DDR

�PCB Case StudyPCB Case StudyPCB Case StudyPCB Case Study

�PMIC SpecPMIC SpecPMIC SpecPMIC Spec

순순순순 서서서서

www.hardkernel.com

S5P6450S5P6450S5P6450S5P6450

4” LCD

BCM4329Ant

24bpp RGB

UART

SDIO

WIFI /BT

RN5T614

Boot

DC JACK MAX98095I2S

MIC

HP

SPK

TouchI2C 3M CAMERA

Cam I/F

T-FLSH

PMIC

SD/MMC

BMA150I2C

Motor Driver LRA

I2C

TTA20USB, UART, JTAG

Codec

Battery

1500mAH@ 3.7V

MAX17040

I2C

Hardware Structure of ODROIDHardware Structure of ODROIDHardware Structure of ODROIDHardware Structure of ODROID----EEEE

www.hardkernel.com

Defining High SpeedDefining High SpeedDefining High SpeedDefining High Speed

� Digital Signal Edge Rates are the determining factor

� Higher clock frequencies mandate faster edge rates, thereby

inferring high speed signaling issues

� Simply operating high speed ICs at a lower clock frequency

does not eliminate the high speed integrity issues

� Think signal bandwidth not clock frequency...

� Digital Signal Bandwith – the relationship between signal rise

time, and its bandwith

www.hardkernel.com

Digital Signaling FundamentalsDigital Signaling FundamentalsDigital Signaling FundamentalsDigital Signaling Fundamentals

� PCB Trace characteristic impedance ( )

� A function of dielectric constant, trace width, trace thickness,

and trace height above return plane(s)

� PCB Trace – propagation velocity

� Microstrip (surface) layers: prop delay ~150 psec/inch

� Magnetic field propagating thru: FR4 blew, solder

mask,then air above

� Internal stripline layers: prop delay ~165 psec/inch

� Magnetic field propagating thru: FR4 above and blew

0Z

Er

cv =

www.hardkernel.com

High frequency signal return pathsHigh frequency signal return pathsHigh frequency signal return pathsHigh frequency signal return paths

� Kirchhoff Current Law: Sum of the currents entering and

leaving a node is zero

� Low frequency (sine wave < 10 MHz) return: path of least

resistance

� High frequency return : path of least inductanceHigh frequency return : path of least inductanceHigh frequency return : path of least inductanceHigh frequency return : path of least inductance

� The smallest physical loop area always provides lowest inductance

� Return current density in reference plane falls off with the square of the

distance

www.hardkernel.com

Signal Return Path Signal Return Path Signal Return Path Signal Return Path –––– Signal Layer ChangeSignal Layer ChangeSignal Layer ChangeSignal Layer Change

� Three general cases:

1. The(2) trace layers straddle

the same reference plane

2. The(2) trace layers reference

different planes, both planes

at same potential, e,g. GND

3. The(2) trace layers reference

different planes, planes at

different DC potential

� Implications to PCB stack

up and trace routing rules

� Case 2 – apply a GND

shoting via grid across

entire(x,y) PCB surface

www.hardkernel.com

Return path Return path Return path Return path –––– Common Design IssueCommon Design IssueCommon Design IssueCommon Design Issue

� Signal trace routing directly over a split (or other

discontinuity) in its reference plane

� Closely spaced adjacent Vias – anti-pad induced slots

� Often creates mutual inductive crosstalk (noise margin)

� Case when many adjacent bus lines cross together

� Can increase radiated EMI and lower radiated immunity threshold

� Degrades rising and falling edge rates (timing margin)

www.hardkernel.com

Signal Return Path Signal Return Path Signal Return Path Signal Return Path –––– Signal Layer ChangeSignal Layer ChangeSignal Layer ChangeSignal Layer Change

Case 3.) The (2) trace layers reference different planes each at a different DC potential. The return current encounters the plane capacitance impedance thereby inducing a voltage drop across this impedance. This impedance drops over time as the current spreads out and traverses a larger capacitive area.

This return path impedance (Z) can be estimated as:

Z ~ 5 ohm x [plane separation (inches) / time (nsec)]

Simple stack-up shown not suitable for commuting very fast edge rate signaling (<<1 nsec). Deploy thin core PWR//GND construction to minimize the impedance and correspondingly the voltage drop.

www.hardkernel.com

Frequency /time relationFrequency /time relationFrequency /time relationFrequency /time relation

� Basic facts and tools for the analysis of the edge of a clock

� Rise time (Tr) = time to rise from 10% to 90% of the signal.

10%

90%

Tr

A slow rising edge

A fast falling edge

V

t

www.hardkernel.com

Knee frequencyKnee frequencyKnee frequencyKnee frequency

Tror

TrFknee

5.035.0=

� TrTrTrTr is the 10is the 10is the 10is the 10----90% edge rate of the signal90% edge rate of the signal90% edge rate of the signal90% edge rate of the signal

� This is the frequency at which most energy is blewThis is the frequency at which most energy is blewThis is the frequency at which most energy is blewThis is the frequency at which most energy is blew

� EX) EX) EX) EX) TrTrTrTr =5ns, what is the equivalent frequency.=5ns, what is the equivalent frequency.=5ns, what is the equivalent frequency.=5ns, what is the equivalent frequency.

MHzns

Fknee 1005

5.0 ==

Period/2=Tr

Period of the equivalent signal

www.hardkernel.com

ReflectionReflectionReflectionReflection

� Reflection Reflection Reflection Reflection 이란이란이란이란????� 신호신호신호신호 연결선을연결선을연결선을연결선을 통하여통하여통하여통하여 하나의하나의하나의하나의 DeviceDeviceDeviceDevice에서에서에서에서 다른다른다른다른 DeviceDeviceDeviceDevice로로로로 신호가신호가신호가신호가 전달전달전달전달 될될될될

때때때때 Device Device Device Device 간의간의간의간의 특성특성특성특성 임피던스임피던스임피던스임피던스 부정합부정합부정합부정합 또는또는또는또는 DeviceDeviceDeviceDevice와와와와 신호신호신호신호 연결선연결선연결선연결선 간의간의간의간의임피던스임피던스임피던스임피던스 부정합으로부정합으로부정합으로부정합으로 인하여인하여인하여인하여 진행진행진행진행 신호의신호의신호의신호의 일일일일부가부가부가부가 진행진행진행진행 방향의방향의방향의방향의 반대반대반대반대반향으로반향으로반향으로반향으로 진행진행진행진행 하는하는하는하는 것을것을것을것을 말한다말한다말한다말한다....

� Reflection Reflection Reflection Reflection 의의의의 영향영향영향영향� Overshoot/Undershoot Overshoot/Undershoot Overshoot/Undershoot Overshoot/Undershoot 발생발생발생발생 ⇒⇒⇒⇒ Fast Rising/Falling Time, Reduction Fast Rising/Falling Time, Reduction Fast Rising/Falling Time, Reduction Fast Rising/Falling Time, Reduction

Noise MarginNoise MarginNoise MarginNoise Margin

� 신호의신호의신호의신호의 고조파고조파고조파고조파(Harmonics)(Harmonics)(Harmonics)(Harmonics)성분이성분이성분이성분이 고주파고주파고주파고주파 영역까지영역까지영역까지영역까지 확대확대확대확대 ⇒⇒⇒⇒Radiation/Conduction EMI Noise Radiation/Conduction EMI Noise Radiation/Conduction EMI Noise Radiation/Conduction EMI Noise 증가증가증가증가

Tr

V

t외곡 전

Tf Tr

V

외곡 후

Tf

OvershootOvershootOvershootOvershoot

UndershootUndershootUndershootUndershootwww.hardkernel.com

CROSSTALKCROSSTALKCROSSTALKCROSSTALK

� 두 개의 이웃하는 도체 사이의 정전결합(Capacitance Coupling)과

전자 결합으로 인한 원치 않은 신호 간섭이다.

ZsZsZsZs

ZoZoZoZo

ZoZoZoZo

ZoZoZoZo

CCCCmmmm

nearnearnearnear

farfarfarfar

ZsZsZsZs

ZoZoZoZo

ZoZoZoZo

ZoZoZoZo

Mutual CapacitanceMutual CapacitanceMutual CapacitanceMutual Capacitance, C, C, C, Cmmmm Mutual InductanceMutual InductanceMutual InductanceMutual Inductance, L, L, L, Lmmmm

ZsZsZsZs

ZoZoZoZo

ZoZoZoZo

ZoZoZoZo

CCCCmmmm

LLLLmmmm

nearnearnearnear

farfarfarfar

nearnearnearnear

farfarfarfar

www.hardkernel.com

CROSSTALK CROSSTALK CROSSTALK CROSSTALK 방지방지방지방지 PCB PCB PCB PCB 설계방안설계방안설계방안설계방안

� Driver Aggressor의 배선 폭 감소

� 두 개의 이웃하는 도체 간의 배선 폭을 세배 이상으로 떨어뜨림

� 긴 네트는 Buffer를 추가

� Shielding 처리

� 인접한 층은 서로 90도로 배선

� 가능한 마이크로 스트립 라인보다는 스트립라인을 권고

� 배선 밀집도 고려하여 부품을 배치

� 오 동작을 야기 하지 않는 범위에서 더 낮은 Rising Time을 사용

� 가능한 Ground Plane 과 Signal Layer 사이의 간격 최소화www.hardkernel.com

Calculation of Decoupling CapacitorsCalculation of Decoupling CapacitorsCalculation of Decoupling CapacitorsCalculation of Decoupling Capacitors

dv

dtI

dv

Qc

×==

� The amount of current needed for switching an output from low to high(I), the time required for the capacitor to charge the supply line (dt), and the drop in the supply voltage that can be tolerated (dV), must be known for computation of decoupling capacitor value.

� For example, consider a buffer with switching outputs. With

dV = 0.1V, dt = 3ns, and I = 352mA

C = [352mA x 3ns] / 0.1V –> C = 0.01056uFwww.hardkernel.com

Decoupling CapacitorsDecoupling CapacitorsDecoupling CapacitorsDecoupling Capacitors

� Low ESR and ESL capacitor Recommend

� Selecting the Package for the Decap

� Sizing Decap

� The large value handles the lower frequencies and high current issues while the smaller value handles the lower frequencies

PACKAGE ESL(pH)

0603 400

1005 550

1608 700

2012 800

3216 1250

Package Series Inductances Capacitor impedance vs. frequency

www.hardkernel.com

High Frequency Ceramic CapacitorHigh Frequency Ceramic CapacitorHigh Frequency Ceramic CapacitorHigh Frequency Ceramic Capacitor

� NPO NPO NPO NPO capacitors have the lowest ESR and best temperature lowest ESR and best temperature lowest ESR and best temperature lowest ESR and best temperature and voltage propertiesand voltage propertiesand voltage propertiesand voltage properties, but are only available up to a few only available up to a few only available up to a few only available up to a few nFnFnFnF

� X7R X7R X7R X7R capacitors have reasonable voltage and temperature coefficients and are available from several available from several available from several available from several nFnFnFnF to several to several to several to several uFuFuFuF

� X5RX5RX5RX5R is similar to X7R, similar to X7R, similar to X7R, similar to X7R, but with reduced reliability reduced reliability reduced reliability reduced reliability and are being extended to 100uFextended to 100uFextended to 100uFextended to 100uF

� Y5V Y5V Y5V Y5V dielectric is used to achieve high capacitance values, , , , but has very poor voltage and temperature characteristicsvery poor voltage and temperature characteristicsvery poor voltage and temperature characteristicsvery poor voltage and temperature characteristics

1pF 10pF 100pF 1nF 10nF 100nF 1pF 10pF 100pF 1nF 10nF 100nF 1pF 10pF 100pF 1nF 10nF 100nF 1pF 10pF 100pF 1nF 10nF 100nF 1uF 10uF 100uF1uF 10uF 100uF1uF 10uF 100uF1uF 10uF 100uF

CODE: 1R0 100 CODE: 1R0 100 CODE: 1R0 100 CODE: 1R0 100 101 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106 107 107 107 107

NPONPONPONPOX7RX7RX7RX7R

X5RX5RX5RX5RY5VY5VY5VY5V

www.hardkernel.com

Decoupling Capacitors RoutingDecoupling Capacitors RoutingDecoupling Capacitors RoutingDecoupling Capacitors Routing

� DO NOT have vias between DECAP and active device –Visualize the high frequency current flow!!

� Ensure DECAP are on same layer as active component for best results

� Route vias into DECAP and then into the active component

� The more vias the better

� The wider the traces the better

� The closer the better ( < 5mm)

� Length to width not exceed 3:1

www.hardkernel.com

PCB traces as Transmission LinesPCB traces as Transmission LinesPCB traces as Transmission LinesPCB traces as Transmission Lines

�Signal wavelength approaches component size

�Dielectric Loss (G)

�Trace Copper Loss(R)

�Trace series inductance(L)

�Trace capacitance(C)RRRR

LLLL

CCCC GGGG

www.hardkernel.com

Characteristic ImpedanceCharacteristic ImpedanceCharacteristic ImpedanceCharacteristic Impedance

Line impedance in terms of R,L,C and G

Line Impedance for Lossless line

)(

)(0

CjG

LjRZ

ωω

++=

C

LZ =0www.hardkernel.com

Control impedance of PCBControl impedance of PCBControl impedance of PCBControl impedance of PCB

� Impedance Determined By� Topology

� Dielectric constant of PCB material

� Dielectric height

� Conductor width

� Conductor thickness (small effect)

� Impedance Control� Delivering max power to load

� Maintaining signal intergrity

� Prevent excessive driver loadingwww.hardkernel.com

I/F I/F I/F I/F 별별별별 PCB Impedance PCB Impedance PCB Impedance PCB Impedance 요구요구요구요구 사항사항사항사항

�USB - Differential 90 ohm

�Memory Port 0 – Line 50 ohm

�Memory Port 1

� mDDR(LPDDR)

1. DQS, DQM,DATA,ADDR, Control Signals – Line 50 ohm

2. Clock – Differential 80 ohm

�MIPI – Differential 100 ohm

�MMC/SD – Line 50 ohm

www.hardkernel.com

StriplineStriplineStriplineStripline 과과과과 MicrostripMicrostripMicrostripMicrostrip

Cross Section of Above PCB Cross Section of Above PCB Cross Section of Above PCB Cross Section of Above PCB

TTTT

Signal (Signal (Signal (Signal (microstripmicrostripmicrostripmicrostrip) ) ) )

Ground/PowerGround/PowerGround/PowerGround/Power

Signal (Signal (Signal (Signal (striplinestriplinestriplinestripline))))

Signal (Signal (Signal (Signal (striplinestriplinestriplinestripline) ) ) )

Ground/PowerGround/PowerGround/PowerGround/Power

Signal (Signal (Signal (Signal (microstripmicrostripmicrostripmicrostrip) ) ) )

Copper TraceCopper TraceCopper TraceCopper Trace

Copper PlaneCopper PlaneCopper PlaneCopper Plane

FR4 DielectricFR4 DielectricFR4 DielectricFR4 Dielectric

WWWW

Stripline

Cross Section of Above PCB Cross Section of Above PCB Cross Section of Above PCB Cross Section of Above PCB

TTTT

Signal (Signal (Signal (Signal (microstripmicrostripmicrostripmicrostrip) ) ) )

Ground/PowerGround/PowerGround/PowerGround/Power

Signal (Signal (Signal (Signal (striplinestriplinestriplinestripline))))

Signal (Signal (Signal (Signal (striplinestriplinestriplinestripline) ) ) )

Ground/PowerGround/PowerGround/PowerGround/Power

Signal (Signal (Signal (Signal (microstripmicrostripmicrostripmicrostrip) ) ) )

Copper TraceCopper TraceCopper TraceCopper Trace

Copper PlaneCopper PlaneCopper PlaneCopper Plane

FR4 DielectricFR4 DielectricFR4 DielectricFR4 Dielectric

WWWW

MicroMicroMicroMicro----StripStripStripStrip

Stripline

www.hardkernel.com

Micro Strip Micro Strip Micro Strip Micro Strip 공식공식공식공식

� Parallel Plate Assumptions +

� Large ground plane with zero thickness

� To accurately predict micro-strip impedance, you must calculate the effectiveeffectiveeffectiveeffectiveeffectiveeffectiveeffectiveeffective dielectric constant.

++≈

CC

D

r TW

TZ

8.0

98.5ln

41.1

870

ε

( )DC

Cr

C

D

rre

TW

TF

W

T1217.0

1212

1

2

1 −−++

−++= εεεε

From Hall, Hall & McCall:From Hall, Hall & McCall:From Hall, Hall & McCall:From Hall, Hall & McCall:

Valid when:0.1 < WC/TD < 2.0 and 1 < er < 15

( )2

1102.0

−−D

Cr

T

Wε=F

1<D

C

T

Wfor

0 1>D

C

T

Wfor

TD

TC

εεεε

WC

www.hardkernel.com

StriplineStriplineStriplineStripline 공식공식공식공식

� Same assumptions as used for microstrip apply here

From Hall, Hall & McCall:From Hall, Hall & McCall:From Hall, Hall & McCall:From Hall, Hall & McCall:

Symmetric (balanced) Symmetric (balanced) Symmetric (balanced) Symmetric (balanced) StriplineStriplineStriplineStripline Case TCase TCase TCase TD1D1D1D1 = T= T= T= TD2D2D2D2

++≈

)8.0(67.0

)(4ln

60 110

CC

DD

r

symTW

TTZ

πεValid when WC/(TD1+TD2) < 0.35 and TC/(TD1+TD2) < 0.25

Offset (unbalanced) Offset (unbalanced) Offset (unbalanced) Offset (unbalanced) StriplineStriplineStriplineStripline Case TCase TCase TCase TD1D1D1D1 > T> T> T> TD2D2D2D2

),,,2(),,,2(

),,,2(),,,2(2

00

000

rCCsymrCCsym

rCCsymrCCsymoffset

TWBZTWAZ

TWBZTWAZZ

εεεε

+⋅≈

TD2

TCεεεε

WC

TD1

www.hardkernel.com

S5P6450 PCB S5P6450 PCB S5P6450 PCB S5P6450 PCB 적층적층적층적층 구조구조구조구조 예예예예

� PCB 적층 구조 (Layer Stack)

www.hardkernel.com

PCB PCB PCB PCB 설계설계설계설계 시시시시 일반적인일반적인일반적인일반적인 대책대책대책대책

� 임피던스 매칭

� 노이즈 강한 적층 구조 선택

� 3W rule

� 20H rule

� Clock Line 은 가능하면 내층으로 배선하여 EMI를 감소시키다.

� 고속 신호는 가능한 기판 중앙을 통하게 한다.

� T 분기 금지을 원칙으로 한다.

� Return Path를 고려한 배선이 되어야 한다.

� Clock Driver, OSC 아래 부품 배치 및 배선 금지

� 90도 배선 금지

� GND 가능한 Plane 화 한다.

� 고속신호 보드 외곽에 가능한 멀게 배선

� 고속고속고속고속 신호신호신호신호 LineLineLineLine에서는에서는에서는에서는 가능한가능한가능한가능한 한한한한 ViaViaViaVia사용을사용을사용을사용을 줄인다줄인다줄인다줄인다www.hardkernel.com

Antenna Antenna Antenna Antenna 배치배치배치배치 및및및및 배선배선배선배선 시시시시 주의주의주의주의 사항사항사항사항

� 안테나 밑에 GND 층이나 배선 금지

� 금속물체 가까이 안테나를 배치 금지

� 안테나에 배선이나 부품을 너무 가깝게 하지 말기

� Monopole 안테나는 효율을 높이기 위해서는 GND 층 필요

� 안테나 위치에는 금속성 기구 나 plastic을 사용하지 않기

� 결코 Low-Q 의 부품을 사용하지 말고, 시험 없이 제조업체 변경 금지

� 협소한 PCB track를 사용하지 말고, 공간이 허락하는 한 넓게 하라

� λ/4 이상의 Board 크기가 필요

� 반드시 보드 외곽에 안테나를 배치

www.hardkernel.com

LPDDR LPDDR LPDDR LPDDR 과과과과 DDR DDR DDR DDR 의의의의 차이점차이점차이점차이점

� Initialization� VDD 와 VDDQ 동시에 전원 공급

� Command 순서가 다름

� Input/output� 2.5V -> 1.8V

�Clocking(CAS latency)

�Temperature-compensated self refresh(TCSR)

�Partial-array self refresh(PASR)

�Deep power down(DPD)

�Clock stop modewww.hardkernel.com

Lower Power DDRLower Power DDRLower Power DDRLower Power DDR----1111

� Data (DQ)/ DQS Signals

� Single ended nets

� Data Strobe(DQS)에 time delay 관점에 최대한 길이를 맞춰야 한다.

� Byte lane(8 bit groups) 사이에도 길이를 맞춰야 한다

� 임피던스 50 ohm

For WRITE cycles, the DQS waveform would be shifted a half pulse to the right, as shown by green arrow and dotted edge

www.hardkernel.com

Lower Power DDRLower Power DDRLower Power DDRLower Power DDR----2222

�Address/Command/Control Signals�Single ended nets

�Memory Clock에 동기

�Clock Positive edge

�Memory Clock 의 절반의 주파수로 동작

�임피던스 50 ohm

�Clock�Differential Signals

�임피던스 80 ohm

�같은 층에 배선www.hardkernel.com

DDR Signaling SSTLDDR Signaling SSTLDDR Signaling SSTLDDR Signaling SSTL----1.81.81.81.8

1.025V1.025V1.025V1.025V

0.9V0.9V0.9V0.9V

1.150V1.150V1.150V1.150V

VVVVSSSSSSSSQQQQ

Transmitter

Receiver

0.775V0.775V0.775V0.775V

0.650V0.650V0.650V0.650V

VVVVOLOLOLOL (MAX)(MAX)(MAX)(MAX)

VVVVOHOHOHOH(MIN)(MIN)(MIN)(MIN)

VVVVILILILIL

VVVVIHIHIHIH

VVVVIHIHIHIH ACACACAC

ACACACAC

VVVVI LI LI LI L DC DC DC DC

DCDCDCDC

VVVVDDDDDDDDQ (1.8V nominal)Q (1.8V nominal)Q (1.8V nominal)Q (1.8V nominal)

www.hardkernel.com

LPDDR DC/AC operating conditionsLPDDR DC/AC operating conditionsLPDDR DC/AC operating conditionsLPDDR DC/AC operating conditions

www.hardkernel.com

PCB Case Study(S5P6450) : ODROIDPCB Case Study(S5P6450) : ODROIDPCB Case Study(S5P6450) : ODROIDPCB Case Study(S5P6450) : ODROID----E4/7E4/7E4/7E4/7

� VIA

0.4 /0.2mm(LAND/ DRILL)

� 이격 거리(Clearance)

일반 0.1mm / 최소 0.075mm

� PCB 두께

0.8mm

� 층 수

6 Layers

� S5P6450S5P6450S5P6450S5P6450 - 0.65mm Pitch BGA PAD

NSMD PAD : 0.25mm / 0.26mm

(LAND/ Solder MASK)

� Dog-bones Fan out

� MLB(Multi Layer Board)www.hardkernel.com

PCB Case Study(SP5C100) : ODROIDPCB Case Study(SP5C100) : ODROIDPCB Case Study(SP5C100) : ODROIDPCB Case Study(SP5C100) : ODROID

� VIA

PTH,IVH 0.45 /0.2mm

BVH 0.5/0.1mm

� 이격 거리(Clearance)

일반 0.1mm / 최소 0.075mm

� PCB 두께

1mm

� 층 수

Buildup 12 Layers

� SP5C100SP5C100SP5C100SP5C100 - 0.5mm Pitch BGA PAD – 521 pin

NSMD PAD : 0.25mm / 0.3mm

www.hardkernel.com

PCB Case Study(SP5C110) : ODROIDPCB Case Study(SP5C110) : ODROIDPCB Case Study(SP5C110) : ODROIDPCB Case Study(SP5C110) : ODROID----S/T/7S/T/7S/T/7S/T/7

� VIA

PTH,IVH 0.45 /0.2mm

BVH 1-2 0.275/0.1mm

BVH 1-3 0.285/0.1mm

� 이격 거리(Clearance)

일반 0.1mm / 최소 0.075mm

� PCB 두께

0.8mm

� 층 수

Buildup 8 Layers D type

� SP5C110SP5C110SP5C110SP5C110 - 0.5mm Pitch BGA PAD - 596pin

NSMD PAD : 0.275mm / 0.375mm

(LAND/ Solder MASK) www.hardkernel.com

PCB Case Study(Exynos4210) : ODROIDPCB Case Study(Exynos4210) : ODROIDPCB Case Study(Exynos4210) : ODROIDPCB Case Study(Exynos4210) : ODROID----AAAA

� VIA

PTH,IVH 0.45 /0.2mm

BVH 1-2 0.25/0.1mm

BVH 1-3 0.25/0.1mm

� 이격 거리(Clearance)

일반 0.1mm / 최소 0.075mm

� PCB 두께

0.8mm

� 층 수

Buildup 10 Layers D type

� Exynos4210Exynos4210Exynos4210Exynos4210 - 0.45mm Pitch BGA PAD - 756pin

SMD PAD : 0.25mm / 0.23mm

www.hardkernel.com

PMICPMICPMICPMIC----1(Ricoh RN5T614E)1(Ricoh RN5T614E)1(Ricoh RN5T614E)1(Ricoh RN5T614E)

� High Efficiency Step-down DC/DC Converters

1. DC/DC1: 1.20V (0.9V to 1.5V/12.5mV steps) @1200mA with RAMP control (For

Core)

2. DC/DC2: 1.15V (0.9V to 1.5V/12.5mV steps and 1.8V) @1000mA with RAMP

control (For Logic)

3. DC/DC3: 1.8V (1.8V to 3.3V by external resistors) @500mA (For Memory)

4. DC/DC on/off control pin for DC/DC1 and DC/DC2

� Low Drop Voltage Regulators

LDO1:3.0V (Always-on) @10mA

LDO2:1.2V (0.9V/1.0V/1.1V/1.2V/1.3V) @30mA

LDO3:1.2V (0.9V/1.0V/1.1V/1.2V/1.3V) @30mA

LDO4:3.3V (1.8V/2.5V/2.6V/2.8V/2.85V/3.0V/3.3V) @300mA

LDO5:1.8V (1.8V/2.5V/2.6V/2.8V/2.85V/3.0V/3.3V) @300mA

LDO6:2.6V (1.2V/1.8V/2.5V/2.6V/2.8V/2.85V/3.0V/3.3V) @150mA

LDO7:3.0V (1.2V/1.8V/2.5V/2.6V/2.8V/2.85V/3.0V/3.3V) @150mA

LDO8:3.3V (1.8V/2.5V/2.6V/2.8V/2.85V/3.0V/3.3V) @150mA

www.hardkernel.com

PMICPMICPMICPMIC----2(Ricoh RN5T614E)2(Ricoh RN5T614E)2(Ricoh RN5T614E)2(Ricoh RN5T614E)

�Li-ion Battery Charger1. Support AC adapter charging

2. With the current limit protection and charge current control, the limited power can be efficiently

3. supplied to the system and the battery.

4. The system can power on even when Li-ion Battery is low voltage or open.

5. The device can withstand up to 6.5V on VCHG pin. However, it can withstand high voltage by

6. combining a high voltage protection IC (up to 28V by using BD6040 of ROHM).

7. Rapid timer and Trickle timer integrated.

8. Monitor for the battery thermistor built in.

9. No external MOSFET required.

10. If system loads over AC adapter current rating, the battery will supply the current to the system.

11. Chip temperature detection circuit for over temperature protection integrated.

1.Package 1. QFN48 pin 6x6mm

2.Low price about 1.2$www.hardkernel.com

발표자 : 박종길www.hardkernel.com

�부트로더 (Uboot 1.3.4) 포팅 과정

�커널 (2.3.35.7) 드라이버 포팅 과정

�안드로이드 (Gingerbread 2.3.5) 포팅 과정

순순순순 서서서서

www.hardkernel.com

UUUU----Boot Boot Boot Boot 포팅포팅포팅포팅

iROM(BL0)iROM(BL0)iROM(BL0)iROM(BL0)(64KB)(64KB)(64KB)(64KB)

OM[3:0] = OM[3:0] = OM[3:0] = OM[3:0] = iROMiROMiROMiROMBootBootBootBoot

OM[3:0OM[3:0OM[3:0OM[3:0]]]]

GPN[15:13GPN[15:13GPN[15:13GPN[15:13]]]]

Booting ModeBooting ModeBooting ModeBooting Mode Boot DeviceBoot DeviceBoot DeviceBoot Device

- - - -

0_1110_1110_1110_111

000000000000

iROMiROMiROMiROM

SD/MMC(CH1 4SD/MMC(CH1 4SD/MMC(CH1 4SD/MMC(CH1 4----bit mode)bit mode)bit mode)bit mode)

001001001001 eMMC4.3(CH1 4eMMC4.3(CH1 4eMMC4.3(CH1 4eMMC4.3(CH1 4----bit mode)bit mode)bit mode)bit mode)

010010010010 eMMC4.4(CH3 4eMMC4.4(CH3 4eMMC4.4(CH3 4eMMC4.4(CH3 4----bit mode)bit mode)bit mode)bit mode)

011011011011 ReservedReservedReservedReserved

100100100100 ReservedReservedReservedReserved

101101101101 512B/Page, 8512B/Page, 8512B/Page, 8512B/Page, 8----bit ECCbit ECCbit ECCbit ECC

110110110110 Over 2KB/Page, 24Over 2KB/Page, 24Over 2KB/Page, 24Over 2KB/Page, 24----bit ECC(2K,4K,8K)bit ECC(2K,4K,8K)bit ECC(2K,4K,8K)bit ECC(2K,4K,8K)

111111111111 Over 4KB/Page, 48Over 4KB/Page, 48Over 4KB/Page, 48Over 4KB/Page, 48----bit ECC(4K,8K)bit ECC(4K,8K)bit ECC(4K,8K)bit ECC(4K,8K)

XFXTSELXFXTSELXFXTSELXFXTSEL Clock source frequency selectClock source frequency selectClock source frequency selectClock source frequency select

0000 12 12 12 12 MhzMhzMhzMhz

1111 19.2 19.2 19.2 19.2 MhzMhzMhzMhz

XOSCSELXOSCSELXOSCSELXOSCSEL Oscillator pad select Oscillator pad select Oscillator pad select Oscillator pad select

0000 SYS OSC(XXTO, XXTI)SYS OSC(XXTO, XXTI)SYS OSC(XXTO, XXTI)SYS OSC(XXTO, XXTI)

1111 USB OSC(XUSBXTI, XUSBXTO)USB OSC(XUSBXTI, XUSBXTO)USB OSC(XUSBXTI, XUSBXTO)USB OSC(XUSBXTI, XUSBXTO)

NAND ControllerNAND ControllerNAND ControllerNAND Controller

SD/MMCSD/MMCSD/MMCSD/MMCControllerControllerControllerController BootBootBootBoot

DeviceDeviceDeviceDevice

GPN[15:13] : GPN[15:13] : GPN[15:13] : GPN[15:13] : BootingBootingBootingBootingDevice selection Device selection Device selection Device selection

DRAMDRAMDRAMDRAMControllerControllerControllerController

DDRDDRDDRDDR256MB256MB256MB256MB

DEBUG PortDEBUG PortDEBUG PortDEBUG Port MemoryMemoryMemoryMemory

UART2UART2UART2UART2 DDR (256MB)DDR (256MB)DDR (256MB)DDR (256MB)

DEBUGDEBUGDEBUGDEBUGSerial Serial Serial Serial PortPortPortPort

UART2UART2UART2UART2

Oscillator pad selectOscillator pad selectOscillator pad selectOscillator pad select

XOSCSELXOSCSELXOSCSELXOSCSELXFXTSELXFXTSELXFXTSELXFXTSEL

Frequency selectFrequency selectFrequency selectFrequency select

S5P6450S5P6450S5P6450S5P6450

ODROIDODROIDODROIDODROID----E Hardware E Hardware E Hardware E Hardware 구성구성구성구성

www.hardkernel.com

UUUU----Boot Source Tree Boot Source Tree Boot Source Tree Boot Source Tree

////ubootubootubootuboot

/board/board/board/board/include/include/include/include

////configsconfigsconfigsconfigs ////samsungsamsungsamsungsamsung

/smdk6450/smdk6450/smdk6450/smdk6450

lowlevel_init.slowlevel_init.slowlevel_init.slowlevel_init.s

////cpucpucpucpu

/s5p645x/s5p645x/s5p645x/s5p645x

/s5p6450/s5p6450/s5p6450/s5p6450

cpu_init.scpu_init.scpu_init.scpu_init.s

/common/common/common/common

smdk6450.hsmdk6450.hsmdk6450.hsmdk6450.h

• System clock 설정• Debug Port 설정• Default 환경변수 설정

• A/M PLL 설정

DMC 초기화•DMC Memory control 설정•DMC Timing control 설정

Fastboot partition 설정•SYSTEM (256MB)•DATA (512MB)•CACHE (256MB)

fastboot.cfastboot.cfastboot.cfastboot.c

USB PHY Clock 설정•Clock frequency 설정•Clock source 설정

cmd_mmc_disk.ccmd_mmc_disk.ccmd_mmc_disk.ccmd_mmc_disk.c

usbdusbdusbdusbd----otgotgotgotg----hs.chs.chs.chs.c

www.hardkernel.com

UUUU----Boot BuildBoot BuildBoot BuildBoot Build

� make clean� 기존에 생성되었던 object, config를 삭제하고 초기화 상태로 전환함.

� make smdk6450_config

� \include\configs\smdk6450.h에 설정값으로 u-boot config를 설정.

� make –j10

� u-boot.bin 생성

www.hardkernel.com

UUUU----Boot Fusing Boot Fusing Boot Fusing Boot Fusing ---- 1 1 1 1

� JTAG

� H/W의 JTAG Port를 MDS(Trace32)에 연결하여 사용함.

� MDS Tool에서 제공하는 Script를 이용하여 H/W 기본적인 Clock 및

Memory(DDR)를 초기화 함.

� 초기화 되어진 Memory(DDR)에 생성되어진 Uboot.bin를 올려서 실행.

� 실행되어진 Uboot를 통하여 fusing.

� fastboot

� movi write uboot 20008000

� Host-PC

� fastboot flash uboot uboot.binwww.hardkernel.com

UUUU----Boot Fusing Boot Fusing Boot Fusing Boot Fusing ---- 2222

� BL1Checksum BL1Checksum BL1Checksum BL1Checksum 연산연산연산연산

ST. ST. ST. ST. SectorSectorSectorSector

Partition NamePartition NamePartition NamePartition Name SizeSizeSizeSize

NormalPartition

User Data (VFAT)

CACHE (Ext4) 256MB

DATA (Ext4) 512MB

SYSTEM (Ext4) 256MB

LowlevelPartition(10MB)

13377 Reserved

9281 Ramdisk 2MB

1089 Kernel 4MB

65 BL2 (u-boot.bin) 512KB

33 UBOOT config 16KB

1 BL1 (u-boot_bl1.bin) 16KB

0 MBR 512B

T-Flash Map(include/movi.h)

Uboot/cpu/s5p645x/movi.c

void movi_write_bl1(ulong addr,member_t *image){

int i;ulong checksum;ulong src;ulong tmp;

src = addr;

for(i = 0, checksum = 0;i < (14 * 1024) - 4;i++)checksum += *(u8*)addr++;

tmp = *(ulong*)addr;*(ulong*)addr = checksum;

movi_write(image[1].start_blk,image[1].used_blk, src);

*(ulong*)addr = tmp;}

UBOOT BL1UBOOT BL1UBOOT BL1UBOOT BL1의의의의 구조구조구조구조

u-boot.bin

u-boot_bl1.bin (14K – 4 bytes) Checksum(4bytes)

14K bytes

sudo dd iflag=dsync oflag=dsync if=./u-boot_bl1.bin of=/dev/sdb seek=1sudo dd iflag=dsync oflag=dsync if=./u-boot.bin of=/dev/sdb seek=65

� BootloaderBootloaderBootloaderBootloader fusing (Linux console)fusing (Linux console)fusing (Linux console)fusing (Linux console)www.hardkernel.com

UUUU----Boot Boot Boot Boot 실행실행실행실행

www.hardkernel.com

UUUU----Boot DebuggingBoot DebuggingBoot DebuggingBoot Debugging

Debug console Debug console Debug console Debug console 상태상태상태상태 Check H/WCheck H/WCheck H/WCheck H/W Check S/WCheck S/WCheck S/WCheck S/W

아무런 메시지도 나타나지 않음.• Main Clock 설정 확인.• Boot mode, Boot Device 설정 확인.• SD/MMC Port연결 확인.

• Debug port 설정 확인.• BL1 checksum 확인.

‘OK’ 메시지만 나타남.• DRAM 전원 확인.• DRAM Bus 연결 확인.

• Memory Configuration 확인.

Debug Message 깨짐 현상. • Main Clock 설정 확인. • A/M PLL 설정 확인.

www.hardkernel.com

Kernel Driver Kernel Driver Kernel Driver Kernel Driver 포팅포팅포팅포팅

� Device의 연결 확인

� Device에 맞는 Driver작성

� Makefile 및 Kconfig file 수정

� Platform device driver 추가

LCD 480X800(WVGA)(LMS397KF04)

Touchscreen(AIMS902)

Keypad(GPIO)

Accelerometor(BMA150)

Vibrator(AUDX1001)

Regulator(RN5T614)

Sound Codec(MAX98095)

Battery Monitor(MAX17040)

WiFi / BT(BCM4329)

3M Camera(S5K5CAGX)

GPIOGPIOGPIOGPIO

IICIICIICIIC

IICIICIICIIC

IICIICIICIIC

LCD I/FLCD I/FLCD I/FLCD I/F SPISPISPISPI

HSHSHSHS----MMC/SD/SDIOMMC/SD/SDIOMMC/SD/SDIOMMC/SD/SDIO

IICIICIICIIC

IICIICIICIIC

IICIICIICIIC

IISIISIISIISCAM I/FCAM I/FCAM I/FCAM I/F IICIICIICIIC

S5P6450S5P6450S5P6450S5P6450

ODROIDODROIDODROIDODROID----E Device E Device E Device E Device 연결연결연결연결

Kernel Porting 순서

UARTUARTUARTUART

www.hardkernel.com

Kernel Source TreeKernel Source TreeKernel Source TreeKernel Source Tree

/drivers

/input /video /misc/regulator/media

/soc/sound

/touchscreen

/keyboard

/samsung

/accelerometor

/codec

/s3c24xx

/aim902.c/aim902-i2c.c/aim902-sysfs.c/aim902-update.c/Kconfig/Makefile

/odroide_keypad.c/Kconfig/Makefile

/s3cfb_lms397kf04.c/Kconfig/Makefile

/axxx1001.c/Kconfig/Makefile

/yas_acc_kernel_driver.c/yas_acc_driver-bma150.c/Kconfig/Makefile

/rn5t614.c/Kconfig/Makefile

/video

/s5k5cagx.c/Kconfig/Makefile

/max98095.c/max98095_mixer.c/Kconfig/Makefile

/hkdk6450-max98095.c/Kconfig/Makefile

/arm/arch /mach-s5p6450 /mach-hkdk6450.c/Kconfig/Makefile

www.hardkernel.com

KconfigKconfigKconfigKconfig , , , , MakefileMakefileMakefileMakefile 수정수정수정수정

� Kconfig file 수정

-- drivers/input/touchscreen/Kconfig --

config TOUCHSCREEN_TPS6507X

tristate "TPS6507x based touchscreens"

depends on I2C

help

Say Y here if you have a TPS6507x based touchscreen controller.

If unsure, say N.

To compile this driver as a module, choose M here: the module will be called tps6507x_ts.

config TOUCHSCREEN_AIM902

bool "ODROID-E4 AIM902 based touchscreens"

depends on I2C

---help---

Say Y here if you have a touchscreen interface using the AIM902 controller, and your board-specific initialization

code includes that.

This enables support for ODROTD-E WVGA(480X800) Touch panel

� Makefile 수정

-- drivers/input/touchscreen/Makefile --

obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o

obj-$(CONFIG_TOUCHSCREEN_AIM902) += aim902.o aim902-i2c.o aim902-sysfs.o aim902-update.o

obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.owww.hardkernel.com

Platform device Platform device Platform device Platform device 추가추가추가추가

-- /arch/arm/mach-s5p6450/mach-hkdk6450.c --

//----------------------------------------------------------------------------------------

// I2C_5 GPIO interface (AIMS902 Touchscreen)

//----------------------------------------------------------------------------------------

#define GPIO_I2C5_SDA S5P6450_GPD(6)

#define GPIO_I2C5_SCL S5P6450_GPD(7)

static struct i2c_gpio_platform_data i2c5_platdata = {

.sda_pin = GPIO_I2C5_SDA, // gpio number

.scl_pin = GPIO_I2C5_SCL,

.udelay = 1,

.sda_is_open_drain = 0,

.scl_is_open_drain = 0,

.scl_is_output_only = 0

};

static struct platform_device hkdk6450_i2c5 = {

.name = "i2c-gpio",

.id = 5, // adapter number

.dev.platform_data = &i2c5_platdata,

};

static struct i2c_board_info i2c_devs5[] __initdata = {

#if defined(CONFIG_TOUCHSCREEN_AIM902)

{ I2C_BOARD_INFO("aim902", 0x28), },

#endif

};

//----------------------------------------------------------------------------------------

static struct platform_device *hkdk6450_devices[] __initdata = {

&s3c_device_i2c0,

&s3c_device_i2c1,

#if defined(CONFIG_TOUCHSCREEN_AIM902)

&hkdk6450_i2c5,

#endif

}

//----------------------------------------------------------------------------------------

www.hardkernel.com

Kernel Build Kernel Build Kernel Build Kernel Build ---- 1111

� make distclean

� 기존에 생성되었던 object, config를 삭제하고 초기화 상태로 전환함.

� make smdk6450_android_defconfig� 기본설정으로 사용할 config file 설정.

www.hardkernel.com

Kernel Build Kernel Build Kernel Build Kernel Build ---- 2222

� make menuconfig

� Platform에 맞는 device driver 선택.

� 사용하지 않는 device driver 제거.

www.hardkernel.com

Kernel Build Kernel Build Kernel Build Kernel Build ---- 3333

� make –j10

� Kernel image 및 driver module (*.ko) 생성.

� Kernel 폴더에 생성되어진 .config를 configs폴더에 저장

� cp .config arch/arm/configs/odroid_e_defconfig

� Kernel Image output

� arch/arm/boot/zImage 생성확인.www.hardkernel.com

Kernel FusingKernel FusingKernel FusingKernel Fusing

� Uboot fastboot

� Host PC :

sudo fastboot flash kernel zImage

� T-Flash Reader

� Host PC :

sudo dd iflag=dsync oflag=dsync if=./zImage of=/dev/sdb seek=1089

www.hardkernel.com

Android Android Android Android 포팅포팅포팅포팅

Android Device Android Device Android Device Android Device 폴더폴더폴더폴더 구조구조구조구조

/device

/hardkernel

/odroide4

/product

/proprietary

/conf

BoardConfig.mkbuild_android.shdevice.mk

init.product.rcinit.rcueventd.product.rcvold.fstab

AndroidProduct.mkodroide4.mk

/bin

/keychars

/libcameraE4

/libsensor

Key-layout file (kcm, klfile)

Camera interface file

Sensor interface file

Touch FirmwareWiFi / BT Firmware기타 실행에 필요한 파일

/common

/google

/sec

/…

device_common.mk

• Device Device Device Device 폴더에폴더에폴더에폴더에 product product product product 추가추가추가추가• BoardConfig.mkBoardConfig.mkBoardConfig.mkBoardConfig.mk 수정수정수정수정• init.rcinit.rcinit.rcinit.rc 수정수정수정수정• device.mkdevice.mkdevice.mkdevice.mk 수정수정수정수정• vold.fstabvold.fstabvold.fstabvold.fstab 수정수정수정수정• WiFiWiFiWiFiWiFi / Bluetooth / Bluetooth / Bluetooth / Bluetooth 수정수정수정수정• Sensor / Sensor / Sensor / Sensor / CarmeraCarmeraCarmeraCarmera library library library library 포팅포팅포팅포팅

Android Porting 순서

www.hardkernel.com

BoardConfig.mkBoardConfig.mkBoardConfig.mkBoardConfig.mk 수정수정수정수정 ---- 1111

…#--------------------------------------------------------------------------

# Sound option

#--------------------------------------------------------------------------

BOARD_USES_GENERIC_AUDIO := false

BOARD_USES_LIBSECRIL_STUB := true

BOARD_NO_PAGE_FLIPPING := false

#--------------------------------------------------------------------------

# bosh(bma150) accelerometer sensor

#--------------------------------------------------------------------------

BOARD_HAVE_BMA150_SENSORS := true

#--------------------------------------------------------------------------

# Wifi Config

#--------------------------------------------------------------------------

WPA_BUILD_SUPPLICANT := true

CONFIG_CTRL_IFACE := y

BOARD_WPA_SUPPLICANT_DRIVER := WEXT

WPA_SUPPLICANT_VERSION := VER_0_6_X

BOARD_WLAN_DEVICE := bcm4329

WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/bcm4329.ko“

WIFI_DRIVER_MODULE_ARG := "iface_name=wlan firmware_path=/system/etc/firmware/fw_bcm4329.bin nvram_path=/system/etc/firmware/nvram"

WIFI_DRIVER_MODULE_NAME := "bcm4329“

…www.hardkernel.com

BoardConfig.mkBoardConfig.mkBoardConfig.mkBoardConfig.mk 수정수정수정수정 ---- 2222

…#--------------------------------------------------------------------------

# Camera

#--------------------------------------------------------------------------

USE_CAMERA_STUB := false

ifeq ($(USE_CAMERA_STUB),false)

BOARD_CAMERA_LIBRARIES := libhkcamera_odroide

endif

#--------------------------------------------------------------------------

# Bluetooth config

#--------------------------------------------------------------------------

BOARD_HAVE_BLUETOOTH := true

BOARD_HAVE_BLUETOOTH_BCM := true

#--------------------------------------------------------------------------

# GPS

#--------------------------------------------------------------------------

BOARD_HAVE_HARDWARE_GPS := false

#--------------------------------------------------------------------------

# Chip H/W Config

#--------------------------------------------------------------------------

BOARD_USES_OVERLAY := true

BOARD_USES_HW_DECODER := true

BOARD_USE_JPEG := false

…www.hardkernel.com

init.rcinit.rcinit.rcinit.rc 수정수정수정수정 ---- 1111

…write /dev/cpuctl/bg_non_interactive/cpu.shares 52

on fs

# mount mtd partitions

# Mount /system rw first to give the filesystem a chance to save a checkpoint

mount ext4 /dev/block/mmcblk0p2 /system

mount ext4 /dev/block/mmcblk0p3 /data wait nosuid nodev noatime

mount ext4 /dev/block/mmcblk0p4 /cache /cache nosuid nodevon post-fs

# once everything is setup, no need to modify /

mount rootfs rootfs / ro remount

on boot

chown system system /sys/kernel/ipv4/tcp_rmem_def

chown system system /sys/kernel/ipv4/tcp_rmem_max

chown root radio /proc/cmdline

#################################################

# Sensors interface node

#################################################

chown system input /sys/class/input/input0/enable

chown system input /sys/class/input/input0/delay

chown system input /sys/class/input/input0/wake

…www.hardkernel.com

init.rcinit.rcinit.rcinit.rc 수정수정수정수정 ---- 2222

…#

# bluetooth interface

#

chown bluetooth bluetooth /dev/s3c2410_serial0

chmod 0666 /dev/s3c2410_serial0

#

# bluetooth Mac address

#

chown bluetooth bluetooth /system/etc/bluetooth

chmod 755 /system/etc/bluetooth

# Define TCP buffer sizes for various networks

# ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax,

setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208

setprop net.tcp.buffersize.wifi 4095,87380,110208,4096,16384,110208

setprop net.tcp.buffersize.umts 4094,87380,110208,4096,16384,110208

setprop net.tcp.buffersize.edge 4093,26280,35040,4096,16384,35040

setprop net.tcp.buffersize.gprs 4092,8760,11680,4096,8760,11680

…www.hardkernel.com

init.rcinit.rcinit.rcinit.rc 수정수정수정수정 ---- 3333

class_start default

…service wpa_supplicant /system/bin/wpa_supplicant -Dwext -iwlan0 -c /data/misc/wifi/wpa_supplicant.conf –dd

group system wifi inet

disabled

oneshot

#===================================================================

# baudrate change 115200 to 921600(Bluetooth)

#===================================================================

service hciattach /system/bin/hciattach -n -f /system/etc/firmware/bcm4329.hcd /dev/s3c2410_serial0 bcmbt 921600 flow

user bluetooth

group bluetooth net_bt_admin misc

disabled

service hfag /system/bin/sdptool add --channel=10 HFAG

user bluetooth

group bluetooth net_bt_admin

disabled

oneshot

…www.hardkernel.com

device.mkdevice.mkdevice.mkdevice.mk 수정수정수정수정 ---- 1111

include $(LOCAL_PATH)/BoardConfig.mk

# --------------------------------------------------------------------------

# Prebuilt kl keymaps

# --------------------------------------------------------------------------

PRODUCT_COPY_FILES += \

device/hardkernel/proprietary/keychars/hkc1xx-keypad.kl:system/usr/keylayout/hkc1xx-keypad.kl

# --------------------------------------------------------------------------

# Generated kcm keymaps

# --------------------------------------------------------------------------

PRODUCT_PACKAGES := \

hkc1xx-keypad.kcm

# --------------------------------------------------------------------------

# These are the hardware-specific configuration files

# --------------------------------------------------------------------------

PRODUCT_COPY_FILES += \

$(LOCAL_PATH)/conf/init.rc:root/init.rc \

$(LOCAL_PATH)/conf/vold.fstab:system/etc/vold.fstab

www.hardkernel.com

device.mkdevice.mkdevice.mkdevice.mk 수정수정수정수정 ---- 2222

# --------------------------------------------------------------------------

# WIFI firmware

# --------------------------------------------------------------------------

PRODUCT_COPY_FILES += \

device/hardkernel/proprietary/bin/fw_bcm4329.bin:system/etc/firmware/fw_bcm4329.bin \

device/hardkernel/proprietary/bin/nvram:system/etc/firmware/nvram \

device/hardkernel/proprietary/bin/bcm4329_e4.ko:system/lib/modules/bcm4329.ko \

device/hardkernel/proprietary/bin/bcm4329.hcd:system/etc/firmware/bcm4329.hcd

# --------------------------------------------------------------------------

# Init files

# --------------------------------------------------------------------------

PRODUCT_COPY_FILES += \

$(LOCAL_PATH)/conf/init.product.rc:root/init.odroide4.rc \

$(LOCAL_PATH)/conf/ueventd.product.rc:root/ueventd.odroide4.rc

www.hardkernel.com

vold.fstabvold.fstabvold.fstabvold.fstab 수정수정수정수정 및및및및 기타기타기타기타 lib lib lib lib 포팅포팅포팅포팅

� vold.fstab 수정#######################

## Regular device mount

##

## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...>

## label - Label for the volume

## mount_point - Where the volume will be mounted

## part - Partition # (1 based), or 'auto' for first usable partition.

## <sysfs_path> - List of sysfs paths to source devices

######################

dev_mount sdcard /mnt/sdcard auto /devices/platform/s3c-sdhci.1/mmc_host/mmc1

� WiFi / Bluetooth 수정� hardware/libhardware_legacy/wifi/wifi.c

� system/bluetooth/bluedroid/bluetooth.c

� Sensor / Carmera library 포팅� device/hardkernel/proprietary/libsensor/

� device/hardkernel/proprietary/libcameraE4/www.hardkernel.com

Android BuildAndroid BuildAndroid BuildAndroid Build

� make clean

� 기존에 생성되었던 object를 삭제하고 초기화 상태로 전환함.

� Android system build(build_android.sh 실행)

� /device/hardkernel/odroide4/build_android.sh 파일을 Android root에 soft-link를 걸어서 사용.

ln –s ./device/hardkernel/odroide4/build_android.sh ./odroide4_build.sh

� Android build, ramdisk-uboot.img 생성.

� System 폴더 및 ramdisk file을 $PRODUCT_-img(odroide4-img) folder에 복사.

www.hardkernel.com

Android FusingAndroid FusingAndroid FusingAndroid Fusing

� Android system file 복사

� Host PC (T-Flash Reader):sudo umount /dev/sdb* � all partition unmount

sudo mkfs.ext4 /dev/sdb2 � system partition 초기화

sudo mount /dev/sdb2 /media/sd

sudo cp –a ./odroide4-img/system/* /media/sd

sudo umount /dev/sdb2

� Android ramdisk-uboot.img

� Host PC (uboot fastboot) : sudo fastboot flash ramdisk ramdisk-uboot.img

� Host PC (T-Flash Reader) : sudo dd iflag=dsync oflag=dsync if=./ramdisk-uboot.img of=/dev/sdb seek=9281www.hardkernel.com

Android BootingAndroid BootingAndroid BootingAndroid Booting

� Q & A

� www.hardkernel.com 자유게시판을 활용하여 주세요.

www.hardkernel.com

발표자 : 김창곤www.hardkernel.com

� WinCE 6.0 개발환경 설정 및 Build

� WinCE Display Driver 포팅

� Uboot를 이용한 Multi-Boot (안드로이드/WinCE)

순순순순 서서서서

www.hardkernel.com

Build tool Build tool Build tool Build tool 및및및및 BSP BSP BSP BSP 설치설치설치설치

� ODROID-E(S5P6450) WinCE 6.0 개발 환경 설치

� Microsoft Visual Studio 2005

� Microsoft Visual Studio 2005 Service Pack 1

� Microsoft Windows Embedded CE 6.0 Platform builder

� Microsoft Windows Embedded CE 6.0 Platform builder Service Pack 1

� Microsoft Windows Embedded CE 6.0 R2

� Microsoft Windows Embedded CE 6.0 R3

� Microsoft Windows Embedded CE 6.0 Cumulative Product Update Rollup Package(2010/12/31)

� Latest Microsoft Windows Embedded CE 6.0 Monthly Update(Recommended)

� BSP(SMDK6450_BSP) 설치

� BSP 폴더 Copy

� %WINCEROOT%\PLATFORM\SMDK6450

� %WINCEROOT%\PLATFORM\COMMON

www.hardkernel.com

ODROIDODROIDODROIDODROID----E OS Design E OS Design E OS Design E OS Design 만들기만들기만들기만들기----1111

� File -> New -> Project

� Project Name “ODROIDE”

� “OK”

www.hardkernel.com

ODROIDODROIDODROIDODROID----E OS Design E OS Design E OS Design E OS Design 만들기만들기만들기만들기 ----2222

� Board Support Packages 선택 (SMDK6450 선택)

www.hardkernel.com

ODROIDODROIDODROIDODROID----E OS Design E OS Design E OS Design E OS Design 만들기만들기만들기만들기 ----3333

� Design Templete 설정 (PDA Device)

www.hardkernel.com

ODROIDODROIDODROIDODROID----E OS Design E OS Design E OS Design E OS Design 만들기만들기만들기만들기----4444

� Design Templete 설정 (Mobile Handheld)

www.hardkernel.com

ODROIDODROIDODROIDODROID----E OS Design E OS Design E OS Design E OS Design 만들기만들기만들기만들기----5555

� Applications Media feature 선택 (Internet Explorer 6.0, Windows Media Audio/MP3)

www.hardkernel.com

ODROIDODROIDODROIDODROID----E OS Design E OS Design E OS Design E OS Design 만들기만들기만들기만들기----6666

� ODROIDE OS Design 을 만들고 나면 Visual Studio에서 Solution Explorer탭 활성화.

� 그림과 같이 Build Option을 Release로 선택.

www.hardkernel.com

Public Component Public Component Public Component Public Component 추가하기추가하기추가하기추가하기----1111

� Catalog Item View (Core OS->CEBASE->File Systems and Data Store)

www.hardkernel.com

Public Component Public Component Public Component Public Component 추가하기추가하기추가하기추가하기----2222

� Catalog Item View (Core OS->CEBASE->Graphics and Multimedia Technologies)

www.hardkernel.com

Public Component Public Component Public Component Public Component 추가하기추가하기추가하기추가하기----3333

� Catalog Item View (Core OS->Device Drivers)

www.hardkernel.com

Public Component Public Component Public Component Public Component 추가하기추가하기추가하기추가하기----4444

� Catalog Item View (Core OS->CEBASE->Applications and Services Development)

www.hardkernel.com

Project Build OptionProject Build OptionProject Build OptionProject Build Option----1111

� Visual Studio->Project->ODROIDE Properties...

� ODROIDE Property Pages -> Configuration Properties -> Locale

� “Clear All” -> “영어 (미국)” 선택

www.hardkernel.com

Project Build OptionProject Build OptionProject Build OptionProject Build Option----2222

� Visual Studio->Project->ODROIDE Properties...

� ODROIDE Property Pages -> Configuration Properties -> Build Options

� “Enable KITL (no IMGNOKITL=1)” 선택 해제

www.hardkernel.com

Build SolutionBuild SolutionBuild SolutionBuild Solution

� Visual Studio->File->Save All

� Visual Studio->Build->Build solution

www.hardkernel.com

ODROIDODROIDODROIDODROID----E H/W E H/W E H/W E H/W 구성구성구성구성

iROM(BL0)iROM(BL0)iROM(BL0)iROM(BL0)(64KB)(64KB)(64KB)(64KB)

OM[3:0] = OM[3:0] = OM[3:0] = OM[3:0] = iROMiROMiROMiROMBootBootBootBoot

OM[3:0OM[3:0OM[3:0OM[3:0]]]]

GPN[15:13GPN[15:13GPN[15:13GPN[15:13]]]]

Booting ModeBooting ModeBooting ModeBooting Mode Boot DeviceBoot DeviceBoot DeviceBoot Device

- - - -

0_1110_1110_1110_111

000000000000

iROMiROMiROMiROM

SD/MMC(CH1 4SD/MMC(CH1 4SD/MMC(CH1 4SD/MMC(CH1 4----bit mode)bit mode)bit mode)bit mode)

001001001001 eMMC4.3(CH1 4eMMC4.3(CH1 4eMMC4.3(CH1 4eMMC4.3(CH1 4----bit mode)bit mode)bit mode)bit mode)

010010010010 eMMC4.4(CH3 4eMMC4.4(CH3 4eMMC4.4(CH3 4eMMC4.4(CH3 4----bit mode)bit mode)bit mode)bit mode)

011011011011 ReservedReservedReservedReserved

100100100100 ReservedReservedReservedReserved

101101101101 512B/Page, 8512B/Page, 8512B/Page, 8512B/Page, 8----bit ECCbit ECCbit ECCbit ECC

110110110110 Over 2KB/Page, 24Over 2KB/Page, 24Over 2KB/Page, 24Over 2KB/Page, 24----bit ECC(2K,4K,8K)bit ECC(2K,4K,8K)bit ECC(2K,4K,8K)bit ECC(2K,4K,8K)

111111111111 Over 4KB/Page, 48Over 4KB/Page, 48Over 4KB/Page, 48Over 4KB/Page, 48----bit ECC(4K,8K)bit ECC(4K,8K)bit ECC(4K,8K)bit ECC(4K,8K)

XFXTSELXFXTSELXFXTSELXFXTSEL Clock source frequency selectClock source frequency selectClock source frequency selectClock source frequency select

0000 12 12 12 12 MhzMhzMhzMhz

1111 19.2 19.2 19.2 19.2 MhzMhzMhzMhz

XOSCSELXOSCSELXOSCSELXOSCSEL Oscillator pad select Oscillator pad select Oscillator pad select Oscillator pad select

0000 SYS OSC(XXTO, XXTI)SYS OSC(XXTO, XXTI)SYS OSC(XXTO, XXTI)SYS OSC(XXTO, XXTI)

1111 USB OSC(XUSBXTI, XUSBXTO)USB OSC(XUSBXTI, XUSBXTO)USB OSC(XUSBXTI, XUSBXTO)USB OSC(XUSBXTI, XUSBXTO)

NAND ControllerNAND ControllerNAND ControllerNAND Controller

SD/MMCSD/MMCSD/MMCSD/MMCControllerControllerControllerController BootBootBootBoot

DeviceDeviceDeviceDevice

GPN[15:13] : GPN[15:13] : GPN[15:13] : GPN[15:13] : BootingBootingBootingBootingDevice selection Device selection Device selection Device selection

DRAMDRAMDRAMDRAMControllerControllerControllerController

DDRDDRDDRDDR256MB256MB256MB256MB

DEBUG PortDEBUG PortDEBUG PortDEBUG Port MemoryMemoryMemoryMemory

UART2UART2UART2UART2 DDR (256MB)DDR (256MB)DDR (256MB)DDR (256MB)

DEBUGDEBUGDEBUGDEBUGSerial Serial Serial Serial PortPortPortPort

UART2UART2UART2UART2

Oscillator pad selectOscillator pad selectOscillator pad selectOscillator pad select

XOSCSELXOSCSELXOSCSELXOSCSELXFXTSELXFXTSELXFXTSELXFXTSEL

Frequency selectFrequency selectFrequency selectFrequency select

S5P6450S5P6450S5P6450S5P6450

ODROIDODROIDODROIDODROID----E Hardware E Hardware E Hardware E Hardware 구성구성구성구성

www.hardkernel.com

WinCE Source TreeWinCE Source TreeWinCE Source TreeWinCE Source Tree

WINCE600WINCE600WINCE600WINCE600\\\\PLATFORMPLATFORMPLATFORMPLATFORM\\\\

SMDK6450\COMMON\

SRC\SOC\ SRC\

config.bib 등의 *.bib filesplatform.reg 등의 *.reg files기타 실행파일 및 dll files

S5P6450_SEC_V1

BOOTLOADER\

FILES\ CATALOG\ SDK\ ETC\

BSP Catalog Item files

USB DriverDownload ToolJTAG Script file

MPVD Driver(Multi Purpose Video Decoder)

COMMON\ DRIVERS\ INC\ KITL\OAL\

OAL 관련된 소스 코드 Booting Device에따른 EBOOT 코드

부트로더, 커널 관련된소스 코드

Architecture 관련한 소스 코드와SOC HW 관련 소스 코드

Public Driver가 아닌디바이스 드라이버

BSP Include file KITL 관련 코드

� CESYSGEN\ - Build process와 관련된 Makefile

www.hardkernel.com

ODROIDODROIDODROIDODROID----E HW Clock, MEM E HW Clock, MEM E HW Clock, MEM E HW Clock, MEM configconfigconfigconfig

� ODROID-E(S5P6450) Clock configuration

� \PLATFORM\COMMON\SRC\SOC\S5P6450_SEC_V1\OAL\INC\soc_cfg.h file

� #define TARGET_CLK CLK_800_166MHz

� //#define TARGET_CLK CLK_667_166MHz

� //#define TARGET_CLK CLK_533_133MHz

� \PLATFORM\COMMON\SRC\SOC\S5P6450_SEC_V1\OAL\INC\S5P6450.inc file

� TARGET_CLK SETA CLK_800_166MHz

� ;TARGET_CLK SETA CLK_667_166MHz

� ;TARGET_CLK SETA CLK_533_133MHz

� ODROID-E(S5P6450) MEM configuration

� \PLATFORM\COMMON\SRC\SOC\S5P6450_SEC_V1\OAL\INC\soc_cfg.h file

� #define DRAM_TYPE LPDDR

� //#define DRAM_TYPE DDR2

� \PLATFORM\COMMON\SRC\SOC\S5P6450_SEC_V1\OAL\INC\S5P6450.inc file

� DRAM_TYPE SETA LPDDR

� ;DRAM_TYPE SETA DDR2

www.hardkernel.com

Debug Port, Booting device Debug Port, Booting device Debug Port, Booting device Debug Port, Booting device 설정설정설정설정

� ODROID-E(S5P6450) Debug Serial init

� \PLATFORM\SMDK6450\SMDK6450.bat file

� @REM set BSP_DEBUGPORT=SERIAL_UART0

� @REM set BSP_DEBUGPORT=SERIAL_UART1

� set BSP_DEBUGPORT=SERIAL_UART2

� @REM set BSP_DEBUGPORT=SERIAL_UART3

� \PLATFORM\SMDK6450\SRC\Inc\bsp_cfg.h

� #define DEBUG_UART3 (3)

� #define DEBUG_BAUDRATE (115200)

� ODROID-E(S5P6450) Booting Device Init (SD_BOOT, HSMMC1)� \PLATFORM\SMDK6450\SMDK6450.bat file

� set BOOTLOADER_OPTION=SDBOOT

� set BSP_NONANDFS=1

� set BSP_NOHSMMC_CH0=1

� set BSP_NOHSMMC_CH1=

� set BSP_NOHSMMC_CH3=1

www.hardkernel.com

기타기타기타기타 ODROIDODROIDODROIDODROID----E HW E HW E HW E HW 설정설정설정설정

� ODROID-E(S5P6450) 기타 HW 설정

� \PLATFORM\SMDK6450\SMDK6450.bat file

� set BSP_NOI2C=

� set BSP_NOSPI=1

� @REM ----- CAMERAFILTER Device Driver Configuration -------------

� @REM CAMERA FILTER/I2C Device Driver

� set BSP_NOCAMERA=1

� @REM ----- GPS Driver Configuration -------------

� set BSP_NOGPS=1

www.hardkernel.com

ODROIDODROIDODROIDODROID----E Display Driver E Display Driver E Display Driver E Display Driver 포팅포팅포팅포팅

� Backlight Driver 포팅

� LCD Controller Init

� LCD I/F Timing

LCD 480X800(WVGA)(LMS397KF04)

PWM_1PWM_1PWM_1PWM_1

LCD I/FLCD I/FLCD I/FLCD I/F

SPISPISPISPIS5P6450S5P6450S5P6450S5P6450

ODROIDODROIDODROIDODROID----E Display HW InterfaceE Display HW InterfaceE Display HW InterfaceE Display HW Interface

LCD I/FLCD I/FLCD I/FLCD I/F

BacklightBacklightBacklightBacklightBacklight HW Driver

www.hardkernel.com

ODROIDODROIDODROIDODROID----E Backlight driver E Backlight driver E Backlight driver E Backlight driver 포팅포팅포팅포팅

� ODROID-E(S5P6450) LCD Backlight driver� \PLATFORM\SMDK6450\SRC\DRIVERS\BACKLIGHT\PDD\backlight_pdd.cpp file

� PWM_1 포트로 작성된 Driver를 PWM_0 포트로 수정

� void BL_InitPWM() function

– GPF14 pin_function PWM_0 수정

- Timer0 초기화

� void BL_Set(BOOL bOn) function

– PWM_0 On/Off

- HW Backlight driver enable/disable

� void BL_SetBrightness(DWORD dwValue)

– PWM_0 Frequency 초기화 (Timer0 설정)

- PWM_0 Duty_rate 설정

� DWORD BacklightInit(LPCTSTR pContext, LPCVOID lpvBusContext, CEDEVICE_POWER_STATE *pDeviceState)

- GPF14 Pull-up/down disabledwww.hardkernel.com

ODROIDODROIDODROIDODROID----E LCD driver E LCD driver E LCD driver E LCD driver 포팅포팅포팅포팅----1111

� ODROID-E(S5P6450) LCD LMS397KF04 define

� \PLATFORM\SMDK6450\SRC\INC\bsp_cfg.h file

� #define LCD_MODULE_LTP700 (8) // Landscape 7" WVGA RGB24

� #define LCD_MODULE_LMS397KF04 (9) // Portrait 3.97" WVGA RGB24

� //#define SMDK6450_LCD_MODULE (LCD_MODULE_LTE480)

� #define SMDK6450_LCD_MODULE (LCD_MODULE_LMS397KF04)

� #elif (SMDK6450_LCD_MODULE == LCD_MODULE_LMS397KF04)

� #define LCD_WIDTH 480

� #define LCD_HEIGHT 800

� #define LCD_BPP 32 // rgb888 XRGB

� #define LCD_TYPE LCD_TYPE_PORTRAIT

� \PLATFORM\SMDK6450\SRC\DRIVERS\DISPLAY\INC\ldi.h file

� typedef enum

{

LDI_LTE480WV_RGB, // 4.8" WVGA 800*480 in SMDK6450

LDI_LMS397KF04_RGB, // 3.97" WVGA 480*800 in ODROIDE

LDI_HT101HD1_RGB, // 1376*768 in SMDK6450

� static void LDI_LMS397KF04_RGB_port_initialize(void);

� static LDI_ERROR LDI_LMS397KF04_RGB_power_on(void);

� static LDI_ERROR LDI_LMS397KF04_RGB_power_off(void);

� static LDI_ERROR LDI_LMS397KF04_RGB_initialize(void);

www.hardkernel.com

ODROIDODROIDODROIDODROID----E LCD driver E LCD driver E LCD driver E LCD driver 포팅포팅포팅포팅----2222

� ODROID-E(S5P6450) LCD LMS397KF04 define

� \PLATFORM\SMDK6450\SRC\DRIVERS\DISPLAY\DISPLAY_DRV\sources file

� \PLATFORM\SMDK6450\SRC\DRIVERS\DISPLAY\DISPLAY_DRV\i2c_pmic.h file add

� \PLATFORM\SMDK6450\SRC\DRIVERS\DISPLAY\DISPLAY_DRV\i2c_pmic.cpp file add

� PMIC(RN5T614) LDO(VDD_LCD) I2C Interface add

� \PLATFORM\SMDK6450\SRC\DRIVERS\DISPLAY\DISPLAY_DRV\display_main.cpp file

� PMIC LDO(VDD_LCD) Enable

� #if (SMDK6450_LCD_MODULE == LCD_MODULE_LTE480)

LDI_set_LCD_module_type(LDI_LTE480WV_RGB);

� #elif (SMDK6450_LCD_MODULE == LCD_MODULE_LMS397KF04)

LDI_set_LCD_module_type(LDI_LMS397KF04_RGB);

� \PLATFORM\SMDK6450\SRC\DRIVERS\DISPLAY\LDI_LIB\LDI\ldi.c file

� SPI interface function add (GPIO Bit-Bang)

� LCD 초기화 코드 추가

- static void LDI_LMS397KF04_RGB_port_initialize(void);

- static LDI_ERROR LDI_LMS397KF04_RGB_power_on(void);

- static LDI_ERROR LDI_LMS397KF04_RGB_power_off(void);

- static LDI_ERROR LDI_LMS397KF04_RGB_initialize(void);

� LCD Interface Timing 수정

- case LDI_LTE480WV_RGB:

- case LDI_LMS397KF04_RGB

www.hardkernel.com

Build OS Image & Build OS Image & Build OS Image & Build OS Image & config.bibconfig.bibconfig.bibconfig.bib

� Visual Studio->File->Save All

� Visual Studio->Build->Build solution

� New OS Image NK.NB0 Start Address

� \PLATFORM\SMDK6450\FILES\config.bib

� #define NKSTART 80100000

� #define NKLEN 01F00000 ; 31 MB

� CONFIG

ROMSTART = $(NKSTART)

ROMSIZE = $(NKLEN)

� NK.NB0 Load Address – 8010_0000

� \PLATFORM\SMDK6450\SRC\INC\oemaddrtab_cfg.inc

g_oalAddressTable

DCD 0x80000000, 0x20000000, 128 ; 128 MB DRAM

� NK.NB0 Load Virtual Address – 2010_0000www.hardkernel.com

Download OS Image & RunDownload OS Image & RunDownload OS Image & RunDownload OS Image & Run

� Target

– Booting on Uboot

- dnw [Load address]

www.hardkernel.com

Download OS Image & RunDownload OS Image & RunDownload OS Image & RunDownload OS Image & Run

� Host PC – USB 드라이버 설치 및 NK.NB0 다운로드

� USB 드라이버 위치 : PLATFORM\SMDK6450\ETC\SMDK6450 USB Driver

� PLATFORM\SMDK6450\ETC\DNW v0.60C\dnw.exe 실행

� USB 연결되면 NK.NB0 download

� Dnw.exe->USB_Port->Transmit->Transmit -> File open dialog -> NK.NB0 선택

� NK.NB0 위치 : OSDesigns\ODROID\ODROID\RelDir\SMDK6450_ARMV4I_Release\NK.NB0

� Target

– 다운로드가 완료되면 “go 20100000”

- WinCE OS Image Booting

www.hardkernel.com

WinCE OS Image FusingWinCE OS Image FusingWinCE OS Image FusingWinCE OS Image Fusing

ST. ST. ST. ST. SectorSectorSectorSector

Partition NamePartition NamePartition NamePartition Name SizeSizeSizeSize

NormalPartition

User Data (VFAT)

CACHE (Ext4) 256MB

DATA (Ext4) 512MB

SYSTEM (Ext4) 256MB

79313 Reserved

LowlevelPartition(10MB)

13377 WinCE OS Image 32MB

9281 Ramdisk 2MB

1089 Kernel 4MB

65 BL2 512KB

33 UBOOT config 16KB

1 BL1 16KB

0 MBR 512B

TTTT----Flash Memory MapFlash Memory MapFlash Memory MapFlash Memory Map

ODROID-E WinCE OS Image

(Size 32MB)

� T-Flash raw-Image 영역 재설정

� Movi R/W command 추가

� Filesystem MBR 영역 재설정

� Bootcmd, ext_env 추가

� Multi-Boot 설정www.hardkernel.com

TTTT----Flash Raw Image Flash Raw Image Flash Raw Image Flash Raw Image 영역영역영역영역 설정설정설정설정

� T-Flash raw-image 영역 재설정

� $uboot$/include/movi.h file

� #define PART_SIZE_WINCE (32 * 1024 * 1024)

� $uboot$/common/cmd_movi.c file

� int init_raw_area_table (block_dev_desc_t * dev_desc)

- wince 영역 추가 32MB

� int do_movi(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])

- movi write wince command 추가

- mmc raw area write command 추가

� T-Flash Filesystem partition table 설정

� $uboot$/common/cmd_mmc_fdisk.c

� Filesystem block start address : 0번 섹터에서 64MB이후 시작하도록 수정

� Bootcmd 수정, EXT_ENV 추가

� $uboot$/include/configs/smdk6450.h

� dnw_ce : “dnw 20100000;movi write wince 20100000”

� Android_boot : “movi read kernel 20008000;movi read rootfs 20A00000 200000;bootm 20008000 20A00000”

� wince_boot : “movi read wince 20100000;go 20100000”

� wince_dl : “dnw 20100000;go 20100000”

www.hardkernel.com

TTTT----Flash Fusing & Standalone bootFlash Fusing & Standalone bootFlash Fusing & Standalone bootFlash Fusing & Standalone boot

� Target – Uboot으로 Booting -> “dnw 20100000”

� Host PC - dnw.exe 실행 후 NK.NB0 전송

� Target – 전송 완료되면 “movi write wince 20100000”

� Target – “run wince_boot” (EXT_ARGS)

www.hardkernel.com

Multi Boot Multi Boot Multi Boot Multi Boot 예제예제예제예제

� ODROID-E VolumeUp Key를 이용한 Multi-Boot 예제

� $uboot$/board/samsung/smdk6450/smdk6450.c file

/* --------------------------------------------------------- */

#define GPNCON (*(unsigned long *)(ELFIN_GPIO_BASE + GPNCON_OFFSET))

#define GPNDAT (*(unsigned long *)(ELFIN_GPIO_BASE + GPNDAT_OFFSET))

#define GPNPUD (*(unsigned long *)(ELFIN_GPIO_BASE + GPNPUD_OFFSET))

void check_bootmode(void)

{

char run_cmd[100];

unsigned long data=0;

GPNCON = (GPNCON & ~(0x3<<2*0))|(0x0<<2*0); // GPN(0) Input config

GPNPUD = (GPNPUD & ~(0x3<<2*0))|(0x1<<2*0); // GPN(0) Pull-Down

data = GPNDAT;

if((data>>0 & 0x1)){

memset(run_cmd, 0x00, sizeof(run_cmd));

sprintf(run_cmd, "run wince_boot");

run_command(run_cmd, 0);

}

}

� int board_late_init(void) – check_bootmode() call

www.hardkernel.com

발표자 : 윤동열www.hardkernel.com

순 서

�카메라 디바이스 드라이버 포팅

�안드로이드 카메라 framework 구조

�안드로이드 카메라 APP에서 Touch-to-focus구현

www.hardkernel.com

Camera Module

� s5k5aafa

� 1.3MPixel

� 1280x1024

� Max 15 fpx @ SXGA

� s5k5cagx

� 3MPixel

� 2048x1536

� Full @15fps,

� VGA @30fps

� MIPI CSI2(single lane)

� JPEG

� s5k4eagx

� 5MPixel

� 2592x1944

� Full @15fps

� MIPI CSI2(dual lane)

� JPEG www.hardkernel.com

CMOS Image Sensor Block Diagram

I2C

Image Data

AF Module

Image

Mclk

www.hardkernel.com

Exynos4210 Camera I/F

* * * * Parallel(CCIRParallel(CCIRParallel(CCIRParallel(CCIR) 2 port) 2 port) 2 port) 2 port* MIPI 2 port* MIPI 2 port* MIPI 2 port* MIPI 2 port(2 Lane, 4 Lane)(2 Lane, 4 Lane)(2 Lane, 4 Lane)(2 Lane, 4 Lane)

www.hardkernel.com

Camera Module Connector

Rear

Front

www.hardkernel.com

PCB Signal Routing

� ODROID-A Camera Signal line.

No Skew data line!!

CPU Module Connector

3M Rear Cam

1.3M Front Cam

www.hardkernel.com

Device Driver – CIS(CMOS Image Sensor)

� driver/media/video/s5k5cagx.c, s5k5cagx.h

� Camera Initialize � s5k5cagx_init()...

� internal clock setting

� firmware patch

� Camera setup� Setting : output format, frame size, effects, iso,af,

� focus management

� Mode change: capture or streaming

� V4L2 interface (ioctl)� VIDIOC_G_CTRL � s5k5cagx_g_ctr()

� VIDIOC_S_CTRL � s5k5cagx_s_ctr()

� VIDIOC_S_FMT � s5k5cagx_s_fmt()

� VIDIOC_G_PARM � s5k5cagx_g_parm()

� VIDIOC_S_PARM � s5k5cagx_s_parm()

� ...

I2C

www.hardkernel.com

Device Driver – FIMC

� driver/media/video/samsung/fimc

� fimc_dev.c� video node 생성(/dev/video0)

� V4L2 interface 등록

� fimc_v4l2.c� V4L2 interface.

� V4L2 device-subdev registration.

� kernel/driver/media/video/v4l2*

� fimc_capture.c� 카메라로 부터 영상 획득

� Mclk, Camera Power On/Off

� v4l2_subdev_call() � s5k5cagx_init()

� fimc_output.c� 영상 출력을 담당

� size,rotation, format 등을 변환

� fimc_overlay.c� LCD 출력 담당

� fimc_regs.c� H/W register control 함수 모음

FIMC(Fully Interactive Mobile Camera

Interface )

– Post Processor, Scaler, Rotator, input/output DMA Driver

/dev/video0

www.hardkernel.com

/dev/video0

Device Driver – FIMC block diagram

V4L2

Fimc_Capture

Fimc_Output

Fimc_Overlay

User Appor

Android

YUV,RGB,JPEG,RAW

open(“/dev/video0”)

YUV422sp, Jpeg

LCD(dev/fb0)

Cam

RGB32

ScalerRotatorColorSpace Conversion

V4L2

www.hardkernel.com

Device Driver – ODROID-A Platform

� Name, I2c address and bus number

� MClk � 24Mhz� clock source(clock.c)

� Power On/Off

� RESET, STBYn

static struct i2c_board_info s5k5cagx_i2c_info = {I2C_BOARD_INFO("S5K5CAGX", 0x3c),

.platform_data = &s5k5cagx_plat,};static struct s3c_platform_camera s5k5cagxs5k5cagxs5k5cagxs5k5cagx = {

.id = CAMERA_PAR_A,

.type = CAM_TYPE_ITU,fmt = ITU_601_YCBCR422_8BIT,

.order422 = CAM_ORDER422_8BIT_YCBYCR,

.i2c_busnum = 1,

.info = &s5k5cagx_i2c_info,

.pixelformat= V4L2_PIX_FMT_YUYV,

.srclk_name = "xusbxti",

.clk_name = "sclk_cam0",

.clk_rate = 24000000,

.line_length = 480,

.width = 640,

.height = 480,

.window = {.left = 0,.top = 0,.width = 640,.height = 480,

},/* Polarity */

.inv_pclk = 0,

.inv_vsync = 1,

.inv_href = 0,

.inv_hsync = 0,

.initialized = 0,

.cam_power = hkdkc210_cam0_power,};

void cam0_s5k5cagx_reset(int power_up){...}

static int hkdkc210_cam0_power(int onoff){...}

/* Interface setting */static struct s3c_platform_fimc fimc_platfimc_platfimc_platfimc_plat = {

.default_cam = CAMERA_PAR_A,

.camera = {&s5k5cagxs5k5cagxs5k5cagxs5k5cagx, // rear cam&s5k5aafa, // front cam

},.hw_ver = 0x51,

};

arch/arm/mach-s5pv310/mach-hkdkc210.c

www.hardkernel.com

V4L2 Interface 예제

� fbcam.c, capture.c(http://v4l2spec.bytesex.org)� 간단히 카메라 영상을 LCD frame buffer에 출력 또는 파일로 저장

� V4L2 interface 사용. ex) ret = ioctl(fp, VIDIOC_QUERYCAP, &cap);

VIDIOC_QUERYCAP

VIDIOC_S_FMT

VIDIOC_DQBUF

VIDIOC_QUERYBUF

VIDIOC_QBUF

VIDIOC_REQBUFS

VIDIOC_STREAMON

VIDIOC_STREAMOFF

VIDIOC_QBUF

VIDIOC_DQBUF

open(“/dev/video0”)

close()

V4L2_CAP_VIDEO_CAPTURE V4L2_CAP_VIDEO_OUTPUT V4L2_CAP_VIDEO_OVERLAY V4L2_CAP_STREAMING

Width, Height, pixel format setting

버퍼 할당 및 초기화 요청

버퍼 정보 쿼리

Exchange a buffer with the driver

Query device capabilities �

새로운 프레임을 요청

카메라 스트림 ON

카메라 스트림 OFF

새로운 프레임을 가져감www.hardkernel.com

Android – Proprietary Camera Library

� android/frameworks/base/services/camera/libcameraservice

� Reference codes

� Emulator : FakeCamera.cpp

� android/device/hardkernel/proprietary/libcamera

� SecCameraHWInterface.cpp

� SecCameraHWInterface.h

� SecCamera.cpp

� SecCamera.h

Porting

open(“/dev/video0”)

libcamera.so 생성www.hardkernel.com

Android Camera Framework

open()close()getCameraInfo()setParameters()TakePicture()startPreview()stopPreview()...

JNIJNI(Java Native Interface)(Java Native Interface)

www.hardkernel.com

Touch-to-focus?

� 사용자가 카메라 APP에서 Preview를 Touch 한 곳으로 Focus를 이동.

CIS Device Driver

Focus X,Y Focus X,Y Focus X,Y Focus X,Y 좌표좌표좌표좌표

Touch event

JAVA Apps Libraries Linux Kernelwww.hardkernel.com

Touch2Focus – Parameters 정의

� android/frameworks/base/core/java/android/hardware/Camera.java� Class Camera.Parameters

� public class Parameters {

// Parameter keys to communicate with the camera driver.

private static final String KEY_PREVIEW_SIZE = "preview-size";

private static final String KEY_PREVIEW_FORMAT = "preview-format";

private static final String KEY_PREVIEW_FRAME_RATE = "preview-frame-rate";

...

private static final String KEY_FOCUS_LOCATION = "focus-location";

}

� android/frameworks/base/libs/camera/CameraParameters.cpp� namespace android {

// Parameter keys to communicate between camera application and driver.

const char CameraParameters::KEY_PREVIEW_SIZE[] = "preview-size";

const char CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES[] = "preview-size-values";

const char CameraParameters::KEY_PREVIEW_FORMAT[] = "preview-format";

const char CameraParameters::KEY_PREVIEW_FRAME_RATE[] = "preview-frame-rate";

...

const char CameraParameters::KEY_FOCUS_LOCATION[] = "focus-location";

}

$ make update-api

www.hardkernel.com

Touch2Focus – Camera APP (JAVA)

� android/packages/apps/Camera/android/packages/apps/Camera/android/packages/apps/Camera/android/packages/apps/Camera/src/com/android/camera/Camera.javasrc/com/android/camera/Camera.javasrc/com/android/camera/Camera.javasrc/com/android/camera/Camera.java

private int touch_old_x;private int touch_old_y;

@Overridepublic boolean onTouchEvent(MotionEvent event) {

int touchX = (int) event.getX(); // touch 좌표를 수집int touchY = (int) event.getY();

if((touch_old_x - touchX > 50) || (touch_old_x - touchX < -50)||(touch_old_y - touchY > 50) || (touch_old_y - touchY < -50) ) {

touch_old_x=touchX;touch_old_y=touchY;

mParameters.setFocusLocation(touchX+","+ touchY);

mCameraDevice.setParameters(mParameters);

Log.v(TAG,"touch "+touchX + ", "+ touchY );}

return true;}

� android/frameworks/base/core/java/android/hardware/Camera.java

public void setFocusLocation(String value) {set(KEY_FOCUS_LOCATION, value);

}

“100,200” 형식으로 저장

Parameter에 좌표 값을 저장

Camera.javaCamera.java

SecCameraHWInterface.cppSecCamera.cpp

S5k5cagx.c

Parameters

www.hardkernel.com

Touch2Focus - Android Proprietary(C++)

� android/device/hardkernel/proprietary/libcamera/SecCameraHWInterface.cppint CameraHardwareSec::get_focus_location(const CameraParameters& params){

int fx,fy;

fx = fy = -1;

// Get the current string, if it doesn't exist, leave the -1x-1

const char *p = params.get(CameraParameters::KEY_FOCUS_LOCATION);

if (p == 0) return -1;

parse_pair(p, &fx, &fy, ',');

mSecCamera->setFocusLocation(fx,fy);

return 0;

}

� android/device/hardkernel/proprietary/libcamera/SecCamera.cppint SecCamera::setFocusLocation(int lx, int ly){

int ret;

unsigned int val;

val = lx<<16 | ly;

ret = fimc_v4l2_s_ctrlfimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAM_FOCUS_LOCATION, val);

return 0;

}static int fimc_v4l2_s_ctrl (int fp, unsigned int id, unsigned int value) { ...

ctrl.value = value;

ret = ioctl(fp, VIDIOC_S_CTRL, &ctrl);}

Kernel의 V4L2 드라이버에 값을 넘김

Parameter에서 좌표데이터를가져옴

Camera.java

SecCameraHWInterface.cppSecCameraHWInterface.cpp

SecCamera.cppSecCamera.cpp

Device Driver

V4L2 callV4L2 callV4L2 callV4L2 call

Parameters

www.hardkernel.com

Touch2Focus – V4L2 (Kernel)

• kernel/media/video/v4l2-ioctl.c

static long __video_do_ioctl(struct file *file, unsigned int cmd, void *arg) {

...

case VIDIOC_S_CTRL:

if (ops->vidioc_s_ctrl) {

ret = ops->vidioc_s_ctrl(file, fh, p);

break;

}

• kernel/media/video/samsung/fimc/fimc_v4l2.c

static int fimc_s_ctrl(struct file *filp, void *fh, struct v4l2_control *c) {

if (ctrl->cap != NULL) {

ret = fimc_s_ctrl_capture(ctrl, c);

} ...

}

• kernel/media/video/samsung/fimc/fimc_capture.c

int fimc_s_ctrl_capture(void *fh, struct v4l2_control *c){

switch (c->id) { ...

default:

if (FIMC2 != ctrl->id)

ret = subdev_call(ctrl, core, s_ctrl, c);

break;

}

return ret;

}

S5k5cagx.c

V4L2V4L2

subdev_callsubdev_callsubdev_callsubdev_call()()()()

www.hardkernel.com

Touch2Focus – CIS Device driver

� Kernel/drivers\media\video /S5k5cagx.c static int s5k5cagx_s_ctrs5k5cagx_s_ctrll(struct v4l2_subdev *sd, struct v4l2_control *ctrl)

{

...

switch (ctrl->id) {

case V4L2_CID_CAM_FOCUS_LOCATION:

int x1= ctrl->value >> 16;

int y1= ctrl->value & 0xffff

err=s5k5cagx_set_focus_location(sd,x1,x2); // set focus position to CIS

err=s5k5cagx_write_array(sd,

s5k5cagx_regs_focus[1],S5K5CAGX_FOCUS); // Change Mode to focus fixed

break;

...

}

...

}

Camera.java

SecCameraHWInterface.cppSecCamera.cpp

S5k5cagx.cS5k5cagx.c

static const struct v4l2_subdev_core_ops s5k5cagx_core_ops = {

.init = s5k5cagx_init, /* initializing API */

.s_config = s5k5cagx_s_config,/* Fetch platform data */

.queryctrl = s5k5cagx_queryctrl,

.querymenu = s5k5cagx_querymenu,

.g_ctrl = s5k5cagx_g_ctrl,

.s_ctrls_ctrl = s5k5cagx_s_ctrl,};

CIS 에 좌표값 Write

www.hardkernel.com

발표자 : 김형섭www.hardkernel.com

순순순순 서서서서

� 오드로이드에 최신 우분투 11.10(Beta 2) 설치

- 리눅스(우분투) 부팅 과정

- rootstock command

- fdisk & 파일시스템 생성

- wifi 환경 구축

- booting

� WWW Service 를 위한 APM(Apache, Php, Mysql) 설치

� WWW Service 시현

www.hardkernel.com

리눅스리눅스리눅스리눅스 부팅부팅부팅부팅 과정과정과정과정

1. 오드로이드에 최신 우분투 11.10(Beta 2) 설치

- 리눅스 부팅 과정

: uboot � Kernel � Ubuntu(Root File System)

1) uboot : 부트로더의 한 종류로 kernel를 메모리에 로드하기 위한최소한의 코드.

uboot 는 T-Flash Card 첫섹터(MBR) 다음 부분에 위치하고 있으며, 여기서는 기존 uboot를 그대로 사용한다.

-로켓(부트로더) : 우주선(커널)을 우주로올리기 위한 추진장치.www.hardkernel.com

리눅스리눅스리눅스리눅스 부팅부팅부팅부팅 과정과정과정과정

2) kernel : 프로세스 스케줄링, 자원관리, 디바이스 드라이버 등등 OS의 핵심.

여기서는 기존 커널(2.6.35.7)을 VFAT 영역인 /boot 파티션에서 로드한다.

3) ubuntu(rootfs) : Root File System(EXT4)

커널은 root file system 의 /sbin/init 프로세스(Process)와 [kthreadd]를실행시킨다. /sbin/init 의 PID 는 1이고, [kthreadd] 의 PID 는 2 이며, 다른 모든프로세스의 조상이다. 각각 fork() 와 exec() system call 과 kernel_thread() 와daemonize() 를 이용하여 번식된다.

$ ps -ef

여기서는 현재 최신 버전(11.10 – oneiric beta2) 를 인스톨하여 사용한다.

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 13:20 ? 00:00:01 /sbin/init

root 2 0 0 13:20 ? 00:00:00 [kthreadd]

root 360 1 0 13:20 ? 00:00:00 udevd --daemon

root 586 360 0 13:20 ? 00:00:00 udevd --daemon

root 791 2 0 13:20 ? 00:00:00 [hd-audio0]www.hardkernel.com

리눅스리눅스리눅스리눅스 부팅부팅부팅부팅 과정과정과정과정

uboot

kernel

www.hardkernel.com

rootstock commandrootstock commandrootstock commandrootstock command

- rootstock command(shell script)

: 우분투 PC(Host system)에서 rootstock 명령으로 ubuntu armel(ARMArchitecture) root file system를 만들수 있다.

$ $ $ $ sudosudosudosudo rootstock rootstock rootstock rootstock --------fqdnfqdnfqdnfqdn odroid odroid odroid odroid --------imagesizeimagesizeimagesizeimagesize 4G 4G 4G 4G --------dist dist dist dist oneiriconeiriconeiriconeiric --------login login login login odroid odroid odroid odroid --------password odroid password odroid password odroid password odroid --------seed wget,nano,linuxseed wget,nano,linuxseed wget,nano,linuxseed wget,nano,linux----firmware,wirelessfirmware,wirelessfirmware,wirelessfirmware,wireless----tools,usbutils,btrfstools,usbutils,btrfstools,usbutils,btrfstools,usbutils,btrfs----tools,i2ctools,i2ctools,i2ctools,i2c----tools,wpasupplicant tools,wpasupplicant tools,wpasupplicant tools,wpasupplicant --------components "main universe components "main universe components "main universe components "main universe multiversemultiversemultiversemultiverse““““

: Option : Option : Option : Option

--------fqdnfqdnfqdnfqdn : Target system : Target system : Target system : Target system 의의의의 Hostname(/etc/hostname) Hostname(/etc/hostname) Hostname(/etc/hostname) Hostname(/etc/hostname) 를를를를 odroid odroid odroid odroid 라고라고라고라고설정한다설정한다설정한다설정한다....

--------imagesizeimagesizeimagesizeimagesize : Target : Target : Target : Target filesystemfilesystemfilesystemfilesystem 의의의의 사이즈사이즈사이즈사이즈

--------dist : dist : dist : dist : apt(Advancedapt(Advancedapt(Advancedapt(Advanced Package Tool) source release version.Package Tool) source release version.Package Tool) source release version.Package Tool) source release version.

--------login : Login IDlogin : Login IDlogin : Login IDlogin : Login ID

--------password : password : password : password : 사용자사용자사용자사용자 비밀번호비밀번호비밀번호비밀번호

--------seed : seed : seed : seed : 인스톨할인스톨할인스톨할인스톨할 패키지패키지패키지패키지 리스트리스트리스트리스트

--------components(Thecomponents(Thecomponents(Thecomponents(The repository components are) : repository components are) : repository components are) : repository components are) :

Main Main Main Main ---- Officially supported software.Officially supported software.Officially supported software.Officially supported software.

Restricted Restricted Restricted Restricted ---- Supported software that is not available under a completely fSupported software that is not available under a completely fSupported software that is not available under a completely fSupported software that is not available under a completely free ree ree ree license.license.license.license.

Universe Universe Universe Universe ---- Community maintained software, i.e. not officially supported Community maintained software, i.e. not officially supported Community maintained software, i.e. not officially supported Community maintained software, i.e. not officially supported software.software.software.software.

www.hardkernel.com

fdiskfdiskfdiskfdisk

- fdisk: T-flash partition 분할

- 파일시스템 생성

$ sudo mkfs.vfat /dev/sdc2 –n vfat

$ sudo mkswap /dev/sdc3

$ sudo mkfs.ext4 /dev/sdc4 –L rootfs

www.hardkernel.com

Root file system Root file system Root file system Root file system 복사복사복사복사

- root file system root file system root file system root file system 복사복사복사복사

www.hardkernel.com

WifiWifiWifiWifi 설정설정설정설정 ---- 1 1 1 1

---- Network : Network : Network : Network : wifiwifiwifiwifi 환경환경환경환경 구축구축구축구축

: bcm4329 wireless lan 모듈를 사용하기 위해서는 먼저 모듈의 power 가 on 이 되어야

한다. 안드로이드 시스템에서는 설정 � Wi-Fi 켜기를 실행함과 동시에 전원이 on

되지만, 우분투에서는 따로 구현을 해 주어야 한다.

여기서는 kernel 이 실행됨과 동시에 wifi 모듈의 전원을 on 시키도록 한다.

[$KERNEL/arch/arm/mach-s5pv310/hkc1xx-sysfs.c]

www.hardkernel.com

WifiWifiWifiWifi 설정설정설정설정 ---- 2222

---- 우분투우분투우분투우분투 설정설정설정설정 파일파일파일파일

$ $ $ $ sudosudosudosudo mkdirmkdirmkdirmkdir ----p /system/etc/firmwarep /system/etc/firmwarep /system/etc/firmwarep /system/etc/firmware

==> copy fw_bcm4329.bin, ==> copy fw_bcm4329.bin, ==> copy fw_bcm4329.bin, ==> copy fw_bcm4329.bin, nvramnvramnvramnvram files into /system/etc/firmware directory.files into /system/etc/firmware directory.files into /system/etc/firmware directory.files into /system/etc/firmware directory.

$ $ $ $ sudosudosudosudo mkdirmkdirmkdirmkdir /lib/modules/2.6.35.7/kernel/lib/lib/modules/2.6.35.7/kernel/lib/lib/modules/2.6.35.7/kernel/lib/lib/modules/2.6.35.7/kernel/lib

==> copy bcm4329.ko file into /lib/modules/2.6.35.7/kernel/lib/ ==> copy bcm4329.ko file into /lib/modules/2.6.35.7/kernel/lib/ ==> copy bcm4329.ko file into /lib/modules/2.6.35.7/kernel/lib/ ==> copy bcm4329.ko file into /lib/modules/2.6.35.7/kernel/lib/ directory.directory.directory.directory.

$ $ $ $ sudosudosudosudo vi /lib/modules/2.6.35.7/modules.depvi /lib/modules/2.6.35.7/modules.depvi /lib/modules/2.6.35.7/modules.depvi /lib/modules/2.6.35.7/modules.dep

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

kernel/lib/bcm4329.ko: <kernel/lib/bcm4329.ko: <kernel/lib/bcm4329.ko: <kernel/lib/bcm4329.ko: <------------ Add this line and save.Add this line and save.Add this line and save.Add this line and save.

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

$ $ $ $ sudosudosudosudo vi /etc/modulesvi /etc/modulesvi /etc/modulesvi /etc/modules

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

bcm4329 <bcm4329 <bcm4329 <bcm4329 <------------ Add this line and save.Add this line and save.Add this line and save.Add this line and save.

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

$ $ $ $ sudosudosudosudo vi /etc/network/interfacesvi /etc/network/interfacesvi /etc/network/interfacesvi /etc/network/interfaces

www.hardkernel.com

WifiWifiWifiWifi 설정설정설정설정 ---- 3 3 3 3

auto loauto loauto loauto lo

ifaceifaceifaceiface lo lo lo lo inetinetinetinet loopbackloopbackloopbackloopback

auto eth0auto eth0auto eth0auto eth0

ifaceifaceifaceiface eth0 eth0 eth0 eth0 inetinetinetinet dhcpdhcpdhcpdhcp

address 192.168.0.204 <address 192.168.0.204 <address 192.168.0.204 <address 192.168.0.204 <------------ AP IP AP IP AP IP AP IP ADDRESS(staticADDRESS(staticADDRESS(staticADDRESS(static))))

gateway 192.168.0.1gateway 192.168.0.1gateway 192.168.0.1gateway 192.168.0.1

dnsdnsdnsdns----nameservernameservernameservernameserver 192.168.0.1192.168.0.1192.168.0.1192.168.0.1

netmasknetmasknetmasknetmask 255.255.255.0255.255.255.0255.255.255.0255.255.255.0

wpawpawpawpa----driver driver driver driver wextwextwextwext

wpawpawpawpa----ssidssidssidssid hardkernel2 <hardkernel2 <hardkernel2 <hardkernel2 <------------ Your SSIDYour SSIDYour SSIDYour SSID

wpawpawpawpa----apapapap----scanscanscanscan 2222

wpawpawpawpa----proto RSNproto RSNproto RSNproto RSN

wpawpawpawpa----pairwisepairwisepairwisepairwise CCMPCCMPCCMPCCMP

wpawpawpawpa----group CCMPgroup CCMPgroup CCMPgroup CCMP

wpawpawpawpa----keykeykeykey----mgmt WPAmgmt WPAmgmt WPAmgmt WPA----PSKPSKPSKPSK

wpawpawpawpa----pskpskpskpsk 81b2ae31a8dede0e05e446fbf6a243c71f865909c349bba1ecdca996e5e041781b2ae31a8dede0e05e446fbf6a243c71f865909c349bba1ecdca996e5e041781b2ae31a8dede0e05e446fbf6a243c71f865909c349bba1ecdca996e5e041781b2ae31a8dede0e05e446fbf6a243c71f865909c349bba1ecdca996e5e0417e <e <e <e <------------your WPA your WPA your WPA your WPA hex_keyhex_keyhex_keyhex_key

www.hardkernel.com

WifiWifiWifiWifi 설정설정설정설정 ---- 4 4 4 4

: How to make a WPA: How to make a WPA: How to make a WPA: How to make a WPA----PSK key.PSK key.PSK key.PSK key.

$ $ $ $ wpa_passphrasewpa_passphrasewpa_passphrasewpa_passphrase <<<<your_essidyour_essidyour_essidyour_essid><><><><your_ascii_keyyour_ascii_keyyour_ascii_keyyour_ascii_key>>>>

network={network={network={network={

SsidSsidSsidSsid="test="test="test="test““““

####pskpskpskpsk="12345678="12345678="12345678="12345678““““

pskpskpskpsk=fe727aa8b64ac9b3f54c72432da14faed933ea511ecab1 5bbc6c52e7522f70=fe727aa8b64ac9b3f54c72432da14faed933ea511ecab1 5bbc6c52e7522f70=fe727aa8b64ac9b3f54c72432da14faed933ea511ecab1 5bbc6c52e7522f70=fe727aa8b64ac9b3f54c72432da14faed933ea511ecab1 5bbc6c52e7522f709a 9a 9a 9a <<<<------------ Copy this to Copy this to Copy this to Copy this to wpawpawpawpa----pskpskpskpsk !!!!

www.hardkernel.com

Booting Booting Booting Booting ---- 1 1 1 1

- Booting

www.hardkernel.com

Booting Booting Booting Booting ---- 2 2 2 2

- Booting

www.hardkernel.com

APM APM APM APM 설치설치설치설치

2. WWW Service 를 위한 APM(Apache, Php, Mysql) 설치

$ $ $ $ sudosudosudosudo aptaptaptapt----get update get update get update get update

: : : : 우분투우분투우분투우분투 패키지패키지패키지패키지 저장소저장소저장소저장소 데이터베이스를데이터베이스를데이터베이스를데이터베이스를 최신으로최신으로최신으로최신으로 갱신갱신갱신갱신....

---- Apache Apache Apache Apache

$ $ $ $ sudosudosudosudo aptaptaptapt----get install apache2get install apache2get install apache2get install apache2

---- mysqlmysqlmysqlmysql 인증인증인증인증 모듈모듈모듈모듈 및및및및 mysqlmysqlmysqlmysql 설치설치설치설치

$ $ $ $ sudosudosudosudo aptaptaptapt----get install libapache2get install libapache2get install libapache2get install libapache2----modmodmodmod----authauthauthauth----mysqlmysqlmysqlmysql

$ $ $ $ sudosudosudosudo aptaptaptapt----get install get install get install get install mysqlmysqlmysqlmysql----server server server server mysqlmysqlmysqlmysql----clientclientclientclient

---- php5 php5 php5 php5 및및및및 mysqlmysqlmysqlmysql 연동연동연동연동 모듈모듈모듈모듈 설치설치설치설치

$ $ $ $ sudosudosudosudo aptaptaptapt----get install php5get install php5get install php5get install php5----common php5 libapache2common php5 libapache2common php5 libapache2common php5 libapache2----modmodmodmod----php5php5php5php5

$ $ $ $ sudosudosudosudo aptaptaptapt----get install php5get install php5get install php5get install php5----mysqlmysqlmysqlmysql

---- sudosudosudosudo /etc/init.d/apache2 restart/etc/init.d/apache2 restart/etc/init.d/apache2 restart/etc/init.d/apache2 restart

www.hardkernel.com

WWW Service WWW Service WWW Service WWW Service ---- 1111

3. WWW Service 시현

: apache configuration file 중 DocumentRoot 디렉토리를 찾아 php 파일을작성한 후 확인한다.

- /etc/apache2/sites-available/default 파일의 DocumentRoot 는 /var/www.

$ cat /var/www/odroid.php

<p><br><center>

<font size=7 color=blue>

<?

echo “Hello World~~”;

echo “ - here in the odroid”;

?>

</font><p>

<? phpinfo(); ?>

</center>www.hardkernel.com

WWW Service WWW Service WWW Service WWW Service ---- 2222

- WWW Service 데모

www.hardkernel.com

발표자 : 이제현 / 김용오www.hardkernel.com

Android Open Accessory Android Open Accessory Android Open Accessory Android Open Accessory 활용활용활용활용 예제예제예제예제

� 하드웨어/펌웨어 구성 및 예제

� 호스트 단말기의 조건과 USB Host / Device

� Google ADK Reference 하드웨어 특징

� Open Accessory solution 비교

� ODROID-ADK 특징

� Thermal 프린터 인터페이스 예제 및 펌웨어 구성

� 안드로이드 플랫폼 구성 및 예제

� Framework

� Gadget 드라이버

� 기기 인식 과정 및 Open Accessory Library

� Thermal Printer 제어 Application 예제www.hardkernel.com

Google Open Accessory Google Open Accessory Google Open Accessory Google Open Accessory 현황현황현황현황

� Android Honeycomb 3.1 / Gingerbread 2.3.4 이상의 기기

� 구글의 강제 조항이 아님 (특정 제품에 한정될 수 있음)

� 안드로이드 스마트폰의 USB Device port를 이용 (100% ?)

� MCU 시스템에서 USB Host 구현 필요

� 스마트폰으로 전원 공급 필요 (휴대용에 적합하지 않을 수 있음)

� 고속 통신 주변기기 개발 가능(USB 2.0 HS)

� 라이센스 비용과 인증 과정이 없음

www.hardkernel.com

Google ADK Reference Google ADK Reference Google ADK Reference Google ADK Reference 하드웨어하드웨어하드웨어하드웨어 특징특징특징특징

� Maxim MAX3421 USB Host controller

� Atmel ATMEGA2560

� Arduino compatible

� Shield board (I/O test)

www.hardkernel.com

Open Accessory solution Open Accessory solution Open Accessory solution Open Accessory solution 비교비교비교비교

� MAX3421 USB Host controller + Atmel ATMEGA2560

� 느린 속도, 높은 가격 ($ ?)

� 복잡한 회로 및 소비전류

� 쉬운 포팅 (수많은 Arduino 예제 활용)

� FTDI Vinculum-II (VNC2)

� 16-bit MCU core with built-in USB Host, 256KB Flash / 16KB RAM ($ ?)

� Firmware source / Application source 제공

� I/O Bus 기반의 인터페이스는 좋으나 Analog/I2C 입출력 없음

� Microchip PIC24/PIC32

� 16bit/32bit, 다양한 제품군, 상대적으로 저렴한 가격, 낮은 소비 전력

� Firmware source / Application source 제공

� 광범위한 I/O 포트 제공

www.hardkernel.com

ODROIDODROIDODROIDODROID----ADK ADK ADK ADK 구성구성구성구성

PIC24FPIC24FPIC24FPIC24F16Bit/Lower Power 16Bit/Lower Power 16Bit/Lower Power 16Bit/Lower Power

MCUMCUMCUMCU++++

EmbeddedEmbeddedEmbeddedEmbedded

USB HostUSB HostUSB HostUSB Host

LDO 3.3 VoltLDO 3.3 VoltLDO 3.3 VoltLDO 3.3 Volt

5Volt output5Volt output5Volt output5Volt outputStepStepStepStep----up DC/DC up DC/DC up DC/DC up DC/DC

Converter Converter Converter Converter (For USB Host )(For USB Host )(For USB Host )(For USB Host )

Lithium PolymerLithium PolymerLithium PolymerLithium PolymerBattery ChargerBattery ChargerBattery ChargerBattery Charger

LiLiLiLi----PolymerPolymerPolymerPolymerRechargeable Rechargeable Rechargeable Rechargeable

BatteryBatteryBatteryBattery

Temperature SensorTemperature SensorTemperature SensorTemperature Sensor

Pressure(AltitudePressure(AltitudePressure(AltitudePressure(Altitude) ) ) ) SensorSensorSensorSensor

I/O PortsI/O PortsI/O PortsI/O PortsPWMPWMPWMPWMADCADCADCADCI2CI2CI2CI2C

GPIOGPIOGPIOGPIO

www.hardkernel.com

ODROIDODROIDODROIDODROID----ADK ADK ADK ADK 특징특징특징특징

� PIC24FJ64GB002로 최소한의 회로 구성

� 전세계 최저가 솔루션(?) / 발진 회로 내장

� 리튬폴리머 충전 회로 내장 / 휴대 가능

� USB 블루투스 동글 지원 (펌웨어 교체로 BaB 전환)

� 기압계/온도계 센서 내장

� 다양한 입출력 포트 (I/O Kit 지원으로 학습 가능)

www.hardkernel.com

ODROIDODROIDODROIDODROID----ADKADKADKADK와와와와 Thermal printer InterfaceThermal printer InterfaceThermal printer InterfaceThermal printer Interface

USB/12MbpsUSB/12MbpsUSB/12MbpsUSB/12Mbps

UART / 9600bpsUART / 9600bpsUART / 9600bpsUART / 9600bps

384 x 24 matrix384 x 24 matrix384 x 24 matrix384 x 24 matrix

Firmware Library Architecture

Configuring the LibraryConfiguring the LibraryConfiguring the LibraryConfiguring the LibraryUSB_ApplicationEventHandler callbacks (기기가 붙고 떨어질때 발생하는 인벤트 처리 콜백 함수 등록)HardwareProfile.h ("HardwareProfile - PIC24FJ64GB002 HK.h" 시스템 클럭, UART 속도, 칩셋 초기 제어)usb_config.h (USB 인터페이스 설정: Host/Device선택, BULK 모드, NAK 허용숫자, VBUS 전류허용치 등등)usb_config.c (VID/PID filter를 설정하여, 붙일 디바이스를 미리 선정 � 임베디드 호스트의 특징)

Initialization (ANDROID_ACCESSORY_INFORMATION Initialization (ANDROID_ACCESSORY_INFORMATION Initialization (ANDROID_ACCESSORY_INFORMATION Initialization (ANDROID_ACCESSORY_INFORMATION myDeviceInfomyDeviceInfomyDeviceInfomyDeviceInfo))))static char description[] = "ODROID-ADK1";static char manufacturer[] = "Hardkernel Co., Ltd.";static char model[] = "ODROID Accessory Demo";static char uri[] = "http://www.hardkernel.com";static char version[] = "1.1";static char serial[] = "N/A";

Keeping the Stack RunningKeeping the Stack RunningKeeping the Stack RunningKeeping the Stack Runningmain()에서 초기화 이후 while(1) 내부에서 USBTask()를 계속 호출하는 형태

Detecting a Connection/Disconnection to an Android DeviceDetecting a Connection/Disconnection to an Android DeviceDetecting a Connection/Disconnection to an Android DeviceDetecting a Connection/Disconnection to an Android DeviceUSB_ApplicationEventHandler() Callback이 자동으로 device_attached == FALSE/TRUE 업데이트

Sending DataSending DataSending DataSending DataAndroidAppIsWriteComplete()Check to see if the last write to the Android device was completedAndroidAppWrite()Sends data to the Android device specified by the passed in handle.

Receiving DataReceiving DataReceiving DataReceiving DataAndroidAppIsReadComplete()Check to see if the last read to the Android device was completedAndroidAppRead()Attempts to read information from the specified Android device

* Microchip's Accessory Framework for Android Microchip's Accessory Framework for Android Microchip's Accessory Framework for Android Microchip's Accessory Framework for Android 문서 참조

www.hardkernel.com

ODROIDODROIDODROIDODROID----ADK ADK ADK ADK 펌웨어펌웨어펌웨어펌웨어 개발개발개발개발 환경환경환경환경

USBUSBUSBUSB

Firmware source code downloadFirmware source code downloadFirmware source code downloadFirmware source code downloadSVN server (펌웨어 및 앱 소스 관리 서버)http://dev.odroid.com/projects/accessory/src1. 커맨드커맨드커맨드커맨드 라인에서라인에서라인에서라인에서 익명으로익명으로익명으로익명으로 체크체크체크체크 아웃아웃아웃아웃 방법방법방법방법# svn checkout --username anonsvn http://dev.odroid.com/svn/accessory* The password is 'anonsvn'

2. SDK 개발개발개발개발 환경환경환경환경 eclipse에서에서에서에서 다운로드다운로드다운로드다운로드 방법방법방법방법http://dev.odroid.com/projects/accessory/wiki/BaseProjectAndEclipseSetting

ToolchainToolchainToolchainToolchain (Compiler)(Compiler)(Compiler)(Compiler)1. MPLAB IDE (Windows)-c30 gcc컴파일러 추가 설치 필요2. MPLAB-X (Linux/Mac/Windows)-ODROID-ADK/BaB예제 import 가능

- 폴더명 대소문자 구분- Android C30-coff.a 말고 Android C30-elf.a를 선택)

•Lite 무료 버전으로 충분히 개발/양산 가능

Programmer (Programmer (Programmer (Programmer (In Circuit Emulator)In Circuit Emulator)In Circuit Emulator)In Circuit Emulator)PICKIT3 (Program PICKIT3 (Program PICKIT3 (Program PICKIT3 (Program 기록기록기록기록 및및및및 디버깅디버깅디버깅디버깅 가능가능가능가능))))-US$ 45 (국내 약 60,000원)-US$ 25 (Clone 제품)PICKIT2 (Program PICKIT2 (Program PICKIT2 (Program PICKIT2 (Program 기록만기록만기록만기록만 가능가능가능가능))))- US$ 35 /18

* MicrochipMicrochipMicrochipMicrochip사사사사 Development Tools Main Page Development Tools Main Page Development Tools Main Page Development Tools Main Page 참고참고참고참고

배터리배터리배터리배터리배터리배터리배터리배터리 필수필수필수필수필수필수필수필수

ADB ADB ADB ADB ADB ADB ADB ADB WiFiWiFiWiFiWiFiWiFiWiFiWiFiWiFi

www.hardkernel.com

발표자 : 김용오www.hardkernel.com

USB Basic

USB is an asymmetric protocol

� Host� Controls the entire bus� Keeps track of all attached devices and hubs (enumeration)� Initiates communication with the device� Is a power source

� Devices� Communicates only with the host through endpoints� Describes its capabilities to the host during enumeration� Implements standard or vendor specific functionswww.hardkernel.com

ODROID가 USB Host Mode 일때

USB Host and Accessory

www.hardkernel.com

USB Host and Accessory

Android phone에 전통적인 USB accessory(device)를 적용하려면...

USB host mode를 지원하는 android phone이있는가?

따라서 Android phone을device(Accessory)로 동작 시킨다.www.hardkernel.com

USB Host and Accessory

ADK BoardADK BoardADK BoardADK BoardPC(ADB orPC(ADB orPC(ADB orPC(ADB orMass Storage)Mass Storage)Mass Storage)Mass Storage)

OdroidOdroidOdroidOdroid

OdroidOdroidOdroidOdroidwww.hardkernel.com

ODROID가 USB Accessory(Device) 모드 일 때

USB Host and Accessory

www.hardkernel.com

Android Open Accessory – Block diagram

www.hardkernel.com

Android Accessory Protocol

www.hardkernel.com

Android Accessory Protocol

www.hardkernel.com

Android Accessory Protocol

AndroidAndroidAndroidAndroidDeviceDeviceDeviceDevice

ADK BoardADK BoardADK BoardADK Board

Device 접속 대기

Accessory mode 지원 여부 결정

연결

USB vendor ID, product ID 요청

USB vendor ID, product ID 응답 Check vendor ID : Google(0x18D1),Product ID : Accessory mode (0x2D00)

Request 51(Protocol Ver)

Protocol ver 응답(1)

Request 52(Information)

Request 53(startup)

Accessoy mode try...

Establish communicationwww.hardkernel.com

Android Accessory Protocol

Establish communication with the device

� If an Android device in accessory mode is dected, query device’s interface and endpoint descriptor� Find first bulk IN & OUT endpoints� Set the device’s configuration to ‘1’� Now ready for communication

www.hardkernel.com

Gadget

kernel/include/linux/usb/f_accessory.hkernel/drivers/usb/gadget/f_accessory.c

21 /* Use Google Vendor ID when in accessory mode */22 #define USB_ACCESSORY_VENDOR_ID 0x18D123 24 25 /* Product ID to use when in accessory mode */26 #define USB_ACCESSORY_PRODUCT_ID 0x2D0027 28 /* Product ID to use when in accessory mode and adb is

enabled */29 #define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01

www.hardkernel.com

Gadget

� f_accessory.c� Communicate with usb accessory designed for android device� Define usb descriptor (interface, endpoint)� Process android accessory protocol if accessory function is disabled(Android device side)

� GET PROTOCOL– Provide protocol version for usb accessory– Currently version number is ‘1’

• SEND STRING– Receive strings from usb accessory(Manufacture, Model, Description, Version, URI, Serial)

• ACCESSORY_START– change Google accessory mode– enable accessory file interface

� usb_accessory device file interface• UsbService use it to communicate with usb accessory

www.hardkernel.com

Gadget

kernel/drivers/usb/gadget/f_accessory.c

www.hardkernel.com

Android 2.3.4 porting

S5PC110, S5PV210 → ODROID-7

S5PC210(Exynos4210), S5PV310 → ODROID-A

Kernel(Nexus S 참조), Android(git 소스에서 직접 merge)

kernel/arch/arm/configs/odroida_android_defconfigkernel/arch/arm/plat-s5p/devs.ckernel/drivers/usb/gadget/composite.ckernel/drivers/usb/gadget/f_mass_storage.ckernel/drivers/usb/gadget/f_accessory.ckernel/include/linux/usb/f_accessory.hkernel/include/linux/usb/composite.hwww.hardkernel.com

android-2.3.3 vs android-2.3.4

www.hardkernel.com

www.hardkernel.com

AndroidAndroidAndroidAndroidAndroidAndroidAndroidAndroid--------2.3.32.3.32.3.32.3.32.3.32.3.32.3.32.3.3UsbObserver.java 에서 uevent 처리

AndroidAndroidAndroidAndroid----2.3.42.3.42.3.42.3.4UsbService.java에서 uevent 처리

frameworks/base/services/jni/com_android_server_UsbService.cpp

31 #include <linux/usb/f_accessory.h>32 33 #define DRIVER_NAME "/dev/usb_accessory"34 35 namespace androidwww.hardkernel.com

UsbManager class

� getAccessoryList()

– 연결되어 있는 accessory list return

� openAccessory()

� ParcelFileDescriptor를return

� ParcelFileDescriptor.getFileDescriptor()를 통해in/output Stream 생성

� hasPermission()

� requestPermission()

www.hardkernel.com

AndroidAndroidAndroidAndroid----2.3.32.3.32.3.32.3.3public class Usb {

public static final String ACTION_USB_CONNECTED ="android.hardware.action.USB_CONNECTED";

public static final String ACTION_USB_DISCONNECTED ="android.hardware.action.USB_DISCONNECTED";

public static final String ACTION_USB_STATE ="android.hardware.action.USB_STATE";

public static final String USB_CONNECTED = "connected";

public static final String USB_FUNCTION_MASS_STORAGE = "mass_storage";

public static final String USB_FUNCTION_ADB = "adb";www.hardkernel.com

AndroidAndroidAndroidAndroid----2.3.42.3.42.3.42.3.4public class UsbManager {

private static final String TAG = "UsbManager";

public static final String ACTION_USB_STATE ="android.hardware.usb.action.USB_STATE";

public static final String ACTION_USB_ACCESSORY_ATTACHED ="android.hardware.usb.action.USB_ACCESSORY_ATTACHED";

public static final String ACTION_USB_ACCESSORY_DETACHED ="android.hardware.usb.action.USB_ACCESSORY_DETACHED";

public static final String USB_CONNECTED = "connected";

public static final String USB_CONFIGURATION = "configuration";

public static final String USB_FUNCTION_MASS_STORAGE = "mass_storage";

public static final String USB_FUNCTION_ADB = "adb";

public static final String USB_FUNCTION_ACCESSORY = "accessory";

UsbManager class

www.hardkernel.com

USB Accessory APIs

� New USB APIs in Android 3.1

� com.android.hardware.usb.*

� Require Android 3.1 (API 12) or later

� Compatibility Library for Gingerbread

� com.android.future.usb.*

� Link against com.android.future.usb.accessory.jar

� Support Gingerbread 2.3.4 and later

www.hardkernel.com

USB Accessory APIs

2.3.4 app 작성작성작성작성 시시시시 AndroidManifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name">

<uses-library android:name="com.android.future.usb.accessory" />

<activity android:name=".ThermalPrinterActivity"

[2011-10-11 20:01:59 - ThermalPrinter] Installing ThermalPrinter.apk...[2011-10-11 20:02:01 - ThermalPrinter] Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY[2011-10-11 20:02:01 - ThermalPrinter] Please check logcat output for more details.[2011-10-11 20:02:01 - ThermalPrinter] Launch canceled!www.hardkernel.com

Thermal Printer 제어 Application

www.hardkernel.com

Thermal Printer 제어 Application

Source repository

http://dev.odroid.com/projects/accessory

svn checkout –username anonsvn

http://dev.odroid.com/svn/accessory/

Passwod : anonsvn

www.hardkernel.com

Thermal Printer 제어 Application

Android-2.3.4 API Level 10

www.hardkernel.com

Thermal Printer 제어 Application

AndroidManifest.xmlAndroidManifest.xmlAndroidManifest.xmlAndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.hardkernel.adk" android:versionCode="1" android:versionName="1.0">

<uses-feature android:name="android.hardware.usb.accessory"/><uses-sdk android:minSdkVersion="10" />

<application android:icon="@drawable/icon" android:label="@string/app_name"><uses-library android:name="com.android.future.usb.accessory" />

<activity android:name=".ThermalPrinterActivity"android:label="@string/app_name" android:screenOrientation="landscape">>

<intent-filter><action android:name="android.intent.action.MAIN" />…

<intent-filter><action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />

</intent-filter><meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"

android:resource="@xml/accessory_filter" /></activity>

www.hardkernel.com

Thermal Printer 제어 Application

xml/xml/xml/xml/accesory_filter.xmlaccesory_filter.xmlaccesory_filter.xmlaccesory_filter.xml

<?xml version="1.0" encoding="utf-8"?>

<resources><usb-accessory manufacturer="Hardkernel Co., Ltd." model="Thermal Printer"/>

</resources>

main.cmain.cmain.cmain.c195 196 static char description[] = "ODROID-ADK1";197 static char manufacturer[] = "Hardkernel Co., Ltd.";198 static char model[] = "Thermal Printer";199 static char uri[] = "http://www.hardkernel.com";200 static char version[] = "1.1";201 static char serial[] = "N/A";202 www.hardkernel.com

Thermal Printer 제어 Application

app_name과 model 이름을 동일하게...Values/Values/Values/Values/strings.xmlstrings.xmlstrings.xmlstrings.xml<?xml version="1.0" encoding="utf-8"?><resources>

<string name="app_name">Thermal Printer</string></resources>

USBAccessoryManager.javaUSBAccessoryManager.javaUSBAccessoryManager.javaUSBAccessoryManager.java

private final BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {

/* get the action for this event */String action = intent.getAction();

if(packageName.equals(action)) {...www.hardkernel.com

s

www.hardkernel.com

USBAccessoryManager::enable(this);

IntentFilter filter = new IntentFilter(packageName);filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);context.registerReceiver(receiver, filter);

UsbManager deviceManager = null;UsbAccessory[] accessories = null;UsbAccessory accessory = null;

deviceManager = (UsbManager)context.getSystemService("UsbAccessory"); accessories = deviceManager.getAccessoryList();

parcelFileDescriptor = deviceManager.openAccessory(accessory);

handler.obtainMessage(what, new

USBAccessoryManagerMessage(USBAccessoryManagerMessage.MessageType.READY, accessory)).sendToTarget();

Thermal Printer 제어 Application

www.hardkernel.com

public class USBAccessoryManager {

outputStream = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());

public void write(byte[] data){if(isConnected() == true) {

if(outputStream != null) {try {

outputStream.write(data);} catch (IOException e) {}

}}

}

Thermal Printer 제어 Application

www.hardkernel.com

public class USBAccessoryManager {...readThread = new ReadThread(parcelFileDescriptor);

private class ReadThread extends Thread {

private FileInputStream inputStream;private ParcelFileDescriptor myparcelFileDescriptor;

public ReadThread (ParcelFileDescriptor p) {myparcelFileDescriptor = p;inputStream = new FileInputStream(p.getFileDescriptor());

...@Overridepublic void run() {

byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; // bytes returned from read()

while(continueRunning) {try {

bytes = inputStream.read(buffer); byte[] data = new byte[bytes];System.arraycopy(buffer, 0, data, 0, bytes);

...

handler.obtainMessage(what, bytes, -1, new

USBAccessoryManagerMessage(USBAccessoryManagerMessage.MessageType.READ, data)).sendToTarget();

Thermal Printer 제어 Application

www.hardkernel.com

Thermal Printer 제어 Application

private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {

byte[] commandPacket = new byte[2];

switch(msg.what){

case USBAccessoryWhat:switch(((USBAccessoryManagerMessage)msg.obj).type) {

case READ:...

case READY:

setTitle("Device connected.");

mBtnPrint.setEnabled(true);

www.hardkernel.com

Thermal Printer 제어 Application

write()1 + 384byte

read()OK(define 1)

UsbManager

view.getDrawingCache();

Scan line (384 pixel * 8 = 384 byte)

USBAccessoryManager

Print

385byte

1byte(0x01)

www.hardkernel.com

감사합니다.

질문은질문은질문은질문은 저희저희저희저희 홈페이지홈페이지홈페이지홈페이지 커뮤니티를커뮤니티를커뮤니티를커뮤니티를 이용해이용해이용해이용해 주세요주세요주세요주세요....

www.hardkernel.comwww.hardkernel.comwww.hardkernel.comwww.hardkernel.comwww.hardkernel.com