Sửa thiết bị capture HDMI Elgato HD60 S bằng Ghidra
(downtowndougbrown.com)- Elgato Game Capture HD60 S vốn không được nhận qua USB đã khôi phục bình thường chức năng capture HDMI và passthrough sau khi thay 3 IC nguồn làm kéo sụt đường nguồn
- Bằng ảnh nhiệt, đo điện áp và tra cứu ký hiệu SMD, đã xác định được 2 bộ ổn áp Fitipower FP6373A và bộ đảo điện áp TI TPS60403DBV; giá linh kiện theo LCSC đều dưới 1 USD
- Chức năng capture đã hoạt động trở lại nhưng đèn trạng thái gồm 7 đèn trắng và 7 đèn đỏ vẫn tắt; việc điều khiển trực tiếp bằng Raspberry Pi Pico xác nhận cả driver LED lẫn cụm LED đều hoạt động bình thường
- Sau khi phân tích firmware Nuvoton M031LD2AE và SPI flash cho Cypress/Infineon CYUSB3014 bằng Ghidra, phát hiện dữ liệu animation LED lẽ ra phải có từ địa chỉ 0x300000 lại bị trống hoặc hỏng
- Chỉ cần ghép riêng vùng dữ liệu LED từ một chiếc HD60 S bình thường vào SPI flash của thiết bị lỗi thì đèn trạng thái đã sống lại, cho thấy lỗi còn lại không phải phần cứng mà nằm ở phần mềm, lập trình hoặc quy trình cập nhật
Sửa mạch nguồn của HD60 S không được nhận qua USB
- Elgato Game Capture HD60 S USB 3.0 mua trên eBay ở tình trạng hỏng khi cắm vào thì máy tính không hiển thị gì
- Mở bo mạch ra đo điện áp thì thấy đường nguồn bị kéo xuống thấp, và dùng camera nhiệt để tìm con chip bị nóng lên
- Các linh kiện có vấn đề là những IC nguồn chỉ có ký hiệu rất ngắn
- 2 chip ghi
fiVJVEnằm gần cuộn cảm 2.2µH nên được suy đoán là switching regulator - Sau khi tra ký hiệu SMD và đối chiếu tài liệu của Fitipower, phạm vi được thu hẹp còn FP6373A
- Chip ghi
PFNIđược xác nhận qua Google là bộ đảo điện áp TI TPS60403DBV
- 2 chip ghi
- Cả ba chip đều nhận đầu vào 5V, phía đầu ra có điện trở thấp; khi bơm trực tiếp 2.7V vào đường ra của một FP6373A thì chính bộ ổn áp đó nóng lên
- FP6373A có thể mua ở LCSC với giá $0.17 mỗi con, còn chip TI là $0.58; phí vận chuyển cao hơn giá linh kiện rất nhiều
Vấn đề đèn trạng thái còn lại sau khi thay linh kiện
- Sau khi thay ba IC nguồn, HD60 S đã được nhận là thiết bị USB và chức năng capture HDMI cùng passthrough hoạt động bình thường
- Tuy nhiên, đèn báo trạng thái của thiết bị vẫn không sáng
- Có 7 LED trắng và 7 LED đỏ
- LED trắng phải nhấp nháy hai lần ngay sau khi kết nối
- Chip liên quan đến LED là IT1504 của Innochip, theo datasheet là driver LED 16 kênh
- Quan sát chân vào của IT1504 bằng oscilloscope cho thấy có luồng dữ liệu nối tiếp tương tự SPI đi vào
- Lần theo PCB cho thấy IT1504 được điều khiển bởi vi điều khiển ARM Cortex-M0 Nuvoton M031LD2AE
Tìm linh kiện thay thế IT1504 và kiểm chứng mạch
- IT1504 khó mua trên các kênh phân phối thông thường, còn Innochip chỉ có hàng theo cuộn đầy đủ nên không thể gửi mẫu
- Trong quá trình tìm hàng thay thế, đã phát hiện MBI5040 của Macroblock
- Datasheet của MBI5040 gần như giống hệt datasheet IT1504 về cấu trúc và sơ đồ khối
- Thông số dòng ra hơi khác một chút nhưng chức năng và tập lệnh rất tương đồng
- Thông tin lệnh trong datasheet MBI5040 giúp hiểu cách điều khiển LED
- Đã mua MBI5040GF và gắn thay IT1504 nhưng LED vẫn không sáng
- Dùng nguồn bench và điện trở để thử bật từng LED thì thấy bản thân LED vẫn tốt
- Khi nối trực tiếp Raspberry Pi Pico vào đầu vào MBI5040 và gửi lệnh, có thể điều khiển LED hoàn toàn
- Từ đó kết luận mạch driver LED và cụm LED không có lỗi vật lý
- Gắn lại IT1504 gốc thì điều khiển bằng Pico vẫn hoạt động bình thường, chứng tỏ driver LED ban đầu cũng không hỏng
Phân tích firmware MCU Nuvoton bằng Ghidra
- Đã hỏi bộ phận hỗ trợ của Elgato về lỗi đèn trạng thái hoặc tùy chọn cài đặt liên quan nhưng không nhận được giải pháp thực tế
- Để kiểm tra firmware của Nuvoton MCU, đã lần theo đầu nối JST 4 chân trên bo và xác nhận đây là đầu nối để lập trình MCU
- Thử đọc bằng Nu-Link2-Me và NuMicro ICP Programming Tool nhưng nội dung chip đã được bảo vệ
- Thay vào đó, đã tìm thấy file
FW_HD60_S_MCU.binđi kèm trong Elgato 4K Capture Utility- Theo
ElgatoDeviceCapabilities.json, firmware này dành cho thiết bị có USB product ID 0x0076 - Elgato gọi nó là “Game Capture HD60 S Rev.4”
- Theo
- File nhị phân trông giống firmware Cortex-M0; word đầu tiên
0x20000E70giống một stack pointer hợp lệ, còn các word tiếp theo trông như vector table dạng địa chỉ flash - Đã nạp firmware vào Ghidra và dùng SVD-Loader để thử ánh xạ thanh ghi
- Chỉnh sửa
M031AE_v1.svdtrong NuMicro_DFP để plugin có thể nạp được - M031BSP của Nuvoton hữu ích cho việc nhận diện hàm
- Chỉnh sửa
Thay MCU và mở khóa để debug
- Khi gắn một chip M031LD2AE trống mới thay cho chip gốc rồi flash firmware của Elgato, thiết bị có hoạt động nhưng chip lại bị chuyển về trạng thái bảo vệ nên không thể debug
- Đã tìm trong Ghidra hàm cập nhật thiết lập bảo vệ và vá để chip không bị khóa lại
- Sau khi nạp firmware đã vá, có thể debug mã khởi tạo bằng OpenOCD và GDB
- Đường đi mã điều khiển LED có tồn tại trong firmware nhưng trong luồng thực thi bình thường lại bị bỏ qua
- Khi dùng GDB ép các thanh ghi và giá trị RAM để mã điều khiển LED được chạy, có thể bật đèn lên
- Firmware có chứa mã điều khiển LED
- Vấn đề là đoạn mã đó không được thực thi trong điều kiện bình thường
Bootloader và sao lưu toàn bộ firmware
- Đã cài firmware đã tắt bit bảo vệ lên một chiếc HD60 S khác qua quy trình cập nhật của Elgato để thử đọc toàn bộ nội dung vốn bị bảo vệ
- Sau cập nhật, thiết bị có vẻ không còn hoạt động như một capture card, nhưng con chip đã được mở khóa đúng như mong muốn
- Nhờ đó có thể đọc được các vùng sau
- LDROM: bootloader giai đoạn 1 của Elgato
- data flash
- các giá trị thanh ghi cấu hình gốc
- firmware ứng dụng APROM
- Bootloader LDROM có thể nhận lệnh và dữ liệu qua I2C để flash lại APROM
- Khi chip ở trạng thái bỏ bảo vệ, bootloader không nhảy vào firmware ứng dụng mà chờ lệnh cập nhật
- Elgato dường như dùng các bit khóa/mở khóa như tín hiệu cho biết có nên ở trạng thái chờ bootloader hay không
- Điều này cũng giải thích vì sao thiết bị bị treo sau khi cài firmware đã mở khóa
Hiểu cấu trúc bên trong của HD60 S
- Bên trong thiết bị có hai bộ xử lý họ ARM cùng hoạt động
- Chip ngoại vi USB 3.0 Cypress/Infineon CYUSB3014 là ARM926EJ-S và giao tiếp với PC qua USB 3.0
- MCU Nuvoton M031LD2AE Cortex-M0 điều khiển chip video ITE và LED
- Nuvoton MCU cấu hình và giám sát các chip ITE qua một bus I2C riêng
- ITE IT6802E có vẻ là bộ thu HDMI
- ITE IT66121FN có vẻ đảm nhiệm việc đưa luồng dữ liệu song song ra HDMI
- CYUSB3014 gửi lệnh cho Nuvoton MCU qua I2C, còn Nuvoton trả thông tin trạng thái về lại CYUSB3014
- CYUSB3014 nhận luồng dữ liệu video từ IT6802E và chuyển cho máy tính qua USB
- Trên bo còn có CPLD Altera MAX II, có vẻ tham gia để dữ liệu video đi vào CYUSB3014 ở định dạng mà chip này có thể nhận
Phát hiện SPI flash và dữ liệu animation LED
- Firmware của CYUSB3014 được lưu không bảo vệ trong SPI flash 4MB Winbond W25Q32JVSSIQ
- Khi xem dump SPI flash, từ offset 0x300000 xuất hiện các khối dữ liệu trông như hình nhỏ
- Lần theo 5 GPIO chưa rõ chức năng trong firmware Nuvoton thì thấy các chân này nối tới bus switch quad 2:1 mux/demux PI5C3257 của Diodes Incorporated
- Bus switch này dùng để chọn chủ thể điều khiển SPI flash giữa CYUSB3014 và Nuvoton MCU
- Ban đầu tưởng SPI flash chỉ dành cho CYUSB3014
- Thực tế sau khi CYUSB3014 khởi động, Nuvoton MCU sẽ giành quyền điều khiển SPI flash
- Trong Ghidra, các hàm vừa được nhận diện mới liên quan tới transaction SPI bit-bang và mã xóa/đọc/ghi SPI flash
Nguyên nhân thật sự của lỗi LED
- Dữ liệu sau địa chỉ 0x300000 trong SPI flash không phải hình ảnh thông thường mà là khung animation LED
- Mỗi khối 16 byte là một khung animation dùng cho 14 LED
- 2 byte cuối mỗi dòng là thời gian trễ trước khi chuyển sang khung tiếp theo
- Firmware Nuvoton kiểm tra xem 2 byte đầu ở vị trí bắt đầu 0x300000 có phải giá trị 16 bit 0xAA55 hay không
- Trong dump SPI flash của hai thiết bị không chạy LED, vùng này bị trống hoặc hỏng
- Ở một dump, khu vực 0x300000 gần như bị điền toàn
0x00 - Một số animation bắt đầu bằng header bất thường như
AB 03 12 39
- Ở một dump, khu vực 0x300000 gần như bị điền toàn
- Trong SPI flash của chiếc HD60 S thứ ba hoạt động bình thường, tại 0x300000 có header và dữ liệu LED chính xác
- Word 16 bit đầu tiên đúng là
0xAA55như firmware mong đợi - Header có chứa thông tin liên quan tới 26 animation LED
- Dữ liệu dot correction được nạp vào IT1504 nằm tại 0x3007F8, còn
0x521114A7theo sau là CRC-32 của 16 byte phía trước
- Word 16 bit đầu tiên đúng là
Khôi phục LED bằng cách vá SPI flash
- Trên SPI flash của thiết bị lỗi, vùng từ 0x000000 tới 0x2FFFFF giữ lại dữ liệu riêng của từng máy
- Lý do là serial USB nằm đâu đó trong khu vực này
- Đã tạo một ảnh hybrid bằng cách chỉ thay vùng dữ liệu LED từ 0x300000 trở đi bằng dữ liệu lấy từ dump của thiết bị bình thường
- Khi flash ảnh này vào thiết bị lỗi LED, LED trắng nhấp nháy hai lần và LED đỏ sáng lên thoáng chốc một lần
- Dù thiết bị bình thường là revision cũ hơn và MCU Nuvoton cũng khác mẫu, dữ liệu LED vẫn khớp với định dạng mà firmware mới mong đợi
- Dữ liệu thô animation cũng tồn tại trong ứng dụng Game Capture cũ trên Windows và Mac
- Đường dẫn trên Windows là
C:\Program Files\Elgato\GameCapture\Animations - Đường dẫn trên Mac là
/Applications/Game Capture HD.app/Contents/Resources/Animations - Nếu sắp xếp lại dữ liệu trong các file như
01.ani,02.ani... theo đúng thứ tự LED thì sẽ khớp với dữ liệu animation trong dump flash bình thường
- Đường dẫn trên Windows là
Hạn chế của công cụ cập nhật và quy trình khôi phục
- Công cụ cập nhật firmware trên Windows của Elgato 4K Capture Utility gặp vấn đề là không chờ đủ lâu
- Trong khi quá trình cập nhật vẫn đang diễn ra thì nó đã báo thất bại
- Nếu cứ tiếp tục chờ, LED trên thiết bị sẽ nhấp nháy và máy sẽ khởi động lại bình thường với firmware mới
- Nếu rút thiết bị ngay sau thông báo lỗi thì có thể để lại bản flash chưa hoàn chỉnh
- Tăng giá trị
updateDurationSectrongElgatoDeviceCapabilities.jsontừ 40 lên 80 sẽ giải quyết được vấn đề này - Elgato khuyến nghị không nên cập nhật firmware HD60 S trừ khi được bộ phận hỗ trợ kỹ thuật yêu cầu, và tính năng này cũng bị ẩn sau một tổ hợp phím đặc biệt trong màn hình cài đặt
- Quy trình khôi phục LED khá phức tạp
- Sửa
ElgatoDeviceCapabilities.jsonđể cho phép cập nhật firmware - Rút thiết bị ngay sau khi bắt đầu cập nhật để buộc chip Cypress nắm quyền điều khiển SPI flash
- Tháo jumper trên PCB để CYUSB3014 khởi động từ USB
- Dùng
download_fx3trong Cypress SDK để nạpcyfxflashprog.imgvào RAM - Dùng
fx3_spitestđã chỉnh sửa để dump toàn bộ SPI flash và vá vùng LED - Gắn lại jumper rồi thực hiện cập nhật firmware bình thường bằng 4K Capture Utility để khôi phục firmware Nuvoton
- Sửa
- Cuối cùng, phần sửa chữa ban đầu thực chất chỉ kết thúc bằng việc thay 3 chip giá chưa tới 1 USD, còn lỗi LED được xác định là một trục trặc liên quan đến phần mềm, lập trình hoặc quy trình cập nhật trên một số HD60 S
1 bình luận
Ý kiến trên Hacker News
Khó hiểu được mục đích trong toàn bộ cấu trúc, và đôi khi nó bị chôn sâu trong nhiều tầng gọi hàm
Ngay cả khi xem trực tiếp mã nguồn cũng thường gặp chuyện này. Phần lớn phần mềm bị trừu tượng hóa quá mức, còn MCU thì ngày càng lớn và rẻ đến mức trong lĩnh vực nhúng cũng bắt đầu thấy những chuyện như một thiết bị capture HDMI có tới hai lõi ARM. Có lẽ thiết bị này không cần nhiều hơn một MCU
Khoảng 20 năm trước, khi lớn lên ở Ấn Độ, sức mua thấp và đồ đạc đắt đỏ nên gần như mọi thứ đều được sửa hoặc tân trang để dùng tiếp
Để làm cho đồ vật hoạt động, người ta dùng đủ kiểu giải pháp tạm bợ gọi là jugaad, quần áo cũng được tái sử dụng, và thợ may sẽ vá đắp kiểu rafu để kéo dài tuổi thọ. Điều này đặc biệt phổ biến trong các gia đình trung lưu như nhà tôi
Cha tôi, người làm việc ở một công ty xuất khẩu may mặc, thường nói rằng người phương Tây chuộng đồ dùng một lần và đồ mới, dù là ô tô, đồ điện tử hay quần áo; khi đó tôi không hiểu được lối suy nghĩ ấy. Nhưng giờ đây, khi sức mua tăng lên và giá cả giảm xuống nhờ Trung Quốc, chúng tôi cũng đang nghiêng về việc vứt đi và mua mới
Tôi rất kính trọng những người không bỏ cuộc giữa chừng và không chỉ nghĩ rằng mua mới thì dễ hơn. Sự kiên trì và tháo vát như vậy thật sự đáng được khen ngợi
Nếu có thể tự sửa và kiếm được linh kiện cần thiết thì ổn. Nhưng nếu phải trả tiền cho kinh nghiệm và kiến thức của ai đó, thì ít nhất ở nơi tôi sống, việc đó khá đắt và cũng khó tìm được người sửa. Bên ngoài các cửa hàng trống chỉ thấy rất nhiều biển sửa TV
May là tôi đã bán nghỉ hưu và đang làm theo giờ, nên thời gian thêm của tôi không có chi phí tiền bạc. Vì vậy tôi có thể dành một ngày để thử sửa máy rửa bát, rồi nếu vài ngày sau nó lại hỏng thì lại dành thêm một ngày để lắp cái mới. Một thợ lắp đặt chuyên nghiệp có lẽ sẽ lắp sản phẩm mới trong một giờ, nhưng ít nhất tôi không phải chờ đến khi xếp được lịch
Chỉ trong khoảng 50 năm trở lại đây, chủ nghĩa tiêu dùng mới phát triển mạnh, còn chất lượng và giá của những thứ như quần áo thì giảm xuống
Gần đây tôi đang tự bảo dưỡng xe máy; ban đầu cần đầu tư một ít dụng cụ, chẳng hạn như dụng cụ tháo lọc dầu, và cũng phải kiếm linh kiện cùng vật tư tiêu hao. Những thứ như dầu nhớt, vòng đệm đồng, ốc thay thế cho con ốc bình chứa dầu phanh cũ. Dù vậy, tổng chi phí chỉ khoảng €100~€150 thay vì €1000 như gara báo
Mẹ tôi lúc nhỏ thì lên gấu quần, rồi khi chúng tôi lớn lên lại hạ gấu xuống, và khi đầu gối hay khuỷu tay bị mòn thì vá thêm
Môi trường như vậy gieo vào tôi cả thói quen tốt lẫn thói quen xấu. Tôi tự làm gần như mọi việc sửa chữa trong nhà, nhưng vì làm việc quá nhiều nên không phải lúc nào cũng có đủ thời gian hay năng lượng. Dù hoàn toàn có khả năng chi trả, tôi vẫn thấy khó trả tiền để người khác làm, nên cuối cùng để đồ hỏng nằm đó lâu hơn cần thiết
Nếu dùng thời gian đó cho các dự án phụ thay vì bảo trì và sửa chữa, có lẽ tôi đã kiếm được nhiều tiền hơn
Những người đó dạy người khác đến mức cơ bản, và giúp đỡ khi có vấn đề bất ngờ phát sinh. Có thể nói tri thức và hình thức học nghề cơ bản đã được tích hợp trong cả cộng đồng
Ngày nay sửa chữa đã trở thành việc làm một mình. Những thứ như YouTube giúp ích rất nhiều, nhưng khía cạnh cộng đồng đã biến mất
Tác dụng phụ đáng tiếc là sửa chữa và tái sử dụng trở nên kém hấp dẫn hơn, kéo theo khả năng sửa được và tuổi thọ dài cũng trở nên ít quan trọng hơn như một tính năng sản phẩm. Giờ đây, khi tăng trưởng kinh tế của Mỹ, đặc biệt đối với 99% dân số, đã đình trệ, những gì chúng ta đánh mất đang lộ rõ. Không còn đồ vật được làm ra để bền lâu, và các công ty cũng không hoặc không thể cung cấp sản phẩm sửa được và dùng lâu. Vì thế ngay cả những người cố tình nỗ lực sửa đồ của mình cũng gặp vô số rào cản
Đoạn nhận ra rằng khối dữ liệu trong chip flash là ảnh thật thú vị. Không phải ảnh theo nghĩa thông thường, mà là dữ liệu mô tả nhiều hoạt ảnh LED
Tôi từng tự tạo một định dạng tương tự cho hoạt ảnh đèn Hue. Chỉ khác là nó là văn bản chứ không phải nhị phân
bulb1 bulb2dly R G B WW CW R G B WW CW100 10 25 20 0 0 25 10 20 0 0200 10 50 20 0 0 50 10 20 0 0Giá trị đầu tiên là số mili giây chờ trước khi chuyển sang dòng tiếp theo, sau đó là độ sáng của từng kênh LED tính theo thang 100. Dòng bắt đầu bằng ký tự không phải số là chú thích, và giữa các kênh có thể có tùy ý một hoặc nhiều khoảng trắng
Thật vui khi thấy một định dạng nhị phân tương tự trong sản phẩm thương mại. Thực ra cách này khá hiển nhiên, nhưng tận mắt thấy vẫn thú vị
https://en.wikipedia.org/wiki/Piano_roll
Một bài viết khiến người ta thấy khiêm nhường. Đây mới là kỹ thuật full-stack thật sự
Tôi muốn xem Elgato sẽ phản ứng với bài viết này như thế nào
Theo trải nghiệm của tôi, sản phẩm Elgato rẻ nhưng cực kỳ thiếu ổn định. Bài viết này cho thấy rất chi tiết lý do
Phần mềm cũng có đủ chức năng mong muốn, có thể tự viết plugin, và quy trình tạo plugin cũng được tài liệu hóa. Tất cả đều thật sự ổn
Nhưng trên thực tế tôi phải liên tục tắt bật nguồn Key Light, và trên Windows cũng phải liên tục khởi động lại ứng dụng Stream Deck
Tôi tự hỏi làm sao họ giữ được động lực trong những dự án như thế này. Phải liên tục đặt linh kiện rồi chờ chúng đến, đặc biệt các linh kiện từ Trung Quốc, và trong lúc chờ thì tôi đã bỏ cuộc khá nhiều dự án
Nếu tôi đếm đúng, tác giả đã đặt hàng ít nhất ba lần. Dù vậy, thật sự rất thú vị
Nếu không có camera nhiệt, có thể bôi cồn sát trùng lên bo mạch và xem chỗ nào bay hơi nhanh nhất
Tất nhiên phương pháp này chỉ dùng được với thiết bị điện áp thấp
Khả năng truy tìm sự thật và lần theo đến cùng khiến chúng ta trở nên thiêng liêng, là mặt người trong việc tạo ra và cải thiện thứ gì đó. Người này đã đi một con đường tâm linh rất sâu khi khám phá một vật dụng trần tục
Thật quá buồn, bực bội và như địa ngục khi các thiết bị chống lại chúng ta. Máy tính và thiết bị nên khuếch đại và phát ra sự thật cấu thành nên chúng. Nhưng nhân loại đang bị mắc kẹt trong lớp vỏ do chính mình tạo ra, trong chủ nghĩa tiêu dùng từ trên xuống vốn từ chối khả năng tham gia và học hỏi. Đặc biệt, máy tính thường trở thành những thiết bị làm mờ đục tiêu biểu che khuất sự thật và sự hiểu biết. Tiềm năng khổng lồ đang bị lãng phí quá nhiều
Tôi hy vọng khi còn sống sẽ thấy một làn sóng đột phá nơi các cỗ máy mở xuất hiện. Xin vỗ tay cho Doug