Nếu blob cây thiết bị (DTB) hoặc blob cây thiết bị cho lớp phủ (DTBO) nằm trong một phân vùng duy nhất,
Ví dụ: phân vùng dtb
và dtbo
, hãy sử dụng cấu trúc bảng sau
và định dạng tiêu đề:
Hình 1. Ví dụ về bố cục phân vùng DTB và DTBO.
Cấu trúc dữ liệu
dt_table_header
chỉ dành cho
Phân vùng dtb
/dtbo
; bạn KHÔNG THỂ nối định dạng này
sau khi kết thúc ngày image.gz
. Nếu có một DTB hoặc DTBO, bạn phải
vẫn sử dụng định dạng này (và dt_entry_count
trong
dt_table_header
là 1).
#define DT_TABLE_MAGIC 0xd7b7ab1e struct dt_table_header { uint32_t magic; // DT_TABLE_MAGIC uint32_t total_size; // includes dt_table_header + all dt_table_entry // and all dtb/dtbo uint32_t header_size; // sizeof(dt_table_header) uint32_t dt_entry_size; // sizeof(dt_table_entry) uint32_t dt_entry_count; // number of dt_table_entry uint32_t dt_entries_offset; // offset to the first dt_table_entry // from head of dt_table_header uint32_t page_size; // flash page size we assume uint32_t version; // DTBO image version, the current version is 0. // The version is incremented when the // dt_table_header struct is updated. }; struct dt_table_entry { uint32_t dt_size; uint32_t dt_offset; // offset from head of dt_table_header uint32_t id; // optional, must be zero if unused uint32_t rev; // optional, must be zero if unused uint32_t custom[4]; // optional, must be zero if unused };
Để đọc tất cả dt_table_entry
, hãy dùng dt_entry_size
,
dt_entry_count
và dt_entries_offset
. Ví dụ:
my_read(entries_buf, header_addr + header->dt_entries_offset, header->dt_entry_size * header->dt_entry_count);
id
, rev
, custom
trong
dt_table_entry
là thông tin nhận dạng phần cứng không bắt buộc của thiết bị
cây mà trình tải khởi động có thể sử dụng để xác định hiệu quả DTB hoặc DTBO cần tải. Nếu
trình tải khởi động yêu cầu thông tin bổ sung, hãy đặt thông tin đó vào DTB hoặc DTBO nơi
trình tải khởi động có thể đọc bằng cách phân tích cú pháp DTB hoặc DTBO (xem mã mẫu dưới đây).
Mã mẫu
Mã mẫu sau đây kiểm tra thông tin nhận dạng phần cứng trong trình tải khởi động.
- Hàm
check_dtbo()
kiểm tra thông tin nhận dạng phần cứng. Trước tiên, lớp này kiểm tra dữ liệu trong cấu trúcdt_table_entry
(id
,rev
, v.v.). Nếu không đủ, dữ liệu này sẽ tảidtb
dữ liệu vào bộ nhớ và kiểm tra giá trị trongdtb
. - Giá trị của
my_hw_information
vàsoc_id
các thuộc tính được phân tích cú pháp trong nút gốc (ví dụ trongmy_dtbo_1.dts
).[my_dtbo_1.dts] /dts-v1/; /plugin/; / { /* As DTS design, these properties only for loader, won't overlay */ compatible = "board_manufacturer,board_model"; /* These properties are examples */ board_id = <0x00010000>; board_rev = <0x00010001>; another_hw_information = "some_data"; soc_id = <0x68000000>; ... }; &device@0 { value = <0x1>; status = "okay"; }; [my_bootloader.c] int check_dtbo(const dt_table_entry *entry, uint32_t header_addr) { ... if (entry->id != ... || entry->rev != ...) { ... } ... void * fdt_buf = my_load_dtb(header_addr + entry->dt_offset, entry->dt_size); int root_node_off = fdt_path_offset(fdt_buf, "/"); ... const char *my_hw_information = (const char *)fdt_getprop(fdt_buf, root_node_off, "my_hw_information", NULL); if (my_hw_information != NULL && strcmp(my_hw_information, ...) != 0) { ... } const fdt32_t *soc_id = fdt_getprop(fdt_buf, root_node_off, "soc_id", NULL); if (soc_id != NULL && *soc_id != ...) { ... } ... }
mkdtimg
mkdtimg
là một công cụ để tạo
dtb
/dtbo
hình ảnh
(nguồn
mã tại system/libufdt
trong AOSP). mkdtimg
hỗ trợ
một số lệnh, bao gồm create
, cfg_create
và
dump
.
create
Dùng lệnh create
để tạo một
dtb
/dtbo
hình ảnh:
mkdtimg create <image_filename> (<global-option>...) \
<ftb1_filename> (<entry1_option>...) \
<ftb2_filename> (<entry2_option>...) \
...
ftbX_filename
tạo một dt_table_entry
trong
hình ảnh. entryX_option
là các giá trị cần gán
dt_table_entry
Các giá trị này có thể là bất kỳ giá trị nào sau đây:
--id=<number|path> --rev=<number|path> --custom0=<number|path> --custom1=<number|path> --custom2=<number|path> --custom3=<number|path>
Giá trị số có thể là chữ số 32 bit (chẳng hạn như 68000) hoặc số hex (chẳng hạn như 0x6800). Ngoài ra, bạn có thể chỉ định đường dẫn bằng cách sử dụng định dạng:
<full_node_path>:<property_name>
Ví dụ: /board/:id
. mkdtimg
đọc giá trị
từ đường dẫn trong tệp DTB hoặc DTBO và gán giá trị (32-bit) cho một thuộc tính tương đối
trong dt_table_entry
. Ngoài ra, bạn có thể đưa ra
global_option
làm tuỳ chọn mặc định cho tất cả các mục. Mặc định
giá trị của page_size
trong dt_table_header
là 2048; sử dụng
global_option --page_size=<number>
để chỉ định một
giá trị.
Ví dụ:
[board1.dts]
/dts-v1/;
/plugin/;
/ {
compatible = "board_manufacturer,board_model";
board_id = <0x00010000>;
board_rev = <0x00010001>;
another_hw_information = "some_data";
...
};
&device@0 {
value = <0x1>;
status = "okay";
};
mkdtimg create dtbo.img --id=/:board_id --custom0=0xabc \
board1.dtbo \
board2.dtbo --id=0x6800 \
board3.dtbo --id=0x6801 --custom0=0x123
dt_table_entry
(board1.dtbo
)id
đầu tiên là0x00010000
vàcustom[0]
là0x00000abc
.id
thứ hai là0x00006800
vàcustom[0]
là0x00000abc
.id
thứ ba là0x00006801
vàcustom[0]
là0x00000123
.- Tất cả các giá trị khác đều sử dụng giá trị mặc định (
0
).
atg_create
Lệnh cfg_create
tạo một hình ảnh có một tệp cấu hình trong
dưới định dạng sau:
# global options <global_option> ... # entries <ftb1_filename> # comment <entry1_option> # comment ... <ftb2_filename> <entry2_option> ... ...
Các lựa chọn global_option
và entryX_option
phải bắt đầu
có một hoặc nhiều ký tự dấu cách (các tuỳ chọn này giống với
Các tuỳ chọn create
, không có tiền tố --
). Dòng trống hoặc
các dòng bắt đầu bằng #
sẽ bị bỏ qua.
Ví dụ:
[dtboimg.cfg]
# global options
id=/:board_id
rev=/:board_rev
custom0=0xabc
board1.dtbo
board2.dtbo
id=0x6800 # override the value of id in global options
board2.dtbo
id=0x6801 # override the value of id in global options
custom0=0x123 # override the value of custom0 in global options
mkdtimg cfg_create dtbo.img dtboimg.cfg
mkdtimg
không xử lý chức năng căn chỉnh cho
.dtb
/.dtbo
nhưng lại thêm chúng vào hình ảnh.
Khi bạn sử dụng dtc
để biên dịch .dts
thành
.dtb
/.dtbo
, bạn phải thêm lựa chọn -a
. Cho
Ví dụ: việc thêm tuỳ chọn -a 4
sẽ thêm khoảng đệm để kích thước của
.dtb
/.dtbo
được căn chỉnh thành 4 byte.
Một số mục nhập trong bảng DT có thể chia sẻ .dtb
/.dtbo
. Nếu
bạn sử dụng cùng một tên tệp cho các mục nhập khác nhau, tên tệp này chỉ lưu trữ một nội dung trong
hình ảnh có cùng dt_offset
và dt_size
. Đây là
hữu ích khi sử dụng phần cứng khác có DT giống hệt nhau.
tệp kết xuất
Đối với dtb
/dtbo
hình ảnh, hãy sử dụng dump
để in thông tin trong hình ảnh. Ví dụ:
mkdtimg dump dtbo.img
dt_table_header:
magic = d7b7ab1e
total_size = 1300
header_size = 32
dt_entry_size = 32
dt_entry_count = 3
dt_entries_offset = 32
page_size = 2048
version = 0
dt_table_entry[0]:
dt_size = 380
dt_offset = 128
id = 00010000
rev = 00010001
custom[0] = 00000abc
custom[1] = 00000000
custom[2] = 00000000
custom[3] = 00000000
(FDT)size = 380
(FDT)compatible = board_manufacturer,board_model
...