คลาส Flash -- การเข้าถึงพื้นที่จัดเก็บข้อมูลแฟลชในตัว

คลาส Flash ให้การเข้าถึงระดับบล็อกโดยตรงไปยังชิปแฟลช QSPI ภายนอกของ RP2040 ไดรเวอร์นี้ใช้งานอินเทอร์เฟซ vfs.AbstractBlockDev เพื่อให้สามารถส่งต่อไปยัง vfs.mount() สำหรับการกำหนดค่าระบบไฟล์แบบกำหนดเอง

สคริปต์ส่วนใหญ่จัดเก็บข้อมูลผ่านระบบไฟล์ที่เมานต์อัตโนมัติที่ / และไม่เคยสร้าง Flash โดยตรง สร้างอินสแตนซ์ด้วยตนเองเมื่อต้องการ:

  • เมานต์ระบบไฟล์ที่ไม่ใช่ค่าเริ่มต้น (เช่น ห่อด้วย vfs.VfsFat) บนพาร์ติชันแบบกำหนดเอง

  • อ่านหรือเขียนบริเวณเฟิร์มแวร์หรือบล็อกข้อมูลโรงงานที่ระบบไฟล์ไม่ได้เป็นเจ้าของ

  • ใช้งานรูปแบบพื้นที่จัดเก็บข้อมูลบนแฟลชแบบกำหนดเองที่ข้ามชั้นระบบไฟล์

ตัวสร้าง

class rp2.Flash Flash

คืนค่าอ็อบเจกต์บล็อกดีไวซ์ Flash แบบซิงเกิลตันที่สนับสนุนโดยชิปแฟลช QSPI ของ RP2040 บล็อกแรกที่เปิดเผยคือบล็อกที่อยู่ถัดจากบริเวณเฟิร์มแวร์ทันที ดังนั้นผู้เรียกใช้จะเห็นเฉพาะบริเวณของชิปที่เหมาะสมกับระบบไฟล์

เมธอด

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

อ่านไบต์จากแฟลชลงใน buf จุดเข้าบล็อกดีไวซ์ vfs.AbstractBlockDev มาตรฐานที่ใช้โดยชั้นระบบไฟล์

รูปแบบธรรมดา (readblocks(block_num, buf)): อ่านบล็อกทั้งหมดเริ่มต้นที่ดัชนีบล็อก block_num ความยาวของ len(buf) ต้องเป็นจำนวนเท่าของขนาดบล็อกแฟลช

รูปแบบขยาย (readblocks(block_num, buf, offset)): อ่าน len(buf) ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนเต็มของบล็อก -- เริ่มต้นที่ไบต์ offset ภายในบล็อก block_num ใช้โดย littlefs และระบบไฟล์แบบระบุไบต์อื่นๆ

writeblocks(block_num: int, buf: bytes) None
writeblocks(block_num: int, buf: bytes, offset: int) None

เขียนไบต์จาก buf ไปยังแฟลช จุดเข้าบล็อกดีไวซ์ vfs.AbstractBlockDev มาตรฐานที่ใช้โดยชั้นระบบไฟล์

รูปแบบธรรมดา (writeblocks(block_num, buf)): เขียนบล็อกทั้งหมดเริ่มต้นที่ดัชนีบล็อก block_num ความยาวของ len(buf) ต้องเป็นจำนวนเท่าของขนาดบล็อกแฟลช แต่ละบล็อกที่ได้รับผลกระทบจะถูกลบอัตโนมัติก่อนการเขียน

รูปแบบขยาย (writeblocks(block_num, buf, offset)): เขียน len(buf) ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนเต็มของบล็อก -- เริ่มต้นที่ไบต์ offset ภายในบล็อก block_num ไม่มีการลบโดยนัย -- ผู้เรียกใช้ต้องตรวจสอบให้แน่ใจว่าบล็อกที่ได้รับผลกระทบถูกลบแล้วผ่านการเรียก ioctl(6, block_num) ก่อนหน้า

ioctl(cmd: int, arg: int) int | None

จุดเข้าควบคุม vfs.AbstractBlockDev มาตรฐาน ถูกเรียกโดยชั้นระบบไฟล์ในเวลาเมานต์/ยกเลิกเมานต์และทุกการซิงก์ ค่า cmd ที่รู้จัก:

  • 1 -- เริ่มต้น คืนค่า 0 เมื่อสำเร็จ

  • 2 -- ยกเลิกการเริ่มต้น คืนค่า 0 เมื่อสำเร็จ

  • 3 -- ซิงก์การเขียนที่รอดำเนินการ คืนค่า 0

  • 4 -- คืนค่าจำนวนบล็อกแฟลชที่มองเห็นได้โดยระบบไฟล์

  • 5 -- คืนค่าขนาดบล็อกในหน่วยไบต์ (โดยทั่วไปคือขนาดเซกเตอร์แฟลช 4096)

  • 6 -- ลบบล็อกที่ดัชนี arg จำเป็นต้องทำก่อนใช้รูปแบบ writeblocks แบบขยาย

  • 7 -- คืนค่าว่าดีไวซ์รองรับคำสั่งลบบล็อกหรือไม่ (1 บน RP2040)

ผู้เรียกใช้โดยตรงโดยปกติไม่ใช้เมธอดนี้ -- ไดรเวอร์ระบบไฟล์จะส่งต่อรหัสมาตรฐานโดยอัตโนมัติเมื่อ Flash ถูกเมานต์แล้ว