پیاده‌سازی فایل سیستم CD-ROM بر روی رزبری پای پیکو

هفته پیش برای کاری، مبدل یو اس بی به شبکه رو تست می‌کردیم

مبدل USB به Ethernet
مبدل USB به Ethernet

این مبدل‌ها معمولا یه تراشه RTL8152/8153 از RealTek  دارند یا AX88772/88179 از ASIX  

نکته‌ای که توجه‌ام رو جلب کرد و البته در یکی دو مورد دیگه هم دیده بودم، این بود که با اتصال USB به لپتاپ، درایوی مشابه CD-ROM باز می‌شد که درایور مورد نیاز سخت‌افزار همراهش بود.
به نظرم ایده خوبی اومد و سعی کردم روی یه Raspberry Pi Pico پیاده‌سازی کنم که با اتصال Raspberry Pi Pico به لپتاپ از راه USB یه فایل و برنامه بتونه اجرا شه برای کار با دستگاه.

رزبری پای پیکو
رزبری پای پیکو

یه مشکل این بود که برای برنامه‌ ریختن روی رزبری پیکو هم از USB OTG استفاده میشه و باید این کارکرد ۲گانه حفظ می‌شد. یعنی در کنار اینکه خود رزبری به عنوان درایو USB DISK شناخته می‌شد، باید جداگانه به عنوان CD-ROM شناخته می‌شد که اجازه تغییر هم نده و فقط خواندنی باشه.
ملاحظه بعدی RAM پایین دستگاه بود

264KB of on-chip SRAM

2MB of on-board QSPI Flash

برای فایل سیستم  FAT12 انتخاب شد که سبکتر بود.

ساختار صحیح فایل‌سیستم FAT12

برای اینکه کامپیوتر بتونه درایو ما را بخونه، باید یک فایل‌سیستم معتبر روی آن ایجاد می‌شد. فایل‌سیستم کلاسیک FAT12 را انتخاب کردم که برای درایوهای کوچک بهینه است. ساختار FAT12 فقط مجموعه‌ای از بایت‌ها نیست، نقشه دقیق و منظمیه که شامل بخش‌های زیر می‌شود:

  • Boot Sector (بوت سکتور): شناسنامه دیسک که اطلاعات حیاتی مانند حجم سکتور و تعداد کلاسترها را در خود دارد.

  • FAT Tables (جداول تخصیص فایل): قلب فایل‌سیستم که وضعیت هر کلاستر (آزاد، اشغال‌شده، یا خراب) را مشخص می‌کنه.
    Root Directory (پوشه ریشه): اطلاعات فایل‌ها و پوشه‌ها مانند نام و آدرس کلاستر شروع آن‌ها درش ذخیره میشه.

  • Data Area (ناحیه داده‌ها): محتوای واقعی فایل‌ها در این بخش قرار می‌گیرد.

    این ساختار باید با دقت و بایت به بایت در حافظه فلش پیکو شبیه‌سازی می‌شد.

پیاده‌سازی نگاشت صحیح کلاستر به سکتور

در FAT12، داده‌ها در واحدهایی منطقی یا در حافظه به نام «کلاستر» (Cluster) سازماندهی می‌شن، اما روی دیسک بصورت فیزیکی به نام «سکتور» (Sector) ذخیره می‌شن. یک چالش مهم، تبدیل آدرس منطقی کلاستر به آدرس فیزیکی سکتور بود. برای مثال، کلاستر شماره ۲ (اولین کلاستر قابل استفاده برای داده) باید به سکتور شماره ۴ نگاشت می‌شد.

ذخیره‌سازی فایل‌های چند سکتوری با زنجیره‌سازی کلاسترها

یک فایل ممکن است بزرگ‌تر از یک کلاستر باشد و در بخش‌های مختلف دیسک پراکنده شود. فایل‌سیستم FAT12 از یک روش هوشمندانه برای پیوند دادن این بخش‌ها استفاده می‌کند که به آن «زنجیره‌سازی کلاستر» (Cluster Chaining) می‌گویند که در واقع یک فهرست پیوندی یا Linked List هست. در جدول FAT، هر ورودی به کلاستر بعدی که حاوی ادامه فایل است، اشاره می‌کند. نکته فنی جالب در FAT12 این است که هر ورودی ۱.۵ بایت (۱۲ بیت) فضا اشغال می‌کند! مدیریت این ساختار نامتعارف برای اطمینان از خوانده شدن کامل فایل‌های بزرگ، یکی از نکات مهمه.

رعایت الزامات فرمت نام‌گذاری ۸.۳

فایل‌سیستم FAT محدودیت‌های خاصی برای نام‌گذاری فایل‌ها دارد که به فرمت «۸.۳» معروفه:
۸ کاراکتر برای نام و ۳ کاراکتر برای پسوند.

چالش کامپایل و کتابخانه

چون مدتیه کدهای embedded رو در حد امکان با Rust می‌نویسم سر استفاده از کتابخانه معروف Adafruit TinyUSB و هم چنین کامپایل خروجی Rust با فرمت uf2

فرمت UF2 یا USB Flashing Format

معمولا برای فلش کردن و برنامه ریختن به ابزارهایی مثل J-Link و ST-Link و ... نیازه.
برای ساده کردن فرایند برنامه‌ریزی روی زربری پای پیکو و برخی انواع دیگه بوردها و میکروکنترلرها، فرمت UF2 ابداع شده که کار رو بصورت کپی کردن ساده فایل روی بورد تبدیل کرده.
قبل اتصال بورد به کامپیوتر، دکمه BOOTSEL یا انتخاب بوت‌لودر رو نگه می‌دارید تا بورد هنگام اتصال یه درایو USB عادی شناخته بشه. بعد از کپی فایل پسوند uf2. اگه فایل درست باشه، بورد بعد مدت کوتاهی ری‌استارت میشه و برنامه جدید اجرا میشه.

باکیفیت ترین دوره آموزش برنامه نویسی چیست ؟

⭐⭐⭐⭐⭐ دوره ی آموزش دوازده قدم برنامه نویسی مهندس سام نیک زاد با کسب امتیاز بالاترین کیفیت دوره ی آموزشی بعنوان با کیفیت دوره انتخاب شده است برای مشاهده کلیک کنید

ثبت نام دوره با تخفیف از ویرگول