การอัพเกรดเฟิร์มแวร์กระสุน


16

เทคนิคชนิดใดที่ใช้เพื่อให้ผู้ใช้อัปเกรดการขายหลังการขายเฟิร์มแวร์อุปกรณ์ได้อย่างปลอดภัย ? ฉันต้องการทำสิ่งนี้กับไมโครคอนโทรลเลอร์ Cortex M3 / 4 แต่ฉันเดาว่าเทคนิคใดที่ไมโครควรทำ

โดยเฉพาะอย่างยิ่งกับองค์ประกอบพิเศษจำนวนน้อยที่สุดของหลักสูตร

คำตอบ:


16

ใช้ชิปที่มีปริมาณหน่วยความจำแฟลชมากกว่าสองเท่าสำหรับรหัสของคุณ วิธีนี้คุณจะได้รับเฟิร์มแวร์ใหม่ไปยังหน่วยความจำนี้ในขณะที่ยังคงทิ้งเก่าในกรณีที่มีอะไรผิดปกติ

หลังจากคุณถอดรหัสและตรวจสอบ checksums บนเฟิร์มแวร์ตัวใหม่ bootloader สามารถคัดลอกไปยังตำแหน่งสุดท้ายแทนที่อันเก่า หากมีสิ่งใดผิดพลาดในส่วนนี้หลังจากการรีเซ็ตอย่างหนัก bootloader จะเห็นว่าเฟิร์มแวร์ใหม่ไม่ถูกต้อง (โดยเรียกใช้การตรวจสอบอีกครั้ง) และลองคัดลอกใหม่

นี่เป็นวิธีที่ง่ายและเข้าใจผิดได้ง่ายที่สุดที่ฉันรู้ นอกจากนี้ยังต้องใช้รหัสเล็กน้อยใน bootloader และไม่ต้องการทำซ้ำฟังก์ชันการทำงานใด ๆ ระหว่างโปรแกรมหลักและ bootloader (คุณไม่จำเป็นต้องใช้ตรรกะการสื่อสารใด ๆ ใน bootloader)


10
ในฐานะผู้ใช้อุปกรณ์อิเล็กทรอนิกส์ฉันอาจเพิ่มว่ามันน่าจะมีปุ่มสักที่ที่จะถือในขณะที่บูตที่จะบูตเฟิร์มแวร์เก่าในกรณีที่ใหม่มีการตรวจสอบที่ถูกต้อง แต่ตัวซอฟต์แวร์มีข้อผิดพลาด
Zan Lynx

4
"ปัญหา" ที่ฉันเห็นด้วยวิธีนี้คือคุณต้องการตารางการย้ายตำแหน่งหรือรหัสตำแหน่งที่สมบูรณ์ มิฉะนั้นรหัสของคุณจะไม่ทำงาน
Nico Erfurth

2
@Masta - คุณไม่เข้าใจส่วนที่คัดลอกเฟิร์มแวร์ไปยังตำแหน่งสุดท้าย (ปกติ)
Kevin Vermeer

3
@jpc - เราใช้เทคนิคนี้กับชิปแฟลชอนุกรมภายนอกกับเครื่องมือบางอย่างในที่ทำงาน คุณไม่จำเป็นต้องมีไมโครคอนโทรลเลอร์พร้อมแฟลชมากกว่าสองเท่าหากคุณมีพื้นที่สำหรับส่วน SOIC หรือ QFN 8 พิน หน่วยความจำแฟลชแบบอนุกรมขนาด 1MB อาจมีราคาต่ำกว่าหนึ่งดอลลาร์ดังนั้นจึงอาจมีราคาถูกกว่าที่จะไปเส้นทางนี้กว่าอัพเกรดไมโครคอนโทรลเลอร์ในบางกรณี!
Kevin Vermeer

@zan - ใช่แล้วเราก็ใช้มันเช่นกัน ข้อกังวลหรือประโยชน์ประการหนึ่งคืออุปกรณ์ได้รับการรีเซ็ตเป็นค่าเริ่มต้นเมื่อคุณคัดลอกเฟิร์มแวร์เก่า (เราไม่มี EEPROM บนไมโครของเราเราเก็บข้อมูลการกำหนดค่าเช่นที่อยู่ MAC และที่อยู่ IP ใน Flash ที่เขียนด้วยตนเอง) สำหรับเราสิ่งนี้ทำให้ง่ายต่อการค้นหาบอร์ดเมื่อเราลืมที่อยู่ IP
Kevin Vermeer

12

ใช้ bootloader และแฟลชเสริมอีกสองสาม KB

ทำการอัปเกรดโดย bootloader โดยส่งคำสั่งพิเศษผ่านทาง UART, USB, I2C หรือโปรโตคอลอื่น มีการอัปเดตรหัสหลักเท่านั้น - รหัส bootloader ไม่เคยแตะยกเว้นผ่านโปรแกรมเมอร์ภายนอก (เช่น JTAG / PICkit สำหรับ PICs เป็นต้น)

หากการอัปเดตล้มเหลว (ไฟฟ้าขัดข้องมีคนสะดุดสายหรือเหตุผลอื่น) วิดเจ็ตจะไม่ทำงาน แต่ bootloader จะยังคงอยู่ที่นั่นเพื่อให้สามารถอัพเกรดได้อีกครั้ง

สามารถตั้งค่าสถานะในบางไบต์ซึ่งป้องกันไม่ให้รหัสหลักทำงานไม่ถูกต้องเนื่องจากยังไม่ได้รับการปรับปรุงอย่างสมบูรณ์


คุณสามารถบังคับให้ bootloader ทำงานได้หากการบู๊ตเกิดจากการเปิดเครื่อง สิ่งนี้จะช่วยได้หากคุณโหลดเฟิร์มแวร์ไม่ดีซึ่งเกิดปัญหาขึ้นทันที bootloader จะต้องหมดเวลาเพื่อเรียกใช้แอปพลิเคชันหลังจาก X วินาที
Robert

เป็นความคิดที่ดีถ้าคุณสามารถใช้โปรโตคอลอย่างง่าย (เช่น async serial, TTL หรือ 485) สำหรับกรณีที่เกี่ยวข้องเพิ่มเติม (การ์ด SD, GPRS, USB) ฉันจะไม่รวมรหัสสนับสนุนที่ซับซ้อนใน bootloader (ไม่สามารถอัปเกรด) ได้ Ethernet OTOH (raw UDP หรือ TFTP) นั้นง่ายพอสำหรับสิ่งนี้
jpc

3

หากอุปกรณ์ของคุณมีราคาค่อนข้างแพงและคุณสามารถจ่ายได้ (และคุณเป็นห่วงการอัพเกรด) คุณสามารถทำเช่นนี้ ...

(โดยทั่วไปเทคนิคนี้ต้องใช้ที่เก็บข้อมูลภายนอกหรือการใช้ jtag .. โดยคดเคี้ยว)

มีไมโครโปรแกรมคงที่ (เช่น PIC เล็กน้อย) ที่สามารถหยุดระบบและโปรแกรมใหม่

เนื่องจากคุณไม่สามารถเปลี่ยนเฟิร์มแวร์ "อัพเกรดโปรเซสเซอร์" ได้จึงไม่ผิดไปเลย

1) ผู้ใช้สามารถอัพเกรดอุปกรณ์

2) หากการอัพเกรดล้มเหลวพวกเขาสามารถลองอีกครั้งได้ตลอดเวลา ไม่สามารถปิดกั้นได้

3) แม้ในขณะที่อุปกรณ์เป้าหมายของคุณไม่รองรับตัวโหลดการบูต (มันแค่ต้องการบู๊ตและรัน) คุณยังสามารถทำสิ่งที่คุณต้องการได้

ใช้ได้กับ FPGA, DSP และเป้าหมายคี่บอลอื่น ๆ

สามารถมีส่วนต่อประสานกับผู้ใช้ที่เป็นระเบียบ (แม้แต่ PIC สามารถเรียกใช้เว็บเซิร์ฟเวอร์ .... )


2

ตรวจสอบให้แน่ใจว่าผลิตภัณฑ์ของคุณมีอินเตอร์เฟสแบบอนุกรมที่เรียบง่ายบางประเภทโดยเฉพาะอย่างยิ่ง EIA232 ตัวเชื่อมต่อที่ไม่ได้มาตรฐานนั้นใช้ได้หากคุณไม่มีที่ว่างสำหรับ DB-9 ตัวอย่างเช่นตัวเชื่อมต่อ TRSเป็นสิ่งที่คุณต้องการสำหรับ TxD, RxD และกราวด์

เมื่อเขียนโปรแกรมอุปกรณ์เป็นครั้งแรก ได้แก่bootloader สิ่งนี้ควรเรียบง่ายที่สุดเท่าที่จะเป็นไปได้เพราะไม่ช้าก็เร็วคุณจะต้องอัพเกรด bootloader ด้วยตัวเองหากต้องการคุณสมบัติใหม่ (คุณอาจไม่สามารถอัพเกรดได้)

จากนั้นเชื่อมต่อ TRS ใช้แจ็คที่มีสวิตช์เพื่อให้คุณสามารถตรวจจับได้เมื่อมีขั้วต่ออยู่ เพียงตรวจสอบการรีเซ็ตทันทีและเริ่ม bootloader หากมีปลั๊กอยู่มิฉะนั้นให้เริ่มต้นแอปพลิเคชัน วิธีดังกล่าว bootloader และโปรแกรมแอปพลิเคชันผู้ใช้จะยังคงแยกจากกัน (การตรวจสอบนั้นเป็นส่วนหนึ่งของ bootloader เราต้องการมันโดยไม่คำนึงถึงเวอร์ชั่นของแอพพลิเคชั่นมิฉะนั้นเราจะไม่สามารถเข้า bootloader ได้!)


ทำไมคุณถึงต้องการอัพเกรด bootloader คุณจะแน่ใจได้อย่างไรว่ากระบวนการอัพเกรดจะไม่ทำให้อุปกรณ์เป็นอิฐ? ถ้าเป็นเช่นนั้นคุณสมบัติใหม่ ๆ ที่น่าสนใจจนคุณอาจเสี่ยงต่อการอัพเกรด
Kevin Vermeer

5
@ เควิน - ฉันคิดว่าเขาหมายความว่า bootloader ควรจะง่ายจนคุณไม่เคยแม้แต่จะคิดถึง "อัพเกรด" เลย
jpc

@jpc - อ่าพูดถูกตีความผิด เราตกลงกันแล้ว!
Kevin Vermeer

1

'ตัวเลื่อน' จะมีอุปกรณ์ใดบ้าง พีซี, USB stick, micro SD card?

วิธีหนึ่งที่จะมีแอปพลิเคชันในรายการแบบถอดได้ (usb stick, การ์ด SD, ฯลฯ ) ชิปโหลดแอปพลิเคชันจากรายการ ผู้อัปเกรดของคุณเพียงแค่สลับไอเทมและรีบูต

ชิปไมโครคอนโทรลเลอร์ ARM และ Cortex ที่ฉันรู้จัก (NXP, Atmel) ล้วนมีบูท bootloader ในตัวดังนั้นหากตัวอัปเดตของคุณมาพร้อมกับพีซีและสายเคเบิลอนุกรม ปรับปรุง


เพียงแค่เดินสายพิน UART ไปยังพอร์ตในขณะที่เชื่อมต่อกับพอร์ต COM และพีซีคุณสามารถแฟลชเฟิร์มแวร์ได้โดยไม่ต้องมีรหัสใด ๆ บน mcu เลย? เคล็ดลับที่ดี
Imbrondir

ตรวจสอบแผ่นข้อมูลส่วน 'bootloader' ในการทำเช่นนี้จริง ๆ แล้ว 'แฮนด์' คุณจะต้องมีวิธีในการรีเซ็ตชิป 2. เปิดใช้งาน bootloader (ชิปตรวจสอบพินละติน) วิธีนี้สามารถทำได้โดยใช้จัมเปอร์และสวิตช์ (รีเซ็ต) แต่วิธีที่สะดวกกว่า (โดยเฉพาะบนโต๊ะทำงานของคุณ) คือการใช้สายจับมือสองเส้นเพื่อทำเคล็ดลับ 'Hands-off' โปรแกรมดาวน์โหลดบนพีซีส่วนใหญ่ (เช่น flashmagic, lpc21isp) สามารถใช้เวทมนตร์จับมือกับคุณได้ (หากคุณต่อสาย handshake อย่างถูกต้อง)
Wouter van Ooijen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.