Ghidra로 Elgato HD60 S HDMI 캡처 장치 수리하기
(downtowndougbrown.com)- USB로 인식되지 않던 Elgato Game Capture HD60 S는 전원 레일을 끌어내리던 전원 IC 3개를 교체하자 HDMI 캡처와 패스스루가 정상 복구됨
- 열화상·전압 측정·SMD 마킹 검색으로 Fitipower FP6373A 레귤레이터 2개와 TI TPS60403DBV 전압 인버터를 찾아냈고, 부품값은 LCSC 기준 1달러 미만이었음
- 캡처 기능은 살아났지만 흰색 7개·빨간색 7개의 상태 LED가 꺼져 있었고, LED 드라이버와 LED 배열 자체는 Raspberry Pi Pico 직접 제어로 정상임이 확인됨
- Ghidra로 Nuvoton M031LD2AE 펌웨어와 Cypress/Infineon CYUSB3014용 SPI 플래시를 추적한 결과, 0x300000부터 있어야 할 LED 애니메이션 데이터가 비어 있거나 손상돼 있었음
- 정상 HD60 S의 LED 데이터 영역만 문제 장치의 SPI 플래시에 합성해 넣자 상태 LED가 되살아났고, 남은 고장은 하드웨어가 아니라 소프트웨어·프로그래밍·업데이트 경로의 문제였음
USB로 인식되지 않던 HD60 S 전원부 수리
- eBay에서 구입한 고장 난 Elgato Game Capture HD60 S USB 3.0는 연결해도 컴퓨터에 아무것도 나타나지 않았음
- 보드를 열어 전압을 재보니 전원 레일이 낮게 끌려 내려가고 있었고, 열화상 카메라로 뜨거워지는 칩을 찾음
- 문제가 된 부품은 작은 마킹만 있는 전원 IC들이었음
fiVJVE로 표시된 칩 2개는 2.2µH 인덕터 근처에 있어 스위칭 레귤레이터로 추정됨- SMD 마킹 검색과 Fitipower 자료 확인을 거쳐 FP6373A로 좁혀짐
PFNI로 표시된 칩은 Google 검색으로 TI TPS60403DBV 전압 인버터임이 확인됨
- 세 칩은 모두 5V 입력을 받고 있었고 출력 쪽 저항이 낮았으며, 한 FP6373A의 출력 레일에 2.7V를 직접 주입하자 해당 레귤레이터가 발열함
- FP6373A는 LCSC에서 개당 $0.17, TI 칩은 $0.58에 구입 가능했고 배송비가 부품값보다 훨씬 컸음
부품 교체 뒤 남은 상태 LED 문제
- 세 전원 IC를 교체한 뒤 HD60 S는 USB 장치로 인식됐고 HDMI 캡처와 패스스루가 정상 동작함
- 그러나 장치의 상태 표시등은 여전히 켜지지 않았음
- 흰색 LED 7개와 빨간색 LED 7개가 있음
- 흰색 LED는 연결 직후 두 번 깜박여야 함
- LED 관련 칩은 Innochip의 IT1504였고, 데이터시트상 16채널 LED 드라이버였음
- 오실로스코프로 IT1504 입력 핀을 보니 SPI와 유사한 직렬 트래픽이 들어오고 있었음
- PCB 추적 결과 IT1504는 Nuvoton M031LD2AE ARM Cortex-M0 마이크로컨트롤러가 제어하고 있었음
IT1504 대체품 탐색과 회로 검증
- IT1504는 일반 유통망에서 구하기 어려웠고, Innochip은 재고가 풀 릴 단위뿐이라 샘플을 보낼 수 없었음
- 대체품을 찾는 과정에서 Macroblock의 MBI5040을 발견함
- MBI5040 데이터시트는 IT1504 데이터시트와 구성·블록 다이어그램이 거의 같았음
- 출력 전류 사양은 약간 달랐지만 기능과 명령 체계가 매우 유사했음
- MBI5040 데이터시트의 명령 정보가 LED 제어 방식 파악에 도움을 줌
- MBI5040GF를 구입해 IT1504 대신 장착했지만 LED는 여전히 켜지지 않았음
- 벤치 전원공급기와 저항으로 LED를 하나씩 켜 본 결과, LED 자체는 정상이었음
- Raspberry Pi Pico를 MBI5040 입력에 직접 연결해 명령을 보내자 LED를 완전히 제어할 수 있었음
- LED 드라이버 회로와 LED 배열에는 물리적 문제가 없다고 판단함
- 원래 IT1504를 다시 장착해도 Pico 제어가 정상 동작해, 기존 LED 드라이버도 고장 나지 않았음
Nuvoton MCU 펌웨어를 Ghidra로 분석
- Elgato 지원에 상태 LED 관련 알려진 문제나 설정 여부를 문의했지만 실질적인 해결책은 얻지 못함
- Nuvoton MCU의 펌웨어를 확인하기 위해 보드의 4핀 JST 커넥터를 추적했고, 이것이 MCU 프로그래밍용 커넥터임을 확인함
- Nu-Link2-Me와 NuMicro ICP Programming Tool로 읽기를 시도했지만 칩 내용은 보호되어 있었음
- 대신 Elgato 4K Capture Utility에 포함된
FW_HD60_S_MCU.bin파일을 찾음ElgatoDeviceCapabilities.json에 따르면 이 펌웨어는 USB product ID 0x0076 장치용임- Elgato는 이를 “Game Capture HD60 S Rev.4”로 부르고 있었음
- 바이너리는 Cortex-M0 펌웨어처럼 보였고, 첫 워드
0x20000E70은 유효한 스택 포인터처럼 보였으며 뒤따르는 워드들은 플래시 주소 형태의 벡터 테이블처럼 보였음 - 펌웨어를 Ghidra에 로드하고 SVD-Loader를 사용해 레지스터 매핑을 시도함
- NuMicro_DFP의
M031AE_v1.svd를 수정해 플러그인에서 로드되도록 함 - Nuvoton의 M031BSP는 함수 식별에 도움이 됨
- NuMicro_DFP의
디버깅을 위한 MCU 교체와 잠금 해제
- 원래 M031LD2AE 대신 새 빈 칩을 장착하고 Elgato 펌웨어를 플래시하자 동작은 했지만, 칩이 다시 보호 상태가 되어 디버깅할 수 없었음
- Ghidra에서 보호 설정을 갱신하는 함수를 찾아 칩을 잠그지 않도록 패치함
- 패치된 펌웨어를 올리자 OpenOCD와 GDB로 초기화 코드를 디버깅할 수 있었음
- LED 제어 코드 경로는 펌웨어 안에 있었지만 정상 실행 흐름에서는 건너뛰고 있었음
- GDB에서 레지스터와 RAM 값을 강제로 채워 LED 제어 코드가 실행되도록 하자 조명을 켤 수 있었음
- 펌웨어에는 LED 제어 코드가 있음
- 문제는 그 코드가 정상 조건에서 실행되지 않는다는 점이었음
부트로더와 전체 펌웨어 백업
- 보호 비트를 해제한 펌웨어를 Elgato 업데이트 경로로 다른 HD60 S에 설치해, 원래 보호되어 있던 전체 내용을 읽어내는 실험을 진행함
- 업데이트 후 장치가 캡처 카드로 동작하지 않는 것처럼 보였지만, 칩은 의도대로 잠금 해제되어 있었음
- 그 결과 다음 영역을 읽어낼 수 있었음
- LDROM: Elgato의 1단계 부트로더
- 데이터 플래시
- 원래 설정 레지스터 값
- APROM 애플리케이션 펌웨어
- LDROM 부트로더는 I2C로 명령과 데이터를 받아 APROM을 다시 플래시할 수 있었음
- 칩이 보호 해제 상태이면 부트로더가 애플리케이션 펌웨어로 넘어가지 않고 업데이트 명령을 기다림
- Elgato는 잠금·잠금 해제 비트를 부트로더 대기 여부를 나타내는 신호처럼 사용하고 있었음
- 잠금 해제 펌웨어 설치 후 장치가 멈춘 이유도 이 동작으로 설명됨
HD60 S 내부 구조 파악
- 장치 안에서는 두 개의 ARM 계열 프로세서가 함께 동작함
- Cypress/Infineon CYUSB3014 USB 3.0 주변장치 칩은 ARM926EJ-S이며 PC와 USB 3.0으로 통신함
- Nuvoton M031LD2AE Cortex-M0 MCU는 ITE 비디오 칩과 LED를 제어함
- Nuvoton MCU는 별도 I2C 버스로 ITE 칩들을 설정하고 감시함
- ITE IT6802E는 HDMI 수신기로 보임
- ITE IT66121FN은 병렬 데이터 스트림을 HDMI로 내보내는 역할로 보임
- CYUSB3014는 Nuvoton MCU에 I2C로 명령을 보내고, Nuvoton은 상태 정보를 CYUSB3014로 돌려보냄
- CYUSB3014는 IT6802E에서 온 비디오 데이터 스트림을 받아 USB로 컴퓨터에 전달함
- 보드에는 Altera MAX II CPLD도 있으며, 비디오 데이터가 CYUSB3014가 받을 수 있는 형태로 들어가도록 관여하는 것으로 보였음
SPI 플래시와 LED 애니메이션 데이터 발견
- CYUSB3014 펌웨어는 Winbond W25Q32JVSSIQ 4MB SPI 플래시에 보호 없이 저장되어 있었음
- SPI 플래시 덤프를 살펴보니 오프셋 0x300000부터 작은 그림처럼 보이는 데이터 덩어리들이 있었음
- Nuvoton 펌웨어에서 알 수 없던 GPIO 5개를 추적하자, 이 핀들은 Diodes Incorporated PI5C3257 quad 2:1 mux/demux bus switch로 이어져 있었음
- 이 버스 스위치는 SPI 플래시에 연결될 주체를 CYUSB3014와 Nuvoton MCU 사이에서 선택함
- 처음에는 SPI 플래시가 CYUSB3014 전용이라고 생각했음
- 실제로는 CYUSB3014 부팅 후 Nuvoton MCU가 SPI 플래시 제어권을 가져감
- Ghidra에서 새로 식별한 함수들은 비트뱅잉 SPI 트랜잭션과 SPI 플래시 지우기·읽기·쓰기 관련 코드였음
LED 고장의 실제 원인
- SPI 플래시의 0x300000 이후 데이터는 일반적인 그림이 아니라 LED 애니메이션 프레임이었음
- 각 16바이트 묶음은 14개 LED에 쓰이는 애니메이션 프레임임
- 각 행의 마지막 2바이트는 다음 프레임으로 넘어가기 전 지연 시간임
- Nuvoton 펌웨어는 0x300000 시작 위치의 첫 2바이트가 16비트 값 0xAA55인지 확인하고 있었음
- LED가 동작하지 않는 두 장치의 SPI 플래시 덤프에서는 해당 영역이 비어 있거나 손상되어 있었음
- 한 덤프에서는 0x300000 영역이 거의 모두
0x00으로 채워져 있었음 - 일부 애니메이션은
AB 03 12 39같은 이상한 헤더로 시작했음
- 한 덤프에서는 0x300000 영역이 거의 모두
- 정상 동작하는 세 번째 HD60 S의 SPI 플래시에는 0x300000에 올바른 헤더와 LED 데이터가 있었음
- 첫 16비트 워드는 펌웨어가 찾던
0xAA55였음 - 헤더에는 26개 LED 애니메이션 관련 정보가 포함되어 있었음
- IT1504에 로드되는 dot correction 데이터는 0x3007F8에 있었고, 뒤따르는
0x521114A7은 앞 16바이트의 CRC-32였음
- 첫 16비트 워드는 펌웨어가 찾던
SPI 플래시 패치로 LED 복구
- 문제 장치의 SPI 플래시에서 0x000000부터 0x2FFFFF까지는 각 장치 고유 데이터를 보존함
- USB 일련번호가 이 영역 어딘가에 포함되어 있었기 때문임
- 0x300000부터의 LED 데이터 영역만 정상 장치 덤프에서 가져온 데이터로 교체한 하이브리드 이미지를 만듦
- 이 이미지를 LED 불량 장치에 플래시하자 흰색 LED가 두 번 깜박이고 빨간색 LED가 잠깐 한 번 켜졌음
- 정상 장치가 더 오래된 리비전이고 Nuvoton MCU 모델도 달랐지만, LED 데이터는 새 펌웨어가 기대하는 형식과 맞았음
- Windows와 Mac의 기존 Game Capture 앱 안에도 애니메이션 원시 데이터가 존재했음
- Windows 경로는
C:\Program Files\Elgato\GameCapture\Animations - Mac 경로는
/Applications/Game Capture HD.app/Contents/Resources/Animations 01.ani,02.ani등 파일의 데이터를 LED 순서에 맞게 재정렬하면 정상 플래시 덤프의 애니메이션 데이터와 일치했음
- Windows 경로는
업데이트 도구와 복구 절차의 제약
- Elgato 4K Capture Utility의 Windows 펌웨어 업데이트는 충분히 오래 기다리지 않는 문제가 있었음
- 업데이트가 아직 진행 중인데 실패했다고 표시됨
- 그대로 기다리면 장치 LED가 깜박이고 새 펌웨어로 정상 재부팅됨
- 실패 메시지 직후 장치를 뽑으면 불완전한 플래시가 남을 수 있음
ElgatoDeviceCapabilities.json의updateDurationSec값을 40에서 80으로 늘리자 이 문제가 해결됨- Elgato는 HD60 S 펌웨어 업데이트를 기술지원이 지시하지 않는 한 하지 말라고 권장하며, 기능도 설정 화면의 특수 키 조합 뒤에 숨겨져 있음
- LED 복구 절차는 복잡함
ElgatoDeviceCapabilities.json을 수정해 펌웨어 업데이트를 허용함- 업데이트를 시작한 직후 장치를 뽑아 Cypress 칩이 SPI 플래시를 제어하도록 유도함
- PCB 점퍼를 제거해 CYUSB3014가 USB에서 부팅하도록 함
- Cypress SDK의
download_fx3로cyfxflashprog.img를 RAM에 올림 - 수정한
fx3_spitest로 SPI 플래시 전체를 덤프하고 LED 영역을 패치함 - 점퍼를 되돌리고 4K Capture Utility에서 정상 펌웨어 업데이트를 수행해 Nuvoton 펌웨어를 복원함
- 최종적으로 원래 수리는 1달러 미만의 칩 3개 교체로 끝났고, LED 문제는 일부 HD60 S에서 발생하는 소프트웨어·프로그래밍·업데이트 관련 결함으로 파악됨
댓글과 토론
Hacker News 의견들
-
전체 구조 속에서 목적을 이해하기가 어려웠고, 여러 단계의 함수 호출 안쪽에 깊이 묻혀 있는 경우도 있었음
소스 코드를 직접 볼 때도 이런 일이 자주 있음. 대부분의 소프트웨어가 과도하게 추상화돼 있고, MCU가 워낙 커지고 싸져서 HDMI 캡처 장치에 ARM 코어가 두 개 들어가는 식의 일이 임베디드에서도 보이기 시작함. 이 장치에는 MCU가 하나 이상 필요하지 않았을 것 같음 -
20년쯤 전 인도에서 자랄 때는 구매력이 낮고 물건이 비싸서 거의 모든 것을 고치거나 새로 손봐서 썼음
물건을 작동하게 만들기 위해 jugaad라는 온갖 임시방편을 많이 썼고, 옷도 재사용하면서 재단사가 rafu라는 덧댐 수선을 해 수명을 늘렸음. 내 집 같은 중산층 가정에서는 특히 흔했음
의류 수출 회사에서 일하던 아버지는 서구 사람들이 자동차든 전자기기든 옷이든 일회용 물건과 새 물건을 선호한다고 자주 얘기했는데, 당시에는 그 사고방식을 이해하지 못했음. 하지만 지금은 구매력이 오르고 중국 덕분에 가격이 내려가면서 우리도 그냥 버리고 새로 사는 쪽으로 기울고 있음
중간에 포기하지 않고 새로 사는 게 더 쉽다고만 생각하지 않는 사람들을 깊이 존경함. 이런 끈기와 자원fulness는 정말 칭찬받을 만함- 새 제품 가격은 내려간 반면 수리 비용은 올라갔음
직접 고칠 수 있고 필요한 부품을 구할 수 있다면 괜찮음. 하지만 누군가의 경험과 지식에 비용을 지불해야 하는 일이라면, 적어도 내가 사는 곳에서는 꽤 비싸고 수리해 줄 사람을 찾기도 어렵다. 빈 가게 밖에 TV 수리 간판만 많이 보임
다행히 반쯤 은퇴했고 시간제 급여를 받는 중이라 내 추가 시간에는 금전적 비용이 없음. 그래서 하루를 써서 식기세척기를 고쳐 보고, 며칠 뒤 다시 고장 나면 또 하루를 써서 새것을 설치할 수 있음. 전문 설치 기사라면 새 제품을 한 시간 만에 설치했겠지만, 적어도 일정 잡을 때까지 기다릴 필요는 없었음 - 서유럽에서도 오랫동안 비슷했음. 부모님 세대는 옷을 덧대고 물건을 많이 고치며 자랐음
지난 50년 정도 사이에야 소비주의가 커지고, 의류 같은 물건의 품질과 가격이 내려갔음
최근에는 오토바이 정비를 직접 하고 있는데, 처음에는 오일 필터를 푸는 도구 같은 약간의 공구 투자가 필요하고 부품과 소모품도 구해야 함. 오일류, 구리 와셔, 낡은 브레이크액 리저버 나사를 대체할 나사 같은 것들임. 그래도 정비소가 제시한 €1000 대신 대략 €100~€150 수준으로 끝남 - 80년대 미국 북동부의 블루칼라 가정에서 자랄 때도 그랬음. 아버지는 집안 물건과 차량을 전부 고쳤고, 나는 형제자매의 옷을 물려받았으며 동생들은 내 옷을 물려받았음
어머니는 어릴 때 바짓단을 줄였다가 우리가 자라면 다시 늘려 줬고, 무릎이나 팔꿈치가 닳으면 덧댔음
이런 환경은 좋은 습관과 나쁜 습관을 함께 심어 줬음. 집안 수리는 거의 전부 직접 하지만, 너무 많이 일해서 시간이나 에너지가 늘 충분하지는 않음. 충분히 감당할 수 있는데도 남에게 돈을 주고 맡기기가 어렵고, 그래서 고장 난 물건을 필요 이상으로 오래 방치하게 됨
그 시간을 유지보수와 수리에 쓰는 대신 사이드 프로젝트에 썼다면 돈은 더 많았을지도 모름 - 예전에는 수리가 공동체의 지식에 가까웠음. 동네 누군가는 용접을 잘 알고, 다른 누군가는 전기, 미장, 옷 수선 등을 잘 알았음
그 사람들이 다른 이들을 기본 수준까지 가르쳐 주고, 예상치 못한 문제가 생기면 도와줬음. 공동체 전체에 지식과 기초 도제식 학습이 내장돼 있었던 셈임
오늘날 수리는 혼자 하는 일이 됐음. YouTube 같은 것은 큰 도움이 되지만, 공동체적인 측면은 사라졌음 - 소비주의 사고방식은 강한 경제와 높은 상승 이동성이 만들어 낸 사치에 가까움
안타까운 부작용으로 수리와 재사용이 덜 매력적으로 여겨지면서, 수리 가능성과 긴 수명도 제품 기능으로서 함께 덜 중요해졌음. 이제 미국의 경제 성장이, 특히 99%에게는 정체되면서 우리가 잃은 것이 드러나고 있음. 오래가도록 만들어진 물건이 없고, 회사들도 수리 가능하고 오래가는 제품을 제공하지 않거나 못 함. 그래서 자기 물건을 고치려고 일부러 애쓰는 사람들조차 수많은 장애물에 부딪힘
- 새 제품 가격은 내려간 반면 수리 비용은 올라갔음
-
플래시 칩 안의 데이터 덩어리가 사진이라는 걸 깨닫는 대목이 흥미로웠음. 일반적인 의미의 사진은 아니고, 여러 LED 애니메이션을 기술하는 데이터였음
Hue 램프 애니메이션용으로 이와 같은 형식을 독자적으로 만든 적이 있음. 다만 바이너리가 아니라 텍스트였음
bulb1 bulb2
dly R G B WW CW R G B WW CW
100 10 25 20 0 0 25 10 20 0 0
200 10 50 20 0 0 50 10 20 0 0
첫 값은 다음 줄로 넘어가기 전 지연할 밀리초이고, 그 뒤에는 각 LED 채널의 밝기를 100 기준으로 적음. 숫자가 아닌 것으로 시작하는 줄은 주석이고, 채널 사이에는 하나 이상의 공백을 얼마든지 둘 수 있음
상용 제품에서 비슷한 바이너리 형식을 보니 즐거움. 사실 꽤 뻔한 방식이지만 그래도 직접 보니 흥미로움- 이건 LED 애니메이션용 트래커 소프트웨어나 자동 피아노 롤 같음
https://en.wikipedia.org/wiki/Piano_roll
- 이건 LED 애니메이션용 트래커 소프트웨어나 자동 피아노 롤 같음
-
겸손해지는 글이었음. 이게 진짜 풀스택 엔지니어링임
- 정말 겸손해짐. 이 글을 출발점으로 삼는다고 해도 내가 해내려면 몇 주는 걸릴 것 같음
-
Elgato가 이 글에 어떻게 반응할지 보고 싶음
- 나도 그렇음. 이 흥미로운 글을 읽은 엔지니어들의 눈에는 흥분이 가득하고, 매니저들은 회사의 지식재산 보호를 더 잘할 방법을 요구하며 화낼 모습이 쉽게 그려짐
- 이제 Elgato를 소유한 Corsair에서 반응해야 할 것임. 개인적으로는 상장된 전통적인 회사에 가깝다고 보며, 반응이 나온다면 기분 좋게 놀랄 듯함
- 이제 그들이 LED 문제의 원인이나 그 밑의 메모리 손상 원인을 알고 있는지가 궁금해짐
-
내 경험상 Elgato 제품은 싸지만 끔찍하게 불안정함. 이 글은 그 이유를 아주 자세히 보여 줌
- 깜빡임과 손상 문제는 매우 나쁜 소프트웨어 엔지니어링 문화를 가리킴
- 안타까운 건 Key Light나 Stream Deck 같은 제품 자체는 멋지고 정말 유용하다는 점임
소프트웨어도 원하는 기능이 다 있고, 직접 플러그인을 만들 수 있으며, 플러그인 제작 과정도 문서화돼 있음. 전부 정말 괜찮음
하지만 실제로는 Key Light 전원을 계속 껐다 켜야 하고, Windows에서 Stream Deck 앱도 계속 다시 시작해야 함
-
이런 프로젝트에서 동기를 어떻게 유지하는지 궁금함. 부품을 반복해서 주문하고 도착을 기다려야 하는데, 특히 중국에서 오는 부품은 기다리다 보면 꽤 많은 프로젝트를 포기하게 됨
- 시간도 문제지만 이런 부품을 주문하는 비용도 문제임. 각각은 몇 센트 수준이지만, 필요한 모든 부품을 미리 알 수는 없음
제대로 세었다면 글쓴이는 적어도 세 번 주문했음. 그래도 정말 흥미롭긴 함
- 시간도 문제지만 이런 부품을 주문하는 비용도 문제임. 각각은 몇 센트 수준이지만, 필요한 모든 부품을 미리 알 수는 없음
-
열화상 카메라가 없다면 보드에 소독용 알코올을 바르고 어디가 가장 빨리 증발하는지 보면 됨
물론 저전압 장치에서만 가능한 방법임 -
진실을 탐구하고 끝까지 추적하는 능력이 우리를 신성하게 만들고, 무언가를 만들고 향상시키는 인간의 면모임. 이 사람은 세속적인 물건 하나를 탐구하면서 아주 깊은 영적인 길을 걸었음
장치들이 우리에게 저항한다는 사실은 너무 슬프고, 답답하며, 지옥 같음. 컴퓨터와 기기는 자신을 이루는 진실을 증폭하고 발산해야 함. 하지만 인류는 스스로 만든 껍데기 안에 갇혀 있고, 참여와 학습 가능성을 거부하는 하향식 소비주의 속에 있음. 특히 컴퓨터는 진실과 이해를 가리는 대표적인 불투명화 장치가 되는 경우가 많음. 엄청난 잠재력이 너무나 낭비되고 있음
살아 있는 동안 열린 기계들이 나타나는 돌파 흐름을 볼 수 있기를 바람. Doug에게 박수를 보냄