รูปภาพ 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 ต้องใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้

  • Blob ของ 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
เคอร์เนล (l หน้า) l = (kernel_size + page_size - 1) / page_size
Ramdisk (m หน้า) 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 เพื่อระบุ ดัชนีของ Device Tree (DT) ที่เลือก คุณระบุได้เพียง 1 ดัชนีเท่านั้น เช่น พารามิเตอร์ androidboot.dtb_idx=N reports N เป็นดัชนีที่อิงตาม 0 ของแผนผังอุปกรณ์ที่ Bootloader เลือกจากชุด DTB ที่อยู่ในอิมเมจการบูต