Ghidra की मदद से Elgato HD60 S HDMI capture device की मरम्मत
(downtowndougbrown.com)- Elgato Game Capture HD60 S जिसे USB पर पहचाना नहीं जा रहा था, उसमें power rail को नीचे खींच रहे 3 power IC बदलने पर HDMI capture और passthrough सामान्य रूप से वापस काम करने लगे
- thermal imaging, voltage measurement और SMD marking search से 2 Fitipower FP6373A regulator और TI TPS60403DBV voltage inverter की पहचान हुई, और LCSC के हिसाब से इन पार्ट्स की कीमत 1 डॉलर से कम थी
- capture function वापस आ गया, लेकिन 7 सफेद और 7 लाल status LED बंद थे; Raspberry Pi Pico से direct control करके पुष्टि हुई कि LED driver और LED array खुद सही थे
- Ghidra से Nuvoton M031LD2AE firmware और Cypress/Infineon CYUSB3014 के SPI flash को trace करने पर पता चला कि 0x300000 से मौजूद होना चाहिए LED animation data खाली था या खराब हो चुका था
- एक सही HD60 S के SPI flash से सिर्फ LED data region लेकर खराब डिवाइस के flash में मिलाने पर status LED फिर से काम करने लगे, और बाकी खराबी hardware नहीं बल्कि software, programming और update path की समस्या निकली
USB पर पहचाना न जाने वाले HD60 S के power section की मरम्मत
- eBay से खरीदा गया खराब Elgato Game Capture HD60 S USB 3.0 कनेक्ट करने पर भी कंप्यूटर पर कुछ दिखाई नहीं देता था
- बोर्ड खोलकर voltage मापा गया तो power rail नीचे खिंच रही थी, और thermal camera से गरम हो रहे chip ढूँढे गए
- समस्या वाले पार्ट छोटे marking वाले power IC थे
fiVJVEमार्किंग वाले 2 chip, 2.2µH inductor के पास थे, इसलिए उन्हें switching regulator माना गया- SMD marking search और Fitipower material की जाँच के बाद उन्हें FP6373A माना गया
PFNIमार्किंग वाला chip Google search से TI TPS60403DBV voltage inverter निकला
- तीनों chip में 5V input आ रहा था और output side का resistance कम था; एक FP6373A की output rail पर सीधे 2.7V inject करने पर वही regulator गरम होने लगा
- FP6373A, LCSC पर $0.17 प्रति piece और TI chip $0.58 में मिल रहा था, जबकि shipping cost पार्ट्स से काफी ज्यादा थी
पार्ट बदलने के बाद बची status LED समस्या
- तीनों power IC बदलने के बाद HD60 S USB device के रूप में पहचाना जाने लगा और HDMI capture व passthrough सामान्य रूप से काम करने लगे
- लेकिन डिवाइस की status lights अब भी चालू नहीं हुईं
- इसमें 7 सफेद LED और 7 लाल LED हैं
- सफेद LED को कनेक्ट होते ही दो बार blink करना चाहिए
- LED से जुड़ा chip Innochip का IT1504 था, जो datasheet के अनुसार 16-channel LED driver था
- oscilloscope से IT1504 input pin देखने पर SPI जैसी serial traffic आ रही थी
- PCB trace करने पर पता चला कि IT1504 को Nuvoton M031LD2AE ARM Cortex-M0 microcontroller control कर रहा था
IT1504 replacement की तलाश और circuit verification
- IT1504 सामान्य distribution channel में आसानी से नहीं मिल रहा था, और Innochip के पास stock सिर्फ full reel में था, इसलिए sample नहीं मिल सका
- replacement खोजते समय Macroblock का MBI5040 मिला
- MBI5040 datasheet का configuration और block diagram, IT1504 datasheet से लगभग समान था
- output current specs थोड़े अलग थे, लेकिन functionality और command set बहुत मिलते-जुलते थे
- MBI5040 datasheet की command information से LED control method समझने में मदद मिली
- MBI5040GF खरीदकर IT1504 की जगह लगाया गया, लेकिन LED फिर भी नहीं जले
- bench power supply और resistor से LED को एक-एक करके चलाने पर पता चला कि LED खुद सही थे
- Raspberry Pi Pico को सीधे MBI5040 input से जोड़कर command भेजने पर LED पूरी तरह control किए जा सके
- इससे तय हुआ कि LED driver circuit और LED array में कोई physical समस्या नहीं थी
- मूल IT1504 को वापस लगाने पर भी Pico control सामान्य चला, इसलिए पुराना LED driver भी खराब नहीं था
Ghidra से Nuvoton MCU firmware का analysis
- Elgato support से status LED से जुड़ी किसी known issue या setting के बारे में पूछा गया, लेकिन कोई उपयोगी समाधान नहीं मिला
- Nuvoton MCU का firmware जाँचने के लिए बोर्ड के 4-pin JST connector को trace किया गया और पुष्टि हुई कि यह MCU programming connector है
- Nu-Link2-Me और NuMicro ICP Programming Tool से read करने की कोशिश की गई, लेकिन chip content protected था
- इसके बजाय Elgato 4K Capture Utility में शामिल
FW_HD60_S_MCU.binfile मिलीElgatoDeviceCapabilities.jsonके अनुसार यह firmware USB product ID 0x0076 वाले device के लिए था- Elgato इसे “Game Capture HD60 S Rev.4” कह रहा था
- binary, Cortex-M0 firmware जैसी लगी; पहला word
0x20000E70valid stack pointer जैसा था और उसके बाद वाले word flash address वाले vector table जैसे दिखे - firmware को Ghidra में load किया गया और SVD-Loader से register mapping की कोशिश की गई
- NuMicro_DFP के
M031AE_v1.svdको modify करके plugin में load होने लायक बनाया गया - Nuvoton का M031BSP function identification में मददगार रहा
- NuMicro_DFP के
debugging के लिए MCU बदलना और unlock करना
- मूल M031LD2AE की जगह नया खाली chip लगाकर Elgato firmware flash किया गया; डिवाइस चला, लेकिन chip फिर protected हो गया और debugging संभव नहीं रही
- Ghidra में protection setting update करने वाला function ढूँढकर उसे chip को lock न करने के लिए patch किया गया
- patched firmware डालने के बाद OpenOCD और GDB से initialization code debug किया जा सका
- LED control code path firmware में मौजूद था, लेकिन सामान्य execution flow में उसे skip किया जा रहा था
- GDB में register और RAM values force करके LED control code चलवाया गया, तब lights जलाई जा सकीं
- firmware में LED control code मौजूद था
- समस्या यह थी कि सामान्य condition में वह code execute नहीं हो रहा था
bootloader और full firmware backup
- protection bit हटाए गए firmware को Elgato update path के जरिए एक दूसरे HD60 S पर install करके मूल रूप से protected पूरे content को read करने का प्रयोग किया गया
- update के बाद डिवाइस capture card की तरह काम करता नहीं दिखा, लेकिन chip योजना के अनुसार unlock हो चुका था
- इसके बाद ये region पढ़े जा सके
- LDROM: Elgato का stage-1 bootloader
- data flash
- मूल configuration register values
- APROM application firmware
- LDROM bootloader, I2C से command और data लेकर APROM को फिर से flash कर सकता था
- जब chip unprotected state में हो, bootloader application firmware पर jump नहीं करता बल्कि update command का इंतज़ार करता है
- Elgato lock/unlock bit को bootloader wait state के signal की तरह इस्तेमाल कर रहा था
- unlock firmware install करने के बाद डिवाइस के अटकने की वजह भी यही थी
HD60 S की internal architecture को समझना
- डिवाइस के अंदर ARM family के दो processor साथ काम करते हैं
- Cypress/Infineon CYUSB3014 USB 3.0 peripheral chip, ARM926EJ-S आधारित है और PC से USB 3.0 पर communicate करता है
- Nuvoton M031LD2AE Cortex-M0 MCU, ITE video chip और LED को control करता है
- Nuvoton MCU एक अलग I2C bus पर ITE chip को configure और monitor करता है
- ITE IT6802E HDMI receiver जैसा दिखता है
- ITE IT66121FN parallel data stream को HDMI के रूप में बाहर भेजने का काम करता दिखता है
- CYUSB3014, Nuvoton MCU को I2C से command भेजता है और Nuvoton status information वापस CYUSB3014 को देता है
- CYUSB3014, IT6802E से आने वाली video data stream लेकर USB से कंप्यूटर तक भेजता है
- बोर्ड पर Altera MAX II CPLD भी है, जो video data को CYUSB3014 के लिए उपयुक्त format में पहुँचाने में शामिल लगता है
SPI flash और LED animation data की खोज
- CYUSB3014 firmware, Winbond W25Q32JVSSIQ 4MB SPI flash में बिना protection के stored था
- SPI flash dump देखने पर offset 0x300000 से छोटे चित्र जैसे दिखने वाले data block मिले
- Nuvoton firmware में पहले अज्ञात रहे 5 GPIO trace करने पर पता चला कि ये pin Diodes Incorporated PI5C3257 quad 2:1 mux/demux bus switch तक जाते हैं
- यह bus switch तय करता है कि SPI flash को CYUSB3014 access करेगा या Nuvoton MCU
- शुरुआत में लगा था कि SPI flash सिर्फ CYUSB3014 के लिए है
- असल में CYUSB3014 boot होने के बाद Nuvoton MCU SPI flash का control ले लेता है
- Ghidra में नए पहचाने गए function bit-banged SPI transaction और SPI flash erase/read/write code से जुड़े थे
LED fault की असली वजह
- SPI flash के 0x300000 के बाद का data सामान्य image नहीं बल्कि LED animation frame था
- हर 16-byte block, 14 LED पर लिखे जाने वाला एक animation frame था
- हर row के आखिरी 2 byte अगले frame पर जाने से पहले का delay time थे
- Nuvoton firmware, 0x300000 address के पहले 2 byte में 16-bit value 0xAA55 है या नहीं, यह जाँच रहा था
- जिन दो device में LED काम नहीं कर रहे थे, उनके SPI flash dump में यह region खाली था या खराब था
- एक dump में 0x300000 region लगभग पूरी तरह
0x00से भरा था - कुछ animation
AB 03 12 39जैसे अजीब header से शुरू हो रहे थे
- एक dump में 0x300000 region लगभग पूरी तरह
- सही चल रहे तीसरे HD60 S के SPI flash में 0x300000 पर सही header और LED data मौजूद था
- पहला 16-bit word वही
0xAA55था जिसे firmware ढूँढ रहा था - header में 26 LED animation से जुड़ी जानकारी थी
- IT1504 में load होने वाला dot correction data, 0x3007F8 पर था और उसके बाद का
0x521114A7, पिछले 16 byte का CRC-32 था
- पहला 16-bit word वही
SPI flash patch से LED बहाल करना
- समस्या वाले device के SPI flash में 0x000000 से 0x2FFFFF तक का data device-specific जानकारी को सुरक्षित रखता है
- क्योंकि USB serial number इसी range में कहीं शामिल था
- इसलिए 0x300000 से LED data region को सही device dump के data से बदलकर एक hybrid image बनाया गया
- इस image को LED-fault वाले device में flash करने पर सफेद LED ने दो बार blink किया और लाल LED एक बार थोड़ी देर के लिए जला
- सही device पुराना revision था और उसका Nuvoton MCU model भी अलग था, फिर भी LED data, नए firmware के expected format से मेल खा गया
- Windows और Mac के पुराने Game Capture app में भी animation raw data मौजूद था
- Windows path:
C:\Program Files\Elgato\GameCapture\Animations - Mac path:
/Applications/Game Capture HD.app/Contents/Resources/Animations 01.ani,02.aniजैसी files के data को LED order के अनुसार फिर से arrange करने पर वह सही flash dump के animation data से मेल खा गया
- Windows path:
update tool और recovery procedure की सीमाएँ
- Elgato 4K Capture Utility का Windows firmware update काफी देर तक इंतज़ार नहीं करता
- update अभी चल रहा होता है, लेकिन tool उसे failed दिखा देता है
- फिर भी इंतज़ार करने पर डिवाइस LED blink करता है और नए firmware के साथ सामान्य reboot हो जाता है
- failure message के तुरंत बाद device unplug कर देने पर अधूरा flash रह सकता है
ElgatoDeviceCapabilities.jsonमेंupdateDurationSecvalue को 40 से 80 करने पर यह समस्या हल हो गई- Elgato सलाह देता है कि HD60 S firmware update तभी करें जब technical support ऐसा कहे, और यह feature settings screen में एक special key combination के पीछे छिपा है
- LED recovery procedure जटिल है
ElgatoDeviceCapabilities.jsonmodify करके firmware update allow करना पड़ता है- update शुरू होते ही device unplug करके Cypress chip को SPI flash control लेने देना पड़ता है
- PCB jumper हटाकर CYUSB3014 को USB से boot करने देना पड़ता है
- Cypress SDK के
download_fx3सेcyfxflashprog.imgको RAM में load किया जाता है - modify किए गए
fx3_spitestसे पूरा SPI flash dump करके LED region patch किया जाता है - jumper वापस लगाकर 4K Capture Utility से सामान्य firmware update चलाया जाता है ताकि Nuvoton firmware restore हो सके
- आखिरकार मूल मरम्मत 1 डॉलर से कम कीमत वाले 3 chip बदलकर पूरी हो गई, और LED समस्या को कुछ HD60 S units में होने वाली software, programming और update-संबंधित खराबी के रूप में पहचाना गया
1 टिप्पणियां
Hacker News की राय
पूरे स्ट्रक्चर में मकसद समझना मुश्किल था, और कई बार वह कई लेयर के function calls के अंदर गहराई में दबा हुआ था
source code सीधे देखते समय भी ऐसा अक्सर होता है। ज़्यादातर software हद से ज़्यादा abstract हो चुका है, और MCU इतने बड़े और सस्ते हो गए हैं कि embedded में भी HDMI capture device में दो ARM core डालने जैसी चीज़ें दिखने लगी हैं। इस device में शायद एक से ज़्यादा MCU की ज़रूरत नहीं थी
करीब 20 साल पहले भारत में बड़े होते समय purchasing power कम थी और सामान महंगा था, इसलिए लगभग हर चीज़ को ठीक करके या फिर से काम लायक बनाकर इस्तेमाल किया जाता था
चीज़ों को चलाने के लिए jugaad जैसी तरह-तरह की अस्थायी तरकीबें बहुत लगाई जाती थीं, और कपड़े भी फिर से इस्तेमाल होते थे; दर्जी rafu नाम की पैबंद- मरम्मत करके उनकी उम्र बढ़ा देते थे। मेरे घर जैसे middle-class परिवारों में यह खास तौर पर आम था
मेरे पिता, जो garment export कंपनी में काम करते थे, अक्सर कहते थे कि पश्चिमी लोग कार हो, electronics हो या कपड़े, disposable और नई चीज़ों को पसंद करते हैं। उस समय मैं यह mindset समझ नहीं पाता था। लेकिन अब purchasing power बढ़ने और चीन की वजह से कीमतें घटने के साथ हम भी बस फेंककर नया खरीदने की तरफ झुक रहे हैं
मैं उन लोगों का बहुत सम्मान करता हूँ जो बीच में हार नहीं मानते और सिर्फ यह नहीं सोचते कि नया खरीद लेना आसान है। ऐसी लगन और resourcefulness सचमुच तारीफ़ के काबिल है
अगर आप खुद ठीक कर सकते हैं और ज़रूरी parts मिल सकते हैं, तो ठीक है। लेकिन अगर किसी के experience और knowledge के लिए पैसे देने पड़ें, तो कम-से-कम जहाँ मैं रहता हूँ वहाँ यह काफी महंगा है और repair करने वाला मिलना भी मुश्किल है। खाली दुकानों के बाहर TV repair के बोर्ड ही बहुत दिखते हैं
अच्छी बात यह है कि मैं आधा retired हूँ और hourly wage पर काम कर रहा हूँ, इसलिए मेरे extra time की कोई सीधी monetary cost नहीं है। इसलिए मैं एक दिन लगाकर dishwasher ठीक करने की कोशिश कर सकता हूँ, और अगर कुछ दिन बाद फिर खराब हो जाए तो एक और दिन लगाकर नया लगा सकता हूँ। कोई professional installer नया product एक घंटे में लगा देता, लेकिन कम-से-कम मुझे schedule मिलने तक इंतज़ार नहीं करना पड़ा
पिछले करीब 50 सालों में ही consumerism बढ़ा है, और कपड़ों जैसी चीज़ों की quality और कीमत दोनों नीचे आई हैं
हाल में मैं अपनी motorcycle maintenance खुद कर रहा हूँ। शुरुआत में oil filter खोलने वाले tool जैसे कुछ tools में निवेश करना पड़ता है, और parts व consumables भी जुटाने पड़ते हैं—oil, copper washers, पुराने brake fluid reservoir screws की जगह नए screws वगैरह। फिर भी garage के बताए €1000 की जगह यह लगभग €100~€150 में हो जाता है
माँ बचपन में pants की मोहरी छोटी करती थीं और जब हम बड़े होते तो फिर बढ़ा देती थीं; घुटने या कोहनी घिस जाएँ तो पैबंद लगा देती थीं
इस माहौल ने अच्छी और बुरी दोनों आदतें डाल दीं। घर की मरम्मत लगभग सब खुद करता हूँ, लेकिन बहुत काम करने की वजह से समय या energy हमेशा पर्याप्त नहीं रहती। खर्च उठा सकता हूँ फिर भी किसी और को पैसे देकर काम करवाना मुश्किल लगता है, और इसलिए टूटी चीज़ें ज़रूरत से ज़्यादा लंबे समय तक पड़ी रहती हैं
अगर वह समय maintenance और repair की जगह side projects में लगाया होता, तो शायद पैसे ज़्यादा होते
वे लोग दूसरों को basic level तक सिखा देते थे, और अप्रत्याशित समस्या आने पर मदद करते थे। यानी पूरी community में knowledge और शुरुआती apprenticeship जैसी learning मौजूद थी
आज repair अकेले करने वाला काम बन गया है। YouTube जैसी चीज़ें बहुत मदद करती हैं, लेकिन community वाला पहलू खत्म हो गया है
दुखद side effect यह है कि repair और reuse कम आकर्षक माने जाने लगे, और इसके साथ repairability व लंबी उम्र भी product features के रूप में कम महत्वपूर्ण हो गए। अब अमेरिका की economic growth, खासकर 99% लोगों के लिए, ठहरने लगी है, तो पता चल रहा है कि हमने क्या खोया। टिकाऊ बनने के लिए बनाई गई चीज़ें नहीं हैं, और companies repairable व long-lasting products देती नहीं हैं या दे नहीं पातीं। इसलिए जो लोग जानबूझकर अपनी चीज़ें ठीक करना चाहते हैं, वे भी ढेरों रुकावटों से टकराते हैं
flash chip के अंदर data के टुकड़े को photo समझ आने वाला हिस्सा दिलचस्प था। वह आम अर्थ में photo नहीं था, बल्कि कई LED animations को describe करने वाला data था
Hue lamp animations के लिए मैंने भी स्वतंत्र रूप से ऐसा ही format बनाया था। बस वह binary नहीं, text था
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 0पहला value अगली line पर जाने से पहले delay के milliseconds है, और उसके बाद हर LED channel की brightness 100 के आधार पर लिखी है। जो line number से शुरू नहीं होती वह comment है, और channels के बीच जितनी चाहें एक या ज़्यादा spaces रख सकते हैं
किसी commercial product में मिलता-जुलता binary format देखकर अच्छा लगा। सच कहें तो यह काफी obvious तरीका है, फिर भी इसे सीधे देखना दिलचस्प था
https://en.wikipedia.org/wiki/Piano_roll
विनम्र कर देने वाला लेख था। यही असली full-stack engineering है
देखना चाहता हूँ कि Elgato इस लेख पर कैसी प्रतिक्रिया देता है
मेरे अनुभव में Elgato products सस्ते हैं लेकिन भयानक रूप से unstable हैं। यह लेख इसकी वजह बहुत detail में दिखाता है
software में भी चाही हुई सारी features हैं, आप खुद plugins बना सकते हैं, और plugin बनाने की प्रक्रिया भी documented है। सब कुछ सच में ठीक-ठाक है
लेकिन असल में Key Light की power बार-बार बंद-चालू करनी पड़ती है, और Windows पर Stream Deck app भी बार-बार restart करनी पड़ती है
ऐसे projects में motivation कैसे बनाए रखते हैं, यह जानना चाहता हूँ। parts बार-बार order करने और उनके आने का इंतज़ार करना पड़ता है; खासकर चीन से आने वाले parts का इंतज़ार करते-करते काफी projects छोड़ देने का मन हो जाता है
अगर मैंने सही गिना है, तो लेखक ने कम-से-कम तीन बार order किए। फिर भी यह सचमुच दिलचस्प है
अगर thermal camera नहीं है, तो board पर rubbing alcohol लगाकर देखें कि कहाँ सबसे जल्दी evaporate होता है
बेशक, यह तरीका केवल low-voltage devices पर ही संभव है
सत्य की खोज करने और अंत तक उसका पीछा करने की क्षमता हमें लगभग पवित्र बनाती है; यही इंसान का वह पहलू है जो कुछ बनाता और बेहतर करता है। इस व्यक्ति ने एक सांसारिक वस्तु की पड़ताल करते हुए बहुत गहरा spiritual path तय किया
यह बात बहुत दुखद, निराशाजनक और नरक जैसी है कि devices हमारे खिलाफ resist करते हैं। computers और machines को अपने भीतर की सच्चाई को amplify और radiate करना चाहिए। लेकिन मानवता अपने ही बनाए खोल में फँसी है, और top-down consumerism में है जो participation और सीखने की संभावना को नकारता है। खासकर computers अक्सर सत्य और समझ को ढकने वाले प्रमुख obfuscation devices बन जाते हैं। अपार potential इतनी बुरी तरह बर्बाद हो रहा है
आशा है कि जीते-जी खुली machines के उभरने वाली breakthrough wave देख सकूँ। Doug को सलाम