รูปภาพ DTB

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

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

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

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

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

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

  • ออบเจ็กต์แบบไบนารีขนาดใหญ่ของ DT ที่ต่อกัน Bootloader ใช้ฟิลด์ totalsize ในส่วนหัว FDT แต่ละรายการเพื่ออ่านและแยกวิเคราะห์ Blob ที่เกี่ยวข้อง

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

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

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

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

โครงสร้างอิมเมจบูต

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

ส่วนอิมเมจบูต จำนวนหน้า
ส่วนหัวของการบูต (1 หน้า) 1
เคอร์เนล (1 หน้า) l = (kernel_size + page_size - 1) / page_size
Ramdisk (m pages) m = (ramdisk_size + page_size - 1) / page_size
Bootloader ระยะที่ 2 (n หน้า) 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 หากมีไฟล์มากกว่า 1 ไฟล์ที่มีนามสกุล *.dtb ในไดเรกทอรี 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 config ด้วยออฟเซ็ตและเวอร์ชันส่วนหัวอื่นๆ เช่น

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 ได้สำเร็จ Bootloader ต้องรองรับอิมเมจบูตที่อัปเดตแล้ว และต้องเพิ่มพารามิเตอร์บรรทัดคำสั่งเคอร์เนล androidboot.dtb_idx เพื่อระบุดัชนีของแผนผังอุปกรณ์ (DT) ที่เลือก คุณระบุได้เพียง 1 ดัชนี เช่น พารามิเตอร์ androidboot.dtb_idx=N reports N เป็นดัชนีแบบอิงตาม 0 ของแผนผังอุปกรณ์ที่ Bootloader เลือกจากชุด DTB ที่อยู่ในอิมเมจบูต