2013년 7월 15일 월요일

[번역] Micro USB otg 포트 하나로 충전과 기기연결을 동시에

많은 안드로이드 기기들이 하나의 micro USB 포트 만을 가지고 있다.

물리적으로 포트가 하나이기 때문에 한번에 하나의 기기 연결만 가능하다.

하지만, 많은 경우 안드로이드 기기는 불시에 충전해야 만 하는 경우들이 다반사이다.

그래서 USB 표준 스펙에 충전과 기기연결을 동시에 제공해 주는

 Accessory Charger Adapter에 대한 정의를 내리고 있다.

이전에 두 기능을 동시에 제공하는 것은 불가능 하다는 결론으로 글을 쓴 적이 있는데

어느 분이 삼성 기기에 이와 같은 기능을 제공하고 있다는 댓글을 올려 주셔서 조금 찾아 보았다.

현재 안드로이드 기기가 없기 때문에 직접 알아 보는 것은 불가능하여

누군가가 올려 놓은 안드로이드 기기에 USB DAC를 연결하고 충전하는 방법을

안내해 주는 글을 소개하기로 한다.

http://www.head-fi.org/t/595071/android-phones-and-usb-dacs/975

위의 링크를 살펴 보시면

The other points I don't understand and that concern me are, most posts indicate that if I tried to make something I need to use a resistor Short between pins 4 & 5, so the fact that your 'Y' adapter works allowing the audio data to go to the DAC(host mode), and charging voltage/current to run back seems to suggest there's more to your'Y'adapter, is it possible that this resistor is built into the adapter? or that actually no resistance is necessary and that it's incorrect information with regards to Galaxy S3's or Note 2's? again nothings clear or definite.

...(중략) micro USB의 4번핀과 5번핀사이를 쇼트 시키는 저항을 사용할 필요가 있어서 어떤 것을 만들고자 한다면, 사실 Y 자 케이블은 DAC로 전송되는 오디오 데이터를 허용하고 전압/전류를 충전하며 동작한다. 이 저항을 아답터에 장착한는 것은 가능합니까? 혹은 어떤 저항도 필요하지는 않는 것입니까?, Galaxy S3와 Note 2에 관한한 정확한 정보가 없습니다.....

"The ID pin on a Micro-B plug is not connected or is connected to ground by a resistance of greater than Rb_PLUG_ID (100kΩ MIN)."
Other put, if the resistance is lesser than 100 kΩ, it’s a Micro-A plug and the S3 / Note2 acts as a USB host able to interwork with a standard USB DAC.

"Micro USB의 B타입 플러그의 ID 핀(4번핀)을

 Rb_PLUG_ID(최소 100K옴) 이상의 저항을 가지고 그라운드와 연결되거나 연결되지 않는다"

달리 말하며, 저항이 100K옴 보다 작다면

(ID 핀(4번핀)과 Gound핀(5번핀)사이의 저항 값이 100K 옴보다 작다면)

 Micro USB의 A 타입 플러그와 S3/Note2플러그는

표준 USB DAC와 상호 동작하는 것이 가능한 USB 호스트로써 동작한다.


1000


"To inform the PD [Portable Device] that it should act as host and draw current,

the ACA [Accessory Charger Adapter] is required

 to pull the ID pin to ground through a resistance of RID_A (124k)."

http://kinetis.pl/sites/default/files/BC1.2_FINAL.pdf


휴대용 기기에게 호스트로 동작하면서 전류를 공급하도록 알리기 위해선

ID 핀과 Ground 사이에 RID_A(124K옴)의 저항이 연결되는

ACA[Accessory Charger Adapter]가 필요하다.


1000


요약하자면 ID 핀과 Ground 사이에 100k옴 이하의 저항을 연결하면

일반적인 주변 기기를 연결하는 안드로이드 기기로써 동작하고

124K옴을 위의 그림과 같이 연결하는 Y자 케이블을 만들면

Male USB Connector에서는 충전기를 연결하고

Female USB Connector에는 USB DAC와 같은 주변기기 연결 할 수 있도록 해준다.

보수적으로 해석해 보자면 아직 Galaxy S3와 Note 2에서만 확인된 사항인 것 같다.

좀 더 자세한 내용은 아래의 링크를 살펴 보시기 바랍니다.

https://sites.google.com/site/sonicboomworld/my-projects/otg-diagrams


그리고 USB 표준 문서의

Battery Charging Specification
Revision 1.2
December 7, 2010

를 훌터본 결과 다음과 같은 테이블이 포함된 페이지를 볼 수 있다.



보시다 시피 ACA의 연결을 ID 핀에 달린 Pull-down 저항값으로 설정하는 것 같다.

RID_A에 해당하는 값은 122K옴에서 126K옴 사이값이면 되고

이때 OTG 디바이스는 A-Device로써 동작한다고 되어 있다.

그래서 좀더 공격적으로 생각해 보자면 USB otg 타입의 기기이면 위와 같이 시도해

보아도 잘 동작할 것으로 사료된다. 저항값은 122K와 126K옴 사이로 하고 말이다.






2013년 7월 6일 토요일

[작업중] 리눅스 시스템에서 Netduino plus 2의 STM32f4xx를 위한 개발 환경 만들기

1. 서론


리눅스 시스템, 좀 더 구체적으로 데비안 시스템에서

각종 CPU  코어를 위한 toolchain을 이미 제공한다.

http://www.emdebian.org/crosstools.html

위의 링크를 살펴 보면 /etc/apt/source.list에 해당 repository를 추가하면

apt-get 툴을 이용하여 arm-linux-gnueabi-gcc의 설치가 가능하다.

하지만, 해당 패키지와의 의존성이 있는 몇몇 패키지에 문제가 생겨 정상적인 사용이 불가능하다.

그리고 예전에 cortex-m3의 stm32 코어를 사용하였을 때 사용하였던 codesourcery lite 툴은

mentor graphic사에 넘어가서 컴파일러를 사용하려면 내 정보를 제공해야하는 것 같다.

그래서 비슷한 cpu를 사용하는 stm32f4-discovery의 환경 설정을 참고해 보았다.

http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419

참고한 사이트는 다음과 같다.

https://forum.sparkfun.com/viewtopic.php?f11&t=31083

위에서 두, 세 번째 내용을 살펴보면,

https://github.com/texane/stlink/blob/master/doc/tutorial/tutorial.pdf?raw=true

다음의 링크에서 환경설정에 관한 내용을 살펴 볼 수 있다.

하지만, 이것도 오래된 버전이라. 다음 링크로 가보라고 안내해 주고 있다.

https://launchpad.net/gcc-arm-embedded

2. 사전 지식

자, 그럼 진짜로 stm32f4xx를 위한 toolchain을 설치해 보자.

안내서는 우분투 시스템을 상정하고 설명하였다.

나는 데비안 시스템이기 때문에 이건 넘어가고 직접 다운로드해서 사용하는 방법을 취해야 겠다.

https://launchpad.net/gcc-arm-embedded/+download

위의 사이트에서 버전 별로 직접 다운로드 할 수 있게 제공하고 있다.

3. 설치 하기

링크에 가보면 여러 가지의 파일이 존재한다.

현재의 최신 버전은 4.7-2013-q2이다. 계속적으로 업데이트가 진행 되기 때문에

apt-get을 통합 자동 업데이트가 불가능하다면 주기적으로 위의 홈페이지를 방문해야한다.

그럼 그 중에서 Linux installation tarball에 해당하는 파일을 다운로드하자.

참 고맙게도 윈도우, 리눅스, 맥 시스템에서 모두 사용할 수 있도록 제공한다.

우선은 임시적인 작업이기 때문에 작업 디렉토리에 압축을 해제하자.

> cp gcc-arm-none-eabi-4_7-2013q2-20130614-linux-tar.bz2 $(HOME)/workspace/arm_projects
> cd $(HOME)/workspace/arm_projects
> tar jxvf gcc-arm-none-eabi-4_7-2013q2-20130614-linux-tar.bz2

그리고 toolchain의 경로를 전역 변수에 등록하는 작업이 필요하다.

앞서서도 이야기 했지만 emdebian의 toolchain이 완성 되기 까지 임시적인 작업이기 때문에

전역 변수에 등록하는 작업을 $(HOME)/.bashrc에 등록하지는 않을 것이다.

그래서 다음과 같은 내용을 갖는 파일을 생성하자.


======================= toolchain.env ==============================
export PATH=$PATH:$(pwd)/gcc-arm-none-eabi-4_7-2013q2/bin
--------------------------------------------------------------------

그리고 위의 파일은 다음과 같이 실행하여 전역 변수에 toolchain의 경로를 등록한다.


> cd $(HOME)/workspace/arm_projects
> source toolchain.env

3. 개발 환경 갖추기

이제는 Makefile, Startup 파일, Linker script 파일을 만드는 작업이 필요하다.

이 작업을 처음부터 다 이해하고 작성한다는 것은 어려운 일이다.

참고가 될만한 것들을 가져다가 작업을 하도록 하였다.

참고문서는 위에서 언급한 stm32f4 discovery 의 펌웨어 소스코드에서 얻어다 쓰도록 하였다.

3.1. Makefile 설정


Makefile은 각종 소스파일의 컴파일 방법에 대해서 정의하고

오브젝트 파일을 어떻게 합성할 것인지에 대해서 정의한다.

일반적인 Makefile의 간단한 시나리오를 이야기 하자면 다음과 같다.

1. 컴파일러, 링커,  등등의 경로와 실행파일의 지정.

2. 컴파일 할때에 컴파일러에 넘겨주어야할 매개변수 CFLAGS의 정의

3. 소스파일을 컴파일한 오브젝트 파일의 합성 매개변수 LDFLAGS의 정의

4. 이미지 파일이 실제 메모리에 적재될때 각 센션별 특정 위치를 지정하는 링커 스크립트 지정

우선, Makefile의 내용을 일일이 살펴보기에는 너무 버겁다.

앞으로 더 살펴보아야 할 것들이 산적해 있기 때문에 심정적으로 더 힘들다.

그래서 필요한 부분만 살펴 보도록 하자.

앞에서 언급했지만 지금 부터 이야기할 Makefile의 내용은 거의 다 stm32f4 discovery 의 펌웨어

소스코드를 가져다 섰다.

그럼 stm32f4 discovery의 펌웨어 소스코드의 Makefile의 흐름을 먼저 파악해 보자.

3.1.1. 컴파일러와 각종 유틸리의 설정


컴파일러와 각종 유틸리티의 파일명과 첨두어에 대한 설정이 이루어 진다.

그 중에서도 다음사항은 가장 중요하다.

TCHAIN_PREFIX = arm-none-eabi

위의 사항은 컴파일러 달리 이야기 하면  arm을 위한 gcc 의 첨두어를 설정하는 부분이다.

이 사항은 설치된 컴파일러의 상황에 따라 바꾸어 주어야 한다.

그리고

CHIP = STM32F40x_1024k 와

BOARD = STM32F4DISCOVERY

에 해당하는 부분이다.

CHIP은 가지고 있는 보드에 달려 있는 cpu와 BOARD는 개발 보드의 모델명으로

상황에 따라 바꾸어 주어야 한다.

하지만, 아직은 소스코드에서 위의 두 가지 정의를 참조하진 않는다.

그냥 앞으로 생길 수 있는 펌웨어의 갈래를 나뉠 수 있는 가지를 제공하고자 하는 것 같다.

3.1.2. 실행 방식과 인터럽트 백터의 위치 지정


다음은 컴파일된 이미지가 램에 적재되어 실행될 것인지

플래시 메모리에 적재되어 실행 될 것인지를 지정한다.

그리고 인터럽트 벡터 모음집이 플래시 메모리에 있는 것을 사용할 것인지

램에 있는 것을 사용할 것인지 지정한다.

이와 같은 설정은 각각 다음 두 가지 정의문으로 지정한다.

RUN_MODE = FLASH_RUN
#RUN_MODE = RAM_RUN

그리고

VECTOR_TABLE_LOCATION = VECT_TAB_FLASH
#VECTOR_TABLE_LOCATION = VECT_TAB_RAM

이 설정들은 나중에 오브젝트 파일들을 적재할 때 참조가 되는 링커스크립트를

이미지가 적재되는 메모리의 형태에 맞게 선택한다.

여기서는 FLASH 메모리에 이미지가 적재되고 있는 인터럽트 벡터 모음집을 사용하기 때문에

나중에 링커 스크립터로 STM32F40x_1024k_flash.ld 를 사용하게 된다.

또한, RUN_MODE에 따라 오브젝트 파일들이 저장되는 위치가 바뀌게 된다.

그레서 컴파일을 수행하기 이전에 RUN_MODE에 따른 디렉토리를 수동으로 만들던지

> make createdirs

을 실행하여 RUN_MODE에 따른 디렉토리를 자동으로 생성해 주어야 한다.

마지막으로, 최종 결과물의 이름은 다음을 통하여 지정하다.

TARGET = project

위와 같이 지정하면 project.bin, project.elf, project.hex 와 같은 결과물이 생성된다.

3.1.3. 소스 코드의 지정




어쩔 수 없이 쓰게 되는 GIT를 이해하는데 헤깔리는 용어들


스냅샷(snapshot) : 모니터 화면을 순간적으로 카메라로 찍는 다는 개념이 원래의 의미이지만, 여기서는 순간적으로 저장된 모든 내용의 상태를 이야기 한다.

커밋(commit): 사전적인 의미는 "저지르다"라는 뜻이지만, 여기서는 저장소에 변경사항을 전송하기 위한 모든 작업을 실행한다는 의미가 되겠다.

체크아웃(checkout): 저장소의 변경된 사항들을 원격의 서버의 저장소에 전송한다는 의미 인것 같다.

워킹디렉토리: 원격 서버에 있는 저장소를 복사한 로컬 디스크의 저장소.