embedded system
DESCRIPTION
CPU informatoinTRANSCRIPT
날날날날 짜짜짜짜 : 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
순순순순 서서서서
�임베디드임베디드임베디드임베디드 시스템에시스템에시스템에시스템에 안드로이드가안드로이드가안드로이드가안드로이드가 적절한가적절한가적절한가적절한가????
�임베디드임베디드임베디드임베디드 안드로이드안드로이드안드로이드안드로이드 기기의기기의기기의기기의 최소최소최소최소 시스템시스템시스템시스템 구성구성구성구성 전략전략전략전략
�시스템시스템시스템시스템 메모리메모리메모리메모리 (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
�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
�부트로더 (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 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
/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
� 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
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
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
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
순순순순 서서서서
� 오드로이드에 최신 우분투 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
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
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
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
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
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
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
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
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
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
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
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
385byte
1byte(0x01)
www.hardkernel.com