2011년 11월 21일 월요일

USB 사용하여 시스템 개발하기

USB I/F를 사용할 경우 자신이 개발하려는 디바이스가 USB host 로 동작해야 하는지 USB device로 동작해야 하는지를 결정해야 하고 각각에 맞는 USB controller를 사용하면 된다. 하지만 USB controller가 MPU에 내장된 임베디드 시스템에서는 사용하고자 하는 MPU에 내장된 USB controller가 자신이 원하는 모드(host/device)를 지원하는지 확인하여야 한다. MPU에 USB controller가 없거나 원하는 모드를 지원하지 않을 경우 외부 controller가 필요하다.  보통 임비디드 디바이스용 MPUs는 device용 USB controller를 내장하고 있지만, 최근에는 OTG(On The Go)를 지원하는 장치가 많이 있고, OTG를 지원하는 장치는 host/device 모두 사용이 가능하다.

*Host controller는 OHCI, UHCI, EHCI and xHCI controller가 있고, 이중 EHCI가 USB2.0 high speed까지 지원하는 것으로 가장 널리 사용된다.

*보통 통신 디바이스는 Master/Slave로 표현을 많이 하는데, USB는 Host/Device로 구분한다. Host가 Master,  Device가 Slave라고 생각하면 된다.


간혹 동일기기(동일 보드)안에서 USB를 사용하여 두개의 MPU를 연결해야 할 경우에는 굳이 일반적인 USB 대신 HSIC를 고려해볼 필요가 있다. HSIC는 USB2.0 high speed만 지원 하고, 회로 길이등의 제약(10cm)사항이 있으므로 설계시 주의가 필요하다. SW적으로는 USB용 드라이버를 거의 수정없이 사용할 수 있다.(진짜?)  HSIC는 전송을 위해서 장치 밖 원거리로 데이터를 전송할 필요가 없으므로, 이에 알맞게 Front End HW가 USB와 다르게 설계되어 있다.

USB는 여러가지 종류의 장치를 지원하는데, 이 장치를 기능별로 분류하여 class라고 부르고 class별로 표준 protocol을 정의하여 놓았다. 따라서 각 장치는 이 protocol을 준수하여 동작하여야 한다.

가장 대표적인 class가 CDC(Communication Device Class)이다. 대표적으로 USB2Serial, USB2ethernet등 USB포트에 연결하여 다른 통신 방법을 제공하는 디바이스들이 여기에 속한다.  CDC는 통신 방법에 따라 ECM,EEM, NCM, ACM, OBEX 등등 다양한 SubClass들이 있다.

USB-ACM: USB2Serial장치를 위한 SubClass
USB-EEM(ethernet emulation model): USB2ethernet 장치를 위한 SubClass

ECM(Ethernet networking Control Model), EEM(Ethernet Emulation Model),  NCM(Network Control Model ), MBIM(Mobile Broadband Interface Model)등은 모두 ethenet packet을 전송하기 위한 class들이며 점차 성능이 개선되고 기능이 추가 되면서 ECM->EEM->NCM->MBIM(Mobile Broandband Interface Model) 순서로 표준이 발표되어 왔다. 이중 MBIM은 NCM v2.0이 이름만 바뀐 것으로 단순 ethernet 통신 뿐만 아니라 무선 전화망을 사용한 인터넷 access관련 기능 지원등이 추가된 것으로 보인다. (잘 모르겠음 ㅠㅠ)
EEM은 ECM이 발표된 이후에 ECM의 비 효율적인 부분을 개선하여 발표되었는데, 추후 ECM도 버전업되면서 이러한 부분이 개선되었다고 한다.
(이들 sub-class간에 차이점 및 use-case는 좀더 study가 필요)

USB host쪽을 개발할 경우에는 우선 USB host controller driver가 필요하다. 그 다음으로 host장치에 연결할 device의 class driver가 필요하다(class driver는 host에서 실행된다!!!).  예를들어 USB2Ethernet 장치의 경우, USB CDC 에 속하고 그중에서도 CDC-EEM 을 사용하여 class driver를 구현할 수 있다.

반대로 USB device쪽에서는 device controller driver가 있어야 하고,  host에서의 class driver에 대응하는 USB function 드라이버의 개발이 필요하다.

참조 사이트:
http://www.jungo.com/st/embedded_usb_cdc.html

2011년 5월 21일 토요일

NOR Flash Memory 토막 지식

Flash 메모리의 경우 sector 단위로 erase가 가능하며 Erase 된 섹터는 모든 bit가 1이라는 값을 가지게 된다. Flash 메모리에 write 하는 작업은 각 bit별 값을 1 to 0으로 바꾸는 작업으로 반대로 0 to1로 바꾸는 write는 불가능하다. 즉 한번 0이된 bit를 1로 바꾸기 위한 유일한 방법은 해당 bit가 포함된 sector 전체를 erase하는 방법밖에 없다.

flash 메모리에서 각각의 bit는 (일반적으로)한개의 cell에 저장이 되는데 이 cell에 전하를 모두 잃으면 1(charge loss), 전하가 쌓이면(charge gain) 0으로 해석된다. 즉 flash erase는 해당 sector에 전하를 모두 비우는 과정이 된다.

때때로 flash에 저장된 값이 0 to 1 혹은  1 to 0으로 값이 변하는 오류가 발생하기도 하는데 이와 같은 bit flipping이 발생하는 이유가 flash memory 자체의 문제인지 SW의 오류로 발생하는 문제인지를 판단하기 어려운 경우가 많다.

먼저, 특정 bit의 값이  0 to1로 값이 변경되었다면 이는  아래와 같은 이유로 flash device의 문제일 가능성이 매우 높은다.   
  1. SW적으로 특정 bit만 0 to1로 변경할 수 없다. 앞서 설명한데로 이를 위해서는 해당 sector를 모두 지운 후 해당 bit만 1이되도록 다시 해당 sector 전체를 다시 write를 해야 하는데, 일부러 이렇게 SW를 작성할 이유가 없고, 이러한 버그가 생기기도 거의 불가능하기 때문이다.
  2. 해당 bit 정보를 저장하는 flash cell에 전류 leakage가 발생하여 전하가 방전(charge loss)되면, 값이 0 to1로 바뀔 수 있다. 먼저 flash에 0을 write할 때(Charge Gain) 전하가 충분히 주입되지 못하여 전하량이 0과 1의 경계부분에 있다가 시간이 지나면서 발생하는 미세한 방전으로 0 to 1로 값이 바뀔 수 있으며, 이와 같은 방전은 일반적으로 시간이 지남에 따라 자연스레 발생하며 cell 특성에 따라 특정 cell이 다른 cell보다 더 빠르게 방전 되기도 한다. 또한 X-ray등으로 냉납등을 조사하는 공정이 있다면, X-ray조사로 인하여 방전이 더 빠르게 발생하기도 한다.

만일 bit값이 1 --> 0 (charge gain)으로 변경되었다면 이 경우는 좀 더 골치 아픈 경우다. SW적으로 erase없이 1 --> 0으로 해당 bit값 만 바꿀 수 있으므로  0 --> 1로 바뀌는 경우보다는 SW 버그일 가능성이 조금 더 크다고 할 수 있겠다. HW적으로도 전하 loss가 아닌 전하 충전이 발생하여야 가능한 현상인데, 전하는 자연적으로는 방전되지 충전되지는 않는다. (물론 손상된 장치에서 특정 cell이 충전되지 않는다고 보증할 수는 없겠지만 )

참고 사이트
http://j102.net/lecture/3595


앞서서 한 cell에 한 bit가 저장된다고 했는데, 데이터 용량을 늘리기 위해 한 cell에 여러 bit를 저장하는 MirrorBit기술이나 MBC(Multi-Bit Cell) 기술등이 적용되고 있다. 이는 NAND flash에서의 MLC 기술과 유사한 것으로 이해된다.

NAND flash에서는 device특성상 불가피하게 발생하는  bit값 변경을 막기 위해서 ECC를 사용한 값 보정 기능이 오래전부터 사용되고 있으나 NOR에서는 최근에서야 ECC기능이 포함되고 있다. 특히 MLC 기술을 사용하는 NOR에 ECC 적용이 활발하게 이루어지고 있다