espflash --- Công cụ nạp firmware bootloader ROM ESP32

Mô-đun này cung cấp một triển khai ESPFlash tối giản, giao tiếp với bootloader ROM ESP32 qua UART. Mô-đun được thiết kế để cập nhật firmware ESP32 trực tiếp trên các mô-đun đồng hành (ví dụ: mô-đun U-blox NINA-W10 dùng trên bo mạch Arduino), và không thay thế cho tiện ích esptool đầy đủ. Các tính năng nâng cao (stub loader, các chip ESP khác, nén deflate, secure boot, v.v.) không được hỗ trợ.

Driver điều khiển RESETGPIO0 để đưa ESP32 vào chế độ tải xuống, sau đó gửi các lệnh đóng gói SLIP để đọc kích thước bộ nhớ flash, cấu hình giao diện SPI, ghi ảnh firmware và xác minh qua băm MD5.

Ví dụ dành cho Arduino Nano RP2040 Connect (bo mạch duy nhất được OpenMV hỗ trợ có espflash đã được tích hợp sẵn). Chân reset và boot-strap của NINA-W102 lần lượt là GPIO 3GPIO 2 của RP2040, còn UART0 của NINA được nối với UART1 của RP2040 (TX = GPIO 8, RX = GPIO 9):

from machine import Pin, UART
from espflash import ESPFlash

reset = Pin(3, Pin.OUT)                                    # NINA RESET
gpio0 = Pin(2, Pin.OUT)                                    # NINA GPIO0
uart = UART(1, 115200, timeout=1000)

esp = ESPFlash(reset, gpio0, uart)
esp.bootloader()
esp.set_baudrate(921600)
size = esp.flash_read_size()
esp.flash_attach()
esp.flash_config(size)
esp.flash_write_file("NINA_FW.bin")
esp.flash_verify_file("NINA_FW.bin")
esp.reboot()

class ESPFlash

class espflash.ESPFlash(reset: 'machine.Pin', gpio0: 'machine.Pin', uart: 'machine.UART', log_enabled: bool = False)

Khởi tạo đối tượng ESPFlash để điều khiển bootloader ROM ESP32.

  • reset là một thực thể machine.Pin được kết nối với đường RESET của ESP32, được cấu hình là đầu ra.

  • gpio0 là một thực thể machine.Pin được kết nối với đường GPIO0 của ESP32, được cấu hình là đầu ra.

  • uart là một thực thể machine.UART được kết nối với các chân (pin) UART0 của ESP32. Phải được khởi tạo ở tốc độ baud 115200 với thời gian chờ đọc khác không.

  • log_enabled bật ghi nhật ký chi tiết về các khung SLIP trao đổi với bootloader. Chỉ hữu ích khi gỡ lỗi.

Hàm khởi tạo sẽ cố gắng nhập hashlib. Nếu hashlib.md5 khả dụng, băm MD5 liên tục được dùng bởi ESPFlash.flash_verify_file() sẽ được tự động tính trong quá trình ghi.

set_baudrate(baudrate: int, timeout: int = 350) None

Thay đổi tốc độ baud UART của bootloader.

  • baudrate là tốc độ baud mới cần chuyển sang. Nếu khác với tốc độ baud hiện tại, lệnh CHANGE_BAUDRATE sẽ được gửi đến bootloader trước khi UART cục bộ được cấu hình lại.

  • timeout được dự trữ và hiện chưa được sử dụng.

Không có tác dụng nếu đối tượng UART bên dưới không triển khai phương thức init().

bootloader(retry: int = 6) bool

Điều khiển RESETGPIO0 để đưa ESP32 vào chế độ tải ROM và đồng bộ với bootloader.

  • retry là số lần thử reset/đồng bộ trước khi bỏ cuộc.

Trả về True nếu thành công, ngược lại ném ra một Exception.

flash_read_size() int

Đọc JEDEC ID của bộ nhớ flash SPI và trả về kích thước flash theo byte.

Ném ra một Exception nếu các bit kích thước được báo cáo nằm ngoài phạm vi 0x12-0x19 dự kiến.

flash_attach() None

Gắn kết với bộ nhớ flash SPI. Phải được gọi một lần sau bootloader() và trước bất kỳ thao tác đọc/ghi flash nào.

flash_config(flash_size: int = 2 * 1024 * 1024) None

Cấu hình các tham số bộ nhớ flash SPI.

  • flash_size là tổng kích thước flash theo byte, thường là giá trị trả về từ flash_read_size().

Kích thước khối, sector và trang được cố định lần lượt là 64 KiB, 4 KiB và 256 byte.

flash_write_file(path: str, blksize: int = 0x1000) None

Ghi một ảnh firmware vào flash bắt đầu từ offset 0.

  • path là đường dẫn filesystem của file binary firmware cần nạp.

  • blksize là kích thước tính theo byte của mỗi khối dữ liệu gửi đến bootloader. Phải là bội số của kích thước sector.

Khối cuối cùng được đệm bằng 0xFF để đủ blksize. Nếu hỗ trợ MD5 khả dụng, băm MD5 liên tục sẽ được cập nhật trong quá trình ghi để flash_verify_file() có thể được gọi mà không cần đối số.

flash_verify_file(path: str, digest: bytes | None = None, offset: int = 0) None

Xác minh nội dung flash với một file firmware.

  • path là đường dẫn filesystem của file binary firmware tham chiếu; kích thước của nó xác định số byte cần xác minh.

  • digest là băm MD5 được mã hóa hex đã tính trước (tùy chọn) của file. Nếu là None, băm được tính trong lần gọi flash_write_file() gần nhất sẽ được dùng.

  • offset là offset trong flash theo byte tại đó việc xác minh bắt đầu.

Ném ra một Exception nếu không có băm nào khả dụng hoặc nếu nội dung flash không khớp với băm tham chiếu.

reboot() None

Gửi lệnh FLASH_END để yêu cầu ROM bootloader khởi động lại ESP32 và chạy firmware vừa nạp. Không có phản hồi nào được đọc.