به روز رسانی جداول پارتیشن از طریق OTA در ESP32 برای WLED 0.15.x 🥖 تصادفی های جان مولر

WLED 0.15.x به کمی بیشتر نیاز دارد app فضایی نسبت به برخی از تاسیسات WLED باستانی. معمولاً به روز رسانی جدول پارتیشن به اتصال USB محلی نیاز دارد. این برنامه ای است که می توانید از طریق OTA نصب کنید که گسترش می یابد app پارتیشن تا 1536 کیلوبایت

رویکرد کلی برای ایجاد پارتیشن در دستگاه ESP32 شامل اتصال آن از طریق USB و فلش کردن آن با کتابخانه IDF (با استفاده از gen_esp32part.py برای ایجاد یک تصویر باینری از جدول پارتیشن، و idf.py برای فلش کردن دستگاه – به اسناد ESP مراجعه کنید. … یا با استفاده از platformio یا مشابه برای انجام همه این کارها با هم). تغییر جداول پارتیشن بدون اتصال دستگاه به صورت محلی واقعاً مستند نیست. اما شما می توانید آن را انجام دهید.

nobody: ...
absolutely nobody: ...
John: Let's make an OTA ESP32 partition table app

تعداد انگشت شماری تاپیک های انجمن وجود دارد که افراد ادعا می کنند قادر به انجام آن هستند، اما کد بسیار کمی وجود دارد. نقطه ضعف این است که اگر مشکلی پیش بیاید، به طور بالقوه دستگاه خود را آجر می کنید (و برای تعمیر باید آن را از طریق USB وصل کنید). نکته مثبت این است که در عمل، مقدار بسیار کمی ممکن است اشتباه کند، زیرا بخش مشکل ساز (پاک کردن و بازنویسی جدول پارتیشن) بسیار سریع است.

چه زمانی ممکن است لازم باشد این کار را انجام دهید؟ WLED 0.15.x به کمی بیشتر نیاز دارد app فضایی نسبت به نصب WLED باستانی (مشکل github). خوب است که مجبور نباشید دستگاه های ESP را برای به روز رسانی آنها لحیم کاری کنید. (بیایید واقعی باشیم: احتمالاً نیازی به به روز رسانی یک کنترلر LED ندارید، احتمالاً تا زمانی که … هر زمان که باشد به کار خود ادامه خواهد داد.)

نمای کلی فرآیند

روند کلی ساده و سریع است.

  1. بررسی کنید که در مرحله اول در حال اجرا هستید app پارتیشن این به شما امکان می دهد اندازه هر دو پارتیشن برنامه را تغییر دهید (پارتیشن دوم برای OTA مورد نیاز است، به طور خودکار تغییر می کند). بزرگ‌تر کردن پارتیشن برنامه اول مشکلی نیست، اما پارتیشن دوم برنامه را به عقب منتقل می‌کند، بنابراین باید در پارتیشن اول باشید.
  2. بررسی کنید که جدول پارتیشن در کجا قرار دارد. این یا در 0x8000 یا 0x9000 است (به نظر می رسد اکثر آنها 0x8000 هستند). می توانید این کار را با خواندن 2 بایت در هر دو مکان و بررسی انجام دهید AA 50 بایت ها اولین مکان با آن شامل جدول پارتیشن خواهد بود.
  3. جدول پارتیشن را در بافر بخوانید. آن را تجزیه کنید.
  4. در صورت نیاز جدول پارتیشن را در بافر خود تنظیم کنید. MD5 جدول پارتیشن را محاسبه کنید.
  5. جدول پارتیشن جدید را با پشت MD5 بنویسید. (برای فلش مموری، قبل از نوشتن باید پاک کنید.)
  6. پاداش: در صورت نیاز پارتیشن ها را پاک یا جابجا کنید. به هر حال پارتیشن برنامه دوم بازنویسی می شود، بنابراین مهم نیست. هر پارتیشن داده ای در صورت پاک نشدن یا جابجایی احتمالاً باطل می شود.

کد

در اینجا ESP32Repartion در Github است.

بقیه در اینجا مواد پاداش است.

ساختار داده جدول پارتیشن

ساختار داده جدول پارتیشن در است esp_partition_info_t . این magic شناسه است AA 50.

typedef struct {
  uint16_t magic;
  uint8_t  type;
  uint8_t  subtype;
  esp_partition_pos_t pos;
  uint8_t  label(16);
  uint32_t flags;
} esp_partition_info_t;

پس از ورودی های پارتیشن، یک ورودی با وجود دارد EB EB شناسه جادویی (+14 FF‘s) + یک MD5 16 بایتی از جدول پارتیشن. MD5 باید درست باشد، در غیر این صورت یک بوت لودر مدرن بوت نمی شود (بوت لودرهای قدیمی MD5 جدول پارتیشن را بررسی نمی کنند و بدون توجه به آن اجرا می شوند).

نمونه جدول پارتیشن FYI

00000000  aa 50 01 02 00 90 00 00  00 50 00 00 6e 76 73 00  .P.......P..nvs.
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
00000020  aa 50 01 00 00 e0 00 00  00 20 00 00 6f 74 61 64  .P....... ..otad
00000030  61 74 61 00 00 00 00 00  00 00 00 00 00 00 00 00  ata.............
00000040  aa 50 00 10 00 00 01 00  00 00 14 00 61 70 70 30  .P.........app0
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
00000060  aa 50 00 11 00 00 15 00  00 00 14 00 61 70 70 31  .P........app1
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
00000080  aa 50 01 82 00 00 29 00  00 00 17 00 73 70 69 66  .P....)....spif
00000090  66 73 00 00 00 00 00 00  00 00 00 00 00 00 00 00  fs..............
000000a0  eb eb ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ................
000000b0  28 f1 4c 09 45 01 77 60  a1 07 06 5d b9 7a 25 07  (.L.E.w`...).z%.
000000c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ................
…

عملکرد پاداش

  • بارگیری سیستم عامل بوت لودر (مسیر URL: /bootloader-download) – با منوی “بیشتر” در صفحه، می تواند باینری بوت لودر فعلی را دانلود کند. نمی‌دانم با این (مهندس معکوس؟ idk) چه می‌کنید، اما می‌توانید.
  • دانلود باینری جدول پارتیشن (مسیر URL: /partition-download) – با منوی “بیشتر” می توانید جدول پارتیشن را به صورت باینری دانلود کنید. اگر چیزی عجیب و غریب را در جدول پارتیشن ببینید و بخواهید به صورت دستی آن را بررسی کنید، ممکن است مفید باشد. موفق باشید.
  • دانلود پارتیشن app1 (مسیر URL: /app1-download) – با منوی “بیشتر”، می توانید پارتیشن دیگر برنامه باینری را دانلود کنید. این ممکن است در صورت نیاز به برنامه دیگر مفید باشد (فقط زمانی مفید است که برنامه جدید را دو بار آپلود نکرده باشید).

سوالات متداول

مکرر پرسیده می شود؟ بیایید صادق باشیم، کسی نپرسیده است. اینها فقط مواردی هستند که به نظر من ممکن است جالب باشند.

س: فاز بحرانی (به روز رسانی جدول پارتیشن) چقدر است؟

پاسخ: بازنویسی جدول پارتیشن برای دستگاه هایی که امتحان کردم حدود 100 میلی ثانیه طول می کشد.

س: اگر جابجایی / پاک کردن پس از آن شکسته شود چه اتفاقی می افتد؟

پاسخ: داده ها را از دست خواهید داد. برخی از برنامه ها اعتبار داده ها را تأیید می کنند (معمولاً یک عدد جادویی در ابتدا). اگر این ها شکست بخورند، احتمالاً فرض می کنند که شما هیچ داده ای ندارید و با پیش فرض ها بازنشانی می کنید.

س: چقدر احتمال دارد که هنگام اجرای این دستگاه خود را “آجر” کنم؟

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

اسکرین شات ها و نمونه ها

تصویری از ESP32Repartion در حال اجرا بر روی ESP32

خروجی نمونه

Build: Dec 28 2024 14:42:07 SDK 4.4.7 / 15840104 (ESP32-D0WDQ6)
Flash chip ID / Size: 0x164068 / 4096 KB
Program heap / program size: 335 KB / 743 KB
Partition table address: 0x8000
Bootloader MD5: 56cb99bf 20a1058a 3b901a5b df9961fa

NOTE: If you do not see a line with 'Ready' at the end,
this process didn't work.

Current app parition is first: OK
Reading partition table...
Splitting partitions out...
Created local copy of partiton table: OK
Type: 01 / 02, Addr: 0x009000, Size: 0x005000 (20K): nvs
Type: 01 / 00, Addr: 0x00e000, Size: 0x002000 (8K): otadata
Type: 00 / 10, Addr: 0x010000, Size: 0x140000 (1280K): app0
Type: 00 / 11, Addr: 0x150000, Size: 0x140000 (1280K): app1
Type: 01 / 82, Addr: 0x290000, Size: 0x170000 (1472K): spiffs

Partition table has 2+x app, 1+x data: OK
New partition table:
Type: 01 / 02, Addr: 0x009000, Size: 0x005000 (20K): nvs
Type: 01 / 00, Addr: 0x00e000, Size: 0x002000 (8K): otadata
Type: 00 / 10, Addr: 0x010000, Size: 0x180000 (1536K): app0
Type: 00 / 11, Addr: 0x190000, Size: 0x180000 (1536K): app1
Type: 01 / 82, Addr: 0x310000, Size: 0x0f0000 (960K): spiffs

Doing the work now...
Erasing partition table...
Writing partition table...
 ... Partition table written in 100 ms
Moving partition 4 from 0x290000 to 0x310000 length 0xf0000 ...
 0x37f000  0x37e000  0x37d000  0x37c000  0x37b000  0x37a000  0x379000  0x378000  
(...)  0x290000  
  ... Partition moved 240 sectors in 10240 ms (42 ms/sector)
Erasing partition 3 at 0x190000, length 0x180000
 ... Partition erased in 195 ms
Partitions erased / moved: OK
Partition table updated.

READY! After reboot, upload the firmware that you need.

Rebooting...

قطعه جاوا اسکریپت برای دانلود صفحه به صورت فایل متنی

فکر کردم اینجا تا حدودی مفید بود. شاید برای دیگران مفید باشد. محتوای متن صفحه فعلی را می گیرد و به صورت محلی به عنوان یک فایل متنی ذخیره می کند.

function downloadPageText() {
  const t = document.body.innerText;
  const a = document.createElement('a');
  a.href = URL.createObjectURL(new Blob((t), {type: 'text/plain'}));
  a.download = 'page-content.txt';
  a.click();
}

دکمه:

button onclick='downloadPageText()'>Download textbutton>

نظرات / سوالات

در حال حاضر هیچ قابلیت نظر دادن در اینجا وجود ندارد. اگر می‌خواهید نظر بدهید، لطفاً از Bluesky استفاده کنید و من را در آنجا ذکر کنید: @johnmu.com. با تشکر

صفحات مرتبط

Source link