अगर ओवरले के लिए आपका डिवाइस ट्री ब्लॉब (डीटीबी) या डिवाइस ट्री ब्लॉब (डीटीबीओ), किसी यूनीक हिस्से में है,
उदाहरण के लिए, dtb
और dtbo
पार्टिशन में, इस टेबल स्ट्रक्चर का इस्तेमाल किया गया है
और हेडर फ़ॉर्मैट:
पहला डायग्राम. डीटीबी और डीटीबीओ पार्टिशन लेआउट का उदाहरण.
डेटा स्ट्रक्चर
dt_table_header
सिर्फ़ इस इवेंट के लिए है
dtb
/dtbo
विभाजन; आप यह प्रारूप नहीं जोड़ सकते
image.gz
के खत्म होने के बाद दिखेगा. अगर आपके पास एक ही डीटीबी या डीटीबीओ है, तो आपको
अब भी इस फ़ॉर्मैट का इस्तेमाल करते हैं (और dt_entry_count
dt_table_header
, 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 };
सभी dt_table_entry
पढ़ने के लिए, dt_entry_size
का इस्तेमाल करें,
dt_entry_count
और dt_entries_offset
. उदाहरण:
my_read(entries_buf, header_addr + header->dt_entries_offset, header->dt_entry_size * header->dt_entry_count);
id
, rev
, custom
इंच
dt_table_entry
, डिवाइस के हार्डवेयर की पहचान करने के विकल्प हैं. हालांकि, इनका इस्तेमाल करना ज़रूरी नहीं है
ट्री की मदद से बूटलोडर को लोड करने के लिए, DTB या DTBO की बेहतर ढंग से पहचान करने में मदद मिल सकती है. अगर
बूटलोडर को अतिरिक्त जानकारी की ज़रूरत है. इसे DTB या DTBO में डालें, जहां
बूटलोडर इसे डीटीबी या डीटीबीओ पार्स करके पढ़ सकता है (नीचे सैंपल कोड देखें).
नमूना कोड
नीचे दिया गया सैंपल कोड, बूटलोडर में हार्डवेयर की पहचान करने वाली सुविधा की जांच करता है.
check_dtbo()
फ़ंक्शन, हार्डवेयर की पहचान की जांच करता है. यह सबसे पहलेdt_table_entry
(id
,rev
वगैरह). अगर यह डेटा काफ़ी नहीं है, तो यहdtb
को लोड करता है डेटा को मेमोरी में सेव करता है औरdtb
में वैल्यू की जांच करता है.my_hw_information
औरsoc_id
की वैल्यू प्रॉपर्टी को रूट नोड में पार्स किया जाता है (उदाहरण के लिएmy_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
एक ऐसा टूल है जिससे
dtb
/dtbo
इमेज
(स्रोत
AOSP में system/libufdt
पर कोड). mkdtimg
समर्थन करता है
कई निर्देश दिए जा रहे हैं. इनमें create
, cfg_create
, और
dump
.
बनाएं
create
कमांड का इस्तेमाल करके
dtb
/dtbo
इमेज:
mkdtimg create <image_filename> (<global-option>...) \
<ftb1_filename> (<entry1_option>...) \
<ftb2_filename> (<entry2_option>...) \
...
ftbX_filename
एक dt_table_entry
जनरेट करता है
इमेज. entryX_option
वे वैल्यू हैं जिन्हें असाइन करना है
dt_table_entry
. इनमें से कोई भी वैल्यू हो सकती है:
--id=<number|path> --rev=<number|path> --custom0=<number|path> --custom1=<number|path> --custom2=<number|path> --custom3=<number|path>
संख्या मान 32-बिट अंक (जैसे 68000) या एक हेक्स संख्या (जैसे कि 0x6800). इसके अलावा, आपके पास इस फ़ॉर्मैट का इस्तेमाल करके भी पाथ तय करने का विकल्प है:
<full_node_path>:<property_name>
उदाहरण के लिए, /board/:id
. mkdtimg
वैल्यू को पढ़ता है
DTB या DTBO फ़ाइल के पाथ से तय करता है और किसी संबंधित
प्रॉपर्टी dt_table_entry
में मौजूद है. इसके अलावा, आपके पास
सभी एंट्री के लिए डिफ़ॉल्ट विकल्प के रूप में global_option
. डिफ़ॉल्ट
dt_table_header
में page_size
की वैल्यू 2048 है; इस्तेमाल
global_option --page_size=<number>
कोई भिन्न
वैल्यू.
उदाहरण:
[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
0x00010000
औरcustom[0]
है0x00000abc
. - दूसरा
id
,0x00006800
है औरcustom[0]
0x00000abc
है. - तीसरा
id
,0x00006801
औरcustom[0]
है0x00000123
है. - अन्य सभी डिफ़ॉल्ट वैल्यू (
0
) का इस्तेमाल करते हैं.
cfg_create
cfg_create
निर्देश, इस कॉन्फ़िगरेशन फ़ाइल की मदद से एक इमेज बनाता है
निम्न प्रारूप:
# global options <global_option> ... # entries <ftb1_filename> # comment <entry1_option> # comment ... <ftb2_filename> <entry2_option> ... ...
विकल्प global_option
और entryX_option
शुरू होने चाहिए
एक या ज़्यादा स्पेस वर्ण का इस्तेमाल करें (ये विकल्प इसके जैसे हैं
create
विकल्प के लिए, --
प्रीफ़िक्स के बिना. खाली लाइनें या
#
से शुरू होने वाली लाइनों पर ध्यान नहीं दिया जाता.
उदाहरण:
[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
, इसके लिए अलाइनमेंट को हैंडल नहीं करता
.dtb
/.dtbo
फ़ाइलें, लेकिन उन्हें इमेज में जोड़ने के बजाय.
जब .dts
को कंपाइल करने के लिए dtc
का इस्तेमाल किया जाता है, तो
.dtb
/.dtbo
, आपको -a
विकल्प जोड़ना होगा. इसके लिए
उदाहरण के लिए, -a 4
विकल्प जोड़ने पर पैडिंग (जगह) जुड़ जाएगी, ताकि
.dtb
/.dtbo
, 4 बाइट के बराबर है.
कई DT टेबल एंट्री .dtb
/.dtbo
को शेयर कर सकती हैं. अगर आपने
तो अलग-अलग एंट्री के लिए एक ही फ़ाइल नाम का इस्तेमाल किया जाता है, तो यह
dt_offset
और dt_size
वाली इमेज. यह है
एक जैसे DT वाले अलग-अलग हार्डवेयर का इस्तेमाल करते समय यह काम आता है.
डंप
dtbo
में से dtb
इमेज के लिए, dump
का इस्तेमाल करें
कमांड का इस्तेमाल करें. उदाहरण:
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
...