อิมเมจ DTB

การใช้งาน Android อาจรวมภาพ Device Tree Blob (DTB) ไว้ให้ Bootloader ใช้งาน ตำแหน่งของรูปภาพ DTB (และตัวเลือกสำหรับการระบุพารามิเตอร์รูปภาพ DTB) จะแตกต่างกันไปตามรุ่นของ Android

  • ใน Android 11 อุปกรณ์ที่ใช้อิมเมจเคอร์เนลทั่วไป (GKI) ต้องรองรับพาร์ติชันบูตของเวนเดอร์ ซึ่งประกอบด้วยข้อมูลเฉพาะของเวนเดอร์ทั้งหมดที่ย้ายจากพาร์ติชันบูต เนื่องจากอิมเมจ DTB มีข้อมูลที่เฉพาะเจาะจงของผู้ให้บริการ ตอนนี้อิมเมจจึงเป็นส่วนหนึ่งของพาร์ติชันบูตของผู้ให้บริการ หากต้องการระบุพารามิเตอร์รูปภาพ DTB โปรดดูส่วนหัวการบูตของผู้ให้บริการ

  • ใน Android 10 อุปกรณ์จะรวมอิมเมจ DTB ไว้ในพาร์ติชันบูตได้ หากต้องการระบุพารามิเตอร์ของรูปภาพ DTB โปรดดูการรวมรูปภาพ DTB ในรูปภาพบูต

  • ใน Android 9 และต่ำกว่า อิมเมจ DTB อาจมีอยู่ในพาร์ติชันของตัวเองหรือต่อท้ายเคอร์เนล image.gz เพื่อสร้างเคอร์เนล + อิมเมจ DTB (ซึ่งจะส่งผ่านไปยัง mkbootimg เพื่อสร้าง boot.img)

รูปแบบรูปภาพ DTB

ใน Android 10 ขึ้นไป รูปภาพ DTB ต้องใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้

  • DT Blob ที่เชื่อมต่อกัน บูตโหลดเดอร์ใช้ช่อง totalsize ในส่วนหัว FDT แต่ละส่วนเพื่ออ่านและแยกวิเคราะห์ Blob ที่เกี่ยวข้อง

  • พาร์ติชัน DTB/DTBO Bootloader มีวิธีที่มีประสิทธิภาพในการเลือก DT Blob ที่ถูกต้องโดยการตรวจสอบโครงสร้าง dt_table_entry (มีช่อง id, rev และ custom) ซึ่งเก็บข้อมูลระบุฮาร์ดแวร์สำหรับรายการได้ โปรดดูรายละเอียดที่พาร์ติชัน DTB/DTBO

รวมอิมเมจ DTB ไว้ในอิมเมจบูท

อุปกรณ์ที่ใช้ Android 10 สามารถรวมอิมเมจ DTB ไว้ในอิมเมจบูตได้ ซึ่งทำให้ Android ไม่ต้องรองรับสคริปต์ที่ต่อท้ายรูปภาพ DTB ไปยัง image.gz ในเคอร์เนล และเปิดใช้การทดสอบชุดทดสอบของผู้ให้บริการ (VTS) เพื่อยืนยัน (และกำหนดมาตรฐาน) ตำแหน่ง DTB

นอกจากนี้ สำหรับอุปกรณ์ที่ไม่ใช่ A/B การมี DTB เป็นส่วนหนึ่งของอิมเมจการกู้คืนจะปลอดภัยกว่าการใช้ DTB ในพาร์ติชันแยกต่างหากเพื่อป้องกันปัญหาที่เกิดจาก OTA ที่หยุดชะงัก ในระหว่าง OTA หากปัญหาเกิดขึ้นหลังจากอัปเดตพาร์ติชัน DTB (แต่ก่อนที่จะอัปเดตแบบเต็ม) อุปกรณ์จะพยายามเปิดเครื่องในโหมดการกู้คืนเพื่อ OTA ให้เสร็จสมบูรณ์ อย่างไรก็ตาม เนื่องจากได้อัปเดตพาร์ติชัน DTB แล้ว จึงอาจไม่ตรงกับอิมเมจการกู้คืน (ซึ่งยังไม่ได้อัปเดต) การมีรูปภาพ DTB เป็นส่วนหนึ่งของรูปแบบรูปภาพสำหรับบูตจะช่วยป้องกันปัญหาดังกล่าวได้ด้วยการทำให้รูปภาพการกู้คืนทำงานได้ด้วยตัวเอง (กล่าวคือ ไม่ได้ขึ้นอยู่กับพาร์ติชันอื่น)

โครงสร้างอิมเมจการเปิดเครื่อง

อุปกรณ์ที่ใช้ Android 10 สามารถรวมอิมเมจ DTB ได้โดยใช้โครงสร้างอิมเมจบูตต่อไปนี้

ส่วนอิมเมจบูต จำนวนหน้า
ส่วนหัวของการเปิดเครื่อง (1 หน้า) 1
เคอร์เนล (หน้า l) l = (kernel_size + page_size - 1) / page_size
แรมดิสก์ (หน้า m) ม. = (ramdisk_size + page_size - 1) / page_size
Bootloader ขั้นที่ 2 (n หน้า) จำนวน = (second_size + page_size - 1) / page_size
การกู้คืน DTBO (หน้า o) o = (recovery_dtbo_size + page_size - 1) / page_size
DTB (หน้า P) p = (dtb_size + page_size - 1) / page_size

เส้นทางรูปภาพ DTB

สําหรับอุปกรณ์ที่ใช้ Android 10 คุณสามารถใช้เครื่องมือ mkbootimg.py และอาร์กิวเมนต์ต่อไปนี้เพื่อระบุเส้นทางไปยังรูปภาพ DTB

อาร์กิวเมนต์ คำอธิบาย
dtb เส้นทางไปยังอิมเมจ DTB ที่จะรวมอยู่ในอิมเมจการบูต/การกู้คืน
dtb_offset เมื่อเพิ่มลงในอาร์กิวเมนต์ base จะระบุที่อยู่จริงของไฟล์โหลดสำหรับต้นไม้อุปกรณ์สุดท้าย เช่น หากอาร์กิวเมนต์ base เป็น 0x10000000 และอาร์กิวเมนต์ dtb_offset เป็น 0x01000000 ระบบจะป้อนข้อมูล dtb_addr_field ในส่วนหัวของภาพบูตเป็น 0x11000000

ต้องใช้ตัวแปรการกำหนดค่ากระดาน BOARD_PREBUILT_DTBIMAGE_DIR เพื่อระบุเส้นทางไปยังอิมเมจ DTB หากมีไฟล์ที่มีนามสกุล *.dtb มากกว่า 1 ไฟล์ในไดเรกทอรี BOARD_PREBUILT_DTBIMAGE_DIR ระบบบิลด์ Android จะต่อเชื่อมไฟล์เพื่อสร้างอิมเมจ DTB สุดท้ายที่ใช้ในการสร้างอิมเมจบูต

หากต้องการส่งอาร์กิวเมนต์ dtb ไปยัง mkbootimg.py ที่มีอิมเมจ DTB จากไดเรกทอรีที่ระบุโดย BOARD_PREBUILT_DTBIMAGE_DIR ต้องตั้งค่าตัวแปรการกำหนดค่ากระดาน BOARD_INCLUDE_DTB_IN_BOOTIMG เป็น true เช่น

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

คุณเพิ่มอาร์กิวเมนต์ dtb_offset ต่อท้ายตัวแปรการกำหนดค่ากระดาน BOARD_MKBOOTIMG_ARGS ด้วยค่าออฟเซ็ตและเวอร์ชันส่วนหัวอื่นๆ ได้ เช่น

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

การรองรับ Bootloader

เพื่อให้ VTS ทำงานได้สําเร็จในอุปกรณ์ที่ใช้ Android 10 บูตโหลดเดอร์ต้องรองรับอิมเมจบูตที่อัปเดตแล้ว และจะต้องเพิ่มพารามิเตอร์บรรทัดคําสั่งของเคอร์เนล androidboot.dtb_idx เพื่อระบุดัชนีของ Device Tree (DT) ที่เลือก คุณจะระบุดัชนีได้เพียงรายการเดียว (1) รายการ ตัวอย่างเช่น พารามิเตอร์ androidboot.dtb_idx=N จะรายงาน N เป็นดัชนีฐาน 0 ของต้นไม้อุปกรณ์ที่บูตโหลดเดอร์เลือกจากชุด DTB ที่มีอยู่ในภาพการบูต