1/28/2015

HDMI 와 DVI PIN 구성 및 비교

1. HDMI Pin 구성 

  • DVI와 HDMI PIN의 호환성 
HDMI와 DVI에서 PIN 을 보면 TMDS를 사용하는데 이 PIN을 를 Mapping 할 경우
호환이 된다
그래서 사실 Pinmap으로 보면 크게 다르지 않다.

  • USB와 HDMI의 호환성  
MHL(Mobile High Definition Link)를 이용하여, HDMI와 MicroUSB B type과 호환이 된다.
이부분은 MHL이 정확하게 어떻게 동작이 되는지 알아야 하는데, 이부분은 아직 이해를 하지 못했다. 


1.1 HDMI Type A Pin out 

Pin out
A diagram of the 19 pins of a type A receptacle HDMI connector showing 10 pins on the top row and 9 pins on the bottom row.
HDMI Type A 소켓
핀 1TMDS Data2+
핀 2TMDS Data2 Shield
핀 3TMDS Data2–
핀 4TMDS Data1+
핀 5TMDS Data1 Shield
핀 6TMDS Data1–
핀 7TMDS Data0+
핀 8TMDS Data0 Shield
핀 9TMDS Data0–
핀 10TMDS Clock+
핀 11TMDS Clock Shield
핀 12TMDS Clock–
핀 13CEC
핀 14보류 (HDMI 1.0 ~ 1.3c), Utility/HEAC+ (선택적, 오디오 리턴 채널과 이더넷이 달린 HDMI 1.4+)
핀 15SCL (DDC를 위한 I²C Serial Clock)
핀 16SDA (DDC를 위한 I²C Serial Data Line )
핀 17DDC/CEC/HEC Ground
핀 18+5 V 전원 (최대 50 mA)
핀 19핫 플러그 감지 (모든 버전), HEAC- (선택적, 오디오 리턴 채널과 이더넷이 달린 HDMI 1.4+)

  아래에서 HDMI Type의 구성을 살펴보자
  http://kcchao.wikidot.com/hdmi

1.2 DVI-I Pin Out




Pin 1TMDS data 2−Digital red− (link 1)
Pin 2TMDS data 2+Digital red+ (link 1)
Pin 3TMDS data 2/4 shield
Pin 4TMDS data 4−Digital green− (link 2)
Pin 5TMDS data 4+Digital green+ (link 2)
Pin 6DDC clock
Pin 7DDC data
Pin 8Analog vertical sync
Pin 9TMDS data 1−Digital green− (link 1)
Pin 10TMDS data 1+Digital green+ (link 1)
Pin 11TMDS data 1/3 shield
Pin 12TMDS data 3−Digital blue− (link 2)
Pin 13TMDS data 3+Digital blue+ (link 2)
Pin 14+5 VPower for monitor when in standby
Pin 15GroundReturn for pin 14 and analog sync
Pin 16Hot plug detect
Pin 17TMDS data 0−Digital blue− (link 1) and digital sync
Pin 18TMDS data 0+Digital blue+ (link 1) and digital sync
Pin 19TMDS data 0/5 shield
Pin 20TMDS data 5−Digital red− (link 2)
Pin 21TMDS data 5+Digital red+ (link 2)
Pin 22TMDS clock shield
Pin 23TMDS clock+Digital clock+ (links 1 and 2)
Pin 24TMDS clock−Digital clock− (links 1 and 2)
C1Analog red
C2Analog green
C3Analog blue
C4Analog horizontal sync
C5Analog groundReturn for R, G, and B signals

  • DVI 관련 내용
PC에서 DVI Cable로 잘 알려져 있으며, Video를 전송하는 Cable이다.
DVI-Cable 종류는 Type A, B, C, D, E 로 나뉘며, 아래의 사이트에 자세한 Cable 정보를 알수 있다.
  https://ko.wikipedia.org/wiki/%EB%94%94%EC%A7%80%ED%84%B8_%EB%B9%84%EC%A3%BC%EC%96%BC_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4
  https://en.wikipedia.org/wiki/Digital_Visual_Interface

1/25/2015

NAND 양산문제 정리 및 다른방법

1. NAND를 이용한 양산(Mass production)

NAND를 사용하게되면 제품개발자들은 제품의 양산을 생각하게 되는데,
아래와 같이 Gang이라는 제품을 이용하여, NAND를 Write를 하여 양산을 하게된다.
양산을 진행을하게되면 Gang을 가지고 있는 업체에 위탁하여 write를 한다.

양산을 하게될 경우, 처음 겪는문제가 NAND의 불량률과 각종 Device 관련 불량률이다.
이에 관련하여 간단한 방법소개를 한다.

Gang의 대체적으로 기능을 보면, Factory Bad Block의 Skip 기능을 기본적으로 가지고 있는 것 같으며, 본인도 다시 NAND 양산을 해봐야 정확한 문제점을 파악이 가능할 것 같다.

  http://www.adc.co.kr/download/EISC_Gang/GangWriter_Manual.pdf
  http://www.mvtool.co.kr/products/product.php?query=view&code=010104&lv=1&no=187&lang=

  • 양산-A
  1. 양산방법   : Nand Image를 Gang 업체에게 전달하여 이를 양산      
  2. 양산문제   : ECC와 Bab Block에 관한 문제점 처리가 안되는 경우가 발생 
  • 양산-B
  1. 양산방법:  NAND Image와 ECC 정보를 전달하여  Gang 업체에서 양산  
  2. 양산문제:  ECC 처리부분의 문제발생여지가 존재하며 있으며, Bad block에 관한 문제 발생 
     * Bad Block의 문제보다는 ECC와 File Meta Data 문제가 발생소지로 보인다.
     * 상황에 따라 BBM도 문제소지가 있다.

  • 양산-C (본인이 양산했던방식)
  1. 양산방법: 1st 와 2nd loader인 U-Boot만 Gang 업체 전달 
  2. 추가방법: U-BOOT에서 Kernel과 File System을 굽는다. 
  3. 추가방법: U-BOOT에서 삽입된 QC프로그램으로 기본 자체검증 (사람확인)
  4. 추가방법: 최종제품 검증 및 확인    

본인이 양산했던 시절은, BBT가 생겨나기 시작했던 시절이라, U-BOOT과 Kernel 사이에
BBT도 호환이 되지 않았던 시절이며, 이를 일일이 수정을 하면서 했던 시절이다.
현재 NAND의 양산이 어떻게 되는지는 궁금하지만, 많이 궁금하지는 않다
왜냐하면 요즘은 거의 eMMC , SDDISK 및 다른 UFS 다른 매체들이 많아져있기 때문이다.

2. 기존 NAND 양산방법 정리

본인이 사용한 방식은 양산-C이며, NAND의 1st Block은 제조사가 보장이 해주기에 1st Bootloader에서는 Error가 발생할 수가 없다.
안정성을 위해서 UBOOT도 2개로 했는지 1개로 했는지 기억이 잘안난다.

위에서도 설명했듯이 UBOOT와 KERNEL에서 BBT가 호환이 되지 않던 시절이라 이부분을 강제로 변경했으며,
양산을 위해 다른 부가적인 기능을 많이 넣었던걸로 기억한다.

그리고 더불어 Upgrade Fail 위해서는 Kernel/Filesystem 부분을 두개로 나누어서 썼던걸로 기억한다.

  • BBT 관련사항 
BBT 초창기라서 수정을 해가면서 별도로 관리를 해야했으며, Kernel과 U-Boot간에 BBT를 공유했다.
BBT인 경우 2개 Block으로 구성이 되며, 하나는 여분으로 사용된다.
현재 솔직히 많이 기억이 잘 안난다.  추후 MTD 관련부분과 Filesystem을 정리를 한다면,
이부분을 다시 정리하겠다.

  • 불량률 관련사항 
양산을 진행을 하게되면, 어디 제품이든 불량률은 나오기 마련이다. 이를 최대한 감소하기 위해서
미리 진단하고 감지하는 프로그램을 넣어야한다. 이를 U-BOOT에 간단히 넣어 기본 Device Test를 진행을
하고 문제가 있는 Device는 미리 교체를 한다.

  • 현재 제안해 주시는 방식 및 정리 
본인도 궁금하며, 현재 대기업의 양산방식은 eMMC or NAND를 포함 Device로 진행되며,
아직도 NAND로 양산을 하게되면 본인도 어떻게 변화 되었는지 궁금하다.
 
   http://www.aesop.or.kr/Board_Community_QandA/34012
http://www.adc.co.kr/download/EISC_Gang/GangWriter_Manual.pdf
http://www.iwecom.co.kr/ce/forum_view.asp?board_idx=22794 



고도리님께서는 TI로 말하자면, 1st boot Loader인 UBL에서 CRC check를 넣고 U-BOOT를 각각 2개식 넣어 굽자고 제안을 했고요.
1 ~ 2: u-boot 1st
3 ~ 4: u-boot 2nd

저는 개인적으로 bad block 문제는 power-cut 문제와  전압문제인것 같습니다.
이미 한번 power-cut은 경험을 했고요.

funmoney님께서는 최신정보를 주시는 것 같습니다. 정말 감사합니다.
이부분은 저도 경험을 하지 못해 추후 다시 한다면 이방법을 으로 물어보도록하겠습니다.
양산하는 공장에서 bad block을 skip을 할수 있는 방법이 있다는 것은 몰랐으며, 그래서 상위에서 Gang 에대해 다시 보게되었네요.
Gang에서 지원이 되는것 같습니다. (bad block skip)

(예전에 이것때문에 많이 문제가 발생했던걸로 기억해서 시간이 많이 흘렀으니 많이 변화되어있겠죠)

개인적으로는 처음부터 bad block이 아닌이상 u-boot loader에 저장할 것이 없다면,
거의 이상이 없는 걸로 알고 있습니다.
그래서 저의 경우는 u-boot를 하나를 사용을 했고요. kernel 역시 하나를 사용하였습니다.
다만, 위에서 처럼 bad block skip를 하기위해서 u-boot 까지 굽고 network를 이용하여
uboot에서 bad block을 찾아가며 kernel과 filesystem을 write를 했습니다.

upgrade 안정성을 위해서 kernel과 filesystem을 두개를 사용을 했습니다.
upgrade 중 문제가 발생을 하면 복구가 가능하도록 요.

   http://www.aesop.or.kr/Board_Community_QandA/33948

3. 양산방법 정리

만약 다시 양산을 할 기회가 온다면, 그때 다시 한번 Gang Spec과 ECC의 기능
및 Filesystem Meta 정보 BBM(BBT) 를 보고 다시 한번 자세히 봐야할 것 같네요.




1/24/2015

NAND OOB 영역 및 ECC 기능

1. NAND의 OOB란? 

NAND의 구성이 Block과 Page로 구성이 되어있으며, Page가 Data와 OOB(Out of Band)로 구성이 되어 존재한다.
OOB의 Size는 항상 Page Size의 의존적이며, 주로 Page의 Data 영역의 512 byte 기준으로 16byte 정도의 영역을 차지한다.
Page size의 크기가 커지면 커지고,작으면 작어진다.

  • OOB의 저장되어지는 정보 
  1. Bad Block Information ( Factory Bad Block 의 기본정보)
  2. Bad Block Marker (2 byte or 1 byte Bad Block, first or second page of erase block)
  3. ECC (Error Correction Code)
  4. File system Meta Data(Raw Flash Filesystem) 

아래의 MTD Driver 문서를 읽어보면 ECC가 256단위로 저장되며, Bad block marker 1byte의 정보를 넣고 있다.

  • MTD Manual의 OOB정보 (autoplacement default schemes) 
  MTD의 저장되는 OOB 정보
  http://www.linux-mtd.infradead.org/tech/mtdnand/x255.html


기본적으로 Chip 제조사들은 OOB에 BBI (Bad Block Inforamtion) 정보를 넣어 Factory Bad Block을 구분이 가능하도록 한다.
하지만 Vendor 위치가 상이 하므로 이부분은 개별 Chip Datasheet를 확인해야 봐야한다.

1.1 BBM 와 Raw File System Meta Data 

OOB에는 ECC정보도 들어가지만, Raw File system 선택에 따라 그에 관련된 Meta Data도 들어가게 되며,
이 뿐만 아니라 Bad Block 관리를 위하여 BBM(Bad Block Management)이라는 Data 정보를 넣는다.
그래서 OOB Size와 ECC의 Size 계산 및 위치가 중요하다.


  • OOB 실제 사용 예 (JFFS2, BBT 사용)
OOB 64 per 2048 bytes 중 , BCH 8bit ECC를 사용할 경우  56 bytes =(14 byte * 4) 사용
처음 Bad Block Table을 생성시 Bad Block Information을 이용한다고 한다.

              Total = 56bytes

하지만, Raw Flash로 사용하고, Raw Flash 기반으로 한 File system 사용한다면, OOB Size가 문제가 될 수 있다고 한다.

대표적인 Raw NAND Filesystem JFFS2의 경우 Metadat로  Clean Marker 용도로 8byte를


Raw Flash 기반으로 둔 Filesystem(JFFS2)   (UBIFS, YAFFS)
한번 확인 필요할 것 같다.


  http://wiki.openmoko.org/wiki/NAND_bad_blocks   (Nand page)
  http://dooeui.blogspot.kr/2010/01/understanding-nand-flash-memory.html

  • Linux 의 OOB의 구성
  http://www.linux-mtd.infradead.org/tech/mtdnand/x215.html
  http://www.linux-mtd.infradead.org/tech/mtdnand/x255.html


  http://processors.wiki.ti.com/index.php/AM335x_JFFS2_Support_Guide


2 ECC(Error Correcting Code) 기능 

NAND는 기본적으로 BAD Block의 가능성과 불안정한 Bit 부분이 존재하므로, 항상 오류를 체크를 해야하며,
에러발생시 이를  탐지하고 복원을 해야한다.

  • SLC 공정에 따라 필요한 ECC
  1. 1 bit per 512 B (43 nm - 350 nm)
  2. 4 bits per 512 B (32 nm)
  3. 8 bits per 512 B (24 nm)
  4. 12? bits per 512 B (19 nm)

  • MLC 공정에 따라 필요한 ECC 
  1. 4 bits per 512 B (43 nm )

위와 같이 NAND의 Type과 공정에 따라 필요되는 ECC의 기능이 다르며, 이에 따른 알고리즘 역시 다르게 적용해야한다.

  • ECC(Error Correcting Code)의 기본기능 
NAND의 Error Bit를 Detection 과 Correction 부분이다. 이 부분은 알고리즘에 따라 탐지되는 Bit와 복원되는 Bit수도 달라진다.
처음에는 SW로 지원했지만 현재에는 거의 HW ECC가 보편화되었으며 이 선택은 이제 중요하다.
만약 MLC 까지 고려를 한다고 하며, HW ECC의 성능을 반드시 해봐야한다.


  • Error Detection 과 Correction 
아래의 Wiki에서 Error의 Detection 과 Correction 에 대해서 기본개념을 설명해주고 있다.
Error Detection 알고리즘은 CRC , Parity bits 등 존재하고 이를 복구하는 ECC는 설명해준다.

  https://en.wikipedia.org/wiki/Error_detection_and_correction


2.1 ECC 알고리즘 의 종류

아래와 같이 대표적으로 많이 사용이 되는 ECC 알고리즘과 그 성능을 자세히 알아보자.
NAND의 ECC는 Error의 Detection 알고리즘과 Correction 알고리즘이 함께 되어있는 것이며, 위에서 설명했듯이 Detection 이 된 후 Correction 이 되므로 분리해서 생각을 할수가 없다.




  • Error Correction 기능 
  1. Hamming : for 1bit                 (1bit 만)           
  2. Reed Solomon: for up to 4 bits (4 bit 까지)
  3. BCH  : For more than 4 bits    (4 bit 이상)

  • Hamming  알고리즘 
    초창기 많이 사용되어지 알고리즘이며, SW로 많이 제공되었음
  1. 1 bit correction   
  2. 2 bits error detection   (Parity 기능)
  3. requires 24 bits for 512 B ( 512 Byte 당 3 Byte 필요)
  

  • Reed Solomon  알고리즘 
    원래 CD-ROM/DVD에서 되며, DVB 및 QR Code 및 다양한 곳에서 사용
  1. 4 bits correction
  2. 5 bits error detection
  3. requires 80 bits for 512 B ( 512 Byte당 10 Byte 필요)


  • BCH (Bose, Ray-Chaudhuri and Hocquenghem)
다양한 저장장치에서 사용이 되고 있으며, 현재 많이 사용이 되는 ECC 중 하나이다.
  1. t bits correction    ( t 값은 가변적으로 변화됨)
  2. requires t*13 bits for 512 B     
  3. extra parity bit needed for error detection
  4. more complex to compute than Hamming 

BCH4/8/16  Error Correction 기능만 Byte 정리

512B 의 기준으로 Data를 계산을 하면, t=4/8/12 * 13 
BCH for 4 bits  : 52 bits = 6.5 bytes
BCH for 8 bits  : 104 bits  = 13 bytes 
BCH for 12 bits : 156 bits  = 19.5 bytes 

BCH4/8/16 Error Detection 과 Error Correction 기능 Bytes 정리 (TI에서 실제사용)

OOB Area (spare region) >= B * ( Page_Size / 512 ) + 2 + FileSystem_metadata
where
B =  8 bytes for BCH4
B = 14 bytes for BCH8 
B = 26 bytes for BCH16

Error Dectection을 알고리즘, Parity 기능이 추가되어진다고 한다.

  https://en.wikipedia.org/wiki/BCH_code


2.2 ECC 알고리즘 의 성능

TI에서 제공해주는 자료이며, 성능의 단위는 Timer의 tick 기준으로 소요된 시간을측정한것이다.
측정보드는 AM37x EVM 이며, SW ECC를 사용했을 경우 알고리즘 비교하되 1 bit를 보정시간을 기준으로 측정  
아래의 자료를 통하여, 1bit를 보정하는 시간 파악하여  알고리즘의 복잡도를 알수있다.

  • tick  계산

4.61us /120  = 3.8416666666666666666666666666667e-8
1 tick =  38.816nS

  • 1-bit correction mode  
120 timer ticks
4.61us to correct 1 error

  • 4-bit correction mode
234,000 timer ticks
9.00ms to correct 1 error with no meaningful performance difference when correcting 2 to 4 errors

  • 8-bit correction mode
244,000 time ticks
9.38ms to correct 1 error with no meaningful performance difference when correcting 2 to 8 errors


2.3 TI HW ECC 알고리즘 



  • TI -MPU의 ECC 정보
TI-MPU는 HW로 Error Detection 과 Location 기능을 제공해주며, SW로 Correction 을 제공을 해주고있다.
Location 부분은 별로 신경을 쓰지 않았지만, 생각을 해보니 중요한 정보인것 같으며, TI에서 좋은 정보를 제공해주고 있다.

  1. Error Detection  :  HW NAND Error 감지 가능한 Bit 수
  2. Error Location    :  HW NAND Error 위치 파악 기능
  3. Error Correction :  HW NAND Error 복원 

ECC support by device

HardwareBoot ROM CodeDriver Solution
Error DetectionError LocationError CorrectionError Correction
1b4b8b16b1b4b8b16b1b4b8b16b4b8b16b
DM33x/DM35x/DM36x
AM1xxx/C674x/OMAP-L1xx
EMIFAEMIFAYY
OMAP34xx/35xx
AM35xx 1.0
AM/DM37xx 1.0
GGGGYY
AM35xx 1.1
AM/DM37xx 1.1+
GPMCGYY
AM389x/C6A816x/DM816xGGGPMCGELMYY
AM387x/DM814x
AM335x
AM437x
GPMCGELMYY
Note: GPMC abbreviated to G in narrow columns and grayed out if affected by the BCH-4 erratum.



  • TI Raw NAND관련 ECC 정보 
TI에서 사용되는 HW ECC 정보 및 Raw NAND Interface , MTD 정보제공


  http://processors.wiki.ti.com/index.php/Raw_NAND_ECC

  • NAND 및 ECC의 알고리즘 및 기타 자료 

MTD 및 NAND , Raw File System 관련 자료, 자료내용 좋다.

1/23/2015

NAND 기본사항

1. FLASH Memory 

역사

플래시 메모리는 1984년 당시 도시바에서 근무하고 있던 마스오카 후지오 박사가 발명했다. 도시바에 따르면, '플래시'라는 이름은 마스오카 박사의 동료인 아리스미 쇼자가 제안했다고 한다. 왜나하면, 메모리 내용이 지워지는 과정이 마치 카메라의 플래시를 떠올렸기 때문이다. 마스오카 박사는 이 발명을 캘리포니아 새너제이에서 열렸던 IEEE 1984 International Electron Devices Meeting (IEDM)에서 발표하였다. 당시 인텔은 이 발명의 엄청난 잠재력을 보고 1988년 최초의 상업용 NOR 타입 플래시 메모리를 소개하였다.

NOR 기반 플래시는 지우기와 쓰기 시간이 긴 대신 어떤 위치에도 임의로 접근할 수 있게 주소/자료 인터페이스를 제공한다. 이 메모리는 컴퓨터 바이오스나 셋톱 박스의 펌웨어와 같이 자주 업데이트되지 않는 프로그램 코드를 저장하는 데에 알맞다. 플래시 메모리 특성상 10,000에서 1,000,000까지 지울 수 있다. NOR 기반 플래시는 초기 이동형 매체의 뿌리가 되어, 콤팩트 플래시에서 처음 사용되었으나 나중에 좀 더 싼 NAND 플래시가 쓰이기 시작했다.

NAND 플래시는 1989년에 도시바가 ISSCC에서 발표했다. NAND 플래시는 NOR 플래시에 비해 지우기와 쓰기 시간이 좀 더 빠르고 집적도가 높으며 비트당 제작비도 낮고 10배의 내구성을 자랑한다. 그러나 입출력 인터페이스는 자료에 대한 순차 접근만을 지원한다. 이것은 컴퓨터 메모리로는 조금 덜 유용하지만 개인용 컴퓨터 카드와 다양한 메모리 카드와 같은 대용량 저장 장치에 알맞다. 첫 NAND 기반 이동형 미디어 포맷은 스마트 미디어였지만, MMC, 시큐어 디지털(Secure Digital), 메모리 스틱과 XD-Picture 카드에서도 사용되고 있다. 그 밖에 RS-MMC (Reduced Size MultiMedia Card), TransFlash, miniSD 등이 다음 세대 저장 매체로 등장하고 있다. 이러한 새로운 포맷은 보통 크기가 4 제곱 센티미터 이하로 상당히 작다.


한계

플래시 메모리의 한계는 블록 내에서 특정 단위로 읽고 쓸 수 있지만, 블록 단위로 지워야 한다는 것이다. 또한 덮어 쓸 수 없으므로, 모든 블록을 지우기 전까지는 해당 자료를 변경할 수 없다.

NOR 플래시의 경우, 임의 접근 방식으로 바이트 또는 워드 단위로 읽기/쓰기 동작이 가능하지만 덮어 쓰기와 지우기 동작은 임의로 접근할 수 없다. NAND 플래시는 페이지 단위로 읽기/쓰기 동작이 가능하지만 해당 페이지를 덮어 쓰거나 지우려면 모든 블록을 지워야 한다.(NAND 플래시는 블록을 여러 페이지로 나누어 사용한다)..


  상위의 글 아래 위키자료
   http://ko.wikipedia.org/wiki/%ED%94%8C%EB%9E%98%EC%8B%9C_%EB%A9%94%EB%AA%A8%EB%A6%AC
  http://www.eetimes.com/document.asp?doc_id=1272118

  tn2919_nand_101.pdf

1.2 Flash Memory의 NAND 기본이해

Flash Memory는 두 종류이지만 거의 NAND만 사용하므로, NAND에 대해서만 언급하겠다.
나의 경우에도 NOR FLASH를 못본지 벌써 얼추 10년이 되어 가는 것 같다. 물론 이의 중간형태인 ONE-NAND도 있지만 초창기에 잠시 좀 쓰이다가 잘 사용하지 않아서 생략한다.

역시 사용하기도 편하고 빠르고 가격이 문제로 인하여 어쩔수 없이 트렌드가 NAND로 가는 것 같다.

아래의 사이트에서 너무 쉽게 설명을 해주고 있어 감사할 다름이다.



  • NAND 기술관련자료    
   개인블로그에서 NAND의 기본구조 ,타입 및 기본적인 내용 설명 및 필요기술소개
   내용이 이해하기 쉽고 좋아서 Link로 연결

   http://cappleblog.co.kr/582
   http://cappleblog.co.kr/583


   NAND의 기본구성에 대해 자세히 기술되어져 있다.
   https://www.ece.umd.edu/~blj/CS-590.26/nand-presentation-2010.pdf


2. NAND의 기본구성

NAND의 구성은  Block과 Page로 구성이 되며, Page가 모여 Block이 되는 구성이다.

1 Block  (Chip Vendor Bad Block이 아님을 보증) 
2 Block 
3 Block 
4 Block -- 1 Page ( Data + OOB)
           2 Page
           3 Page
           4 Page
           5 Page 
           ......           


  • 전형적인 Block과 Page Size 관계
  1. 32 pages of 512+16 bytes each for a block size of 16 kB
  2. 64 pages of 2,048+64 bytes each for a block size of 128 kB
  3. 64 pages of 4,096+128 bytes each for a block size of 256 kB
  4. 128 pages of 4,096+128 bytes each for a block size of 512 kB

      • NAND의 기본특성 
      1. Erase의 기본단위로  Block 단위 
      2. Read/Write 의 기본단위는 Page 단위 
      3. Erase 를 할 경우 값은 0xFF     로 변경   (NAND의 기본특성)
      4. Write 를 할 경우 값은 1 -> 0  변경    (NAND의 기본특성) 

      • Flash Memory의 Wiki 확인내용 
      1. NAND의 내구성  (Erasing 횟수 관련내용, 참조만 하고 Datasheet 참고)
      2. NAND or NOR 비교  ( NOR는 XIP 실행)
      3. NAND 년도 별의 공정의 변화 및 Trend 

         http://en.wikipedia.org/wiki/Flash_memory


      2.1 NAND Page의 기본구성 

      Page는 Write의 기본단위이며, Main Area + OOB 로 구성이 되어, 보통 Main Area 512 byte , OOB는 16byte 구성된다.
      물론 Main Area 256 였던 시절도 존재하며, 현재 2048이고 이 Size는 가변적이다.
      (상위 구성은 기본예이며, Chip Vendor에 및 Chip 따라 Size가 변경)

      설사 Main Area가 2048byte 일 경우에도 기본 Base로 512byte에 기반으로 ECC를 계산하여 OOB에 넣기 때문에 512byte는 중요

      • 1 Page 의 구성의 예
      1. Data(Main area)    : 2048 bytes
      2. OOB(Out Of Band) : 64 bytes


      • Page 2K일 경우, 2048/512 = 4 
      1. 512+16, 
      2. 512+16, 
      3. 512+16, 
      4. 512+16 


      • 삼성 SLC Type NAND 구성 (Samsung SLC)  
           K9F1G08U0M  = 8 bit Bus

                1 Page   =  (2K + 64) Bytes
                1 Block   = (2K + 64)B x 64 Page
                             = 128K +4K Bytes
                1 Device = (2K+64)B x 64Pages x 1024 Blocks = 1056Mbits = 128M bytes.

        http://wiki.openwrt.org/doc/techref/flash



      Ref.
          http://www.macronix.com/Lists/ApplicationNote/Attachments/736/AN0269V2_Introduction%20to%20NAND%20in%20Embedded%20Systems-0220.pdf


      2.2 Timing

      Nand는 기본적으로 CMD 방식으로 제어를 하며, 약간의 Timing 오류에 따라 오류가 발생을 할 수 있다고 하나 유연하므로 ,
      이 부분은 적당히 설정 하거나 주의하면 되겠다.

      1/19/2015

      HDMI 와 DVI 기본정리

      1. HDMI 


      HDMI (High Definition Multimedia Interface) 는 기본적으로 DVI 에서 발전하여, Video , Audio Data를 전송하기 위해서 만들어진 Interface이다.
      기본적으로 DVI 기반이므로, 이는 항상 DVI 알고 있어야 한다.
      HDMI를 기술을 만든 회사들은 Sony , Silicon Image 등 협력하여 이 Interface를 만들었다.
      HDMI Main 기술은 거의 Silicon Image일 것라고 생각되어진다. 
      현재 SOC에서 HDMI Interface를 기본적으로 가지고 있는 것들을 보면, 사용이 편하고 설정도 편하여 다시 한번 정리하고자 한다.


      2. HDMI 기본 구성 


                Host (Source)                                                    Display (Sink)
      http://kcchao.wikidot.com/hdmi


      HDMI는 기본적으로 BUS구조가 아니며, 1:1 Mapping 형식으로 Source와 Sink가 붙어야한다.
      USB일 경우는 BUS구조이기 때문에, 여러 Port가 연결이 가능하지만, HDMI는 다르다.



      • HDMI 기본구성 용어 설명 
      1. Source  : Device에서 Data를 보내는 곳 (HDMI Output) ,             HW : Transmitter 
      2. Sink     : Device에서 Data를 받는곳    (HDMI Input, e.g Display )  HW : Receiver 
      3. Repeater : HDMI의 신호를 멀리 보내기 위해서 사용되어지는것이다.   
      4. CEC :    Consumer Electronics Control 약어로 Sink를 Control하기 위해서 사용 
      5. HPD :    Hot plug  (Pin 19)
      6. DDC :    I2C로 통신하며, Display의 EDID 값을 읽는다. (Pin 15,16)       

      • HDMI 관련내용 
        HDMI Version 과 각각의 기능별 설명을 자세히 해주고 있다.
        역시 영문 wiki와 정확한 spec을 보는것이 가장 현명한 것 같으며, 한글보다는 영문이 더 정확한 것 같다.

        http://kcchao.wikidot.com/hdmi
        https://en.wikipedia.org/wiki/HDMI


      • 아래의 정보는 이상하여 Link를 걸어놓았다. (참고하지 마시길)

        https://ko.wikipedia.org/wiki/%EA%B3%A0%EC%84%A0%EB%AA%85_%EB%A9%80%ED%8B%B0%EB%AF%B8%EB%94%94%EC%96%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 (고선명_멀티미디어_인터페이스)


      • HDMI Spec
        현재 간단히 구할수 있는 Spec을 구했으며, 간단히 구성을 보자.
        http://www.microprocessor.org/HDMISpecification13a.pdf
        http://www.evernew.com.tw/HDMISpecification13a.pdf


      • ESD 보호 회로 (ESD protection chip)
      HDMI 기술문서를 보면 항상 ESD 보호회로가 나오며, 이는 요구되어진다고 한다.
      보통 Chip 형태로 나오며, HW로 구성을 하면된다.
      ESD(Electro Static Discharge) 영문해석해서 두개의 전하를 가진 물체가 접촉 or 쇼트에 발생하는 것을 말하며, 이는 spark를 발생한다고 쉽게 설명해서 정전기 라고 생각하면되겠다.

        https://en.wikipedia.org/wiki/Electrostatic_discharge
        http://tsecl.com/board/index.asp?kind=view&madalli=freeboard&num=9
        http://www.ti.com/lit/sg/sszb130b/sszb130b.pdf


      3. HDMI의 설정관련기술 

      예를 들면, HMDI Switch , HDMI repeater, 등으로 구성이 될 경우 아래와 같은 상황이 될수 있다.
      TMDS일 경우 1:1일지만, DDC이는 I2C로 버스이다. CEC의 경우도 아래와 같이 연결이 된다고 하는데, 이부분은 확인해봐야겠다.






      3.1. DDC (I2C로 연결)

      기본적으로, PIN15,16을 이용하여, Source에서 I2C로 접근하여 EDID ROM 정보를 읽어간다.
      정확히 이해해야하는 것은 EDID는 ROM이며, Source, 즉 HOST가 이 정보를 읽어가는것이다. Host에서 Device들의 정보를 쉽게 파악이 가능하고 이를 기반으로 통신하다.
      EDID 1.3인 경우, 128 byte로 구성이 되어있으며, DDC의 I2C를 이용하여 Data를 읽고,
      이정보를 바탕으로 Sink 즉 연결된 Device의 정보 Feedback을 받을수 있다.
      그리고, 관련내용을 아래에서 보자.


      • DDC관련 내용
        http://en.wikipedia.org/wiki/Display_Data_Channel


      • EDID ROM 관련내용 
      EDID 제품의정보 및 Display 해상도 그리고, Timing 정보 , Audio 정보 , Audio Format 정보
      만약 자세히 HDMI를 다룬다면 아래부분은 자세히 봐야한다.

        http://en.wikipedia.org/wiki/Extended_display_identification_data
        http://read.pudn.com/downloads110/ebook/456020/E-EDID%20Standard.pdf


      3.2 HDMI-CEC

      CEC는Consumer Electronics Control)로 Source, 즉 Host에서 Command 주어 HDMI Device를 Control, 즉 제어를 한다는 개념이다.

      대표적인 예인것이 remocon이며, 예를 들면, TV or set-top box, PVR/DVR 연결이 되어 있
      을 때, 이를 Device on/off 하고 제어하는 것이다. 자세한내용은 Spec을 보자.
      Set-Top box 인 경우를 예를 들자면, 이 기능을 이용하여 TV에게 Command를 주어 Display를 변경하고, Remocon 기능을 줄수 있다.

      양방향 통신 opcode 형식으로 제어를 한다 그러므로 HOST가 일방적인 제어가 아니 ACK가 있다. 

      다음은 Spec의 operand들의 각종의 예제 CEC 17 Operand Descriptions 
      CEC 13.10 OSD Display로 TV의 OSD에 자막등을 제어가 가능하다고 하는 이부분은 흥미롭다. Spec을 한번보자.

        https://en.wikipedia.org/wiki/Consumer_Electronics_Control
        https://github.com/JeonghunLee/CEC/blob/master/extras/CEC_Specs.pdf

      Linux CEC 관련
        http://elinux.org/CEC_(Consumer_Electronics_Control)_over_HDMI

      3.3 Hotplug 기능

      HPD 기술은 생략

      아래를 참조를 하면 될 것 같다.
        http://wellplay.tistory.com/entry/HDMI-Hot-Plug-Detect-PinHPD-and-5V-Pin


      4. HDCP

      HDCP(High-bandwidth Digital Content Protection)는 디지털영상보호기능으로, 정확히 말해 Digital Contents를 보호하기 위해 암호화 및 인증을 통해 영상을 출력을 하는 기능이다.
      구현만 하지 사실 많이 사용이 되어지는 것 같지는 않다.

      본인도 예전에 HDCP 1.1 기능을 사용하여 HDMI를 개발을 한적이 있는데 현재 이 기술이 많이 발전하여 점점 더 변경이 되어가고 있지만, 지속적으로 지켜봐야겠다.
      아래를 보면 이 기술은 인텔에서 개발이 되었다고 한다.

      HDCP 버전지원하는 인터페이스
      1.0DVI
      1.1DVIHDMI
      1.2DVI, HDMI
      1.3DVI, HDMI, UDIGVIFDP

        http://www.avkorea.com/catalog/extron/HDCP.pdf
        http://ko.wikipedia.org/wiki/%EA%B3%A0%EB%8C%80%EC%97%AD_%EB%94%94%EC%A7%80%ED%84%B8_%EC%BD%98%ED%85%90%EC%B8%A0_%EB%B3%B4%ED%98%B8


      5. Source의 Transmitter

      Silicon image 사에서 제공하는 HDMI 관련 칩으로, Transmitter 기능을 가진 칩이다.
      기본 구성은 아래의 내용을 보면 쉽게 이해가능하다.
      HDMI와 SPDIF 연결이 가능하다.

      기본구성
        https://www.semiconductorstore.com/pdf/newsite/siliconimage/9030_PB.pdf
        https://www.semiconductorstore.com/pdf/newsite/siliconimage/SiI9022a_pb.pdf


      Silicon Image의 문서는 비공개문서이며, 아래의 사이트에 참조

      Flowchart
               Configuration Flowchart            ( 전체 Flowchart     ,Page 7)
               Display Discovery Flow chart     ( Display 연결관련   ,Page 11)
               HDMI Transmitter Initialization     ( HDMI Init            ,Page 14)
               Setting Video Mode Flow chart    ( Video Mode setting ,Page 16)


      Ref.
      SiI-AN-0117-A_9030     (HDMI Transmitter Application Note)
        http://wenku.baidu.com/view/969089d280eb6294dd886c81.html



      SiI-PR-0003-B00_9030   (HDMI Transmitter Programmer's Reference)
        http://wenku.baidu.com/view/4553e074f46527d3240ce0c4.html


      1/14/2015

      /proc 정보 이용 분석

      1. /proc 정보사용  


      # ls /proc/
      1              252            66             driver         mounts
      10             256            68             execdomains    mtd
      11             3              7              fb             net
      12             390            70             filesystems    pagetypeinfo
      13             396            72             fs             partitions
      14             405            74             interrupts     scsi
      15             42             76             iomem          self
      16             43             8              ioports        slabinfo
      17             44             82             irq            softirqs
      18             48             9              kallsyms       stat
      19             5              asound         key-users      sys
      2              50             buddyinfo      keys           sysrq-trigger
      20             52             bus            kmsg           sysvipc
      21             54             cmdline        kpagecount     timer_list
      22             56             config.gz      kpageflags     tty
      228            58             cpu            loadavg        uptime
      23             6              cpuinfo        locks          version
      24             60             crypto         meminfo        vmallocinfo
      25             62             devices        misc           vmstat
      250            64             diskstats      modules        zoneinfo



       # ls /proc/      
      1             456           579           fs            self
      152           461           592           graphics      slabinfo
      154           466           6             interrupts    softirqs
      155           471           606           iomem         stat
      157           476           636           ioports       sys
      163           481           7             irq           sysrec
      174           486           8             kallsyms      sysvipc
      186           491           959           key-users     timer_list
      187           496           976           kmsg          tnk
      2             5             990           kpagecount    tty
      269           501           buddyinfo     kpageflags    umap
      275           504           bus           loadavg       uptime
      3             507           cmdline       locks         version
      329           510           consoles      media-mem     vfmw
      346           513           cpu           meminfo       vfmw_chn
      362           516           cpuinfo       misc          vfmw_dbg
      363           519           crypto        modules       vfmw_dec
      364           522           devices       mounts        vfmw_prn
      365           525           diskstats     mtd           vfmw_scd
      366           528           driver        net           vmallocinfo
      4             531           execdomains   pagetypeinfo  vmstat
      439           562           fb            partitions    yaffs
      442           578           filesystems   scsi          zoneinfo


      상위와 같이 Kernel  Version 및 SoC마다 지원해주는 proc 기능이 다르고, 기능이 구현이 안되는 경우도 있으니 이런 부분은 조심해서 확인하자.


      • interrupt 분석
      $ cat /proc/interrupts  // 모든 Interrupt 정보 확인  
      $ ls /proc/irq/number/
      

      • Kernel Symbol Table 확인 
      $ cat /proc/kallsyms   // Kernel의 Sysmbol Table 확인 및 Memory 주소 확인  

      • Kernel HW I/O Memory 확인 
      $ cat /proc/iomem // Kernel의 HW I/O Memory확인  
      $ cat /proc/modules   // Kernel Module Memory 확인 
      



      $ cat /proc/vmallocinfo 
      0xbf000000-0xbf026000  155648 module_alloc_update_bounds+0x14/0x64 pages=37 vmalloc
      0xbf02f000-0xbf035000   24576 module_alloc_update_bounds+0x14/0x64 pages=5 vmalloc
      0xbf039000-0xbf03b000    8192 module_alloc_update_bounds+0x14/0x64 pages=1 vmalloc
      0xbf03d000-0xbf049000   49152 module_alloc_update_bounds+0x14/0x64 pages=11 vmalloc
      0xbf04f000-0xbf05b000   49152 module_alloc_update_bounds+0x14/0x64 pages=11 vmalloc
      0xbf061000-0xbf090000  192512 module_alloc_update_bounds+0x14/0x64 pages=46 vmalloc
      0xbf09a000-0xbf0bb000  135168 module_alloc_update_bounds+0x14/0x64 pages=32 vmalloc
      0xbf0c0000-0xbf0d7000   94208 module_alloc_update_bounds+0x14/0x64 pages=22 vmalloc
      0xbf0dd000-0xbf10e000  200704 module_alloc_update_bounds+0x14/0x64 pages=48 vmalloc
      0xbf113000-0xbf11e000   45056 module_alloc_update_bounds+0x14/0x64 pages=10 vmalloc
      0xbf123000-0xbf14b000  163840 module_alloc_update_bounds+0x14/0x64 pages=39 vmalloc
      0xbf153000-0xbf17a000  159744 module_alloc_update_bounds+0x14/0x64 pages=38 vmalloc
      0xbf182000-0xbf18f000   53248 module_alloc_update_bounds+0x14/0x64 pages=12 vmalloc
      0xbf194000-0xbf1ca000  221184 module_alloc_update_bounds+0x14/0x64 pages=53 vmalloc
      0xbf1d8000-0xbf236000  385024 module_alloc_update_bounds+0x14/0x64 pages=93 vmalloc
      0xbf24d000-0xbf293000  286720 module_alloc_update_bounds+0x14/0x64 pages=69 vmalloc
      0xbf29f000-0xbf2a8000   36864 module_alloc_update_bounds+0x14/0x64 pages=8 vmalloc
      0xbf2ac000-0xbf2d8000  180224 module_alloc_update_bounds+0x14/0x64 pages=43 vmalloc
      0xbf2df000-0xbf2ed000   57344 module_alloc_update_bounds+0x14/0x64 pages=13 vmalloc
      0xbf2f2000-0xbf2f4000    8192 module_alloc_update_bounds+0x14/0x64 pages=1 vmalloc
      0xbf2f6000-0xbf309000   77824 module_alloc_update_bounds+0x14/0x64 pages=18 vmalloc
      0xbf30f000-0xbf337000  163840 module_alloc_update_bounds+0x14/0x64 pages=39 vmalloc
      0xbf33d000-0xbf398000  372736 module_alloc_update_bounds+0x14/0x64 pages=90 vmalloc
      0xbf3ac000-0xbf3da000  188416 module_alloc_update_bounds+0x14/0x64 pages=45 vmalloc
      0xbf3e5000-0xbf3e8000   12288 module_alloc_update_bounds+0x14/0x64 pages=2 vmalloc
      0xbf3ea000-0xbf3ed000   12288 module_alloc_update_bounds+0x14/0x64 pages=2 vmalloc
      0xbf3f0000-0xbf3f4000   16384 module_alloc_update_bounds+0x14/0x64 pages=3 vmalloc
      0xbf3f7000-0xbf411000  106496 module_alloc_update_bounds+0x14/0x64 pages=25 vmalloc
      0xbf414000-0xbf419000   20480 module_alloc_update_bounds+0x14/0x64 pages=4 vmalloc
      0xbf41c000-0xbf421000   20480 module_alloc_update_bounds+0x14/0x64 pages=4 vmalloc
      0xbf424000-0xbf447000  143360 module_alloc_update_bounds+0x14/0x64 pages=34 vmalloc
      0xbf44c000-0xbf475000  167936 module_alloc_update_bounds+0x14/0x64 pages=40 vmalloc
      0xbf479000-0xbf488000   61440 module_alloc_update_bounds+0x14/0x64 pages=14 vmalloc
      0xbf48c000-0xbf491000   20480 module_alloc_update_bounds+0x14/0x64 pages=4 vmalloc
      0xd0804000-0xd0810000   49152 cramfs_uncompress_init+0x34/0x64 pages=11 vmalloc
      0xd0810000-0xd081c000   49152 zisofs_init+0x14/0x34 pages=11 vmalloc
      0xd081c000-0xd081f000   12288 jffs2_lzo_init+0x28/0x78 pages=2 vmalloc
      0xd0831000-0xd083d000   49152 jffs2_zlib_init+0x5c/0xb0 pages=11 vmalloc
      0xd083e000-0xd0840000    8192 hinfc301_probe+0x88/0x3a0 ioremap
      0xd0852000-0xd0854000    8192 hinfc301_probe+0xc4/0x3a0 ioremap
      0xd0854000-0xd0856000    8192 hinfc301_probe+0xf0/0x3a0 ioremap
      0xd0856000-0xd0858000    8192 hi_mci_probe+0x17c/0x460 ioremap
      0xd085a000-0xd085c000    8192 SYS_HAL_Init+0x6c/0x174 [hi3521_sys] ioremap
      0xd0860000-0xd0871000   69632 pl011_probe+0x190/0x294 ioremap
      0xd0880000-0xd0891000   69632 pl011_probe+0x190/0x294 ioremap
      0xd0891000-0xd08d4000  274432 jffs2_zlib_init+0x20/0xb0 pages=66 vmalloc
      0xd08d4000-0xd08e5000   69632 jffs2_lzo_init+0x18/0x78 pages=16 vmalloc
      0xd08fe000-0xd0900000    8192 VcmpHalInit+0x38/0x104 [vcmp] ioremap
      0xd0900000-0xd0911000   69632 devm_ioremap+0x48/0x78 ioremap
      0xd0914000-0xd0918000   16384 TdeHalInit+0x264/0x374 [hi3521_tde] ioremap
      0xd091c000-0xd091f000   12288 wf_ipc_init+0x100/0x4c8 [wfcommon] pages=2 vmalloc
      0xd0920000-0xd0931000   69632 hiusb_ehci_hcd_drv_probe+0xcc/0x160 ioremap
      0xd093c000-0xd093f000   12288 wf_ipc_init+0x3bc/0x4c8 [wfcommon] pages=2 vmalloc
      0xd0940000-0xd0951000   69632 hiusb_ohci_hcd_drv_probe+0xc0/0x154 ioremap
      0xd0980000-0xd09a1000  135168 stmmac_dvr_probe+0xe8/0xa50 [stmmac] ioremap
      0xd09be000-0xd09c0000    8192 VoieHalInit+0x20/0x40 [hi3521_aenc] ioremap
      0xd09c0000-0xd09d1000   69632 SYS_HAL_Init+0x20/0x174 [hi3521_sys] ioremap
      0xd09e0000-0xd09f1000   69632 SYS_HAL_Init+0x48/0x174 [hi3521_sys] ioremap
      0xd0a00000-0xd0a11000   69632 SYS_HAL_Init+0x8c/0x174 [hi3521_sys] ioremap
      0xd0b00000-0xd0bc1000  790528 _mmb_map2kern+0x68/0xd0 [mmz] ioremap
      0xd0ce0000-0xd0cf1000   69632 HAL_VOU_Init+0x20/0x30 [hi3521_vou] ioremap
      0xd0da0000-0xd0da9000   36864 _mmb_map2kern+0x68/0xd0 [mmz] ioremap
      0xd0db0000-0xd0dbe000   57344 _mmb_map2kern+0x68/0xd0 [mmz] ioremap
      0xd0e00000-0xd0f96000 1662976 _mmb_map2kern+0x68/0xd0 [mmz] ioremap
      0xd0fe0000-0xd0ff1000   69632 DRV_HDMI_BoardInit+0x20/0x30 [hi3521_hdmi] ioremap
      0xd1000000-0xd17ea000 8298496 _mmb_map2kern+0x68/0xd0 [mmz] ioremap
      0xd1800000-0xd1996000 1662976 _mmb_map2kern+0x68/0xd0 [mmz] ioremap
      0xd1a11000-0xd1a92000  528384 wf_ipc_init+0xd4/0x4c8 [wfcommon] pages=128 vmalloc
      0xd1ac0000-0xd1ad1000   69632 dmac_init+0x44/0x10c [hidmac] ioremap
      0xd1b00000-0xd1bf1000  987136 wfw_init+0x16c/0x1d4 [wfcommon] ioremap
      0xd1bf1000-0xd1ff2000 4198400 wf_ipc_init+0xd4/0x4c8 [wfcommon] pages=1024 vmalloc
      0xd1ff2000-0xd23f3000 4198400 wf_ipc_init+0x1ac/0x4c8 [wfcommon] pages=1024 vmalloc
      0xd23f3000-0xd25f4000 2101248 wf_ipc_init+0xd4/0x4c8 [wfcommon] pages=512 vmalloc
      0xd25f4000-0xd27f5000 2101248 wf_ipc_init+0x314/0x4c8 [wfcommon] pages=512 vmalloc
      0xd27f5000-0xd28f6000 1052672 wf_ipc_init+0xd4/0x4c8 [wfcommon] pages=256 vmalloc
      0xd28f6000-0xd30f7000 8392704 wf_ipc_init+0x100/0x4c8 [wfcommon] pages=2048 vmalloc vpages
      0xd30f7000-0xd32f8000 2101248 wf_ipc_init+0xd4/0x4c8 [wfcommon] pages=512 vmalloc
      0xd32f8000-0xd33f9000 1052672 wf_ipc_init+0xd4/0x4c8 [wfcommon] pages=256 vmalloc
      0xd33f9000-0xd3bfa000 8392704 wf_ipc_init+0x3bc/0x4c8 [wfcommon] pages=2048 vmalloc vpages
      0xd3bfa000-0xd3c7b000  528384 wf_ipc_init+0x1f4/0x4c8 [wfcommon] pages=128 vmalloc 

      참고사항
      - Address : Virtual Address 이지만 뒤에 phy 옵션으로 제공하는 경우도 있음
      - 관련 함수 (ioremap , ioremap_nocache,vmalloc ... )

      request_mem_region() 으로 할당된 memory는 아래에 표시.

      $ cat /proc/iomem 
      
      10000000-10000100 : hinand
      10020000-10020fff : hi_mci.0
      10080000-1008ffff : ahci.0
      100a0000-100affff : hiusb-ohci.0
        100a0000-100affff : ohci_hcd
      100b0000-100bffff : hiusb-ehci.0
        100b0000-100bffff : ehci_hcd
      101c0000-101dffff : stmmaceth.0
        101c0000-101dffff : stmmaceth
      20030000-200300ff : stmmaceth.0
        20030000-20030064 : hinand
      20080000-2008ffff : uart:0
        20080000-20080fff : uart-pl011
      20090000-2009ffff : uart:1
        20090000-20090fff : uart-pl011
      20700000-2070ffff : l2cache.0
      50000000-50000880 : hinand
      80000000-83ffffff : System RAM
        8002a000-805acfff : Kernel text
        805ae000-8062aa37 : Kernel data 

      상위 정보는 Kernel version or SoC마다 다를 수 있으므로 참고

      • Kernel의 시간체크 
      $ cat /proc/uptime  // Kernel이 Boot Up 시간표시   


      • 사용중인 Device 확인 

      $ cat /proc/devices 
      Character devices:
        1 mem
        4 /dev/vc/0
        4 tty
        5 /dev/tty
        5 /dev/console
        5 /dev/ptmx
        7 vcs
       10 misc
       13 input
       21 sg
       29 fb
       90 mtd
      128 ptm
      136 pts
      166 ttyACM
      180 usb
      189 usb_device
      204 ttyAMA
      254 bsg
      
      Block devices:
        1 ramdisk
      259 blkext
        7 loop
        8 sd
       11 sr
       31 mtdblock
       65 sd
       66 sd
       67 sd
       68 sd
       69 sd
       70 sd
       71 sd
      128 sd
      129 sd
      130 sd
      131 sd
      132 sd
      133 sd
      134 sd
      135 sd
      179 mmc
      240 romblock 


      2. 개별 PID 의 정보 


      • /proc/self         : 현재 동작 중인 pid 
      • /proc/number   : pid 정보 


      $ ls /proc/250/
      attr             exe              mountstats       smaps
      auxv             fd               net              stat
      clear_refs       fdinfo           oom_adj          statm
      cmdline          limits           oom_score        status
      comm             maps             oom_score_adj    task
      coredump_filter  mem              pagemap          wchan
      cwd              mountinfo        personality
      environ          mounts           root 


      $ cat /proc/250/maps  
      00008000-000a6000 r-xp 00000000 01:00 6175       /usr/sbin/telnetd
      000ae000-000af000 rw-p 0009e000 01:00 6175       /usr/sbin/telnetd
      000af000-000d2000 rw-p 00000000 00:00 0          [heap]
      40033000-40034000 rw-p 00000000 00:00 0
      4004a000-4004b000 rw-p 00000000 00:00 0
      400ca000-400e7000 r-xp 00000000 01:00 4005       /lib/ld-2.8.so
      400ee000-400ef000 r--p 0001c000 01:00 4005       /lib/ld-2.8.so
      400ef000-400f0000 rw-p 0001d000 01:00 4005       /lib/ld-2.8.so
      400f0000-40195000 r-xp 00000000 01:00 3985       /lib/libm-2.8.so
      40195000-4019c000 ---p 000a5000 01:00 3985       /lib/libm-2.8.so
      4019c000-4019d000 r--p 000a4000 01:00 3985       /lib/libm-2.8.so
      4019d000-4019e000 rw-p 000a5000 01:00 3985       /lib/libm-2.8.so
      4019e000-402bb000 r-xp 00000000 01:00 4006       /lib/libc-2.8.so
      402bb000-402c2000 ---p 0011d000 01:00 4006       /lib/libc-2.8.so
      402c2000-402c4000 r--p 0011c000 01:00 4006       /lib/libc-2.8.so
      402c4000-402c5000 rw-p 0011e000 01:00 4006       /lib/libc-2.8.so
      402c5000-402c8000 rw-p 00000000 00:00 0
      beb73000-beb94000 rw-p 00000000 00:00 0          [stack]
      ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]
      
      $ cat /proc/250/mounts
      
      rootfs / rootfs rw 0 0
      /dev/root / ext2 rw,relatime,errors=continue 0 0
      devtmpfs /dev devtmpfs rw,relatime,size=246140k,nr_inodes=61535,mode=755 0 0
      proc /proc proc rw,relatime 0 0
      tmpfs /mnt/.splash tmpfs rw,relatime,size=40k 0 0
      sysfs /sys sysfs rw,relatime 0 0
      devpts /dev/pts devpts rw,relatime,gid=5,mode=620 0 0
      /dev/mtdblock11 /opt ext2 ro,relatime,errors=continue 0 0
      /dev/mtdblock14 /rdk jffs2 ro,relatime 0 0  


        http://www.makelinux.net/ldd3/chp-9-sect-4
        http://www.tldp.org/LDP/sag/html/proc-fs.html
        http://bestskp.tistory.com/121
        https://www.kernel.org/doc/Documentation/filesystems/proc.txt
        https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=63&ved=0CCsQFjACODw&url=http%3A%2F%2Fcfile25.uf.tistory.com%2Fattach%2F242E0445514034683BF6FE&ei=SEyiVMvmC9OWuASh7YCoBg&usg=AFQjCNF01zVOTf66tox721ZrWIJ1CcrhVA&sig2=jDYliavyZOTf6nj4GcmsYw&bvm=bv.82001339,d.dGc&cad=rjt


      1/11/2015

      proc의 PID 정보

      1. 프로세스 정보 보기


      /proc/self  :  현재 실행 중인 pid를 자동으로 가르킨다.
      /proc/pid/maps


      address           perms offset  dev   inode      pathname
      
      08048000-08049000 r-xp 00000000 03:00 8312       /opt/test
      08049000-0804a000 rw-p 00001000 03:00 8312       /opt/test
      0804a000-0806b000 rw-p 00000000 00:00 0          [heap]
      a7cb1000-a7cb2000 ---p 00000000 00:00 0
      a7cb2000-a7eb2000 rw-p 00000000 00:00 0
      a7eb2000-a7eb3000 ---p 00000000 00:00 0
      a7eb3000-a7ed5000 rw-p 00000000 00:00 0          [stack:1001]
      a7ed5000-a8008000 r-xp 00000000 03:00 4222       /lib/libc.so.6
      a8008000-a800a000 r--p 00133000 03:00 4222       /lib/libc.so.6
      a800a000-a800b000 rw-p 00135000 03:00 4222       /lib/libc.so.6
      a800b000-a800e000 rw-p 00000000 00:00 0
      a800e000-a8022000 r-xp 00000000 03:00 14462      /lib/libpthread.so.0
      a8022000-a8023000 r--p 00013000 03:00 14462      /lib/libpthread.so.0
      a8023000-a8024000 rw-p 00014000 03:00 14462      /lib/libpthread.so.0
      a8024000-a8027000 rw-p 00000000 00:00 0
      a8027000-a8043000 r-xp 00000000 03:00 8317       /lib/ld-linux.so.2
      a8043000-a8044000 r--p 0001b000 03:00 8317       /lib/ld-linux.so.2
      a8044000-a8045000 rw-p 0001c000 03:00 8317       /lib/ld-linux.so.2
      aff35000-aff4a000 rw-p 00000000 00:00 0          [stack]
      ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
      
      
      - address: memory address 
      
      
      - perms :  memory의 권한을 나타내며, 조합으로 각 섹션을 짐작가능하다. (.text .data .bss .heap)
       r = read
       w = write
       x = execute
       s = shared
       p = private (copy on write)
      
      
         text : code와 실행가능하며,            r-xp 
         data : 초기화 된 전역변수 말하며,      rw-p 
      
      
      
      
      - offset : 실행중인 file offset.  , 위에서 /opt/test 가 실행 중  
      
      
      - dev:  03:00   device number (주 번호- major : 부 번호- minor)
                                03:00 /proc/devices  와 /proc/partitions 으로 확인가능 
                                      (disk information)
      
      
      - inode  :  inode number 


      /proc/pid/cmdline : 실행 중인 file에 들어온 인수 출력
      /proc/pid/fd
      /proc/pid/mem
      /proc/pid/environ


      • Linux의 Proc의 전체구조 설명 
        http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html
        https://www.kernel.org/doc/Documentation/filesystems/proc.txt
        http://forum.falinux.com/zbxe/index.php?document_srl=554058&mid=lecture_tip

      1/07/2015

      find 검색

      1. Find 기본사용법

      find는 원하는 file을 찾을 경우 사용하며, file정보를이용하여 검색하기 때문에 grep보다 빠른 검색가능하다.


      SYNOPSIS
             find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
      


      1.1.  Find 의 옵션  

      Find는 FILE의 정보기준으로 검색을 하며, 다양한 옵션들을 제공하여 빨리 원하는 FILE들을 찾아준다.

      • Find 기본연산옵션
      1. FILE의 이름관련 연산
      2. FILE의 시간관련 연산 
      3. FILE의 사이즈관련 연산
      4. AND/OR/NOT 연산제공 :  상위 1/2/3번의 조합이 가능 

      **SIZE 관련 연산
      
             -size n[cwbkMG]
                    File uses n units of space.
      
                    `b'    for 512-byte blocks (this is the default if no suffix is used)
                    `c'    for bytes
                    `w'    for two-byte words
                    `k'    for Kilobytes (units of 1024 bytes)
                    `M'    for Megabytes (units of 1048576 bytes)
                    `G'    for Gigabytes (units of 1073741824 bytes)
      
      **TIME 관련 연산  (time: 기본단위는 24*hours , min:  minutes)
      
              -mtime  n : modified n days ago         (파일의 내용을 변경시 )
              -mmin   n : modified minutes ago
              -atime  n : access   n days ago         (파일을 오픈했을 경우, cat, vi, grep, head )
              -amin   n : access   minutes ago  
              -ctime  n : changed  n days ago          (파일의  속성이 변경시)
              -cmin   n : changed  minutes ago
      
      **SIZE/TIME의 숫자개념 
      
               -n  :  for less  than  ( < n )
               +n  :  for great than  ( > n )
                n  :  for exactly n   (  n )

      상위 FILE의 SIZE 및 TIME 연산의 AND/OR/NOT 연산가능

      **AND OR 연산 및 NOT 연산 
      
             -not expr
                    Same as ! expr, but not POSIX compliant.
      
             expr1 expr2
                    Two expressions in a row are taken to be joined with an implied "and"; expr2 is not evaluated if expr1 is false.
      
             expr1 -a expr2
                    Same as expr1 expr2.
      
             expr1 -and expr2
                    Same as expr1 expr2, but not POSIX compliant.
      
             expr1 -o expr2
                    Or; expr2 is not evaluated if expr1 is true.
      
             expr1 -or expr2
                    Same as expr1 -o expr2, but not POSIX compliant.
      
             expr1 , expr2
                    List;
      

      • Find의 기타옵션 
      1. 다른 command 실행연산
      2. FILE 검색결과의 출력방법


      **실행연산
      
             -exec command ;
      
      **output 종류 
      
      newline을 사용여부 및 프로그래밍으로 output을 만들수 있다 이 부분 man을 참고
      
             -print0
                    True; print the full file name on the standard output, followed by a null character
      
             -print True; print the full file name on the standard output, followed by a newline.
      
             -printf format
                    True;  print  format  on  the standard output,
      
                    %p     File's name.
      
                    %P     File's name with the name of the command line argument under which it was found removed.
      
                    %s     File's size in bytes.
      
                    %b     The amount of disk space used for this file in 512-byte blocks.
      
                    %k     The amount of disk space used for this file in 1K blocks.
      


      2. Find 예제 


      2.1 FILE의 이름기준 검색 


      * : 여러글자 대체
      ? : 한글자만 대체
      [1-8] : 한글자만 정의 (1~8)
      [a-c] : 한글자만 정의 (a~c)

      $ find . -name  expr// 원하는 검색어 
      $ find . -name '*.o'   // *.o 파일 검색  (가능하면 '' or ""사용) 
      $ find . -name *.h    // *.h  파일 검색
      $ find . -name *droid-[2-5]*  // android-2/4/5 검색
      $ find . -name *droid-[2-5].[0-1]*  //e.g android-2.0 검색
      $ find ./ -name '*aic*.o' // 중간에 aic 파일 검색
      


      2.2 FILE의 시간기준 검색 

      시간은 모두 과거의 기준으로 검색을 하기에 +- 모두 과거시간들과 검색한다.
      다만 차이가 있다면 아래와 같이 n 에따라 -:less than or +:great than or 일치 있을 뿐이다.

      $ find . -mtime -7             // 수정날짜 (n < 7   ) 현재 FILE(0) ~ 7일전 FILE 검색  
      $ find . -mmin  30             // 수정시간 ( n         ) 오직 30분전 변경된 FILE 만 검색 
      $ find . -mmin  -30            // 수정시간 ( n < 30 ) 현재 FILE(0) ~ 30분전 FILE 검색  
      $ find . -mmin  +30            // 수정시간 ( n > 30 ) 30분전 FILE  ~ 이전전부 FILE 검색       
      $ find . -mmin +30 -mmin -60   // 수정시간 (30 >n , n < 60) 30분전 ~ 60분전 사이만 검색 (AND연산) 
      
      $ find . -atime n/-n/+n        // 액세스 날짜 (파일오픈) 
      $ find . -amin n/-n/+n         // 액세스 시간 
      
      $ find . -ctime n/-n/+n        // 파일속성변경 날짜 (파일오픈 및 사용) 
      $ find . -cmin n/-n/+n         // 파일속성변경 시간 
      
      

      2.3 FILE의 크기기준검색
        FILE의 시간과 동일하게 적용하면됨

        $ find ./ -size  +50k
        $ find ./ -size  +50k -printf "%p            %s\n"    // printf format을 만들어 사용 자세한 내용은 man참고 
        $ find ./ -size  +50k | xargs du -hs
        $ find ./ -size  +50k | xargs du -h
        


        2.4 연산의 AND/OR/NOT 검색

        $ find ./ -name 'snd-*.o' -o -name 'snd*.h'   // NAME 연산 NAME 연산  OR연산 적용 
        $ find ./ -name 'snd-soc*.o' -a -name 'snd*.o'   // NAME 연산 NAME 연산 AND 연산적용  
        $ find ./sound/  -name '*.o' -not -name 'built-in.o' //NAME 연산 NAME 연산 NOT 연산적용  ( *.o 검색 하고, -not으로 제외) 
        $ find . -mtime -7  -name '*.c' -o -name '*.h'   // 7일전- 현재    수정한 파일 중 *.c or *.h 검색 
        $ find . -mmin -60 -name '*.c' -o -name '*.h'   // 60분전 - 현재   수정한 파일 중 *.c or *.h 검색
        

        • 수정시간 과 파일이름 검색이용 예제

        $ find . -mtime -7  -name '*.c' -o -name '*.h'   // 7일전- 현재    수정한 파일 중 *.c or *.h 검색 
        $ find . -mmin -60 -name '*.c' -o -name '*.h'   // 60분전 - 현재   수정한 파일 중 *.c or *.h 검색 

        • 수정시간 현재부터 30일 이전까지 관련 내용 검색  ( 30 < n )

        $ find . -mtime -30 -name '*.c' -o -name '*.h' // 검색내용 중  *.c 혹은 *.h 검색 
        $ find . -mtime -30 -name '*.h'                // 검색내용 중  *.h 만 재검색

        • 30이전 부터 60이전까지 관련내용 검색 (  30 > n  &&  60  < n )

        $ find . -mtime +30 -mtime -60  -name '*.c' -o -name '*.h'
        $ find . -mtime +30 -mtime -60  -name '*.h' 


        • find를 이용한 내부 command 이용 

         아래 내용은 날짜별로 관련내용을 분류할때 사용. (mv를 실행)
               - '{}' ';'     find 내부 command

        $ find . -name "*.VER" -mtime -31 -exec mv '{}' /opt/html/31';' -print
        $ find . -name "*.VER" -mtime +31 -mtime -62 -exec mv '{}' /opt/html/62 ';' -print


          http://www.linux-faqs.info/general/difference-between-mtime-ctime-and-atime

        1/05/2015

        HDMI 관련 프로젝트 관련정리

        본인도 오래전에 TI Chip(DM646x)을 가지고 Silicon Image사의 Sil9030 Chip Linux Device Driver를 개발해보고, 
        HDMI의 HDCP기능 구현과 TEST Program 과  Audio Multi-Channel 을 AC3(5.1) Format을 이용하여 HDMI로 통해 전송하여
        SPIDF 로 AC(5.1Channel)재생을 하도록 수정하고 개발해봤다.
        물론 이때는 Silicon Image사 Window CE Driver 와 Spec만 제공해주어서, 
        Window Deivce Driver를 리버스 엔지니어링로 분석 후 Linux Device Driver를 개발했다. 

        최근 HDMI 관련자료를 보니, 좀 이상하여, 다시 정리하려고만, 하며, 
        솔직히 말해 너무 오래전일이라 지금 데이타 시트를 보고 간단히만 정리하려고 한다.
        추후에 다시 HDMI Device Driver 설정 변경할 기회가 있을 때 세부적으로 기술하도록 하자. 

        • SII9030의 전체구성 


        SiI9030의 기본특징은 다음과 같다.

        • HDMI 1.0
        • DVI 1.0
        • EIA/CEA-861B
        • HDCP 1.1



        • Digital Video Output

        • Integrated PanelLink® core
        • Supports DTV (480i/576i/480p/576p/720p/1080i/1080p) and PC(VGA/XGA/SXGA/WSXGA) resolutions
        • Flexible video interface supports DVD and HD MPEG decoders
        - 12/24-bit RGB YCbCr 4:4:4
        - 16/20/24-bit YCbCr 4:2:2
        - 8/10/12-bit YCbCr 4:2:2 (ITU-R BT.601 & BT.656)
        • Integrated YCbCr <—> RGB color space conversion
        • 4:2:2<—> 4:4:4 up-converter
        • Programmable Data Enable (DE) generator


        • Digital Audio Output

        • DVD-Audio support thru 4xI2S inputs
        • Supports 2-channel 192kHz or 8-channel 96kHz
        • Supports IEC60958 2-channel PCM or IEC61937 compressed audio (Dolby Digital, DTS, etc.)
        • Industry-standard S/PDIF input

        1/04/2015

        U-BOOT Download 와 기본구조

        1. Uboot 란?  

        Uboot는 예전의 ppcboot 와 armboot가 합쳐지면서 생겨진 이름으로Univeral Boot Loader의 약자의 이름이다.
        내 기억으로는 1.0 이전은 ppcboot로 소스관리가 되다가 ARM7이 나오면서 armboot가 별도나오고 이를 통합하여 생겨난 bootloard이다.
        이 bootloard 이외에도 redboot 나 다른 opensource의 boot loarder들이 존재하며, 오래전에는 다 사용을 했지만,
        이 bootloader가 Linux에서 많이 사용되어지면서 다른 bootloader들은 지금 찾기가 힘들것 같다.

        빌드 방법과 기본구조만 알면 거의 이해가 될 것 같으며, Chip Vendor로 부터 BSP로 받더라도 DDR과 PLL부분은 자신에 맞게 수정을 해야 할 것이며,
        본인에게 필요한 Command가 있다면 추가해서 사용하면된다.

        U-Boot Site
          http://www.denx.de/wiki/view/U-Boot

        1.1 Download on Web

        denx 사이트에서 직접 Web browser로 FTP로 연결이 되어 Download가 가능하다.
        가장 편하며 좋다.

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

        1.2 DownLoad by FTP

        $ ftp ftp.denx.de
        Connected to phoibe.denx.de.
        220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
        220-You are user number 2 of 50 allowed.
        220-Local time is now 09:10. Server port: 21.
        220-IPv6 connections are also welcome on this server.
        220 You will be disconnected after 15 minutes of inactivity.
        Name (ftp.denx.de:jhlee): anonymous
        ftp>dir
        drwxr-sr-x    6 1001       1000             4096 Jun  9  2015 pub
        ftp> cd pub
        ftp> dir
        drwxr-sr-x   17 1001       1000             4096 Jun  9  2015 eldk
        drwxr-xr-x    2 1001       1000             4096 Jan 10  2003 ppcboot
        drwxr-xr-x    2 1001       1000             4096 Jul  4 08:11 tmp
        drwxrwxr-x    2 1001       1000            12288 Dec  6 01:05 u-boot
        
        ftp > get u-boot-latest.tar.bz2
        ftp > get u-boot-2015.10.tar.bz2
        
        

        1.3 Download by GIT

         
        $ apt-get install git   // git가 설치 안된 경우 
        $ git clone git://git.denx.de/u-boot.git   // GIT를 이용하여 압축이 안된 소스를 Download 
        


        1.4 Chip Vendor U-Boot

        해당 SDK를 설치를 하면 U-Boot가 source가 존재 할 것이다.


        2. Uboot의 기본구조 및 관련 기본설명 

        • ARCH
        CPU의 Architecture를 말하며 현재는거의 ARM을  주로 많이 사용하지만,이전에는 Power PC와 Mips도 많이 사용한 적이 있다.
        Board는 현재 각 개별 Board 별 설정을 하는 곳으로 현재 EVM이 많이 생겨나다보니 Kernel의 설정과 거의 유사한 형태로 변화되어 설정되고 있다.

        • Drivers
        Uboot도 NOR NAND의 loader에서 발전하여 각각의 interface를 지원하다보니,여러가지 driver를 제공하게 되었으며,
        이는 loader로써의 역할뿐만 아니라 간단한 TEST program으로 가능하게되었다.

        아래에서 보면 mmc뿐만 아니라, fpga를 사용한다면, fpga loader도 필요할 것이며, bus interfacepci , usb ,
        network interface 인 mii 여러가지를 다양하게 지원하며, video를 사용하여 간단한 video도 test도 가능하다.
        (예전에 video쪽은 Uboot에서 본인 Chip에 맞게 Driver를 다 구현하였다.)

        • Filesystem 
        각각의 BUS interface를 mount 한 후 각각의 Filesystem까지 지원을 하다보니,그 mount된 device의 파일을 load까지 가능하며 접근가능하다.
        점점 기능이 추가되므로, 가능하다면 최신버전으로 사용하자

        • NAND BOOT
        SPL(Second Program Loader) 약자이며,Uboot는  TPL(Tertiary Program Loader)로 될수가 있다.
        이는 본인의 Chip에 따라 달라질수 있으며, 관련내용은 Chip Vender의 Manual을 참조하자
        일단 예를 들어 TI인 경우 Davinci를 간단히 보면, RBL(Rom bootloader), UBL, U-BOOT 이런식으로 Boot가 진행된다.
        RBL은 CPU가 내장을 하고 있으며, UBL은 NAND의 1st Block에서 찾아 이를 Boot 한 후,
        U-BOOT를 Booting 시킨다.
        그래서 2번째 Bootloader가 되는 것이며, OMAP인 경우는 이름이 바뀌지만, 개념은 거의 유사하다고 보면된다.
        위 개념은 TI 뿐만 아니라, Freescale의 I.MX 다른 CPU에도 존재하기에 반드시 관련문서를보자.

        • Bootscript 지원 및 환경변수 지원 
        이 부분은 따로 자세히 설명을 하도록 하겠으며, 일반 OS의 Shell 변수처럼 설정이 가능하며, 외부의 Script을 Load하여 실행도 가능하다.

        • Device Tree 
        Uboot 와 Kernel의 설정을 외부에서 손쉽게 설정이 가능하도록 만들어진 기능으로 해당 Board에 대한 MACHINE 정보기반으로
        Kernel에게 전달 해주면, Kernel은 Device Tree 정보를 기반으로 Kernel HW 설정을 진행하며, Uboot에게 전달 해주면, Uboot역시 동일하게 동작한다.

        $ tree -d -L 2 
        .
        ├── Licenses
        ├── api
        ├── arch
        │   ├── arc
        │   ├── arm
        │   ├── avr32
        │   ├── blackfin
        │   ├── m68k
        │   ├── microblaze
        │   ├── mips
        │   ├── nds32
        │   ├── nios2
        │   ├── openrisc
        │   ├── powerpc
        │   ├── sandbox
        │   ├── sh
        │   ├── sparc
        │   └── x86
        ├── board
        │   ├── 8dtech
        │   ├── AndesTech
        ....
        │   ├── LaCie
        │   ├── Marvell
        │   ├── Seagate
        ....
        ....
        ....
        │   ├── d-link
        │   ├── dave
        │   ├── davedenx
        │   ├── davinci
        │   ├── dbau1x00
        │   ├── denx
        │   ├── dnp5370
        │   ├── efi
        ....
        │   ├── h2200
        │   ├── highbank
        │   ├── hisilicon
        ...
        │   ├── lge
        ...
        │   ├── nvidia
        ...
        │   ├── raspberrypi
        │   ├── renesas
        │   ├── ronetix
        │   ├── samsung
        
        │   ├── spear
        │   ├── st
        ..
        │   ├── ti
        ...
        │   └── xilinx
        ├── common
        │   └── spl
        ├── configs
        ├── disk
        ├── doc
        │   ├── DocBook
        │   ├── SPI
        │   ├── SPL
        │   ├── device-tree-bindings
        │   ├── driver-model
        │   └── uImage.FIT
        ├── drivers
        │   ├── bios_emulator
        │   ├── block
        │   ├── bootcount
        │   ├── clk
        │   ├── core
        │   ├── cpu
        │   ├── crypto
        │   ├── ddr
        │   ├── demo
        │   ├── dfu
        │   ├── dma
        │   ├── fpga
        │   ├── gpio
        │   ├── hwmon
        │   ├── i2c
        │   ├── input
        │   ├── led
        │   ├── memory
        │   ├── misc
        │   ├── mmc
        │   ├── mtd
        │   ├── net
        │   ├── pci
        │   ├── pcmcia
        │   ├── pinctrl
        │   ├── power
        │   ├── pwm
        │   ├── qe
        │   ├── ram
        │   ├── rtc
        │   ├── serial
        │   ├── soc
        │   ├── sound
        │   ├── spi
        │   ├── thermal
        │   ├── tpm
        │   ├── twserial
        │   ├── usb
        │   ├── video
        │   └── watchdog
        ├── dts
        ├── examples
        │   ├── api
        │   └── standalone
        ├── fs
        │   ├── cbfs
        │   ├── cramfs
        │   ├── ext4
        │   ├── fat
        │   ├── jffs2
        │   ├── reiserfs
        │   ├── sandbox
        │   ├── ubifs
        │   ├── yaffs2
        │   └── zfs
        ├── include
        │   ├── andestech
        │   ├── asm-generic
        │   ├── bedbug
        │   ├── configs   // Board Config 
        │   ├── cramfs
        │   ├── dm
        │   ├── dt-bindings  //Device Tree 
        │   ├── faraday
        │   ├── fsl-mc
        │   ├── jffs2
        │   ├── linux
        │   ├── lzma
        │   ├── mtd
        │   ├── net
        │   ├── pcmcia
        │   ├── power
        │   ├── samsung
        │   ├── synopsys
        │   ├── test
        │   ├── u-boot
        │   ├── usb
        │   └── zfs
        ├── lib
        │   ├── bzip2
        │   ├── dhry
        │   ├── efi
        │   ├── libfdt   //Flatted Device Tree 관련부분
        │   ├── lzma
        │   ├── lzo
        │   ├── rsa
        │   ├── tizen
        │   └── zlib
        ├── net
        ├── post
        │   ├── board
        │   ├── cpu
        │   ├── drivers
        │   └── lib_powerpc
        ├── scripts
        │   ├── basic
        │   └── kconfig
        ├── test
        │   ├── dfu
        │   ├── dm
        │   ├── env
        │   ├── fs
        │   ├── image
        │   ├── stdint
        │   ├── trace
        │   ├── ums
        │   └── vboot
        └── tools
            ├── buildman
            ├── easylogo
            ├── env
            ├── gdb
            ├── kermit
            ├── logos
            ├── omap
            ├── palmtreo680
            ├── patman
            └── scripts
        

        USB libusb 사용구조

        Linux에서 USB Host에서 libusb를 이용하면 별도의 Driver 설치 없이 User Space에서 USB Driver를 작성이 가능하다고 한다.

        다만 Class Driver의 경우만 쉽게 작성가능한 것으로 파악되며, Gadget File system을 이용하지는 않는 것으로 보인다. 

        • libusb 의 dev filesystem 연결 

        $ ls /dev/bus/usb/001/   //Host에서 각 USB Device를 선택가능
        001  002  003  015

        • libusb의 Host의 경우  (get_usbfs_fd)
        /dev/bus/usb 
        /dev/usbdev 이용 

        • LibUSB Guide 참조   

          https://fpga4u.epfl.ch/images/2/24/Libusb_Developers_Guide_vers0_1.pdf
          http://blog.csdn.net/fudan_abc/article/details/2070570
          http://libusb.info/