SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
Loading...
Searching...
No Matches

ชื่อทั้ง 6 ชุดเดียวกันนี้มีอยู่บน mtb-mpy ด้วย โดยมาจาก lfs_wifi_creds.c ที่อยู่ใน libbento_mpy.a — เป็น archive (ไฟล์ไลบรารีแบบสแตติก .a) ที่ ไม่ได้ส่งมอบมาเป็นซอร์ส และการอ่านเขียนไฟล์ของมันทำงานด้วยการเรียก open() ของ Python ผ่าน MicroPython VFS นั่นคือเหตุผลที่รุ่น mtb-mpy ต้องใช้ VM และมีอยู่บน variant นี้ไม่ได้ ส่วนที่เก็บฝั่ง C ที่ส่งมอบจริงเข้าถึงไฟล์เดียวกันผ่าน bento_storage แทน และเข้ากันได้ระดับไบต์โดยเจตนา

mtb-mpy (archive อ่านที่นี่ไม่ได้) mtb-only (lfs_wifi_creds_c.c ส่งมอบจริง)
การอ่านเขียนไฟล์ open() ของ Python ผ่าน VFS bridge bento_storage_read_file() / bento_storage_write_file() บน lfs2 ล้วน
บริบทการเรียก MicroPython task เท่านั้น หลังเมานต์ VFS แล้ว task ใดก็ได้ เมื่อ bento_storage_init() เมานต์ให้แล้ว
lfs_wifi_creds_init() การเริ่มต้นใช้งานจริง; gc_collect() ก่อน (~16 KB GC heap) no-op — bento_storage_init() เป็นเจ้าของการเริ่มต้นใช้งาน
lfs_wifi_creds_deinit() ทำให้ handle ของ Python ใช้ไม่ได้ ก่อน soft reset no-op
lfs_wifi_creds_ready() ที่เก็บเริ่มต้นแล้วและเมานต์ VFS แล้ว ส่งต่อไปยัง bento_storage_ready()
lfs_wifi_creds_needs_resave() true หลังอ่านไฟล์รูปแบบเดิมที่ใช้ XOR-32 false เสมอ — เขียนเฉพาะรูปแบบปัจจุบันเท่านั้น
เส้นทางการเขียน เขียนทั้งกระบวนการภายใน wifi_creds_lock() และเลื่อนไปให้ตัว flush ที่ทำงานตอน REPL ว่าง ทำ snapshot ภายใต้ lock เขียนนอก lock และทำทันทีใน WiFi worker

ข้อกำหนดร่วม — รูปแบบข้อมูลบนดิสก์ที่เข้ากันได้ระดับไบต์ (บอร์ดที่ย้ายข้าม variant ยังคงเครือข่ายที่บันทึกไว้เอาไว้ได้):

ตำแหน่ง (offset) ขนาด ฟิลด์
0 4 magic 0x57494649 ("WIFI", QSPI_WIFI_CREDS_MAGIC)
4 2 version 1 (QSPI_WIFI_CREDS_VERSION)
6 2 count, 0 ถึง 6
8 600 entries, 6 × sizeof(qspi_wifi_entry_t) = 100
608 4 CRC32 (poly 0xEDB88320) ของไบต์ 0 ถึง 607

ตัวอ่านทั้งสองยอมรับค่าตรวจสอบ (checksum) แบบเดิมที่เป็น XOR-32 ตอนอ่าน ไฟล์ที่ยังไม่ผ่านการย้ายรูปแบบจึงยังบูตขึ้นมาพร้อมเครือข่ายของตนได้ ส่วนตัวเขียนทั้งสองปล่อยออกมาเป็น CRC32 เท่านั้น implementation ที่ส่งมอบจริง คัดมาตามตัวอักษร — สั้นพอที่จะเป็นข้อกำหนดของตัวเองได้:

void lfs_wifi_creds_init(void) { /* bento_storage_init() owns bring-up */ }
void lfs_wifi_creds_deinit(void) { }
bool lfs_wifi_creds_ready(void) { return bento_storage_ready(); }
/* The mtb-mpy store can inherit a pre-LFS sector image that wants rewriting;
* this store writes only the current format, so never. */
bool lfs_wifi_creds_needs_resave(void) { return false; }
int lfs_wifi_creds_read(qspi_wifi_entry_t *entries, int max_entries) {
if (entries == NULL || max_entries <= 0) return 0;
if (!bento_storage_ready()) return 0;
int n = bento_storage_read_file(CREDS_FILE, s_buf, sizeof(s_buf));
if (n < CREDS_TOTAL_SIZE) return 0;
uint32_t magic; memcpy(&magic, &s_buf[0], 4);
uint16_t version; memcpy(&version, &s_buf[4], 2);
uint16_t count; memcpy(&count, &s_buf[6], 2);
if (magic != QSPI_WIFI_CREDS_MAGIC) return 0;
if (version != QSPI_WIFI_CREDS_VERSION) return 0;
if (count > QSPI_WIFI_CREDS_MAX) return 0;
uint32_t stored; memcpy(&stored, &s_buf[CREDS_HEADER_SIZE + CREDS_ENTRIES_SIZE], 4);
if (stored != calc_crc32(s_buf, CREDS_HEADER_SIZE + CREDS_ENTRIES_SIZE)) {
/* Legacy XOR-32 fallback, exactly as the mtb-mpy reader does. */
if (stored != calc_xor32(s_buf, CREDS_HEADER_SIZE + CREDS_ENTRIES_SIZE)) return 0;
}
int out = (count < (uint16_t)max_entries) ? count : max_entries;
memcpy(entries, &s_buf[CREDS_HEADER_SIZE], (size_t)out * sizeof(qspi_wifi_entry_t));
/* Defensive termination, same as the mtb-mpy reader. */
for (int i = 0; i < out; i++) {
entries[i].ssid[32] = '\0';
entries[i].password[64] = '\0';
}
return out;
}
bool lfs_wifi_creds_write(const qspi_wifi_entry_t *entries, int count) {
if (count < 0 || count > QSPI_WIFI_CREDS_MAX) return false;
if (count > 0 && entries == NULL) return false;
if (!bento_storage_ready()) return false;
memset(s_buf, 0, sizeof(s_buf));
uint32_t magic = QSPI_WIFI_CREDS_MAGIC;
uint16_t version = QSPI_WIFI_CREDS_VERSION;
uint16_t cnt = (uint16_t)count;
memcpy(&s_buf[0], &magic, 4);
memcpy(&s_buf[4], &version, 2);
memcpy(&s_buf[6], &cnt, 2);
if (count > 0) {
memcpy(&s_buf[CREDS_HEADER_SIZE], entries,
(size_t)count * sizeof(qspi_wifi_entry_t));
}
uint32_t crc = calc_crc32(s_buf, CREDS_HEADER_SIZE + CREDS_ENTRIES_SIZE);
memcpy(&s_buf[CREDS_HEADER_SIZE + CREDS_ENTRIES_SIZE], &crc, 4);
return bento_storage_write_file(CREDS_FILE, s_buf, sizeof(s_buf));
}

การล็อก wifi_creds_lock() / wifi_creds_unlock() ป้องกันตัวแปร global ที่ใช้ร่วมกันคือ g_boot_wifi_creds ไม่ใช่ป้องกันตัวไฟล์ wifi_init.c ยังทำ read-modify-write กับ /.wifi_creds โดยตรงโดยไม่แตะตัวแปร global เหล่านั้น lock เดียวที่ครอบตัวไฟล์เองคือ lock ของชั้น bento_storage เอง