USB를 이용한 전원 공급 (1) - USB BC

이미지
USB는 데이터 전송을 목적으로 설계되었지만, 전원 공급 기능도 포함하고 있다. 이는 USB로 연결된 간단한 저전력 기기를 동작시키기 위한 것이다. 그래서 USB 2.0에서는 5V 전압과 0.5A의 전류를, USB 3.2에서는 5V 전압과 0.9A의 전류 공급이 가능하다. 하지만 이 스펙은 어디까지나 USB를 통한 데이터 통신을 하는 데 필요한 디바이스를 동작시키기 위함이지, USB를 전원 공급을 위해 이용하려는 목적은 아니었다. 따라서 저전력 기기가 아닌 외장 하드 같은 디바이스는 별도의 전원 공급을 필요로 했고, USB를 통한 전원 충전은 USB가 본래 의도했던 기능이 아닌 일종의 부작용에 가까운 일이었다. 하지만 iPod을 비롯한 많은 MP3 플레이어나 PMP 플레이어들이 이를 이용한 충전 기능을 가지고 나왔다. 어차피 데이터 통신을 위해 USB 포트가 필요하니 별도의 충전 포트를 만드는 것보다 USB 포트를 재사용하는 것이 기기를 싸고 가볍고 작게 만들 수 있었기 때문이다. 결국 브랜드마다 독자적인 USB를 통한 전원 충전 규격들이 만들어졌. 사람들은 이런 혼란스러운 상황이 해결되기를 원했고, 결국 2007년 USB-IF는 USB Battery Charging(a.k.a. BC)라는 표준을 만들어 USB 충전기를 표준의 영역으로 가지고 왔다. SDP DCP CDP 데이터 전송 가능 데이터 전송 불가 데이터 전송 가능 최대 0.5A(USB 2.0) 최대 0.9A(USB3.x) 최대 1.5A 최대 1.5A 별도 핸드셰이크 없음 D+/D- 쇼트 D+/D- 라인에 독립적으로 전압을 가해 핸드셰이크 데스크톱, 노트북 등에서 사용 USB 충전기에서 주로 사용 데스크톱, 노트북...

USB 3.x 케이블 무엇을 골라야 하나

3.1? 3.2? 이건 뭐지? Gen 1? Gen 2? 이건 뭐지? USB 케이블이 필요해 인터넷에 검색하면 다양한 케이블이 나온다. 여기서 적당한 케이블을 골라야 하는데 보통은 여기서부터 막막해진다. 3.1과 3.2의 차이는 무엇이고 3.1 Gen 2와 3.2 Gen 2는 무슨 차이가 있을까? 3.2 Gen 1은 3.1 Gen 2보다 좋은 것일까? 사람들에게 혼란을 주는 가장 큰 요인은 USB 3.x의 복잡한 명명 방식이라고 생각한다. USB 3.0, USB 3.1, USB 3.2. 이름만 보면 USB 3.1은 USB 3.0보다 발전됐고, USB 3.2는 USB 3.1보다 발전된 것으로 보인다. 하지만 USB 3.2에서 규정하는 모든 기술이 USB 3.1에서 규정하는 모든 기술보다 발전한 기술은 아니다. 그 이유는 이들 표준이 이전 버전을 포함하는 방식으로 설계됐기 때문이다. 예를 들어, USB 3.1 표준은 USB 3.0 표준 문서에서 정의된 기능과 추가된 기능을 포함하며, USB 3.2 표준은 USB 3.1 표준 문서에서 정의하는 기능과 새로운 기능을 포함하고 있다. 이렇게 포함 구조로 설계된 표준은 표준 문서라는 기술적 측면에서는 합리적인 선택이다. 하지만 이런 이름이 좋은 브랜딩 방식이라고 생각하지 않는다. 예를 들어 이 글에서도 USB 3.x 표준에 기반한 케이블은 정확히 부를 이름이 없어 그냥 USB 3.x라는 이름으로 뭉뜽그려 부르고 있다. 이와 같은 혼란을 해소하기 위해 USB4에서는 모든 표준을 USB4라는 하나의 브랜드로 묶고, 표준 문서에 Version 1과 Version 2라고 버전을 붙이는 방식을 택했다. 이는 소비자들이 버전 간 차이를 명확히 이해할 수 있도록 노력한 것으로 보인다. USB 3.0 우선 USB 3.0이 USB 2.0과 비교해 가지는 가장 큰 장점은 전송속도다. 기존에 사용하던 USB 2.0 케이블은 최대 480 Mbps. 즉, 60 MB/s의 전송 속도를 가졌다. USB 2.0이 도입되던 ...

USB 2.0 과 3.x의 컨넥터 호환성

이미지
지난 글 에서 설명했듯이 USB 2.0에서는 VCC / GND / D+ / D- 4개의 케이블이 있기 때문에 4개의 핀만 필요하다. USB 3.x 케이블을 위해 필요한 케이블은 VCC / GND 와 고속 전송을 위한 두 쌍의 레인( SSRx+ , SSRx- , SSTx+ , SSTx- 라고 한다. 이에 대한 자세한 설명은 다음 기회에 하도록 하겠다.) 그리고 혹시 차폐에 쌓여있을 수 있는 노이즈를 접지로 보내 안전하게 제거하기 위한 GND_DRAIN 케이블까지 총 7개의 케이블이 사용된다. 이 중 VCC 와 GND 는 USB 2.0에서 사용하는 선과 공유하기 때문에 새로운 5개의 선이 더 필요하다. 이미지 출처: Wikipedia 이미지 출처: Wikipedia 이 5개의 선을 핀에 연결하기 위해 USB 3.0 표준은 새로운 모양의 Type B 컨넥터를 도입했다. 기존 Type B 컨넥터는 4개의 핀만을 가지고 있고 확장할 수 없는 구조로 돼있기 때문이다. 따라서 Type B 컨넥터의 경우에는 컨넥터 모양만으로도 USB 2.0 케이블인지 USB 3.0 케이블인지 쉽게 구분할 수 있다. 하지만 Type A 컨넥터나 Type C 컨넥터는 상황이 다르다. 상하 대칭으로 24개의 핀을 가져 최대 12개의 선을 연결할 수 있는 Type C 컨넥터는 컨넥터 모양 만으로 USB 2.0 케이블인지 USB 3.x 케이블인지 구분할 수 없고, 케이블에 SuperSpeed 로고가 있는지 확인해야 한다. 그렇지 않으면 다음과 같이 Type C - Type C 케이블이지만 최대 전송 속도가 480 Mbps인 케이블을 만나게 된다. USB 2.0 Type C 케이블도 존재한다. Type A 컨넥터는 상황이 좀 재밌다. Type A 컨넥터도 원래는 4개의 핀만을 지원하도록 설계됐다. 하지만 Type B와는 다르게 Type A 컨넥터는 너무 많이 사용됐다. 따라서 USB 3.x를 위해 새로운 모양의 컨넥터를...

USB 2.0 케이블의 내부 구조

이미지
아이폰도 USB-C를 사용하면서 온 세상이 USB 로 통일됐지만 실제로는 너무 다양한 USB가 존재한다. 기본 형태인 USB-A나 최근 많이 사용되는 USB-C 뿐 아니라, 보통 5핀이라고 불리는 micro-B를 포함한 다양한 USB-B 컨넥터들이 존재한다. 그래도 컨넥터는 모양이 다르기 때문에 쉽게 구분할 수 있는데 케이블은 답이 없다. 겉으로는 똑같아 보이는 케이블이라도 어떤 케이블은 데이터 통신이 안 되고 어떤 케이블은 데이터 통신이 가능하다. 이런 차이는 케이블 내부 구성에 따라 발생한다. 이번 글에서는 USB 2.0 케이블의 내부를 통해 USB 케이블에 대해 자세히 알아보겠다. Micro-B 케이블의 편조 차폐와 호일 차폐 위 사진은 집에서 돌아다니던 A - Micro-B USB 2.0 케이블의 피복을 벗겨낸 것이다. 절연체 아래로 금속 선이 있는 것을 알 수 있다. 이 선들은 금속 선이지만 전선은 아니다. 이 선은 전자기 차폐를 목적으로 들어간 금속 선이다. 실제 전선은 이 금속 선을 벗겨야 나온다. 이번에 자른 케이블에는 두 종류의 차폐가 사용됐다. 하나는 얇은 금속 호일이고, 다른 하나는 얇은 도체의 가닥으로 이루어져 있다. 전자는 보통 호일 차폐(Foil Shielding)라고 부르고 후자는 편조 차폐(Braided Shielding)라고 부른다. 이 둘은 다 외부 전자기장으로부터 전선을 보호하기 위해 사용되지만, 특성이 약간 다르다. 보통 편조 차폐가 저주파수 전자기파를 차단하는 것에 효과적이고, 호일 차폐가 고주파수 전자기파를 차단하는 데 효과적이다. USB 3.0의 고속 전송 케이블은 이 두 차폐를 사용하는 것이 필수적이고, 그 외의 경우에는 필수는 아니고 권장 사항이다. 하지만 어지간한 싸구려 케이블을 쓰지 않는 한 요즘은 USB 2.0 케이블에도 이 두 가지를 같이 사용한다. 차폐 선이 쉴드와 연결되지 않았다 하지만 고속 전송을 지원하는 케이블이 ...

Linux의 clear와 Mac의 clear는 다르다

최근 CSI Sequence에 대한 글을 열심히 쓰고 있지만, 우리가 직접 CSI Sequence를 직접 사용할 일은 거의 없다. 하지만 알게 모르게 사용하는 CSI sequence가 있다. 바로 화면을 지우는 데 사용되는 clear 라는 명령어다. clear 는 기본적으로 두 가지 종류의 CSI sequence를 사용한다. 하나는 CUrsor Position(a.k.a CUP; CSI H )다. 이것을 이용해 커서를 화면의 시작으로 돌린다. clear 를 하고 나면, 최상단 왼쪽으로 커서가 움직이는 것은 CUP 덕분이다. 두 번째 CSI sequence는 Erase in Display(a.k.a. ED; CSI 2 J )다. 이를 이용해 화면 전체를 지운다. 여기까지는 Linux와 Mac이 공유하는 동작이다. 하지만 이후 동작에서 Linux의 clear 와 Mac의 clear 는 다르게 동작한다. 간단하게 말하면 Linux의 clear 는 스크롤 버퍼를 지우고, Mac의 clear 는 지우지 않는다. 이는 Linux의 clear는 앞의 두 시퀀스에 이어 CSI 3 J 를 출력하기 때문이다. CSI 3 J 는 xterm 이 도입한 Escape Sequence의 확장으로 스크롤 버퍼에 저장된 라인을 지우는 시퀀스다. 2011년 레드 햇 진영에서 E3라고 이름붙인 뒤 로 터미널 에뮬레이터에서는 E3 확장이라고 부르기도 한다. Mac의 clear 는 이 시퀀스를 출력하지 않기 때문에 스크롤 버퍼를 남겨둔다. 이런 차이가 발생한 것은 생각보다 오래된 일은 아니다. 원래 대부분의 터미널 에뮬레이터들은 E3 확장을 비롯한 xterm 확장들을 이해하지 못했다. 당연히 이 시절에는 Linux에서 사용되던 clear 커맨드도 E3를 사용하지 않았기 때문에 스크롤 버퍼는 지우지 않았다. 하지만 시간이 지나며 점점 xterm 확장은 다른 터미널 에뮬레이터로 전해져오며 E3도 구현되기 시작했다. 2007년 PuTTY , 2011년 Red Hat , 2014년 Gnome...

[CSI Sequence] 화면 지우기

오늘은 지난 글 에 이어서 CSI Sequence를 이용해 화면을 지우는 방법을 알아보도록 하겠다. CSI Sequence에는 화면을 지우는 시퀀스가 2개 있다. 첫 번째는 EL이라고 불리는 Erase in Line 시퀀스다. CSI # K 로 구성된 시퀀스로 이름 그대로 줄을 지우는 데 사용되는데, # 을 주지 않으면 기본값은 0으로 처리되며, 값을 준다면 0, 1, 2 총 세개중 하나를 줘야 한다. 이외의 값이 오는 경우 시퀀스 자체가 무시된다. 예를 들어 0x311b5b334b32 즉, 1^[3K2 같은 값을 출력하면 ^[3K 는 무시되고 화면에 12 만 출력된다. 0, 1, 2의 동작은 정리하면 다음과 같다. 0 커서부터 줄 끝까지 지운다. 1 줄 시작부터 커서까지 지운다. 2 커서의 위치와 상관 없이 줄 전체를 지운다. 주의할 점은 EL 시퀀스는 커서의 위치를 옮기지 않는다는 것이다. 즉, 지금 쓴 줄을 지우고 새로운 줄을 쓰고 싶으면, EL 시퀀스와 캐리지 리턴 (\r)을 같이 사용해줘야 한다. 두 번째는 ED라고 불리는 Erase in Display 시퀀스다. CSI # J 로 구성된 시퀀스로 이름 그대로 화면을 지우는 데, EL과 마찬가지로 # 의 값에 따라 화면의 어디를 지울지를 결정한다. 0 커서를 기준으로 화면 끝까지 지운다. 1 화면 시작부터 커서까지 지운다. 2 커서의 위치와 상관 없이 화면 전체를 지운다. 3 스크롤 버퍼에 저장된 라인을 지운다, 기본적으로 EL과 같은 느낌이다. 기본값이 0인 것도 같고, 커서의 위치를 옮기지 않는 것도 같고, 정해진 값 이외의 값이 들어오면 무시하는 것도 같다. 단 하나의 차이는 EL에 없는 3이 추가된 것이다. 이 시퀀스는 스크롤 버퍼에 저장된 값을 지우는 시퀀스다. 원래 VT100 시절에 있던 시퀀스는 아니다. 그 시절 터미널에는 스크롤이라는 개념이 없었다. 이 시퀀스는 X 윈도우 시스템 과 ...

[CSI Sequence] 커서 옮기기

Code Abbr Name CSI # A CUU CUrsor Up CSI # B CUD CUrsor Down CSI # C CUF CUrsor Forward CSI # D CUB CUrsor Backward CSI # E CNL CUrsor Next Line CSI # F CPL CUrsor Previous Line CSI # I CHT Cursor Horizontal forward Tabulation CSI # Z CBT Cursor Backward Tabulation CSI # G CHA Cursor Horizontal Absolute CSI # ; # H CUP CUrsor Position 오늘은 지난 글에 이어 이번 글에서는 CSI sequence를 이용해 커서를 옮기는 방법에 대해 알아보겠다. 커서를 옮기는 CSI sequence의 종류는 위와 같이 정리할 수 있다. CUU, CUD, CUF, CUB 이들은 각각 CUrsor Up, CUrsor Down, CUrsor Forward, CUrsor Backward의 약자로 이름 그대로 커서를 위, 아래, 앞, 뒤로 이동한다. 인자로는 한 개의 숫자를 받고, 만약 인자가 생략되면 1로 취급된다. 즉, 0x1b[A 는 0x1b[1A 와 같은 의미이다. 이때 CUF나 CUB는 같은 줄 내에서만 움직이며 줄의 시작에서 CUB를 받아도 이전 줄로 움직이지 않고, 줄의 마지막에서 CUF를 받아도 다음 줄로 움직이지 않는다. 이런 동작을 원하면 각각 reverse auto-wrap 모드와 auto-wrap 모드를 켜야 하는데, 이 모드를 지원할지는 터미널별로 다르다. CNL, CPL 이들은 각각 Cursor Next Line, Cursor Previous Line을 의미하며, 커서를 다음 줄 혹은 윗줄로 옮긴다. CUU와 CUD는 커서의 column을 유지한 채 줄을 바꾼다면, CN...

이 블로그의 인기 게시물

USB 2.0 케이블의 내부 구조

[C++] enum class - 안전하고 쓰기 쉬운 enum

[Web] SpeechSynthesis - TTS API

터미널 출력 제어를 위한 termios 구조체 이해하기

[Python] cache 데코레이터로 최적화하기