
RP2040 फ़र्मवेयर जो एक Toshiba MK4001MTD 0.85" SDIO microdrive को USB mass storage डिवाइस के रूप में ब्रिज करता है, पूरे SDIO-ATA प्रोटोकॉल स्टैक को स्क्रैच से लागू करता है, जिसमें PIO-accelerated reads/writes और बैड सेक्टर रिकवरी शामिल हैं।
RP2040 Pico फर्मवेयर जो Toshiba MK4001MTD 0.85" SDIO माइक्रोड्राइव को USB मास स्टोरेज डिवाइस के रूप में ब्रिज करता है।

MK4001MTD एक 4 GB माइक्रोड्राइव है जो मूल रूप से Nokia N91 म्यूज़िक फ़ोन और कुछ अन्य डिवाइसों, जैसे MP3 प्लेयर या USB ड्राइव, में उपयोग किया जाता था, जब फ्लैश स्टोरेज अभी भी काफी महंगा था।
आपने परिचय देखे होंगे जो दावा करते हैं कि यह ड्राइव MMC प्रोटोकॉल का उपयोग करता है, लेकिन यह वास्तव में गलत है। मैं कुछ समय से इसकी जांच कर रहा हूं: मैंने 8-बिट MMCplus कार्ड रीडर बनाने की कोशिश की और अलग-अलग SD/MMC रीडर का परीक्षण किया, लेकिन सफलता नहीं मिली। अंतिम उपाय के रूप में, मैंने एक Nokia N91 खरीदा ताकि लॉजिक ट्रेस कैप्चर कर सकूं और पुष्टि कर सकूं कि यह वास्तव में किस प्रोटोकॉल का उपयोग करता है।
यहाँ वह फोटो है जब मैं इसे अपने 8bit-MMCPlus रीडर बोर्ड के साथ उपयोग करने की कोशिश कर रहा था, और पता चला कि यह MMC नहीं है :(

इसलिए मैंने N91 लेकर ट्रेस इकट्ठा किए:

मानक ATA/CF माइक्रोड्राइव के विपरीत, यह CMD52/CMD53 के माध्यम से टनल किए गए ATA कमांड के साथ SDIO इंटरफ़ेस का उपयोग करता है। इस प्रोटोकॉल का समर्थन करने वाला कोई मौजूदा ड्राइवर नहीं है, इसलिए यह फर्मवेयर स्क्रैच से पूरा स्टैक लागू करता है।
यह मेरे लिए आश्चर्यजनक था, क्योंकि CE-ATA नामक एक SDIO-से-ATA मानक मौजूद है। लेकिन अगर आप रिलीज़ टाइमलाइन को ध्यान से देखें, तो CE-ATA इस ड्राइव के बाद आया। नतीजतन, यह ड्राइव पूरी तरह से SDIO कमांड पर निर्भर करता है, और CE-ATA उपलब्ध नहीं है। CE-ATA में दो नए कमांड CMD60/CMD61 हैं और यह CMD12/39 का उपयोग करता है, लेकिन आप ट्रेस से देख सकते हैं कि यह उनमें से किसी का भी उपयोग नहीं कर रहा है।
दूसरा हार्डवेयर बिंदु जिसका उल्लेख करना है, वह यह है कि एक और गलत जानकारी—जो यह दावा करती है कि यह 8-बिट MMCPlus कार्ड है—न केवल झूठी है, बल्कि पिनआउट MMC मानक का पालन नहीं करता है। आप Nokia N91 सर्विस मैनुअल पा सकते हैं जिसमें पिनआउट के बारे में कुछ दस्तावेज़ है: जबकि पिन नंबरिंग MMCPlus मानक का पालन करती है, पिन मैपिंग ऐसा नहीं करती। यह एक महत्वपूर्ण विवरण है यदि आप इसे स्वयं वायर कर रहे हैं: यह उसी MMC कनेक्टर का उपयोग करता है, लेकिन पिन मैपिंग अलग है, हार्डवेयर अनुभाग में और अधिक जानकारी।
अंत में, ध्यान दें कि इसे Claude/OpenClaw के साथ सह-विकसित किया गया है। मैंने मैन्युअल रूप से लॉजिक ट्रेस एकत्र किए और OpenClaw के लिए विकास पर पुनरावृत्ति करने के लिए एक क्लोज्ड-लूप टेस्ट स्टेशन स्थापित किया—ट्रेस का विश्लेषण करना और सुविधाओं को लागू करना। दस्तावेज़ीकरण मुख्य रूप से Claude द्वारा लिखा जाएगा; मैं इनलाइन अपने नोट्स भी जोड़ूंगा। मैंने दस्तावेज़ीकरण को स्वयं पढ़ा और दोबारा जांचा है, और यह विश्वसनीय और समझने में आसान होना चाहिए।
N91 ट्रेस पर विश्लेषण के बारे में अंतर्दृष्टि के लिए, यह /docs/N91_TRACE_ANALYSIS.md के अंतर्गत है, मैंने वहां N91 सर्विस मैनुअल के साथ रॉ लॉजिक ट्रेस भी डाल दिए हैं।
ब्लॉग पोस्ट में और देखें: https://www.willwhang.dev/Reading-MK4001MTD/
इसे क्रियाशील देखें: https://youtu.be/GC4xil3_Bbc
PIO-त्वरित रीड/राइट और आइडल पावर मैनेजमेंट के साथ पूरी तरह से कार्यात्मक USB मास स्टोरेज।
| मीट्रिक | मान |
|---|---|
| पढ़ने की गति | ~985 kB/s (USB फुल-स्पीड द्वारा सीमित) |
| लिखने की गति | ~920 kB/s (USB फुल-स्पीड द्वारा सीमित, विज्ञापित राइट कैश) |
| कच्ची SDIO-साइड गति | ~2.35 MB/s पढ़ना / ~2.15 MB/s लिखना (ड्राइव-सीमित) |
| क्षमता | 3.75 GB (7,862,400 सेक्टर) |
| फाइलसिस्टम | FAT32 सत्यापित (mount/unmount/fsck साफ) |
| डेटा अखंडता | लिखें+पढ़ें सत्यापित; सभी 4 DAT लाइनों पर प्रति-ब्लॉक CRC16 |
| आइडल स्टैंडबाय | 5 s आइडल या USB सस्पेंड → STANDBY IMMEDIATE + पावर गेट |
USB Host ←→ USB MSC (TinyUSB) ←→ ATA Layer ←→ SDIO Layer (PIO) ←→ MK4001MTD
फर्मवेयर में चार परतें हैं:
USB MSC (msc_device.c) — TinyUSB मास स्टोरेज क्लास। SCSI READ(10)/WRITE(10) को ATA सेक्टर ऑपरेशन में अनुवादित करता है। 32 KB EP बफर, प्रति USB ट्रांसफर 64 सेक्टर तक बैचिंग। ड्राइव I/O दोनों दिशाओं में USB के साथ ओवरलैप किया जाता है, एक वास्तविक ATA-USB ब्रिज की तरह कैशिंग डिस्क के साथ: एक अनुक्रमिक-रीड प्रीफेचर अगले हिस्से को लाता है जबकि पिछला हिस्सा होस्ट को स्ट्रीम होता है, और राइट्स को स्टेज किया जाता है और फ्लश किया जाता है जबकि USB अगला टुकड़ा प्राप्त करता है। डिवाइस अपने राइट कैश का विज्ञापन करता है (कैशिंग मोड पेज, WCE=1 — होस्ट "राइट कैश: सक्षम" रिपोर्ट करते हैं और fsync/unmount/suspend पर SYNCHRONIZE CACHE जारी करते हैं, जिसे फर्मवेयर मानता है)। एक असफल बैकग्राउंड फ्लश अगले WRITE या SYNCHRONIZE CACHE पर MEDIUM ERROR के रूप में सामने आता है; ज्ञात-खराब सेक्टरों पर लिखना एक सख्त सिंक्रोनस पथ लेता है।
ATA-over-SDIO (ata_sdio.c) — SDIO फ़ंक्शन 1 एड्रेस स्पेस में CMD52 के माध्यम से मैप किए गए ATA रजिस्टरों में लिखकर और CMD53 के माध्यम से सेक्टर डेटा स्थानांतरित करके ATA कमांड (IDENTIFY, READ SECTORS, WRITE SECTORS) लागू करता है। CMD, डेटा और ATA स्तरों पर 3-स्तरीय रीट्री लॉजिक।
PIO SDIO (sdio_pio.c, sdio.pio) — RP2040 के PIO पेरीफेरल का उपयोग करके हार्डवेयर-त्वरित SDIO (4-बिट बस 10 MHz पर, इनपुट सिंक्रोनाइज़र को बायपास करके प्रति बिट 4 PIO चक्र)। तीन PIO प्रोग्राम डायनामिक प्रोग्राम स्वैपिंग के माध्यम से एकल स्टेट मशीन साझा करते हैं:
पिन/पावर (sdio_hw.c) — GPIO आरंभीकरण और HDD पावर नियंत्रण। सभी SDIO संचार PIO का उपयोग करता है।
मानव नोट्स: दिलचस्प बात यह है कि Claude PIO में SDIO लागू करने के लिए वास्तव में अनिच्छुक था, और PIO और बिट-बैंगिंग के बीच आगे-पीछे जाने में बहुत सारे विकास चक्र बर्बाद हुए।
MK4001MTD एक I/O फ़ंक्शन वाले SDIO कार्ड के रूप में प्रस्तुत होता है। मानक SDIO कार्ड आरंभीकरण (CMD5/CMD3/CMD7) बस सेट करता है, फिर ATA रजिस्टरों तक SDIO कमांड के माध्यम से पहुंचा जाता है:
रजिस्टर एक्सेस (CMD52): प्रत्येक ATA रजिस्टर फ़ंक्शन 1 एड्रेस पर मैप किया गया है:
| पता | रजिस्टर | उपयोग |
|---|---|---|
| 0x00 | DATA | सेक्टर डेटा के लिए CMD53 लक्ष्य |
| 0x01 | ERR/FEAT | त्रुटि (पढ़ें) / फीचर (लिखें) |
| 0x02 | SECCOUNT | सेक्टर गणना |
| 0x03 | LBA_LO | LBA बिट्स 0-7 |
| 0x04 | LBA_MID | LBA बिट्स 8-15 |
| 0x05 | LBA_HI | LBA बिट्स 16-23 |
| 0x06 | DEV/HEAD | डिवाइस/हेड + LBA बिट्स 24-27 |
| 0x07 | CMD/STATUS | कमांड (लिखें) / स्थिति (पढ़ें) |
डेटा स्थानांतरण (CMD53): सेक्टर डेटा को DATA रजिस्टर (पता 0x00) को लक्षित करते हुए ब्लॉक मोड में CMD53 जारी करके स्थानांतरित किया जाता है। मल्टी-सेक्टर रीड के लिए, block_count=N के साथ एक एकल CMD53 N × 512 बाइट्स को एक SDIO मल्टी-ब्लॉक लेनदेन में स्थानांतरित करता है।
इंटरप्ट सिग्नलिंग: ड्राइव SDIO इंटरप्ट (CCCR रजिस्टर 0x05 में INT_PENDING बिट 1) को सक्रिय करके सेक्टर तत्परता का संकेत देता है। ATA STATUS रजिस्टर पढ़ने से इंटरप्ट साफ हो जाता है।
16-सेक्टर रीड के लिए:
1. PIO CMD52 के माध्यम से ATA रजिस्टर लिखें:
SECCOUNT=16, LBA_LO/MID/HI, DEV/HEAD=0xE0, CMD=0x20
2. CMD52 के माध्यम से STATUS को पोल करें जब तक DRQ (बिट 3) सेट न हो