Nâng cấp firmware chống đạn


16

Loại kỹ thuật nào được sử dụng để cho phép người dùng nâng cấp an toàn chương trình bán phần mềm thiết bị? Tôi muốn làm điều này với một vi điều khiển Cortex M3 / 4, nhưng tôi đoán các kỹ thuật cho bất kỳ vi mô nào cũng nên làm.

Tốt nhất là với số lượng ít nhất của các thành phần bổ sung của khóa học.

Câu trả lời:


16

Sử dụng một con chip có bộ nhớ Flash nhiều hơn gấp đôi bạn sẽ cần cho mã của mình. Bằng cách này, bạn có thể đưa phần sụn mới vào bộ nhớ này trong khi vẫn để phần sụn cũ trong trường hợp có lỗi xảy ra.

Sau khi bạn giải mã và xác minh tổng kiểm tra trên phần sụn mới, bộ tải khởi động có thể sao chép nó vào vị trí cuối cùng, thay thế vị trí cũ. Nếu có bất cứ điều gì sai trong phần này, sau khi thiết lập lại bộ nạp khởi động sẽ thấy phần sụn mới không hợp lệ (bằng cách chạy lại tổng kiểm tra một lần nữa) và thử lại bản sao.

Đây là cách đơn giản nhất và hoàn hảo nhất mà tôi biết. Nó cũng yêu cầu ít mã trong bộ tải khởi động và không yêu cầu sao chép bất kỳ chức năng nào giữa chương trình chính và bộ tải khởi động (bạn không cần bất kỳ logic giao tiếp nào trong bộ tải khởi động).


10
Là một người sử dụng thiết bị điện tử, tôi có thể nói thêm rằng thật tuyệt khi có một nút ở đâu đó để giữ trong khi khởi động chương trình cơ sở cũ, trong trường hợp cái mới có tổng kiểm tra chính xác nhưng bản thân phần mềm có lỗi.
Zan Lynx

4
"Vấn đề" tôi thấy với giải pháp này là bạn cần một số loại bảng định vị lại hoặc hoàn thành mã độc lập vị trí. Nếu không, mã của bạn sẽ không chạy.
Nico Erfurth

2
@Masta - Bạn không hiểu phần mà phần sụn được sao chép vào vị trí cuối cùng (bình thường).
Kevin Vermeer

3
@jpc - Chúng tôi sử dụng kỹ thuật này với chip Flash nối tiếp bên ngoài trên một số công cụ nội bộ tại nơi làm việc. Bạn không cần phải có một bộ vi điều khiển có hơn hai lần Flash nếu bạn có chỗ cho một phần SOIC hoặc QFN 8 chân. Bộ nhớ Flash nối tiếp 1MB có thể có ít hơn một đô la nên có thể rẻ hơn khi đi tuyến đường này so với nâng cấp vi điều khiển trong một số trường hợp!
Kevin Vermeer

@zan - Yup, chúng tôi cũng dùng cái này. Một mối quan tâm hoặc lợi ích là thiết bị được đặt lại về mặc định khi bạn sao chép phần sụn cũ (chúng tôi không có EEPROM trên micro của chúng tôi; chúng tôi lưu trữ dữ liệu cấu hình như địa chỉ MAC và địa chỉ IP trong Flash tự viết). Đối với chúng tôi, điều này giúp bạn dễ dàng tìm thấy một bảng khi chúng ta quên địa chỉ IP.
Kevin Vermeer

12

Sử dụng bộ tải khởi động và một vài KB đèn flash phụ.

Việc nâng cấp được thực hiện bởi bộ tải khởi động, bằng cách gửi một số lệnh đặc biệt qua UART, USB, I2C hoặc giao thức khác. Chỉ có mã chính được cập nhật - mã bootloader không bao giờ được chạm vào ngoại trừ thông qua một lập trình viên bên ngoài (tức là JTAG / PICkit cho PIC, v.v.)

Nếu cập nhật không thành công (mất điện, ai đó bị vấp dây hoặc lý do khác), thì tiện ích sẽ không hoạt động, nhưng bộ tải khởi động sẽ vẫn ở đó để có thể thử nâng cấp lại.

Một cờ có thể được đặt trong một số byte ở đâu đó để ngăn chặn mã chính thực thi không chính xác vì nó chưa được cập nhật đầy đủ.


Bạn cũng có thể buộc bộ tải khởi động chạy nếu khởi động là do bật nguồn. Điều này sẽ giúp nếu bạn tải phần mềm xấu bị hỏng ngay lập tức. Bộ tải khởi động sẽ cần thời gian chờ để chạy ứng dụng sau X giây.
Robert

Đó là một ý tưởng tốt nếu bạn có thể sử dụng một giao thức đơn giản (như nối tiếp async, TTL hoặc 485). Đối với các trường hợp liên quan hơn (thẻ SD, GPRS, USB) tôi sẽ không bao gồm mã hỗ trợ phức tạp trong bộ tải khởi động (không thể nâng cấp). Ethernet OTOH (UDP thô hoặc TFTP) đủ đơn giản cho việc này.
jpc

3

Nếu thiết bị của bạn tương đối đắt tiền và bạn có thể trả chi phí (và khách hàng quan tâm đến việc nâng cấp), bạn có thể làm điều này ...

(nói chung kỹ thuật này yêu cầu lưu trữ bên ngoài hoặc sử dụng sai lệch jtag ..)

Có một vi chương trình cố định (như một PIC nhỏ) có thể tạm dừng hệ thống và lập trình lại nó.

bởi vì bạn không thể thay đổi phần sụn "nâng cấp bộ xử lý", nó không bao giờ bị lỗi.

1) người dùng có thể nâng cấp thiết bị

2) nếu nâng cấp thất bại, họ luôn có thể thử lại. Nó không thể bị gạch

3) ngay cả khi thiết bị mục tiêu của bạn không hỗ trợ trình tải khởi động (nó chỉ muốn khởi động và chạy), bạn vẫn có thể làm cho thiết bị thực hiện những gì bạn muốn.

hoạt động cho các mục tiêu FPGA, DSP và lẻ bóng khác.

Có thể có giao diện người dùng thực sự gọn gàng (thậm chí PIC có thể chạy máy chủ web ....)


2

Hãy chắc chắn rằng sản phẩm của bạn có một số loại giao diện nối tiếp đơn giản , tốt nhất là EIA232. Đầu nối không chuẩn sẽ ổn nếu bạn không có chỗ cho DB-9. Ví dụ, một đầu nối TRS là tất cả những gì bạn cần cho TxD, RxD và mặt đất.

Khi lập trình thiết bị lần đầu tiên, hãy bao gồm bộ tải khởi động . Điều này nên đơn giản nhất có thể , bởi vì sớm hay muộn bạn cũng muốn nâng cấp bộ nạp khởi động nếu nó cần các tính năng mới. (Bạn có thể thậm chí không thể nâng cấp nó)

Sau đó, kết nối TRS. Sử dụng giắc cắm có công tắc để bạn có thể phát hiện khi có đầu nối. Chỉ cần kiểm tra ngay khi thiết lập lại và khởi động bộ nạp khởi động nếu có phích cắm, nếu không thì khởi động ứng dụng. Bằng cách đó, bộ nạp khởi động và chương trình ứng dụng người dùng vẫn tách biệt tốt. (Kiểm tra thực sự là một phần của bộ tải khởi động; chúng tôi sẽ cần nó bất kể phiên bản của ứng dụng, nếu không chúng tôi sẽ không thể vào bộ tải khởi động!)


Tại sao bạn muốn nâng cấp bộ nạp khởi động? Làm thế nào bạn có thể chắc chắn rằng quá trình nâng cấp sẽ không làm hỏng thiết bị? Nếu có thể, những tính năng mới nào sẽ hấp dẫn đến mức bạn sẽ mạo hiểm để nâng cấp?
Kevin Vermeer

5
@Kevin - Tôi nghĩ rằng anh ta có nghĩa là bộ nạp khởi động nên đơn giản đến mức bạn sẽ không bao giờ nghĩ đến việc "nâng cấp" nó.
jpc

@jpc - Ah, bạn nói đúng, giải thích sai điều đó. Chúng ta đồng ý!
Kevin Vermeer

1

Những 'thiết bị nâng cấp' nào sẽ có sẵn? Một PC, một thanh USB, một thẻ micro SD?

Một cách là để ứng dụng trong một vật phẩm có thể tháo rời (thẻ nhớ USB, thẻ SD, v.v.). Các chip tải ứng dụng của nó từ các mục. Upgrader của bạn chỉ cần hoán đổi các mục và khởi động lại.

Tất cả các chip vi điều khiển ARM và Cortex mà tôi biết (NXP, Atmel) đều có bộ tải khởi động nối tiếp tích hợp, vì vậy nếu trình cập nhật của bạn đến với PC và cáp nối tiếp (và bạn đã sắp xếp giao diện cổng COM), anh ấy có thể tải xuống cập nhật.


Vì vậy, chỉ đơn giản bằng cách nối các chân UART với một cổng, trong khi kết nối với cổng COM và PC, bạn có thể flash chương trình cơ sở mà không cần bất kỳ mã nào trên mcu không? Mẹo hay.
Imbrondir

Kiểm tra biểu dữ liệu, phần 'bộ nạp khởi động'. Để thực hiện việc này thực sự 'bỏ tay', bạn sẽ cần một cách để 1. đặt lại chip; 2. kích hoạt bộ nạp khởi động (chip kiểm tra pin ceratin). Điều này có thể được thực hiện bằng một nút nhảy và công tắc (đặt lại), nhưng cách thuận tiện hơn (đặc biệt là trên bàn của bạn) là sử dụng hai đường bắt tay để thực hiện thủ thuật 'bắt tay'. Hầu hết các chương trình tải xuống PC (ví dụ: flashmagic, lpc21isp) có thể thực hiện phép thuật bắt tay cho bạn (nếu bạn nối các đường bắt tay chính xác).
Wouter van Ooijen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.