Bài 6: Firmware update qua bootloader trên microcontroller

Bootloader gần như luôn đi kèm bài toán firmware update. Chỉ boot được thôi là chưa đủ. Trong sản phẩm thực tế, bootloader còn phải nhận application image mới, ghi image vào đúng vị trí, kiểm tra lại image và quyết định có nên chuyển sang boot từ application image mới hay không.

Với microcontroller, firmware update qua bootloader có nhiều cách triển khai khác nhau. Sự khác nhau không chỉ nằm ở giao tiếp như UART, CAN hay USB, mà còn nằm ở cách tổ chức flash, cách kiểm tra image và cách xử lý khi update bị gián đoạn.

Vai trò của bootloader trong firmware update

Khi hệ thống cần update firmware, bootloader thường chịu trách nhiệm cho các việc sau:

  • Nhận application image mới từ một giao tiếp phù hợp.
  • Ghi image vào đúng vùng flash memory.
  • Kiểm tra image sau khi ghi.
  • Cập nhật metadata hoặc trạng thái image.
  • Quyết định thời điểm chuyển sang boot từ application image mới.
  • Giữ khả năng recovery nếu update lỗi.

Nếu thiếu một trong các bước này, hệ thống rất dễ rơi vào trạng thái update xong nhưng không boot được.

Các hướng nhận firmware phổ biến

Trên MCU, bootloader thường nhận firmware mới qua một số hướng quen thuộc dưới đây.

Update qua UART

UART là cách đơn giản và phổ biến nhất, nhất là trong giai đoạn bring-up, manufacturing hoặc recovery tại hiện trường.

Ưu điểm

  • Đơn giản, dễ triển khai.
  • Dễ debug bằng tool phổ thông.
  • Phù hợp với bootloader nhỏ.

Nhược điểm

  • Tốc độ thường không cao.
  • Cần kết nối vật lý trực tiếp.
  • Không thuận tiện cho update số lượng lớn ngoài hiện trường.

Update qua CAN

CAN xuất hiện nhiều trong công nghiệp và automotive. Với các hệ đã có bus CAN sẵn, đây là hướng rất tự nhiên để update firmware.

Ưu điểm

  • Tận dụng được hạ tầng giao tiếp sẵn có.
  • Phù hợp với hệ đa node.
  • Hợp với các flow chẩn đoán và reprogramming trong automotive.

Nhược điểm

  • Payload nhỏ, nên logic truyền nhận thường phức tạp hơn.
  • Phải xử lý kỹ timeout, retry và trạng thái bus.
  • Tốc độ thực tế có thể hạn chế với image lớn.

Update qua USB

USB phù hợp với các thiết bị có kết nối trực tiếp tới PC hoặc thiết bị host khác. Một số nền tảng dùng DFU hoặc giao thức riêng.

Ưu điểm

  • Tốc độ thường tốt hơn UART.
  • Thuận tiện khi update tại bàn hoặc qua tool desktop.
  • Có thể tận dụng các chuẩn sẵn như DFU.

Nhược điểm

  • Stack USB phức tạp hơn.
  • Bootloader thường phải lớn hơn.
  • Debug giai đoạn đầu khó hơn UART.

Update qua mạng hoặc OTA gateway

Một số MCU không nhận OTA trực tiếp mà nhận firmware qua một gateway hoặc một processor khác. Khi đó bootloader chỉ thấy dữ liệu đi vào qua một kênh nội bộ như UART, SPI hoặc shared memory.

Ưu điểm

  • Phù hợp với sản phẩm cần update từ xa.
  • Tách vai trò network stack khỏi MCU bootloader.
  • Giảm độ phức tạp ở phần bootloader chính.

Nhược điểm

  • Phụ thuộc vào thành phần trung gian.
  • Cần chốt rõ giao thức giữa gateway và bootloader.
  • Logic lỗi và recovery có thể phân tán qua nhiều khối.

Nhận firmware mới chỉ là một nửa bài toán

Giao tiếp chỉ quyết định firmware đi vào bằng đường nào. Phần khó hơn nằm ở chỗ application image được ghi vào đâu trong flash memory, kiểm tra ra sao và chuyển đổi trạng thái boot như thế nào. Đây là lý do firmware update luôn gắn chặt với flash layout và metadata.

Một bootloader nhận image tốt nhưng không có chiến lược ghi image và recovery rõ ràng vẫn là một bootloader rủi ro cao.

Các bước thường có trong một flow update

Một flow update điển hình trên MCU thường gồm các bước sau.

  • Xác định hệ thống đang ở boot mode hay update mode.
  • Nhận image và chia thành các block phù hợp.
  • Ghi block vào staging area, slot phụ hoặc vùng đích.
  • Kiểm tra tính toàn vẹn của image sau khi ghi.
  • Cập nhật metadata để đánh dấu image pending hoặc confirmed.
  • Chuyển boot decision sang application image mới nếu đủ điều kiện.
  • Rollback hoặc recovery nếu image không boot được.

Kiểm tra image sau khi update

Bootloader không nên coi việc ghi xong là update thành công. Sau khi ghi, ít nhất cần có bước kiểm tra để biết image còn nguyên vẹn hay không.

  • Kiểm tra size.
  • Kiểm tra CRC hoặc checksum.
  • Kiểm tra image header.
  • Kiểm tra chữ ký số nếu hệ thống dùng secure boot.
  • Kiểm tra trạng thái image trong metadata.

Trong các hệ an toàn hơn, application image mới chỉ được coi là hợp lệ về mặt kỹ thuật sau khi pass kiểm tra, nhưng chỉ được coi là usable sau khi boot thử thành công và được xác nhận lại.

Những điểm dễ lỗi nhất trong firmware update

Firmware update qua bootloader thường hỏng ở một số điểm quen thuộc.

  • Mất điện trong lúc đang ghi flash memory.
  • Image nhận thiếu block hoặc block bị sai thứ tự.
  • Metadata bị cập nhật sai trạng thái.
  • Image ghi xong nhưng bootloader vẫn trỏ vào application image cũ hoặc image lỗi.
  • Rollback logic không rõ nên boot loop liên tục.
  • Giao thức truyền nhận không xử lý tốt timeout, retry hoặc resume.

Chọn hướng update theo bối cảnh sản phẩm

Không có một giao tiếp update tốt nhất cho mọi sản phẩm.

  • UART hợp với bring-up, manufacturing và recovery đơn giản.
  • CAN hợp với hệ công nghiệp hoặc automotive có bus sẵn.
  • USB hợp với thiết bị cần update trực tiếp từ PC.
  • OTA qua gateway hợp với sản phẩm cần update từ xa nhưng không muốn bootloader gánh toàn bộ network stack.

Điểm quyết định không chỉ là tốc độ truyền dữ liệu, mà là tổng thể của flash layout, update mode hoặc flash loader, metadata và mức độ fail-safe mà sản phẩm cần đạt.

Những yếu tố làm bài toán update phức tạp hơn

Trong sản phẩm thực tế, firmware update không chỉ là nhận image rồi ghi xuống flash memory. Một số yếu tố dưới đây thường làm bootloader và update flow phức tạp hơn đáng kể.

  • Xác thực quyền update trước khi cho phép ghi firmware.
  • Xác thực image bằng chữ ký số, thay vì chỉ dựa vào CRC hoặc checksum.
  • Bảo vệ đường truyền nếu firmware đi qua kênh có rủi ro bị nghe lén hoặc chèn dữ liệu.
  • Nén và giải nén image để giảm băng thông truyền hoặc giảm thời gian update.
  • Xử lý các ràng buộc của flash như erase trước program, page size, alignment và bank boundary.
  • Giảm rủi ro tear và wear, nhất là với metadata, counter hoặc state flag bị ghi lặp lại nhiều lần.

Các chủ đề này thường đủ lớn để tách thành bài riêng. Trong bài này, chúng chỉ nên được xem là các yếu tố cần tính tới khi thiết kế update flow tổng thể.

Kết luận

Firmware update qua bootloader là bài toán tổng hợp giữa giao tiếp, flash layout, metadata và boot decision. Chọn đúng kênh truyền nhận mới chỉ giải được một phần. Phần còn lại nằm ở chỗ hệ thống ghi image thế nào, kiểm tra image ra sao và quay về update mode, flash loader path hoặc application image cũ như thế nào khi update lỗi.

Phản hồi về bài viết

Cùng thảo luận chút nhỉ!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.