2/27/2015

PMIC

PMIC에 대해서 아래와 같이 간단히 기술을 한다.

PMIC의 주요기능
  • DC to DC conversion
  • Battery charging
  • Power-source selection
  • Voltage scaling
  • Power sequencing
  • Miscellaneous functions

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

전형적인 PMIC의 기능인 것 같으며, 아래와 같이 기능설명이 나와 있다.
주요설정은 I2C로 제어되며

위에서 언급했듯이, 이런 기능들을 SOC에 제공하기위해서

  • DVFS (Dynamic voltage and frequency scaling)
  • AVS(adaptive voltage scaling)
  • Dynamic Power Switching


SWITCHING TYPE, STEP-DOWN REGULATORS (BUCK)
를 개별적으로 Core, I/O, Memory 공급을 하며 조절한다.
이는 SOC의 Power Management와 같이 사용이 된다.

LTC3555 Typical Application
http://www.linear.com/product/LTC3555


Freescale MC34708 PMIC Internal Block Diagram

아래와 같이 PWM으로 조절하는 것 같다.

  • Six Buck switching regulators
  • Two single/dual phase buck regulators
  • Four single phase buck regulators
  • PFM/ APS/ PWM/ PWMPS operation modes
  • Dynamic voltage scaling

http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MC34708

  • Linear 사의 PMIC 제품
http://www.linear.com/parametric/PMIC_(DC-DC,_PowerPath_and_Battery_Charger)

  • Freescale 사의 PMIC
http://www.freescale.com/files/training_pdf/WBNR_FTF10_CON_F0896_PDF.pdf?lang_cd=en


관련이해자료
  • SMPS 관련 기술자료 (BUCK , BUCK-BOOST) 
http://www.iworldtech.com/6_info/0101.php
http://mon.futurepia.com/6
http://gakari.tistory.com/412
http://forum.falinux.com/zbxe/index.php?document_srl=499315&mid=hardware
  •  Regulator & Buck 
http://en.wikipedia.org/wiki/Regulator
http://en.wikipedia.org/wiki/Voltage_regulator
http://en.wikipedia.org/wiki/Buck_converter



2/26/2015

VI 편집기 수정중 (추후정리)

1. VI 편집기 

처음으로 리눅스 및 유닉스를 접하면서 다룬 편집기이며, 다루기도 복잡하지만 보편적인 편집기인 것 같다. 그래서 필수적으로 기본 명령어와 기본 설정정도는 알아둬야하는 것 같다.

1.1 VI,VIM의 기본설정  

  • VIM 설치 

$ sudo apt-get install vim 

  • 탭사이즈 조절 및 Line Number 설정
$ vi ~/.vimrc
set ts=4
set nu      
set ruler
set title
"  "주석  


set ts=4  :  tab size 설정
set nu     :   set number   좌측에 line number 표시
set ruler  :  현재 cursor 위치 표시


1.2 소스분석시 필요한 설정

$ sudo apt-get install ctags cscope 

  • CTAGS 추가  (./vimrc 변경) 
$ vi ~/.vimrc
set tags=./tags,tags    " 
set tags +=~/qtwork/kernel/tags           
"set tags+=~/am437x/works/board-support/u-boot-2014.07+gitAUTOINC+fb6ab76dad-gfb6ab76/tags
"set tags+=~/dm368/mt5/Source/dvsdk_ipnctools/ipnc_psp_03_21_00_04/kernel/tags
  • CSCOPE 추가  (./vimrc 변경) 
$ vi ~/.vimrc
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
if filereadable("./cscope.out")
    cs add cscope.out
else
    cs add /usr/src/linux/cscope.out
endif
set csverb

  • CSCOPE File 관련 생성 

$ vi mkcscope.sh
#!/bin/sh
rm -rf cscope.files cscope.files
find . \( -name ‘*.c’ -o -name ‘*.cpp’ -o -name ‘*.cc’ -o -name ‘*.h’ -o -name ‘*.s’ -o -name ‘*.S’ \) -print>cscope.files
cscope -i cscope.files


상위와 같이 실행하면, 자동으로 cscope가 실행이 되는데, 이때
ctrl+z 로 나가면 된다.

2. VIM의 모드구성

Normal Mode가 Default 이며, 다른모드에서 ESC를 클릭시 Normal로 돌아온다.

  1. Normal Mode : vi로 file open 했을 경우 처음 기본모드 (default)
  2. Insert   Mode : Normal 에서 'i' , 'a', 'o', 's'  입력시 편집가능
  3. Visual   Mode : Normal 'v'

  • Command 이용 및 sed와 유사한 기능 실행 

Normal Mode는 ':'를 이용하여 Command가 실행이 가능하며, sed와 같은 script도 가능하다
'/' 를 이용하여 정의하고 검색도 가능하다


  https://wiki.kldp.org/KoreanDoc/html/Vim_Guide-KLDP/Vim_Guide-KLDP.html
  http://idkwim.tistory.com/66

2.1 단축키 생성 및 치환기능 

Visual 모드에서 아래와 같이 각각의 명령을 이용하여 vi 내부에서 사용되는 기본명령 및 다른 기능들을 단축키로 대체 가능하다.

솔직히 거의 잘 사용하지 않으며,  그냥 알아두기만 하고 추후 사용할 일 있으때 그때보자.

nmap, map, vmap, imap,

일단 nmap에 대해 간단히 알아보자.
위의 visual mode에서 아래와 같이 실행을 해보자.

:nmap - dd
:nmap \ -

위와 같이 실행을 하면,  - 키를 입력하면 자동으로 dd가 실행이되어 한줄이 삭제된다.
\ 키를 입력을 하여도 동일하다.
nmap은 명령어를 mapping 시켜준다.

아래와 같이 실행을 하면, 위에서 mapping 했던 설정이 제거된다.

:nunmap -
:nunmap \


ex) :map _ ddp
'_'를 누르면 해당 줄을 아래로 내림

하지만 입력모드에서 언더스코어는 코딩할 때 자주 쓰이므로, 노멀모드에서만 동작하도록 해야 합니다. 이 때는 모드의 머릿글자+map 으로 동작 범위를 제한할 수 있습니다.

ex) :nmap _ ddp
그런데 만약, p 키를 다른 명령에 맵핑했다면 어떻게 될까요. _ 를 누르면 현재 줄을 삭제하고 p에 할당된 작업을 수행합니다. 따라서 맵핑을 작성할 때는 키시퀀스에 할당된 기능이 아닌 맵핑된 기능만을 처리하도록 해야 합니다.

:noremap _ ddp
noremap 은 키 시퀀스에 맵핑된 기능이 있어도 무시하고 디폴트 기능만을 수행하도록 합니다. 역시 모드의 머릿글자와 덧붙여서 조합이 가능합니다.
그러면 noremap 은 언제 사용해야 할까요? 언제 어떤 맵핑을 추가할지 모르니, "항상" 이렇게 사용해야 합니다.

:help nmap

관련 Manual

    http://learnvimscriptthehardway.stevelosh.com/chapters/05.html
    http://sunshowers.tistory.com/61
    http://jaeheeship.github.io/console/2013/11/15/vimrc-configuration.html


2.2 Command 기본실행 

Normal Mode에서 ':' 을 실행을 하면 sed와 같은 script 구사가 쉽게 가능하며,
':!'를 이용하여 Linux Command를 편집기 안에서 실행이 가능하다.


  • 문자열 치환기능 
기본기능은 sed와 동일하게 s/pattern/pattern/g   g는 전체의 의미
pattern 내부에 /가 존재한다면 \을 이용하여 구분해줘야 한다.

:1,10s/old/new/g :
:3,$s/old/new/g  : line3 부터 설정 끝까지 검색하고 치환
:s/old/new/g     :  전체 치환



  • 복사 및 이동 
Normal Mode에서 기본복사는 'yy'  or  '5yy' , 1줄 or 5줄 복사 하고 원하는 곳에 'p' 붙혀넣기 동작이다.
하지만 Command 이용하여 복사가 아래와 같이 가능하다.  
아래의 실행하기전에 : se nu로 line의 소스의 숫자를 확인하자.

: 1,5 co 7    : 1 ~5 을 line 7 기준으로 다음줄에 복사
: 1,5 t 7     : 1 ~5 을 line 7  기준으로 다음줄에 복사
: 2,4 m 7    : 2 ~4 을 line 7  기준으로 다음줄로 이동



  • 삭제기능 
Normal Mode에서 기본복사는 'dd' or '5dd' , 1줄 삭제 or 5줄 삭제가 가능하지만, Command를 이용하여 가능하다.

:5,10d     : 5~ 10 line 삭제

  • 검색기능 
Normal Mode에서 원하는 단어 위치에서 '*' 지속적으로 누르면 그 단어를 계속 찾아준다.
동일한 기능으로 '/pattern'  하고 'n'을 지속적으로 누르면 이를 지속적으로 찾는다.

define 찾기의 예제 
'/define' 입력 후  n 지속적입력  아래로 검색  'N' 반대방향
'?define' 입력 후  n 지속적입력  위로 검색    'N' 반대방향 


  • 뒤줄에 특수문자 "," 추가 

//1~10 line에 , 추가
:1,10s/$/\,/g

//전체 추가
:%s/$/\,/g


  • 앞줄에 추가 "foo:" 추가 
:10,20s/^/foo: /

:%s/^/foo: /




2.3 Command 확장 

vi가 window 처럼 이용이 되고 window의 다른 editor처럼 편하다면 좋겠지만, 이를 유사하게 사용이 가능하다.

  • Window 처럼 Tab 기능 사용 
vi 내부에서 여러문서를 읽고 편집하기위해서 tab 기능을 사용하며, 상위에 tab이 표시된다.

: tabnew  test.c  : 새로운 탭(문서창)을 작성한다.   ,
: tabnext           : 다음 탭(문서창)을 보여준다.
: tabprev           : 이전 탭(문서창)을 보여준다.
: tabclose          : 현재 탭(문서창)을 닫는다.


각 tab의 제거는 q! or x(save하고 exit) or tabclose 이지만 귀찮다.
위 명령은 길어서 사용하기 힘들다면,  vi ~/.vimrc 열어 단축 단어 설정하자.

$ vi ~/.vimrc
nmap th :tabprev
nmap tl :tabnext
nmap tn :tabnew       
nmap tc :tabclose

  http://vim.wikia.com/wiki/Using_tab_pages


  • 창 분할 
Tab기능과 별도로 현재의 창을 분할하여 File을 열고 닫을수도 있다.


:split 파일명    // 세로 창 분할  위아래 분할
:vs  파일명      // 가로 창 분할   좌우 분할
//Ctrl+w를 누른 후 w 창이동



  • 창분할 의 고급 (탐색기 처럼사용)
앞에 숫자를 넣으면 창의 크기가 결정이 되며, File 명 대신 Directory를 선택시 탐색기로이용


:30vs./     : 30은 세로창의 사이즈이며, ./ 디렉토리 열어 탐색기처럼 사용하여 File open
:split./     :  가로창을 현재 디렉토리 열어 탐색기처럼 사용하여 File open

  • HEX Editor (현재 많이 이용중)
 
:!%xxd
:!%xxd -r



3. Xshell 설정의 단축버튼설정 

Xshell에는 총 12개의 단축버튼이 있으며, vim을 사용할때 이 단축버튼을 각각의 기능에 연결하여 CTAGS/CSCOPE 사용하자.

 VIM에서 사용하는 CTAGS/CSCOPE 기능 
:tj  //TAG 검색
:sts tj   //새창 검색
:tn      //다음태그
:tp     //이전태그  
:tags   //태그 히스토리
:cs find c   // 부른함수
:cs find d   // 불려진함수 
:cs find s   // C심볼
:tabnew      // 새창 
:tabnext     // 다음탭
:tabprev     // 이전탭
:tabclose    // 탭닫기


단축버튼을 만들 경우 반드시 CR을 확인하자 (new line)



Xshell에서 도구->단축버트모음
별도저장 및 다른 기능을 저장


2/25/2015

Multimeter 와 PowerSupply

  • Multimeter
멀티미터 사용의 용도는 아주 다양하지만, 기능 거의 동일하다. 비싼 멀티미터일 수록 좋다. 
더불어 잡 기능이 많다. 요즘 그래프까지 지원이 되고 좋은 것은 좋다. 
  1. 전압 측정 사용
  2. 전류 측정
  3. 저항측정  및 회로연결사항 확인 
사용법은 제조사마다 약간식 다를 수 있으나, 거의 비슷하다.
회전식 버튼을 돌려가면서 간단하게 이용이 가능하다.

  https://ko.wikipedia.org/wiki/%EB%A9%80%ED%8B%B0%EB%AF%B8%ED%84%B0


  • Power Supply
전원공급기로 전체 사용하는 전력을 쉽게 알수 있으며, 어뎁터 없이 쉽게 연결하여 사용가능하다.
나의 경우는 파워소비를 측정하기위해서 많이 사용을 했다.
사용법도 쉬워서 한번 사용해보면 쉽가한다

2/16/2015

NAND BBM(Bad Block Management)

1. NAND의 Block의 상태 

  • NAND Block의 상태종류 
  1. 1st block : Chip Vendor는 1st Block은 Bad Block이 되지 않게 유지해줌  
  2. Factory-Default bad blocks:  Chip Vendor는 Block 의 1st or 2nd Page의 OOB 정보표시 
  3. Worn-out bad blocks : NAND 를 Erase or Write할 경우 BAD Block이 발생한 경우  
  4. Good blocks : 현재 좋은 상태의 Block 

  • Factory-Default Bad Block
    공장 초기에 제공해주는 Bad Block 정보이며, Chip Vendor 마다
    다를 수 있으므로 Datasheet를 참고 해야한다.

     - Samsung 인경우,
         각 Block의  1st or 2nd page의 6th OOB의 값이 0xFF 아닐 경우, BAD
   
이 정보는 Large page or Small page, bus width 에 따라 달라질 수 있다.
(Chip vendor 정보 반드시 참고)  
아래 link에 macronix를 정보를 소개.
이 정보를 BBI ( Bad block indication ) 라고도 호칭하기도 한다.


  • 1st Block
Chip Vendor마다 다르겠지만, 보통 ECC도 필요가 없으며, Nand 회사에서 보증하는 Block으로
약 1000 write 까지보증한다고 한다, 이부분도 각각의 Datasheet를 참고를 해야겠다.
하지만, 보통 1st Block에서 문제생기는 일은 거의 없기에 구지 자세히 알필요까지는 없을 것 같다.

  • Worn-out bad blocks 
보통 Write 제한이 있기에, 이를 초과 했을 경우, bad block이 발생. or
사용도중 Program or Erase 도중 fail 이나서 STATUS를 읽어서 ERROR 읽어 경우도
Bad block으로 처리한다.

1.2 NAND의 Bad Block 숙지사항 

UBOOT기준으로 설명을 하면, 이전 Version에는 아래의 사이트 처럼 U-Boot 에서
Bad Block을 만들어주는 Command가 존재했지만, 최신 Version으로 가면 없어진다.

NAND처리는 지속적으로 변화고 있으며,  본인의 BSP 를 비롯하여, U-BOOT, Kernel의
MTD관련부분을 어느정도 정확하게 알아야 동작원리를 알아야 겠다.

기본적인 BBT(Bad Block Table) 원리와 BBM(Bad Block Management) 부분을 정확하게
알아야 나중에 에러가 발생을 하여도 문제진단이 빠를 것 같다.

  • U-BOOT의 NAND관련 Command (오래된 Version) 
  http://wiki.openmoko.org/wiki/NAND_bad_blocks



  • U-BOOT의 NAND관련 Command 

  https://www.denx.de/wiki/DULG/UBootCmdGroupNand


1.3 BSP의 NAND의 구성 


  • AM35x-OMAP35x 관련 내용 
TI의 AM35x와 OMAP3관련 NAND 설정 및 이에 관련내용들이며, UBOOT에서 nanecc 라는 ECC설정가능명령도 존재한다.

  http://processors.wiki.ti.com/index.php/AM35x-OMAP35x-PSP_04.02.00.07_UserGuide



  • i.M28과 BBT와 BBI설명 
아래 문서를 읽어보면,  I.MX28 NAND 구성은 재미있는 것 같다.
2K page 64 OOB 구성을 512+16 매번 쪼깨서 사용하며, 이것은 정말 신선하게 느껴졌다.
매번 느끼는 것이지만, Bad block 의 관리와 NAND관리는 MPU와도 밀접한 것 같다.


  Freescale-i.MX28-MCIMX281AVM4B-Learning Centre MCU-Application Notes-Freescale.Application_Notes_5.pdf

  https://www.element14.com/community/docs/DOC-31589/l/freescale-application-note-for-nand-flash-bad-block-management-for-linux-bsp





2. Linux의 NAND BBM(Bad Block Management) 


2.1 Bad Block Table 생성 

Bad Block Table은 2bit 정보로 각 Block을 관리하며, 보통은 BBT은 2개의 Block을 사용을 하며, 하나는 Back-up용으로 생각하면 된다.

MPU-Nand Driver에서  static struct nand_bbt_descr을 선언하여 사용.
기본적 Last 2 Block or 1st Block을 사용하며, 아래와 같은 가지고 사용을 한다.

Nand에서 사용하는 BBT 
 * The table uses 2 bits per block
 * 11b:     block is good
 * 00b:     block is factory marked bad
 * 01b, 10b:    block is marked bad due to wear

Memory에서 사용하는 임시 BBT
 * The memory bad block table uses the following scheme:
 * 00b:     block is good
 * 01b:     block is marked bad due to wear
 * 10b:     block is reserved (to protect the bbt area)
 * 11b:     block is factory marked bad


Bad block table
  http://www.linux-mtd.infradead.org/tech/mtdnand/x144.html

  • BBT의 생성되는 Flowchart
초기에 U-Boot에서 한번 하며, 아래와 같이 공장 초기 값을 이용하여 만든다.
Factory-Default  bad block 정보이용하여  Bad block Table에 만드는 방법
현재 Linux BBT 역시 이와 같은 방식으로 동작하지만, 옵션에 따라 미세하게 다르게 동작.


http://bbs.ednchina.com/FORUM_POST_17_89328_0.HTM
  http://www.macronix.com/Lists/ApplicationNote/Attachments/729/AN0278V1%20-%20BB%20information%20introduction.pdf
  https://www.micron.com/resource-details/8e059ff2-fb4f-4e05-974c-e205226d2318


3. U-BOOT 와 Kernel BBT 분석 

Uboot 와 Kernel은 NAND를 사용시에는 BBT를 사용하며, 이에 관련된 부분을 알아보자. 

  • U-BOOT
U-BOOT NAND Bad Block Table 관련부분

 $ vi ./drivers/mtd/nand/davinci_nand.c

void davinci_nand_init(struct nand_chip *nand)
{
        nand->chip_delay  = 0;
#ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
        nand->bbt_options         |= NAND_BBT_USE_FLASH;
#endif
#ifdef CONFIG_SYS_NAND_NO_SUBPAGE_WRITE
        nand->options     |= NAND_NO_SUBPAGE_WRITE;
#endif
#ifdef CONFIG_SYS_NAND_HW_ECC
        nand->ecc.mode = NAND_ECC_HW;
        nand->ecc.size = 512;
        nand->ecc.bytes = 3;
        nand->ecc.strength = 1;
        nand->ecc.calculate = nand_davinci_calculate_ecc;
        nand->ecc.correct  = nand_davinci_correct_data;
        nand->ecc.hwctl  = nand_davinci_enable_hwecc;
#else
        nand->ecc.mode = NAND_ECC_SOFT;
#endif /* CONFIG_SYS_NAND_HW_ECC */
#ifdef CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
        nand->ecc.mode = NAND_ECC_HW_OOB_FIRST;
        nand->ecc.size = 512;
        nand->ecc.bytes = 10;
        nand->ecc.strength = 4;
        nand->ecc.calculate = nand_davinci_4bit_calculate_ecc;
        nand->ecc.correct = nand_davinci_4bit_correct_data;
        nand->ecc.hwctl = nand_davinci_4bit_enable_hwecc;
        nand->ecc.layout = &nand_davinci_4bit_layout_oobfirst;
#endif

$ vi ./drivers/mtd/nand/nand_bbt.c
nand_default_bbt
    -> 1.bbt_main_descr,bbt_mirror_descr  //NAND_BBT_USE_FLASH 때문에 default BBT옵션설정 
    -> 2.nand_scan_bbt 
           -> check_create
                 -> create_bbt
                      ->  scan_block_full or scan_block_fast

$ vi ./include/linux/mtd/bbm.h  // BBT 관련옵션 확인 


  • bbt_md(bbt_mirror_descr) or bbt_td(bbt_main_descr) 설정분석 
  1. NAND_BBT_LASTBLOCK :  NAND 마지막 Block BBT 존재여부 확인 
  2. NAND_BBT_CREATE      :  NAND BBT가 없다면 생성  
  3. NAND_BBT_WRITE       :  NAND BBT에 WRITE 가능   
  4. NAND_BBT_2BIT          :  각 Bblock 당 정보를 2bit식 할당 
  5. NAND_BBT_VERSION   :   BBT Version 정보 표시  
  6. NAND_BBT_PERCHIP    :   NAND Chip 마다 BBT 생성 


$ vi ./drivers/mtd/nand/nand_bbt.c

/* Generic flash bbt descriptors */
static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };

static struct nand_bbt_descr bbt_main_descr = {
        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
                | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,

        .offs = 8,  //offset of the pattern in the oob area of the page
        .len = 4,   //length of the pattern
        .veroffs = 12,  //offset of the bbt version counter in the oob are of the page
        .maxblocks = NAND_BBT_SCAN_MAXBLOCKS, //maximum number of blocks to search for a bbt
        .pattern = bbt_pattern      //pattern to identify bad block table or factory marked
};

static struct nand_bbt_descr bbt_mirror_descr = {
        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
                | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
        .offs = 8,
        .len = 4,
        .veroffs = 12,
        .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
        .pattern = mirror_pattern
};

static struct nand_bbt_descr bbt_main_no_oob_descr = {
        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
                | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
                | NAND_BBT_NO_OOB,
        .len = 4,
        .veroffs = 4,
        .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
        .pattern = bbt_pattern
};

static struct nand_bbt_descr bbt_mirror_no_oob_descr = {
        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
                | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
                | NAND_BBT_NO_OOB,
        .len = 4,
        .veroffs = 4,
        .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
        .pattern = mirror_pattern
};


  • Kernel Source

  http://lxr.free-electrons.com/source/drivers/mtd/nand/Makefile

  nand-objs := nand_base.o nand_bbt.o nand_timings.o

  http://lxr.free-electrons.com/source/drivers/mtd/nand/nand_bbt.c

  • drivers/mtd/nand/nand_bbt.c

           nand_scan_bbt
Search
-> check_create
                     -> mark_bbt_region
->nand_update_bbt

               * check_create
                        read_abs_bbt
                                   read_bbt


  http://lxr.free-electrons.com/source/drivers/mtd/nand/nand_base.c
  • drivers/mtd/nand/nand_base.c

        /* Fill in remaining MTD driver data */
         mtd->type = nand_is_slc(chip) ? MTD_NANDFLASH : MTD_MLCNANDFLASH;
         mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM :
                                                 MTD_CAP_NANDFLASH;
         mtd->_erase = nand_erase;
         mtd->_point = NULL;
         mtd->_unpoint = NULL;
         mtd->_read = nand_read;
         mtd->_write = nand_write;
         mtd->_panic_write = panic_nand_write;
         mtd->_read_oob = nand_read_oob;
         mtd->_write_oob = nand_write_oob;
         mtd->_sync = nand_sync;
         mtd->_lock = NULL;
         mtd->_unlock = NULL;
         mtd->_suspend = nand_suspend;
         mtd->_resume = nand_resume;
         mtd->_reboot = nand_shutdown;
         mtd->_block_isreserved = nand_block_isreserved;
         mtd->_block_isbad = nand_block_isbad;
         mtd->_block_markbad = nand_block_markbad;
         mtd->writebufsize = mtd->writesize;


           nand_block_markbad
                -> nand_block_markbad_lowlevel
                         -> nand_markbad_bbt



  http://lxr.free-electrons.com/source/drivers/mtd/mtdcore.c

  • drivers/mtd/mtdcore.c

           mtd_block_isbad
              -> mtd->_block_isbad

           mtd_block_markbad
              -> mtd->_block_markbad


  http://lxr.free-electrons.com/source/drivers/mtd/nand/davinci_nand.c

2/15/2015

MTD-Linux Embeded File system (추후 자료 수정)

1. MTD(Memory Technology Devices)

MTD(Memory Technology Devices)란?

말그대로, Linux에서 사용되어지는 Memory Technology Device 이며, Flash Memory를
초기에는 NOR Type의 Flash Memory 지원이 되어지면서 이를 Control하기 위해서 , NAND의 출현으로 현재 그 기능이
다중화 많이 기능들이 추가되고, 이에 더불어 FTL, NTFL 등 다양한 기능이 추가하는 중이다.
NAND에 필요한 Bad Block Management 기술 들이 들어가 있다.


code code sample 

 
1.1 MTD의 기본구성


MTD의 기본구성을 살펴보면, 일단 MTD Chip Drivers가 존재하며, 각종 Flash Memory
(NAND , ONE-NAND , NOR Type) 기본 Interface 부분이 존재한다.
이런 부분들은 H/W와 밀접한 관계를 가지고 있기때문에 glue logic라고 표현을 한것이다.

상위 MTD에는 추상화되어 Char Device 와 Block Device 로 구분이 되며, Flash Memory에 접근하는 방식이 다르다.
일반적인 Disk라면, Fixed Size로 ATA , PATA, PIC Interface 로 이를 접근을 해서 Block Device로 접근을 하면된다.
하지만, Flash의 경우 write and erase operation 이 구분을 해야하며, Size도 제각각이다.
이를 Control 하고, Partition 이라는 개념을 제공하기위해서 Char Device를 제공한다.

현재는 NOR or ONENAND 보다는 NAND를 사용하거나 NAND의 부족한 기술을 HW적으로 보완해줘서 사용하는
SD Disk 같은 저장장치로 분류되겠다.
물론 SD Disk 같은 저장장치는 MTD의 사용이 필요하지 않다.

MTD의 기본설명
  https://en.wikipedia.org/wiki/Memory_Technology_Device

MTD의 FAQ (일반적인 질문 및 기본사항)
  http://www.linux-mtd.infradead.org/faq/general.html
  http://www.linux-mtd.infradead.org/archive/tech/faq.html

MTD API 및 MTD Test
  http://www.linux-mtd.infradead.org/doc/general.html


아래는 Mircorn의 기술자료 이며, 현재 MTD 구조를 보여주고 있다.
tn0025_enabling_flash_in_linux_mtd.pdf (micron)





1.2 MTD의 Device의 기본사용법 



아래 참조

  http://etutorials.org/Linux+systems/embedded+linux+systems/Chapter+7.+Storage+Device+Manipulation/7.1+MTD-Supported+Devices/

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



1.3 NAND를 사용할 경우 필요한 기술 


1. Wear-leveling 란 ?

Flash Memory일 경우 NAND or NOR는 File system을 사용하면, 한 영역을 자주 지우고, 쓰는 경향이 존재한다.
하지만, Flash Memory에는 Erase와 Write의 수명이 존재하기 때문에 이를 방지하기 위해서 Flash Memory에 Level을 두어 여러군데에 골고루 사용하도록 하는 기술이다.

  http://kr.apacer.com/business/technology/wear-leveling


2. BBM(Bad Block Management)
NAND는 NOR Type의 Flash와 달리 기본적으로 Bad Block이 존재하며, 이를 보완하기 위해 Bad Block Management 기술이 필요하다.
이 Bad Block도 Factory Bad Block과 Run Time Bad Block 로 크게  두 가지로 분류가 되며, 이 관리를 제대로 해야 저장장치로서의 신뢰성을 얻을 수 있다.

제조사는 Factory Bad Block일 경우 OOB에 이 정보를 알려주며, 그리고 현재 MTD 인 경우 따라 다르겠지만,
OOB 중 2 Byte를 사용하여 Bad Block 관련하여 사용한다.

  • BBT(Bad Block Table)
BBM의 한 종류로 MTD에서 사용하는 기술이며, Bad Block 정보를 가지고 Bad Block을 판단할수 있지만, Factory Bad Block과 Worn Bad Block은 구분할 수가 없다.
그래서 2 Bit를 이용하여 기본적으로 2개의 Block을 사용하여 Table을 만들어 이를 관리한다.


3. Gabage Collection (GB)

RAM과 함께 사용되어지는 기술이며, 이는



SSD Disk 및 eMMC 관련기술 (NFTL)
  http://www.qdpma.com/storage/SSD.html



1.4 Raw Flash File System 과 FTL 

MTD에서는 사용되어지는 File System은 두가지로 보면될 것같다. 현재 거의 주류가 raw NAND or FTL Firmware를 포함하여,
NAND을 사용할때 필요한 기술들을 HW 상에서 모두 동작하게 하는 저장장치일 것이다.

FTL Firmware 기능을 포함한 것이, 대표적인 것들이  MMC, eMMC, SD, SSD , USB Memory 일 것이다.

Raw Flash File System은 일반적으로 Flash Memory에 MTD 상위에 있는 File System을 말한다.
하지만, 여기에는 복합적인 기능이 필요하다.


  http://www.linux-mtd.infradead.org/doc/ubifs.html#L_raw_vs_ftl






http://www.linux-mtd.infradead.org/~dwmw2/mtd-upper-layers.jpeg


http://image.slidesharecdn.com/evaluation-of-flash-file-systems-for-large-nand-flash-memory4871/95/evaluation-of-flash-file-systems-for-large-nand-flash-memory-5-728.jpg?cb=1271316564




위의 MTD 구성 간단히 보자.
NAND의 NFTL은 뒤에서 다시 보자.
NFTL을 사용하지 않을 경우를 MTD-RAW라고 하는데 이와 비교해서 보자.



  1. MTD와 NAND 연결 
  2. MTD와 MMC, eMMC, SD, SSD 와 연결 (NFTL 필요)


  • MTD- User Modules
  1. NFTL (NAND Flash Translation Layer)
  2. FTL(Flash Translation Layer)
  3. MTD-Char Device
  4. MTD-Block Device
  5. MTD-JFFS2 
  6. MTD-YAFFS/2
  7. MTD-LOGFS
  8. MTD-UBIFS

  • MTD- Chip Drivers
  1. NAND Drivers 
  2. NOR Drivers 




http://forum.falinux.com/pds/data-s2410/No11-1.pdf





1.3 MTD NFTL (Nand Flash Translation Layer)

MTD Raw를 사용하지 않고 MTD-NFTL의 기본사용이유는 Wear-Leveling 과 BBM 관리가
목적이며, 이에 대해서 좀더 자세히 알아보도록 하자.

만약 사용하지 않는다면, File system에서 이를 지원을 해야 겠다. 

  http://www.linux-mtd.infradead.org/doc/ubifs.html#L_raw_vs_ftl

https://en.wikipedia.org/wiki/Flash_file_system#Linux_flash_filesystems

https://digitalcerebrum.wordpress.com/random-tech-info/flash-memory/raw-flash-vs-ftl-devices/

  http://d1.amobbs.com/bbs_upload782111/files_46/ourdev_684405XFKZAB.pdf




2 . MTD Raw Flash File system

FTL를 사용하지 않으며, MTD위에 바로 File system을 사용하는 Filesystem를 통칭한다.
이는 Embeded에서 주로 사용이 되어지며,
Wear-leveling 은 File system에서  BBT를 MTD에서 제공을 한다.


MTD NAND 관련 기술
http://www.linux-mtd.infradead.org/tech/mtdnand/book1.html
http://www.linux-mtd.infradead.org/tech/mtdnand/r526.html
http://www.linux-mtd.infradead.org/tech/mtdnand/r743.html
http://www.linux-mtd.infradead.org/tech/mtdnand/r804.html





2.1 Kernel 설정

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

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

  https://wiki.kldp.org/KoreanDoc/html/Kernel-KLDP/specmtd.html

  http://www.stlinux.com/howto/Flash/MTD

  NFTL vs INFTL

  http://www.tldp.org/HOWTO/Disk-on-Chip-HOWTO/intro.html


http://elinux.org/images/9/9a/CELFJamboree29-FlashFS-Toshiba.pdf




2.1 JFFS2

JFFS2 clean marker requires 8 bytes
만약 BCH8을 사용하면, 14byte *4 =56 byte,  56+8 =64byte.
BBT 정보를 사용할수 없다.


NAND read 시 Run-time bad가 발생 할 수가 있어,아래가면, AM335x JFFS2를 사용하지 않는다.

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

  • TI가 JFFS2 지원을 중단한 이유
  1. UBIFS를 권하고 있으며, UBIFS는 JFFS2의 다음 모델이며, 향상된 기능을 가지고 있다. 
  2. ECC layout이 RBL, SPL, U-BOOT ,  ECC의 알고리즘인 BCH8이 호환이 가능. 
 
  http://processors.wiki.ti.com/index.php/AM335x_JFFS2_Support_Guide#Reasons_for_disabling_JFFS2_support


2.2 UBIFS



http://www.linux-mtd.infradead.org/doc/ubidesign/ubidesign.pdf

UBI는 완벽한 FTL(flash translation layer)는 아니지만, bad block과 wear leveling 기능을 제공을 하며,

erase block management를 제공을 한다.


UBIFS는 UBI(Unsorted Block Image)와 UBIFS로 분리된다.



UBIFS raw flash 을 위해 만들어진 FILE SYSTEM 이며, B+ Tree를 사용하여 구성이 되어있다고 한다.
처음 노키아에서 만들어져서 사용되어져 있다고 한다.



  • 장점
빠른 속도와 FILESYSTEM의 가벼운이 큰 장점이며, OOB영역을 적게 사용하여
ECC의 사용폭이 넓은 것 같다.
  • 구성
             UBIFS                /fs/ubifs
             UBI                    drivers/mtd/ubi
             MTD                  drivers/mtd
                  NAND , NOR, OneNAND

  • 아래의 예제

sudo mkfs.ubifs -q -m 2048 -e 129024 -c 1023 -r mypath  -o ubifs.img
sudo ubinize -o ubi.img -m 2048  -p 131072 -s 512 ubinize.cfg

mount 및 kernel args
$ mount -t ubifs ubi0:rootfs /mnt/ubifs
rw ubi.mtd=4,2048 rootfstype=ubifs root=ubi0:rootfs


UBIFS BAD BLOCK MARK
  http://www.linux-mtd.infradead.org/doc/ubi.html#L_torturing
  http://www.linux-mtd.infradead.org/doc/ubi.html#L_max_beb

기타자료

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

  http://www.linux-mtd.infradead.org/faq/ubifs.html

http://wiki.linpert.de/index.php?title=UBIFS     

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

  http://www.linux-mtd.infradead.org/faq/ubifs.html

http://www.linux-mtd.infradead.org/doc/ubifs_whitepaper.pdf

  http://www.linux-mtd.infradead.org/doc/ubidesign/ubidesign.pdf
http://www.linux-mtd.infradead.org/doc/ubifs.pdf


1.3 YAFFS1/2




위의 unstable bits문제를 yaffs2를 교체하므로써 해결이 되었다고 한다.

  http://forum.falinux.com/zbxe/index.php?document_srl=786065&mid=device_driver

http://yaffs.net/lurker/message/20140710.203207.b2255691.it.html

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


1.1 How To make JFFS2/YAFFS2/UBIFS/CRAMFS

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

http://processors.wiki.ti.com/index.php/TI81XX_PSP_UBOOT_User_Guide#Creating_UBIFS_File-System


   Benchmark result
  http://elinux.org/images/9/9a/CELFJamboree29-FlashFS-Toshiba.pdf

http://forum.falinux.com/zbxe/index.php?document_srl=786065&mid=device_driver


3 MTD FTL File-system

Flash 기반으로 NAND 관련 Contoller가 포함이된
SD Card/MMC 와 eMMC 그리고, USB Storage 사용한다.


/dev/mmcblk0

http://elinux.org/images/b/b6/EMMC-SSD_File_System_Tuning_Methodology_v1.0.pdf


https://wiki.linaro.org/WorkingGroups/KernelArchived/Projects/FlashCardSurvey


ext3/ext4

btrfs

f2fs



2/12/2015

xargs 기본사용

1. xargs 기본사용

xargs는 기본적으로 단독으로 사용하는 command가 아니며 다른 command과 조합으로 사용한다.

xargs에서 다른 command를 실행하면, 표준입력으로 값으로 들어온 값을 그대로 command로 넘겨준다. 그래서 이름 xargs 인 것 같다.
결론적으로 xargs의 command는 표준입력의 넘어온 list의 제한적인 검색 또는 실행을 한다.

$ find . -name "*.o" | xargs rm -rf  


SYNOPSIS
       xargs  [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]]
       [-L max-lines] [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s max-chars] [--max-chars=max-chars] [-P max-procs]  [--max-procs=max-procs]  [--interactive]  [--verbose]
       [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits] [--version] [--help] [command [initial-arguments]]


2. 기본예제


$ find . -name "*.o" | xargs rm -rf
$ ls "*.o" | xargs rm -rf

위 예제가 제대로 동작이 안될 때 아래와 같이 한다.
왜냐하면 find를 검색은 기본적으로 newline을 포함하지만 -print0 은 이를 제거한다.

$ find /tmp -name "*.tmp" -print0 | xargs -0 rm

  • 각 directory의 전체 사이즈를 알고 싶을 경우.

$ ls | xargs du -hs 

http://www.dreamy.pe.kr/zbxe/CodeClip/164220
http://www.thegeekstuff.com/2013/12/xargs-examples/

HI3521 기본 구조 및 특징

1. HI3521 기본구조


TI의 DM8148과 구조가 유사하지만, 거의 DVR과 NVR용으로 나온 칩이다.


  더 자세한 내용을 Datasheet를 참고하자.
  http://www.hkvstar.com/pdf/Hi3521.pdf

2. HI3521 SDK 구조 

The structure of the Hi3521_SDK_Vx.x.x.x folder is as follows:    
    |-- sdk.cleanup                 #Cleanup scripts of the SDK.
    |-- sdk.unpack                  #Expansion scripts of the SDK.
    |-- osdrv                       #OS and related drivers
    |   |-- busybox                 # Source code of busybox
    |   |-- drv                     # Source code of drivers
    |   |-- kernel                  # Source code of the Linux kernel
    |   |-- pub                     # compiled images/tools/drivers
    |   |-- rootfs_scripts          # Root file system
    |   |-- toolchain               # cross compiler
    |   |-- tools                   # Source code of the Linux tools
    |   |-- uboot                   # Universal boot loader (U-boot) source code
    |   `-- Makefile                # osdrv Makefile
    |-- package                     #Compressed packages of the SDK
    |   |-- osdrv.tgz               #Compressed package of the linux and driver
    |   |-- mpp.tgz                 #Compressed package of the media processing platform 
    |   `-- image_glibc             #Images that can be burnt to the flash memory
    |-- scripts                     #Shell scripts
    |-- mpp                         #MPP
        |-- component               #Component source code 
        |-- extdrv                  #Source code of the drivers of board-level peripherals
        |-- include                 #External header files
        |-- ko                      #Kernel driver
        |-- lib                     #Audio library and the library of the release version
        |-- tools                   #Tools used for media processing
        `-- sample                  #Source code samples


Description of the Installation and Upgrade of the Hi3521 SDK.txt
이문서를 읽으면 기본설치 및 구성을 이해할수가 있다.

위 문서 구성대로
     기본이되는 toolchain과 uboot,kernel,filesystem은 에 osdrv에 구성되며
     mpp에는 hisilicon 에서 제공하는 mpp와 관련된 driver와 sample 및 외부 driver 제공
     drv 에는 기타 driver를 제공


3. osdrv 

3.1 Build 

osdrv에는 uboot , kernel, filesystem을 구성을 할 수 있으며, 이에 관련된 Makefile이
존재한다.
그리고, Build는 전체 빌드와 개별빌드로 진행된다.

osdrv/Makefile 에서 진행되지만 수정이 필요.
(매번 압축을 새로풀고 소스를 지우고, 빌드를 진행)

Makefile을 전체를 할 경우 아래 순서대로 진행

  • prepare : 각 배포할 장소의 directory를 만듦
  • hiboot : uboot build
  • hikernel : kernel build
  • hirootfs_prepare : default file system 구성 (rootfs_scripts/rootfs.tgz)
  • hibusybox : busybox copy
  • hiboardtools : board 관련 tools (himm ,udev, parted)
  • hipctools : pctools (처음 한번만 실행하면 됨)
  • hirootfs_build : pctools로 filesystem image를 생성, NAND 사이즈에 따라 수정요구.

진행 후, 아래에 생성된 이미지 확인
osdrv/pub/

3.2 uboot 

      Uboot는 HI3521은 아래 설정
      arch/arm/configs/godarm_defconfig

     Uboot는 HI3531은 아래 설정
     arch/arm/configs/godnet_defconfig

logo 를 사용할 경우 아래의 명령을 사용하는데,

uboot에서 startvo,stopvo:
              startgx:stopgx:

위 command를 사용했을 경우, stop해줘야지 올바르게 kernel에 동작을 한다.
stopvo와 stopgx의 값 himm을 이용하여 kernel에서 멈추게 할수도 있다.


4. DEBUG 

telnet을 하나 이용하여 아래의 상태를 확인


# cat /dev/logmpp

# ls /proc/umap/
adec    aenc    ai      ao      chnl    dsu     grp     h264e   hdmi    ive     jpege   logmpp  rc      rgn     sys     vb      vda     vdec    venc    vi      vo      vpss

2/11/2015

grep 이용 검색

1. 기본사용법 

     grep은 기본사용법은 적은 찾고자 하는 패턴을 입력하고, 시작디렉토리를 입력하며, 검색을 시작한다.

     grep  option  expr  directory     // expr에 "" or ''을 넣어주어야 주어한다.

2. 기본옵션 

     -r 옵션은 순환적으로 밑에 디렉토리까지 검색하지만, 속도가 너무 느리다.
        만약 SSD이라면, 적극추천한다. 하지만 재귀에 문제로 너무 오래걸리는 것인지 동작이 멈춘 것인지 알수 없는 경우가 발생.

     -n output file의 line number를 알고 싶다면 -n으로 사용

     -b -n과 동일한 기능 같은데, newline이 포함안됨

     -E 옵션과 확장 패턴을 넣을수 있는데, 이때  AND 와 OR 연산을 사용가능.

       -E, --extended-regexp
              Interpret PATTERN as an extended regular expression
              * egrep과 동일하다고 한다. 

       -e PATTERN, --regexp=PATTERN
              Use PATTERN as the pattern.

       -b, --byte-offset
              Print the 0-based byte offset

       -n, --line-number
              Prefix each line of output with the 1-based line number 

       -R, -r, --recursive
              Read all files under each directory

       -v, --invert-match
              Invert the sense of matching, to select non-matching lines.

       -h, --no-filename
              Suppress the prefixing of file names on output.
              검색 list의 file 이름 제거

man에서 참고

3. 기본표현식 

     패턴은 regular expression이라고 부르며, 아래와 같은 meta-characters 사용이 가능하다.


   The period . matches any single character.

   Anchoring
       The caret ^ and the dollar sign $ are meta-characters that respectively match the empty string at the beginning and end of a line    

   Bracket Expressions
 
   [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:]
   [0-9] 
   [0-9A-Za-z] 
   [aBbCcDd]   
   [0123456789]

   Repetition
   A regular expression may be followed by one of several repetition operators:
       ?      The preceding item is optional and matched at most once.   
       *      The preceding item will be matched zero or more times.       
       +      The preceding item will be matched one or more times.       
       {n}    The preceding item is matched exactly n times.
       {n,}   The preceding item is matched n or more times.
       {n,m}  The preceding item is matched at least n times, but not more than m times.

man에서 참고

4. 사용확장 
  • OR 연산
$ grep 'pattern1\|pattern2' filename
$ grep -E 'pattern1|pattern2' filename
$ egrep 'pattern1|pattern2' filename
$ grep -e pattern1 -e pattern2 filename
  • AND 연산
     grep에는 AND연산이 없지만, 유사하게 사용이 가능. ( '|' 사용 및 -E 와 '.*' 사용)
$ grep -E 'pattern1.*pattern2' filename
$ grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
$ grep -E 'pattern1' filename | grep -E 'pattern2'
  • NOT 연산 
$ grep -v 'pattern1' filename


5. 사용예제들

아래의 사용예제들은 AND와 NOT , 그리고 OR 연산을 사용하며, -r을 사용한다.
그리고 위의 메타데이타를 사용하기에 쉽게 검색이 된다.
grep은 find에 비해 검색속도가 상당히 많이 느리지만, SSD에서는 적극 추천한다.

단독사용도 가능하지만, find와 조합도 가능하고 다양한 조합도 가능하기 사용자의 능력인것 간다.


$ grep -r 'i2c.*sm.*wri*' .  //i2c와 sm과 wri가 3개의 패턴검색 (위의 AND 연산)

$ grep -Er 'i2c.*sm.*wri*' .     //현재 위와 동일하다

$ grep -r 'i2c.*sm.*wri*' . | grep -v "block"  // 위를 일차검색하고, block을 제외 

$ grep -r 'i2c*' . | grep -v "block"  //i2c 관련 검색을 하지만 block 제외

$ grep -r 'i2c.*write[0-9]' .    //i2c와 write0~9까지 의 패턴을 검색. 

$ grep -r 'i2c.*write[0-9]' .    //i2c와 write0~9까지 의 패턴을 검색.

$ grep -rE '(i2c|spi).*write[0-9]' . //i2c 나 spi  둘 중  write0~9와 패턴이 중복되는 것 검색


아래의 사이트 참고,

  http://www.thegeekstuff.com/2011/10/grep-or-and-not-operators/
  http://xero0212.tistory.com/26
  http://www.thegeekstuff.com/2009/03/15-practical-unix-grep-command-examples/

Push-Pull TTL

Totem-pole or  Push-Pull TTL



정확히 말하면, push-pull output 이며, 주로 CMOS , TTL 등 IC의 Gate 회로에서 사용되어지는 용어이다.



2/10/2015

find 확장 조합 (grep , xarg)

1. Linux 에서 검색방법

개별 find or grep으로 검색으을 하면, 어느정도의 한계를 느낄 것이며, 이를 확장해주는 것이 xargs의 기능이라고 생각한다.
이를 pipe라는 기능을 사용하여, '|'  조합으로 기본 구성을 하여 사용해보고, 단순 검색인
find와 grep을 이용을 해보자.


1.1 find 이용한 기본 검색 

  • find name 검색 

$ find . -name board // kernel 에서 board  filename 검색 
./Documentation/devicetree/bindings/board
./drivers/staging/board

$ find . -name '*.c' // *.c file 파일 검색 
.....

  • find로 변경시간 검색 
-5 or -10 , 즉 5분 전 or 5일 전 것이 가장 유용하게 이용이 될것이며, 파일이 많으면,
head or tail 이용하자

-cmim :  File의 status가 변경된 시간 (기준 n minute)
-ctime :  File의 status가 변경된 시간 (기준 n*24 hours, 1 day)
-mmin:   File의 data가 변경된 시간 (기준 n minute)
-mtime:  File의 data가 변경된 시간 (기준 n*24 hours , 1 day )


$ find . -cmin -5 //  -5 분이하, 즉 5분전  파일 변경된 것 검색 
./.config

$ find . -cmin 5         //  정확히 5 분 전 것만 검색 , 별로 검색에 필요 없음 
$ find . -cmin +5 | head //  +5 분이상, 즉 5분 후  파일 변경된 것 검색 , 파일이 너무 많아 head 사용 
./.tmp_kallsyms2.o
./mm
./mm/.filemap.o.cmd
./mm/.mincore.o.cmd
./mm/mremap.o
./mm/.compaction.o.cmd
./mm/page_isolation.o
./mm/.msync.o.cmd
./mm/modules.builtin
./mm/zsmalloc.c  

$ find . -ctime -5   //  파일 변경된 것 -5 *24 시간 이하     , 즉 5일 이전것 
.
./init
./include/linux
./kernel/sched
./arch/arm/boot/compressed
./arch/arm/kernel
./.config.old

$ find . -ctime 5    //  파일 변경된 것 5*24 hours 시간된 것 ,
$ find . -ctime +5   //  파일 변경된 것 +5 *24 hours 시간이상, 즉 5일 이후것  


atime /amin : 즉 access time 도 존재하지만 , debugging 할 경우에나 필요할 것 같다.

  • find로 size 기준으로 검색 
find로 file size 기준으로 검색

$ find -size -512c  // 512 byte 이하 검색 
$ find -size -4k  // 4k byte 이하 검색 
$ find -size -4M  // 4M byte 이하 검색 
$ find -size -4G  // 4G byte 이하 검색 

  • grep을 이용한 검색 
grep을 이용하며, 검색하면 좋지만, 시간 상당히 걸리뿐만 아니라
가끔 시스템이 죽을 경우도 존재한다.


$ grep -n _board_ ./System.map // System.map 파일 안에서 _board_ 검색하고 line을 출력 
$ grep -n _board_ ./System.map 
678:c001ff70 t omap_mux_dbg_board_open
680:c001ffc0 t omap_mux_dbg_board_show
18680:c043faf0 T spi_register_board_info
28085:c0679ecc r omap_mux_dbg_board_fops
37105:c088aeb8 R __ksymtab___i2c_board_list
37106:c088aec0 R __ksymtab___i2c_board_lock
45157:c08964c8 r __kcrctab___i2c_board_list
45158:c08964cc r __kcrctab___i2c_board_lock

$ grep -r _board_ .              // 현재 directory부터 모든 파일 안의 _board_  검색을 한다 
./System.map:c001ff70 t omap_mux_dbg_board_open
./System.map:c001ffc0 t omap_mux_dbg_board_show
./System.map:c043faf0 T spi_register_board_info
./System.map:c0679ecc r omap_mux_dbg_board_fops
./System.map:c088aeb8 R __ksymtab___i2c_board_list
./System.map:c088aec0 R __ksymtab___i2c_board_lock
./System.map:c08964c8 r __kcrctab___i2c_board_list
./System.map:c08964cc r __kcrctab___i2c_board_lock
./System.map:c08b2e64 r __kstrtab___i2c_board_list
./System.map:c08b2e75 r __kstrtab___i2c_board_lock
./System.map:c08cc7d4 T omap_serial_board_init
./System.map:c08e73c4 T i2c_register_board_info
./System.map:c08fc398 t pmic_i2c_board_info
./System.map:c0911390 d musb_default_board_data
./System.map:c0945560 D __i2c_board_lock
./System.map:c094556c D __i2c_board_list
.....

1.2. 기본조합 (find와 grep)

find만 이용할 경우 file list 만을 검색을 하지만, 여기서 grep을 이용하여 file list를 
find에서 검색한 list 에서만, grep을 이용하여 find의 검색 정보의 정확성을 높힌다.
사실 그리 좋은 조합은 아닌 것 같다.

1. find 로 *.c 파일 file list을 생성
2. *.c file list 입력을 받아 이를 grep 으로 board관련된 내용 file list 줄임


$ find . -name '*.c' | grep board  // find 로 전체 *.c 파일 list 생성
./sound/soc/intel/boards/haswell.c
./sound/soc/intel/boards/skl_rt286.c
./sound/soc/intel/boards/bytcr_rt5640.c
./sound/soc/intel/boards/byt-max98090.c
./sound/soc/intel/boards/broadwell.c
./sound/soc/intel/boards/cht_bsw_rt5645.c
./sound/soc/intel/boards/cht_bsw_max98090_ti.c
./sound/soc/intel/boards/mfld_machine.c
./sound/soc/intel/boards/cht_bsw_rt5672.c
./sound/soc/intel/boards/byt-rt5640.c
./kernel/debug/kdb/kdb_keyboard.c
./arch/arm/mach-tegra/board-paz00.c
./arch/arm/mach-omap2/board-generic.c
./arch/arm/mach-omap2/board-ldp.c
./arch/arm/mach-omap2/board-rx51-peripherals.c
./arch/arm/mach-omap2/common-board-devices.c
./arch/arm/mach-omap2/board-n8x0.c
./arch/arm/mach-omap2/board-rx51.c
./arch/arm/mach-omap2/board-rx51-video.c
./arch/arm/mach-omap2/board-flash.c
./arch/arm/mach-ux500/board-mop500-audio.c
./arch/arm/mach-ux500/board-mop500-regulators.c
./arch/arm/mach-omap1/board-h2-mmc.c
./arch/arm/mach-omap1/board-perseus2.c
./arch/arm/mach-omap1/board-osk.c


1.3 find 와 xargs 와 greps 조합 검색

  • xargs 와 pipe의 조합기능 
 xargs - build and execute command lines from standard input
 xargs는 stdin으로 부터 들어온 command lines을 실행하거나 빌드하는 기능이다.

쉽게 말하면

  1. find  *.c   |  xargs grep xx  // c파일을 찾아 list 만들고 이를 grep에게 argument로 전달 
  2. find  *.h  |  xargs rm    xx  // h파일을 찾아 list 만들고 이를 rm에게  argument로 전달 


xargs를 이용하여, grep으로 검색을 하되 find에서 검색한 내용안 에서만 검색을 한다.
위의 검색과  차이가 있다.


$ find . -name '*.c' | xargs grep dram_init   // *.c 검색해서  grep으로 *.c파일만 dram_init 내용을 검색 


1.4. xargs 확장 사용 

xargs: 파이프 이전의 명령의 결과 값들을 인자로 보내어 주어 실행시킴.
이름도 xargs , 현재 여러 인자를 TEST 못해봄.  주로, 인자 하나만 사용해봄.

$ find . -name '*.o' | xargs  grep 찾고자 하는 file 
$ find . -name '*.mk' -o -name 'Makefile' | xargs grep odroid 
$ find . -name '*.mk' | xargs rm 


Ref.
  http://stackoverflow.com/questions/7339253/find-and-number-of-days-range
  http://qdata.co.kr/bo/bbs/board.php?bo_table=ltip&wr_id=210


2. 소스내 패턴검색 (sed,xarg 응용)

sed를 알고나서, xarg에 적용을 하고 난뒤 아래와 같은 조합으로 만들어봤는데,
소스검색방법으로 정말 최적인것 같다.
SSD가 아닌곳에서도 소스검색용으로는 최적인것 같다.


sed 및 xargs와 grep를 이용하여, 빌드만 된 소스에서 원하는 패턴을 검색

      1. find로  obejct 검색한다.
      2. sed 로 *.o 에서 *.c로 변경한다. (검색결과 파이프로 받는다)
      3. xargs를 이용하여 grep 명령을 실행한다. (-r 재귀명령어, -s  no-messages )


$ find . -name '*.o' | sed -e 's/o$/c/g' | xargs grep -rs 'stmmac'


3. Find 기타사용

  • 소스 파일 추출  (cscope 파일 사용)

Find 사용하여, 소스 File 추출

$ find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' -o -name '*.asm' \) -print > cscope.files 

ex) 특정 파일 추출

    하나 추가할때마다 -o -name 사용

$ find . -name '*.c' -o -name '*.h' 


ls 하여 파일을 다시 grep으로 avc포함된 파일만  ./avc 폴더로 이동

$ ls | grep avc | xargs -i mv {} ./avc  

  https://kldp.org/node/35902

U-boot MII 와 NAND 기본명령

1. Uboot의 기본정보

  • 메뉴얼 
http://www.denx.de/wiki/DULG/Manual
http://www.denx.de/wiki/U-Boot/Documentation

  • 소스확인 
http://git.denx.de/?p=u-boot.git;a=summary


  • Uboot Command 
  http://skywheel.tistory.com/entry/uboot-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%A0%95%EB%A6%AC


1.1 Uboot Config 확인 

  • Uboot 기본설정확인
include/config.h  
include/configs/xxxx   //board name 

#define CONFIG_CMD_xxx         // Command 지원확인
#define CONFIG_ENV_OFFSET      // ENV 저장부분  
#define CONFIG_ENV_ADDR


SoC에따른 Uboot
  http://www.denx.de/wiki/U-Boot/Custodians


1.2 Uboot Env NFS 설정 


  • TI-NFS SETTING EXAMPLE
setenv ethaddr 00:11:22:33:04:55
setenv ipaddr 192.168.1.4
setenv serverip 192.168.1.100
setenv netmask 255.255.255.0
setenv broadcast 192.168.1.255
setenv gateway 192.168.1.1 

setenv bootargs 'console=ttyS1,115200n8 rw mem=48M root=/dev/nfs nfsrootdebug rootdelay=4 nfsroot=192.168.1.100:/home/jhlee/dm368/mt5/Source/ipnc_rdk/target/filesys_dm368,nolock mem=48M cmemk.phys_start="0x83000000" cmemk.phys_end="0x88000000" cmemk.phys_start_1="0x00001000" cmemk.phys_end_1="0x00008000" cmemk.pools_1="1x28672" cmemk.allowOverlap=1 eth=00:0C:0C:A0:04:22 ip=192.168.1.168 nohz=off highres=off clocksource=acpi_pm lpj=1077248 earlyprintk'

안에들어가는 옵션은 Filesystem에 따라 다양하며, 위에서 보는거와 같이 디버깅을 위해서,
earlyprintk , nfsrootdebug 를 추가 가능하다.
또한, mount 시점을 delay를 주는 것도 가능하다.
quiet


2. Uboot의 MII 명령

MII는 Media indepenent interface로 LAN에서 사용하는 표준 Interface이며, 이를 이용하여 일반적으로 사용되어지는 Register 값들을 확인가능하다.

  • Uboot시 아래 mii phy 발견확인 
In:    serial
Out:   serial
Err:   serial
ARM Clock :- 432MHz
DDR Clock :- 340MHz
Ethernet PHY: GENERIC @ 0x01
Hit any key to stop autoboot:  0 

  • MII Device의 갯수 및 주소 파악 
현재 사용되어지는 MII Device 갯수와 주소를 파악가능 (현재 1개만사용)

DM368 IPNC :>mii device
MII devices: 'GENERIC @ 0x01' 
Current device: 'GENERIC @ 0x01'

2.1 Uboot MII 명령어

  • Uboot MII 명령어 
- mii device Lists available devices.  // 사용가능한 MII Device 보여줌
- mii device Set current device.      // MII Device 설정 
- mii read Reads register 'reg' from MII PHY 'addr'.  // MII Device의 Register Read
- mii write Writes 'data' to register 'reg' at MII PHY 'addr'.    // MII Device의 Register Write
- mii dump Displays data of register 'reg' from MII PHY 'addr'.   // MII Device Register Dump 


  • 관련소스
MII에서 MDIO설정하는 부분확인
drivers/net/stmmac/mdio.c

  • Offset Register Name
  1. 00 Basic Mode Configuration
  2. 01 Basic Mode Status
  3. 02 PHY ID #1
  4. 03 PHY ID #2
  5. 04 AutoNegotation Advertisement
  6. 05 Link Partner Ability
  7. 06 AutoNegotation Expansion

  • The bits of the MII status 
  1. 0x8000 Capable of 100baseT4.
  2. 0x7800 Capable of 10/100 HD/FD (most common).
  3. 0x0040 Preamble suppression permitted.
  4. 0x0020 Autonegotiation complete.
  5. 0x0010 Remote fault.
  6. 0x0008 Capable of Autonegotiation.
  7. 0x0004 Link established ("sticky"* on link failure)
  8. 0x0002 Jabber detected ("sticky"* on transmit jabber)
  9. 0x0001 Extended MII register exist.

  https://en.wikipedia.org/wiki/Media-independent_interface

2.2 Uboot MII 사용방법 및 확인


  • Basic Mode Configuration

DM368 IPNC# mii write 1 0 0  // addr reg data
DM368 IPNC# mii read 1 0   // addr reg data 
0000
DM368 IPNC# mii write 1 0 3100     // default setting (Basic Mode Configuration)
DM368 IPNC# mii read 1 0
3100
DM368 IPNC# mii write 1 0 B100    // + Reset 
DM368 IPNC# mii read 1 0
3100


  • 상위 Register 들 점검
DM368 IPNC :>mii read 1 0  // Basic Mode Configuration
3100
DM368 IPNC :>mii read 1 1  // Basic Mode Status 
7849
DM368 IPNC :>mii read 1 2  // PHY ID #1
0181
DM368 IPNC :>mii read 1 3  // PHY ID #2
B8B0
DM368 IPNC :>mii read 1 4  // AutoNegotation Advertisement
01E1
DM368 IPNC :>mii write 1 0 1000
DM368 IPNC :>mii read 1 0


  • MII Dump로 쉽게 분석

# mii dump 1 0  // Basic Mode Configuration
0.     (3100)                 -- PHY control register --
  (8000:0000) 0.15    =     0    reset
  (4000:0000) 0.14    =     0    loopback
  (2040:2000) 0. 6,13 =   b01    speed selection = 100 Mbps
  (1000:1000) 0.12    =     1    A/N enable   // Auto Nego
  (0800:0000) 0.11    =     0    power-down
  (0400:0000) 0.10    =     0    isolate
  (0200:0000) 0. 9    =     0    restart A/N
  (0100:0100) 0. 8    =     1    duplex = full
  (0080:0000) 0. 7    =     0    collision test enable
  (003f:0000) 0. 5- 0 =     0    (reserved)

# mii dump 1 1 // Basic Mode Status 
1.     (786d)                 -- PHY status register --
  (8000:0000) 1.15    =     0    100BASE-T4 able
  (4000:4000) 1.14    =     1    100BASE-X  full duplex able
  (2000:2000) 1.13    =     1    100BASE-X  half duplex able
  (1000:1000) 1.12    =     1    10 Mbps    full duplex able
  (0800:0800) 1.11    =     1    10 Mbps    half duplex able
  (0400:0000) 1.10    =     0    100BASE-T2 full duplex able
  (0200:0000) 1. 9    =     0    100BASE-T2 half duplex able
  (0100:0000) 1. 8    =     0    extended status
  (0080:0000) 1. 7    =     0    (reserved)
  (0040:0040) 1. 6    =     1    MF preamble suppression
  (0020:0020) 1. 5    =     1    A/N complete  //Auto Nego 
  (0010:0000) 1. 4    =     0    remote fault
  (0008:0008) 1. 3    =     1    A/N able
  (0004:0004) 1. 2    =     1    link status
  (0002:0000) 1. 1    =     0    jabber detect
  (0001:0001) 1. 0    =     1    extended capabilities


# mii dump 1 2 // PHY ID #1
2.     (0243)                 -- PHY ID 1 register --
  (ffff:0243) 2.15- 0 =   579    OUI portion


# mii dump 1 3 // PHY ID #2
3.     (0c54)                 -- PHY ID 2 register --
  (fc00:0c00) 3.15-10 =     3    OUI portion
  (03f0:0050) 3. 9- 4 =     5    manufacturer part number
  (000f:0004) 3. 3- 0 =     4    manufacturer rev. number


# mii dump 1 4 // AutoNegotation Advertisement
4.     (01e1)                 -- Autonegotiation advertisement register --
  (8000:0000) 4.15    =     0    next page able
  (4000:0000) 4.14    =     0    reserved
  (2000:0000) 4.13    =     0    remote fault
  (1000:0000) 4.12    =     0    reserved
  (0800:0000) 4.11    =     0    asymmetric pause
  (0400:0000) 4.10    =     0    pause enable
  (0200:0000) 4. 9    =     0    100BASE-T4 able
  (0100:0100) 4. 8    =     1    100BASE-TX full duplex able
  (0080:0080) 4. 7    =     1    100BASE-TX able
  (0040:0040) 4. 6    =     1    10BASE-T   full duplex able
  (0020:0020) 4. 5    =     1    10BASE-T   able
  (001f:0001) 4. 4- 0 =     1    selector = IEEE 802.3

# mii dump 1 5  //Link Partner Ability
5.     (45e1)                 -- Autonegotiation partner abilities register --
  (8000:0000) 5.15    =     0    next page able
  (4000:4000) 5.14    =     1    acknowledge
  (2000:0000) 5.13    =     0    remote fault
  (1000:0000) 5.12    =     0    (reserved)
  (0800:0000) 5.11    =     0    asymmetric pause able
  (0400:0400) 5.10    =     1    pause able
  (0200:0000) 5. 9    =     0    100BASE-T4 able
  (0100:0100) 5. 8    =     1    100BASE-X full duplex able
  (0080:0080) 5. 7    =     1    100BASE-TX able
  (0040:0040) 5. 6    =     1    10BASE-T full duplex able
  (0020:0020) 5. 5    =     1    10BASE-T able
  (001f:0001) 5. 4- 0 =     1    selector = IEEE 802.3

# mii info  // MII PHY 관련정보
PHY 0x01: OUI = 0x90C3, Model = 0x05, Rev = 0x04, 100baseT, FDX

  https://en.wikipedia.org/wiki/Management_Data_Input/Output
  https://en.wikipedia.org/wiki/Autonegotiation
  http://lostintransit.se/tag/autonegotiation/
  http://units.folder101.com/cisco/sem1/Notes/ch6-ethernet/autonegotiation.htm


3. Uboot I2C 와 USB 명령어 

  • Uboot에서 USB 명령어

# usb dev 0
USB device 0:
    Device 0: Vendor: General  Rev: 5.00 Prod:              
            Type: Removable Hard Disk
            Capacity: 3950.0 MB = 3.8 GB (8089600 x 512)
... is now current device

# usb part 0
Partition Map for USB device 0  --   Partition Type: DOS
Partition     Start Sector     Num Sectors     Type
    1            778135908      1141509631      72
    2            168689522      1936028240      65
    3           1869881465      1936028192      79
    4           -1409286144          55499       d

  • Uboot에서 I2C명령어

imd {i2c_chip} {addr}{.0, .1, .2} {len}
imm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
imw {i2c_chip} {addr}{.0, .1, .2} {data} [{count}]


4. Uboot NAND 명령어

CPU마다 기본적으로 지원되는 Command는 많이 다르며, 특정 CPU에서만 지원되는 CMD도 있다.
본인이 원하면 CMD를 추가하여 설정을 하고 포팅을 해서 사용을 해야 하며 관련내용은 Command Config에서 확인하자.

nand write 관련 command

nand write       : 일반적인 raw data를 기록한다.
nand write.e     : NAND의 ecc block을 사용하여 기록을 한다.
nand write.jffs2 : jffs2 filesystem을 기록한다.


nandecc hw 2
nandecc hw 0   : ecc 변경

  https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/100/t/210595


nand scrub : bbt까지 다 없애고 초기화
nand erase : nand erase 진행

세부설명은 이곳을 봐도 될 것 같음
  http://wiki.openmoko.org/wiki/U-Boot_commands#Loading_Kernel_from_NAND
  http://wiki.openmoko.org/wiki/NAND_bad_blocks


  http://www.aesop.or.kr/index.php?mid=Board_Community_QandA&page=41&listStyle=webzine&document_srl=77412

2/08/2015

Srew rate

OPAMP에서 사용되는 용어로 아래의 사이트에 잘 설명이 되어 있다.


      Op amp slew rate illustration

Srew rate는 the maximum rate of change of output voltage per unit of time

즉 amp에 생산된 voltage의 순간 기울기 값이다. 위 그림에서 voltage의


\mathrm{SR} = \max\left(\left|\frac{dv_\mathrm{out}(t)}{dt}\right|\right)


Vout은 amp에 의해 만들어지며, 시간으로 미분을 한다.

아래의 예는 시간을 으로 srew rate를 했을 경우, 삼각파가 발생.
이유는 정현파 0 ,접선기울기로 시작해서 시간이 지난 후 다시 접선기울기로 다시 진행



Op amp slewing distortion


Ref.
http://en.wikipedia.org/wiki/Slew_rate


http://www.radio-electronics.com/info/circuits/opamp_basics/operational-amplifier-slew-rate.php



http://kin.naver.com/qna/detail.nhn?d1id=11&dirId=1118&docId=182800414&qb=c2xldyByYXRl&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=SLrWasoRR1dsssQ%2BuO4ssssssts-138873&sid=VNrtDwoUU0sAAFNX39s

2/04/2015

Media Independent Interface (L2 와 L1 Interface)

1. MII Interface

일반적으로 SoC를 보면 EMAC/MAC 과 PHY Chip 분리되어 동작이 되는 것을 알 수가 있으며, 그 구조를 보면, Ethernet 의 L2와 L1의 구성이라고 생각하면 되겠다. 

처음 MII (Media Independent Interface)를 접한 것은 MPC850T을 사용할 때 FAST Ethernet을 사용하면서 이것을 처음 접했는데, 그 때는 왜 사용하는 지 궁금했다.
하지만, 매번 SoC를 접하면서 각 종류별로 매번 MII를 접하다보니, 이것에 대해 정리를 하고자 아래와 같이 간단히 서술만 하기로 한다. 
사실 MII 개념은 어렵지 않기 때문에, 한번 이해하면 다음에도 다른 MII 도 쉽게 이해한다. 
그리고, Linux에서도 설정도 쉽게 하므로 자세한 설명은 모두 생략한다. 

MII를 사용하는 이유는 뻔하다 SoC와 Phy Chip간의 중간 Interface로 사용하는 것으로 USB를 비롯하여 각 다른 고속 Serial Interface에서도 많이 볼 수있는 현상이다.
즉, Phy 칩의 표준 Interface라고 생각하면 될 꺼 같다. 


1.1 MII(Media Independent Interface)의 종류들 

MII(Media Independent Interface)만 알면 나머지도 쉽게 이해가 가면 어렵지가 않지만, 요즘은 거의 GMII기반으로 사용하기에 간단히 설명 
위키에 설명이 너무 잘되어 있어 관련 세부설명은 생략한다.
  1. EMAC: 실제 MAC Data 전송  
    1. MAT To PHY  (일반적인 구성이며, 아래 그림과 동일)
    2. MAC To MAC (TX, RX를 Cross로 연결 구성)
  2. MDIO: Phy 칩 Control  
    1. Master/Slave 개념으로 동작  
    2. AP의 MDIO가 Master가 되어 , PHY의 제어와 기능확인 

https://www.ti.com/lit/ug/sprugx8b/sprugx8b.pdf (6.2.3)


TI의 EMAC 과 일반 PHY가 아닌 Switch (RTL8370M) 외부와 연결시,아래의 그림 MAC To MAC으로 연결한다.
처음 이부분 때문에 조금 혼동이 되었으며, 아래와 같은 구성으로 연결이 된다.


1.3 MII와 GMII 다른점 

MII : 2.5 MHz or 25 MHz
GMII : 2.5 MHz or 25MHz or 125MHz

MII 일 경우, TX, RX Clock을 모두 PHY에서 제공하는 Sync 방식
GMII 일 경우,  TX Clock Host가, RX은 PHY가 제공한다. Async 방식 (Giga bit 일 경우)


Ref.
  http://www.ti.com/lit/ug/sprugx8b/sprugx8b.pdf  (EMAC)


1.4  ERROR Report 

MII 이든, GMII 이든, 에러가 발생을 하며 이를 보고를 한다. 보통이를 EMAC Driver에서 제공하며,
Linux Device Driver에서는 이를 다시 /proc/net/dev로 연결을 해놓는다.


RX_ER, CRS, COL

관련 정보

# cat  /proc/net/dev



2 How To Connect it with Host 

각 Host 의 MAC->  MAC or PHY 연결하는 방법으로 간단하게 그림으로 설명 


2.1 MAC to PHY(GMII/MII)

가장 일반적인 구성으로 MAC 과 PHY 칩을 직접 연결하여, RJ45 나가는 구성  
다만 각 GMII/MII/RGMII/SGMII/XGMII 조금 씩 차이는 있지만, 그 구성은 거의 다 비슷하다. 

Host에서 PHY로 연결을 했기때문에, PHY의 정보를 읽어 올 수 있다. 그리고, PHY에서
발생하는 ERR 및 및 CRS, COL을 연결한다.


  • 상위 EMAC은 연결 구성도 (MDIO는 생략)


Host에서 MDIO Interface를 사용하여 PHY를 제어를 하며, CLK을 모두, PHY에서 얻어오는
Sync 방식이다.

  • 상위 EMAC은 연결 구성도 (MDIO는 생략)



2.2 MAC to MAC  (GMII)

일반적인 구성은 아니며, Host의 MAC to MAC 직접 연결(1:1 Mapping) 했기 때문에, 
정확히 PHY가 없기 때문에, PHY 정보를 얻어 올수 없으며, 아래와 같이 HW 구성도 달라진다.
즉, TX, RX를 Cross 로 연결해주는 것이다. 

가장 쉬운 예로 
  1. AP의 MAC 과 SWITCH 의 MAC 연결 
  2. AP의 MAC 과 AP 의 MAC 연결 

정확히 말해, PHY 정보를 얻어오는 MDIO Interface를 사용할 수가 없다.
그래서, SWITCH 인 RTL8370M은 SMI Interface를 별도로 제공한다.

RX_ER, CRS, COL은  GR로 연결을 된다.

  • 상위 EMAC은 연결 구성도 (MDIO는 생략)




3. Timing 

GMII Interface Timing 도를 구하지 못해, 아래와 같이, RGMII Timing도를 구함.


http://www.cnblogs.com/shengansong/archive/2012/01/04/2311894.html



GTX_CLK의 Rising Edge에 가 Setup Time이며, 뒤는 Hold Time이다.
그래서, Data는 Setup Time 약간 뒤에 있는 것이 좋다.

http://www.cnblogs.com/shengansong/archive/2012/01/04/2311894.html


GMII Interface 관련자료
  http://hearlink.tripod.com/CandCDB/GMII_REPORT.pdf