1P by GN⁺ | ★ favorite | 댓글 1개
  • ThinkPad X1 Carbon 6th Gen의 숨겨진 xDCI 컨트롤러를 켜자 노트북 자체가 키보드나 저장장치 같은 임의의 USB 장치를 에뮬레이션할 수 있게 됨
  • 단서는 /sys/class/usb_role/intel_xhci_usb_sw-role-switch였지만, xHCI 역할 전환만으로는 부족했고 별도의 DWC3 기반 xDCI UDC가 PCIe 장치로 노출돼야 했음
  • BIOS 이미지에는 xDCI Support 설정이 있었지만 기본 Setup UI에서는 숨겨져 있었고, 활성화 후 lspci에 xDCI 8086:9d30dwc3-pci 드라이버가 나타남
  • 성공한 방법은 Advanced BIOS 페이지 잠금 해제NVRAM 패치였으며, PCH 레지스터 재구성은 PMC 일부 변경에 그치고 PSF 잠금 때문에 실패함
  • xDCI 활성화 뒤 g_mass_storage, Raw Gadget, syzkaller 재현기, Facedancer 백엔드가 외부 하드웨어 없이 동작했지만, VBUS가 끊긴 USB 케이블과 device 역할 전환이 필요함

ThinkPad에서 발견한 USB 장치 모드 단서

  • Raw Gadget은 Linux 커널 USB Gadget 서브시스템에 사용자 공간 API를 제공하는 커널 모듈이며, 잘못된 USB 디스크립터를 제공해 USB 호스트 퍼징과 익스플로잇에 활용할 수 있음
  • 일반 PC에는 USB Device Controller, 즉 UDC가 보통 없고 Raspberry Pi 같은 싱글보드 컴퓨터에 주로 내장돼 있음
    • 기존 작업에는 Raspberry Pi나 USB 3380 기반 EC3380-AB 같은 외부 하드웨어가 필요했음
  • ThinkPad X1 Carbon 6th Gen에서 /sys/class/usb_role 아래 intel_xhci_usb_sw-role-switch가 발견됨
    • /sys/class/usb_role은 하드웨어 USB 구성요소를 host 모드와 device 모드 사이에서 전환하는 인터페이스임
    • device를 role 파일에 써도 처음에는 dmesg 메시지나 /sys/class/udc/ 항목이 생기지 않았음
  • xHCI는 x86 시스템에서 USB host로 동작하게 하는 HCD이고, xDCI는 Intel이 USB device 쪽 인터페이스에 쓰는 이름임

커널 코드와 메일링 리스트로 확인한 구조

  • Linux 커널에서 intel_xhci_usb_sw는 두 위치에서 확인됨
    • drivers/usb/roles/intel-xhci-usb-role-switch.cdevicehost가 쓰일 때 xHCI 레지스터를 조작하는 USB Role Switch 드라이버를 구현함
    • drivers/usb/host/xhci-ext-caps.c는 xHCI 드라이버가 XHCI_INTEL_USB_ROLE_SW quirk를 설정한 경우 intel_xhci_usb_sw 가상 플랫폼 장치를 만듦
  • ThinkPad의 xHCI PCIe device ID는 0x9d2f였고, 커널의 PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI와 일치함
  • Linux 커널 메일링 리스트 논의에서 xHCI와 DWC3 UDC는 별도 장치이며, 둘 사이에 mux가 있다는 점을 확인함
    • role switch는 이 mux를 바꾸는 역할을 함
    • DWC3 UDC 자체가 PCI 장치로 보이지 않으면 device mode로 쓸 UDC가 없는 상태임
  • DWC3는 Synopsys의 DesignWare Core SuperSpeed USB 3.0 Controller IP이며, Intel을 포함한 여러 벤더가 시스템에 사용함
  • ThinkPad에서 lspci를 확인했을 때 처음에는 xHCI 8086:9d2f만 보였고, dwc3-pci.c 기준 Sunrise Point-LP의 xDCI device ID인 0x9d30은 보이지 않았음

ACPI와 BIOS에 남아 있던 xDCI 흔적

  • ACPI DSDT에는 Device (XDCI)_STA 메서드가 존재함
    • /sys/bus/acpi/devices/device:33/path\_SB_.PCI0.XDCI였음
    • /sys/bus/acpi/devices/device:33/status15였고, 이는 장치가 enabled and functioning 상태임을 뜻함
    • 하지만 lspci에는 xDCI가 없었기 때문에 ACPI 관점에서만 정상으로 보이는 상태였음
  • 기본 BIOS Setup 화면에는 xDCI나 OTG 관련 설정이 보이지 않았음
  • Lenovo BIOS Bootable CD 업데이트 이미지를 내려받아 BIOS 바이너리 /mnt/bios/FLASH/N23ET86W/$0AN2300.FL1를 추출하고 UEFITool로 확인함
  • Setup 모듈의 PE32 image section에서 문자열을 검색하자 다음 항목이 나타남
    • xDCI Support
    • Enable/Disable xDCI (USB OTG Device).
  • BIOS 안에는 xDCI Support 설정이 있지만 기본 UI에서는 숨겨져 있었음

Advanced BIOS 페이지로 xDCI 켜기

  • x1c6-hackintosh 프로젝트 문서를 따라 숨겨진 Advanced BIOS 페이지를 여는 방식을 시도함
  • 이 방식은 BIOS가 저장된 SPI 칩을 다시 플래시해야 했음
    • SPI 클립을 쓰는 대신 SPI 칩을 소켓으로 교체해 여러 번 칩을 빼고 꽂아 실험함
    • FTDI FT2232H Mini Module과 flashrom을 사용해 SPI 칩 내용을 덤프하고 다시 기록함
  • BIOS 패치는 두 단계로 구성됨
    • UEFIPatchDate/Time BIOS 페이지 GUID 참조를 Advanced 페이지 쪽으로 바꿈
    • 별도 바이트 패치로 TPM을 MFG Mode로 강제해 Boot Guard가 BIOS 수정을 감지하지 않도록 함
  • BIOS 1.37에서 첫 번째 패치만 적용하면 노트북이 비프음을 내며 부팅하지 않았고, 두 번째 패치까지 적용한 뒤 Advanced 페이지가 나타남
  • Intel Advanced MenuPCI-IO ConfigurationUSB Configuration 아래의 xDCI SupportEnabled로 바꾸자 부팅 후 xDCI가 노출됨
    • lspci00:14.1 USB controller [8086:9d30]이 나타남
    • 커널은 dwc3-pci 드라이버를 자동 로드함
    • /sys/class/udc/dwc3.1.auto가 생김

xDCI 포트와 케이블 조건

  • xDCI가 연결된 외부 USB 포트를 찾기 위해 role을 device로 둔 상태에서 USB 플래시 드라이브를 각 포트에 꽂아 확인함
    • 특정 포트에서는 OS가 플래시 드라이브를 감지하지 않았고, role을 host로 되돌리자 다시 동작함
    • 해당 포트가 xDCI 연결 포트로 판단됨
  • ThinkPad의 xDCI 포트가 USB Type-A였기 때문에 host 컴퓨터에 연결하려면 Type-A to Type-A male-to-male 케이블이 필요했음
  • role switching이 포트의 전원 VBUS를 끄지 않았기 때문에, 두 장치의 VBUS가 직접 연결되지 않도록 VBUS가 끊긴 케이블을 사용함
    • 처음에는 USB 2.0 케이블 두 개를 잘라 VBUS를 끊은 male-to-male 케이블을 직접 제작함
    • 이후에는 PortaPow USB Power Blocker와 male-to-male USB 2.0 케이블을 사용함
  • g_zero gadget driver를 로드하자 다른 노트북에서 테스트 USB 장치가 정상적으로 에뮬레이션됨
  • 2024년 6월 11일 업데이트 기준으로, DataPro USB 3.0 Super-Speed A/A Debugging Cable은 USB 2.0 D-D+도 끊겨 있어 SuperSpeed 연결 수립에 필요한 High-Speed 연결이 실패함
    • VBUS를 수동으로 끊은 LogiLink CU0038 케이블은 SuperSpeed 장치 에뮬레이션에 동작함

PCH 레지스터로 소프트웨어 활성화 시도

  • BIOS가 xDCI를 어떻게 켜는지 파악하기 위해 Kaby Lake BIOS 소스 코드의 Pch/Library/Private/PeiPchInitLib/PchXdci.c를 확인함
  • BIOS의 xDCI 비활성화 경로는 xDCI를 PMCPSF에서 비활성화하는 구조였음
  • PMC 변경

    • PMC의 NST_PG_FDIS_1 레지스터 offset 0x628의 bit #24 XDCI Function Disable을 지우면 xDCI 전원 차단을 해제할 수 있을 것으로 봄
    • Linux 커널의 pmc_core_devicepmc->regbase 매핑을 재사용하는 커널 모듈을 작성함
    • 부팅 직후에는 ST_PG_FDIS1ST_FDIS_LK bit #31이 설정돼 NST_PG_FDIS_1 값을 바꿀 수 없었음
    • 노트북을 suspend했다가 깨운 뒤에는 lock bit가 설정되지 않았고, XDCI Function Disable bit를 지우는 데 성공함
  • PSF 변경

    • BIOS는 PID_PSF2 Port ID 0xBB의 PSF2 PCR에서 USB Dual Role (OTG) Function Disable bit를 설정해 xDCI를 비활성화함
    • PCR 주소는 PCH_PCR_BASE_ADDRESS 0xFD000000와 Port ID, offset 조합으로 계산됨
    • 커널 모듈에서 PSF2 PCR을 ioremap으로 매핑했지만 읽기 값은 0xffffffff로 나왔고 변경되지 않았음
    • P2SB를 unhide해도 결과는 같았음
    • BIOS의 RemoveSidebandAccessEPMASK5PID_PSF2를 IOSF-SB에서 분리하고 MASKLOCK으로 잠가, OS에서 PSF를 다시 설정할 수 없었음
    • PCH 접근은 PMC 일부 설정에는 성공했지만 PSF 재구성 실패로 xDCI 활성화 방법이 되지 못함

NVRAM 패치로 Boot Guard 우회 없이 활성화

  • BIOS 설정 값은 SPI 칩의 NVRAM 영역에 저장되므로, 숨겨진 Advanced 페이지를 열지 않고 xDCI Support 값만 바꾸는 방법을 시도함
  • IFRExtractor-RSSetup 모듈의 UEFI IFR 정보를 추출함
  • xDCI Support 설정은 PchSetup UEFI 변수 안에 저장돼 있었음
    • VarStore GUID: 4570B7F1-ADE8-4943-8DC3-406472842384
    • VarStoreId: 0x5
    • VarOffset: 0x40
    • 값 범위: 0x0 또는 0x1
  • Linux의 efivarfs에서 /sys/firmware/efi/efivars/PchSetup-4570b7f1-ade8-4943-8dc3-406472842384를 확인함
    • efivarfs 파일 첫 4바이트는 헤더이므로 실제 xDCI Support 값은 파일 offset 0x44에 있음
    • xDCI 비활성 상태에서는 값이 00, BIOS Advanced 페이지에서 활성화한 뒤에는 01로 바뀜
  • 사용자 공간이나 EFI Shell에서 해당 변수를 직접 쓰려 하자 EFI_WRITE_PROTECTED 오류가 발생함
    • efivarfs의 immutable 속성을 제거해도 Read-only file system 오류가 발생함
    • chipsec로 EFI Shell에서 변경해도 같은 오류가 발생함
  • SPI 프로그래머로 읽은 원본 BIOS 이미지에서 PchSetup 주변 바이트 시퀀스를 찾아 xDCI Support bit만 01로 패치하고 다시 플래시하자 xDCI가 활성화됨
  • 이 방식은 여전히 SPI 칩 reflashing이 필요하지만, Advanced 페이지 패치와 Boot Guard 우회가 필요 없고 TPM도 깨지지 않았음
  • BIOS 1.37에서 NVRAM을 패치한 뒤 1.61로 업데이트했을 때 BIOS 설정 값이 유지돼 패치를 다시 적용할 필요가 없었음

xDCI로 USB 장치 에뮬레이션하기

  • 모든 예제는 xDCI가 BIOS에서 활성화돼 있고, intel_xhci_usb_sw-role-switchdevice로 전환돼 있으며, VBUS가 끊긴 케이블로 xDCI 포트와 USB host가 연결돼 있다는 전제를 가짐
  • Legacy gadget drivers

    • Linux USB Gadget 서브시스템의 legacy gadget drivers는 모듈을 로드하면 특정 USB class 장치를 에뮬레이션함
    • g_mass_storage는 파일 시스템 이미지를 USB mass storage 장치로 노출함
    • FAT 이미지 disk.img를 만들고 file.txtHi from xDCI를 넣은 뒤 sudo modprobe g_mass_storage file=./disk.img stall=0로 로드함
    • USB host에서 드라이브가 자동 마운트되고 파일 내용이 확인됨
  • Raw Gadget

    • Raw Gadget을 xDCI와 함께 실행해 USB 키보드 예제를 시도함
    • 처음에는 SET_CONFIGURATION 처리 중 멈췄음
    • 원인은 dwc3와 몇몇 UDC 드라이버가 0-length control request를 gadget driver 확인 없이 즉시 acknowledge할 수 있다고 가정한 점이었음
    • Raw Gadget에 workaround patch를 적용하고 GadgetFS도 수정한 뒤 키보드 에뮬레이션이 성공함
    • 관련 동작은 문서 패치 commit로 정리됨

syzkaller와 Facedancer 활용

  • syzkaller는 Raw Gadget을 사용해 Linux 커널 USB 스택을 외부 퍼징할 수 있음
  • 기본 syzkaller USB 퍼징은 커널 내부에서 virtual USB Device와 Host controller를 연결하는 Dummy HCD/UDC를 사용함
  • xDCI를 쓰기 위해 syzkaller의 UDC 지정 코드를 dummy_udc 대신 dwc3-gadget, dwc3.1.auto로 바꿈
  • syzkaller가 발견한 WARNING in smsusb_start_streaming/usb_submit_urb 버그의 reproducer를 syz-execprog -enable=usb로 실행함
    • Ubuntu 5.15.0-91-generic 커널을 host로 둔 노트북에서 usb_submit_urb 경고가 재현됨
    • 해당 버그는 smsusb 드라이버가 USB endpoint type 검증을 빠뜨려 발생한 WARNING이며, 해로운 동작은 아니었음
  • Facedancer는 Python 기반 USB 장치 에뮬레이션 프레임워크임
    • Raw Gadget 기반 Facedancer backend는 아직 prototype이고 out-of-tree Raw Gadget 패치에 의존함
    • BACKEND=rawgadget, RG_UDC_DRIVER=dwc3-gadget, RG_UDC_DEVICE=dwc3.1.auto를 설정하고 rubber-ducky.py 예제를 실행하자 정상 동작함
  • Raw Gadget 기반 USB Proxy도 xDCI와 함께 실행됐고, xDCI를 이용하면 노트북을 USB sniffer나 USB Man-in-the-Middle 도구로 사용할 수 있음

다른 기기와 소프트웨어 방식의 가능성

  • ThinkPad X1 Carbon 6th Gen 외 다른 PC에서도 xDCI 활성화가 가능할 수 있음
    • 가장 단순한 경우 BIOS 설정에서 xDCI를 켜는 것만으로 동작할 수 있음
    • ACPI와 role switching 지원이 있고 xDCI 포트가 외부 포트에 배선돼 있어야 함
  • 다른 ThinkPad도 xDCI BIOS 설정이 숨겨지고 보호돼 있을 가능성이 있어 SPI 칩 reflashing이 필요할 수 있음
    • NVRAM 방식은 Boot Guard 우회 없이 적용 가능함
    • 일부 최신 시스템의 SPI 칩은 RPMC로 reflashing이 보호될 수 있으며, 이런 칩은 W25R128FW처럼 이름에 R이 포함될 수 있음
  • 업데이트에 따르면 Shiny Quagsire는 XPS 13과 Surface Go 1에서 grub-mod-setup_varPchSetup 변수를 수정해 xDCI를 활성화한 적이 있음
    • 해당 기기에서는 PchSetup 변수가 보호되지 않아 순수 소프트웨어 방식이 가능했음
  • 다른 소프트웨어 접근으로는 BIOS 취약점을 이용해 xDCI 관련 NVRAM 변수를 바꾸거나, 부팅 중 DMA로 BIOS를 공격해 임의 코드를 실행하는 방법이 가능할 수 있음
  • 제목의 “secret”은 의도적 은닉이라기보다 문서화되지 않은 기능을 가리키는 표현에 가까움

댓글과 토론

Hacker News 의견들
  • 노트북을 다른 컴퓨터용 범용 키보드와 모니터로 쓰는 기능이 왜 흔하지 않은지 늘 궁금함
    헤드리스 머신 유지보수하려고 키보드와 모니터를 새로 사는 건 이상한데, 이미 노트북이 그 역할을 할 수 있기 때문임

    • GPD Pocket 3에는 정확히 이걸 해주는 KVM 모듈이 있음: HDMI와 USB-C 입력을 받아, 연결된 머신의 디스플레이·키보드·마우스처럼 동작함: https://gpd.hk/gpdpocket3
      곧 나올 Minisforum V3 태블릿도 영상 입력이 있어서 외부 모니터처럼 쓸 수 있지만, 키보드와 마우스까지 공유되지는 않을 것 같음
      이런 기능이 더 흔해지면 정말 좋겠음
    • 맞음. 친구가 이것만을 위해 사이버덱을 만들었음
      마우스와 키보드를 외부 포트로 전환해 다른 머신에 케이블로 연결할 수 있고, 옆면에는 HDMI 포트가 두 개 있어서 하나는 출력, 하나는 입력임
      내부 스위치로 덱 자체 머신이나 외부 입력 중 어느 쪽을 모니터 소스로 쓸지 고를 수 있음
    • 헤드리스 머신을 자주 다루는 입장에서, 노트북을 모니터로 쓰는 가장 좋은 해법은 이 제품이었음: https://www.amazon.com/dp/B0BJ2YDV7Q
      기본적으로 헤드리스 머신의 HDMI 신호를 캡처해서 USB를 통해 노트북에 에뮬레이션된 웹캠으로 노출하는 칩이고, 전자부품이 케이블 안에 들어갈 만큼 작음
      키보드는 표준 무선 키보드, 드물게 마우스가 필요할 때를 대비해 트랙패드 내장형을 사는 것 말고는 좋은 해법을 못 찾았음
    • 컴퓨터 하나를 다른 컴퓨터에 그냥 연결할 수 없다는 점이 늘 불편했음
      듣기로는 USB 4에 이걸 가능하게 하는 모드가 있다고 함
    • hidclient를 쓰면 노트북이 블루투스 키보드와 마우스인 척할 수 있음
      https://web.archive.org/web/20180610141436/http://anselm.hoffmeister.be/computer/hidclient/index.html.en
      https://github.com/benizi/hidclient
  • 몇 년 전 Travis Goodspeed가 했던 일로 기억나는 사례가 떠오름
    스마트 TV가 일반 USB 메모리의 파일로 펌웨어 업데이트를 받았고, TV는 디지털 서명을 확인하려고 파일을 처음부터 끝까지 읽은 뒤 업데이트를 위해 다시 읽었음
    USB 저장장치인 척하는 장치라면 첫 번째 읽기에는 제조사 펌웨어 파일을 보내고, 두 번째에는 비공식 펌웨어를 보낼 수 있음

  • 정말 흥미로움. 비슷하게 실현 가능한 선택지를 조사해 왔음
    쓸 구실을 계속 찾고 있는 강력한 NAS 서버가 있고, 집 안 곳곳에 40G와 10G 연결도 해둠
    PS5와 XBox는 추가 저장공간으로 USB 하드디스크를 쓰고 있음
    NAS 저장공간을 PS5와 XBox에 노출할 수 있는지 알아보니 가능했음. NAS 공유를 iSCSI나 NFS로 마운트한 뒤, g_mass_storage 모듈로 USB 저장장치를 에뮬레이션해 해당 저장공간을 USB 호스트에 노출하면 됨
    현재 큰 걸림돌은 시간과 비용 외에도 이런 시스템이 제공할 대역폭임. 업그레이드 폭이 그리 크지 않음
    Raspberry Pi는 USB-OTG를 지원하는 것으로 유명하지만 USB 2.0 속도에 머물고, 찾아본 같은 급의 다른 SBC들도 대부분 마찬가지였음. 예외는 RockPi4였고, RockPi는 기가비트 이더넷 포트가 있어 이더넷을 꽉 채우면 PS5와 Xbox 모두에 안정적인 HDD 속도를 제공할 수 있음
    커스텀 PCIe 네트워크 카드나 익스프레스 카드를 꽂아 1GbE를 넘길 수 있는 해법을 만들면 USB 3.0 인터페이스를 제대로 포화시킬 수 있어 꽤 흥미로울 것 같음

    • 비슷한 홈랩 구성이 있고, https://www.virtualhere.comIP 기반 USB를 실험해 보는 중임
      서버와 통신할 클라이언트가 필요하긴 하지만 꽤 잘 동작하는 듯함
      책상 위에 “얇은 USB 클라이언트”를 두고 USB 장치를 거기에 연결한 뒤, 실험실의 원하는 물리 호스트나 VM 호스트로 붙이거나 전환하는 구성을 생각 중임
    • PS5와 NAS는 물리적으로 어떻게 연결하는지 궁금함
      NAS → SBC → PS5라고 추측하는데, 아니면 NAS를 PS5에 USB 케이블로 직접 연결하는 건가?
      PS5에서 콘텐츠 재생은 어떻게 되는지도 궁금함. 내부 NVMe는 특정 속도를 만족해야 하는 걸로 아는데, 외장 드라이브에는 적용되지 않는 건가?
    • Raspberry Pi 5에는 기가비트 이더넷 포트가 있고, FriendlyElec의 NanoPi 계열 같은 다른 SBC들도 마찬가지임
      실제로 NanoPi R6S는 1기가비트 포트에 더해 2.5G 이더넷 포트 두 개를 갖고 있음
  • 매우 상세한 글이라 고마움. 품질이 좋음
    이게 가능했다는 사실 덕분에, 수정된 USB 케이블만으로 네트워크 없는 Synergy / Mouse Without Borders 같은 구성이 가능할지도 모른다는 희망이 생김
    여러 컴퓨터를 동시에 조작해야 하는 사람에게는 아주 좋은 방향임

    • KVM 스위치가 있긴 하고, 영상 없이 USB 키보드·마우스만 전환하는 장치도 있음
      그래도 제안한 방식은 흥미롭게 들림
  • 최근 비슷한 걸 알아봤는데, USB-C 머신 두 대를 USB-C 케이블 하나로 연결해 10Gbps 통신을 하고 싶었음
    아쉽게도 대부분의 Ryzen 보드는 아직 Thunderbolt가 없고, Thunderbolt라면 이걸 네이티브로 쉽게 지원함
    “듀얼 롤” USB 컨트롤러도 USB 3.2/4.0 전까지는 꽤 드물었고, 이 글에서 다루듯 가능하더라도 지원되지 않는 경우가 많았음
    Thunderbolt 없이 USB-C 케이블로 머신 두 대를 네트워크로 묶는 일이 이렇게 어렵다는 게 완전히 이상하게 느껴짐
    일시 중단 후 잠금 비트가 해제되는 부분도 좋았음. 이런 문제는 정말 흔함. 예를 들어 SATA 장치가 보안 삭제를 막는 상태에서 벗어나게 할 때도 매우 흔한 방식임

  • 깊이가 인상적인 수준임
    PC를 USB 장치로 쓸 수 있으면 재미있는 가능성이 많이 열림
    필요한 xDCI 옵션이 이 장치의 하드웨어에는 있지만 노출되지 않았고, 접근하려면 펌웨어 해킹이 필요하다는 점은 조금 안타까움
    하드웨어는 가능한데, 제조사가 그냥 꺼두고 제어 기능을 잠가둔 셈임

  • Lenovo가 ThinkPad 하나로 다른 ThinkPad를 디버깅하는 경로로 이걸 쓰는지 궁금함
    https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/secure-coding/intel-debug-technology.html
    업데이트: 아마 맞는 듯함
    https://www.youtube.com/watch?v=ExUvQa_jB7c
    Intel Firmware를 DCI와 USB 3.0으로 디버깅하는 영상임

  • “하지만 Raspberry Pi를 다루는 건 번거롭다: 선 연결, 보드 부팅, 셸 접속 등”이라는 부분은 아마 USB OTG를 설정하면 됐을 것 같음
    꽂은 장치에서 전원을 받게 하고, 셸을 켠 뒤 스크립트로 처리할 수 있었을 듯함
    그러면 SSH로 마운트 설정이나 명령 실행을 하고, 아마 장치 마운트까지 가능했을 것임
    그래도 자기 장치를 이해하고 커널을 읽어보려는 시도는 권장함. 계속 더 잘하고 싶은 일이고, 우리 장비는 우리가 고치자는 느낌임

    • 이 실험의 핵심 자체가 USB OTG를 다루는 것이고, Pi에는 OTG 포트가 하나뿐이라 접속하려면 다른 방법이 필요함
      직접 해봤음
  • 초기 인터넷 해커 문화가 강하게 떠올라서 향수를 자극할 정도임. 정말 훌륭한 글임
    ESR이 해커가 되는 것, Hacker News 의미의 해커를 이야기할 때 말한 사람이 바로 이런 유형이었음
    호기심, 끈기, 기술력이 결합된 모습은 극히 드물고 크게 인상적임

  • Celeron N3350/Pentium N4200/Atom E3900 기반 시스템을 갖고 있는데, BIOS에 xDCI 스위치가 노출되어 있음
    활성화하면 다른 옵션들도 몇 개 생기고, Linux로 부팅하면 PCI 장치 USB controller: Intel Corporation Device 5aaa (rev 0b)가 보임
    하지만 UDC 장치 노드는 나타나지 않음. 원글에서 힌트를 얻어 좀 더 파봐야 할 것 같음