Tag Archives: u-boot

ทดลอง u-boot porting แบบเบื้องต้น บน QEMU mini2440

จากประสบการณ์ในการทำงานด้านการออกแบบระบบสมองกลฝังตัวของแอดมินที่ผ่านมา เราอาจจะเจอกับงานที่มีการเปลี่ยนแปลงไปจากบอร์ดอ้างอิง (Reference design) เนื่องจากเหตุผลเรื่องราคา ความต้องการของลูกค้า อายุของผลิตภัณฑ์ในตลาด แนวโน้มของเทคโนโลยี่ หรือข้อจำกัดเรื่องกฎหมายสิ่งแวดล้อม โดยเฉพาะอุปกรณ์พวกหน่วยความจำต่างๆ เช่น nand flash หรือ SDRAM ซึ่งอาจจะทำให้เฟิร์มแวร์ ของบอร์ดอ้างอิงทำงานไม่ได้บนบอร์ดต้นแบบ ทำให้เราต้องมีการแก้ไขโค้ดต้นฉบับให้สามารถทำงานกับบอร์ดที่ออกแบบมาใหม่ได้ การแก้ไขนี้จะมากน้อยขนาดไหน อยู่ที่โชคของแต่ละคนนะครับ ในบางงานเราอาจจะได้เป็นนักพัฒนากลุ่มแรกในโลกที่ได้ทำงานกับอุปกรณ์นั้น ข้อดีคือ มันท้าทายมาก ข้อเสียคือมันใหม่จนเราไม่สามารถปรึกษาใครได้เลย แม้กระทั่งกับ FAE (Field Application Engineer)

ขั้นตอนการทำงานของโปรแกรมยูบูต (u-boot execution flow)

หลังจากที่ได้ทำความเข้าใจกับขั้นตอนการสร้างยูบูต (compile-time) แล้ว เราลองมาทำความเข้าใจกับขั้นตอนการทำงานของโปรแกรมยูบูต (run-time) กันต่อเลยดีกว่า โดยทั่วไปสามารถแบ่งขั้นตอนการทำงานของโปรแกรมยูบูต ได้เป็นสองรูปแบบ คือ แบบมีการย้ายตำแหน่งของยูบูต (Relocation) กับแบบไม่มีการย้ายตำแหน่งของยูบูต (Non relocation) ซึ่งมีขั้นตอนโดยรวมแทบจะเหมือนกันเว้นแต่ส่วนการย้ายยูบูตไบนารี่โค้ด แม้ว่าในโค้ดเวอร์ชั่นปัจจุบัน (2016.xx) จะใช้การย้ายตำแหน่งของยูบูต (Relocation) เป็นส่วนใหญ่ แต่เรายังสามารถพบลักษณะการบูตโดยไม่มีการย้ายตำแหน่งของยูบูต ในระบบขนาดเล็ก เนื่องการทำงานของโค้ดส่วนนี้ มีความน่าสนใจศึกษาอยู่ ในบทความนี้จึงขอแบ่งรูปแบบของการทำงานโดยใช้เรื่องนี้เป็นหลักนะครับ ก่อนจะทำความเข้าใจการทำงานทั้งหมด ขออธิบายเรื่องการย้ายตำแหน่งยูบูตให้เข้าใจกันก่อน

การใช้งานยูบูตบนแพลตฟอร์มที่มี ROM ขนาดเล็กด้วย ยูบูตฉบับย่อส่วน (u-boot SPL/TPL)

ในการออกแบบระบบฝังตัวบางครั้ง เราอาจมีข้อจำกัดเรื่องราคาของตัวผลิตภัณฑ์ ทำให้นักออกแบบต้องไปเลือกใช้แฟลซเมมโมรี่แบบอนุกรมที่มีราคาถูกกว่า แต่ปัญหาของอุปกรณ์หน่วยความจำแบบนี้ก็คือ ซีพียูส่วนใหญ่ไม่สามารถทำงานกับอุปกรณ์แบบอนุกรมโดยเข้าถึงผ่านเมมโมรี่สเปซได้ ซึ่งนั่นทำการบูตจากอุปกรณ์หน่วยความจำแบบอนุกรมเป็นไปไม่ได้เลย ยกตัวอย่างเช่น หากเราใช้ SPI flash เพื่อเก็บตัวยูบูตหรือลินุกซ์เคอร์เนลไว้ ซีพียูจะไม่สามารถอ่านข้อมูลออกมาได้หาก SPI คอนโทรลเลอร์ ไม่ได้ถูกตั้งค่าเริ่มต้น และแม้ว่าระบบบัสจะทำงานได้ แต่เราก็ไม่สามารถ เข้าถึงข้อมูลใน SPI flash โดยการอ้างตำแหน่งแบบตรงๆ

ทำความเข้าใจ ขั้นตอนการคอมไพล์ u-boot ตอนที่ 2

จากตอนที่แล้วเราได้ทำความรู้จักกับโครงสร้างไดเร็คทอรี่ และเข้าใจกับลำดับขั้นตอนการสร้างส่วนประกอบต่างๆของยูบูต ไปบางส่วนแล้วในตอนนี้เราจะมาทำความเข้าใจในรายละเอียดของการคอมไพล์แต่ละขั้นตอนลงไปอีก ซึ่งจะทำให้เราเข้าใจมากขึ้นไปอีก การวิเคราะห์คอนโซลเอาท์พุตจากการรัน make <config> ระหว่างการรันคำสั่ง make <config> จะปรากฏข้อความส่งออก จำนวนมาก จากคำสั่งต่างๆ ที่คำสั่ง make เรียกใช้ ข้อความที่ดูมากมายจนเกินกว่าจะทำความเข้าใจนั้น รวบรวมทุกขั้นตอนของการสร้างโปรแกรม ยูบูต อย่างละเอียด การทำความเข้าใจกับแต่ละคำสั่งสามารถทำให้เราเข้าใจขั้นตอนต่างๆได้มากขึ้นนอกเหนือจากลำดับขั้นตอนข้างต้น เราสามารถเก็บข้อความส่งออกขณะทำการคอมไพล์ เป็นไฟล์เพื่อการวิเคราะห์ภายหลังด้วยคำสั่ง

ทำความเข้าใจ ขั้นตอนการคอมไพล์ u-boot ตอนที่ 1

หลายๆคนที่เคยเริ่มคอมไพล์ยูบูตด้วยตัวเอง คงมีคำถามเกี่ยวกับขั้นตอนต่างๆ ที่เกิดขึ้นหลังจากการเริ่มการคอมไพล์โปรเจค เนื่องจากมันจะมีข้อความมากมายส่งออกมาที่หน้าจอจนอาจทำความเข้าใจได้ไม่ทั้งหมด แต่ถ้าเราลองมาพิจารณาทีละส่วน การจะเข้าใจขั้นตอนการคอมไพล์ยูบูต ก็เริ่มเป็นไปได้มากขึ้น จริงๆแล้วการทำความเข้าใจในขั้นตอนเหล่านี้จะเป็นพื้นฐานที่ดีในการทำความเข้าใจการคอมไพล์ระบบฝังตัวของโปรเจคอื่นๆด้วย เนื่องจากมีหลักการไม่ต่างกันมาก

เริ่มต้นทำความรู้จัก ยูนิเวอร์แซล บูตโหลดเดอร์กันดีกว่า

What is the Boot Loader? การนิยาม บูตโหลดเดอร์ให้ครอบคลุมสำหรับทุกแพลตฟอร์มอาจทำให้สับสนได้เนื่องความแตกต่างกันและข้อจำกัดต่างๆ ของฮาร์ดแวร์ ตัวอย่างเช่นบูตโหลดเดอร์ของราสเบอรี่พายซึ่งทำหน้าที่ตั้งแต่การตั้งค่าระบบต่างๆทุกอย่างไปจนถึงการโหลดลินุกซ์เคอร์เนล เปรียบเทียบกับบูตโหลดเดอร์ของ PC ซึ่งทำหน้าที่เพียงการโหลดลินุกซ์เคอร์เนลเท่านั้น เนื่องจากหน้าที่การกำหนดค่าเริ่มต้นระบบเป็นของ BIOS จึงอาจกล่าวได้ว่า BIOS ทำหน้าที่เป็นบูตโหลดเดอร์ช่วงที่หนึ่ง