Qsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/devicetree/overlay-notesmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/zh_TW/devicetree/overlay-notesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/it_IT/devicetree/overlay-notesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ja_JP/devicetree/overlay-notesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/ko_KR/devicetree/overlay-notesmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget,/translations/sp_SP/devicetree/overlay-notesmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhY/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/devicetree/overlay-notes.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h+Documentation/devicetree/overlay-notes.rst h]h)}(h*Documentation/devicetree/overlay-notes.rsth]h*Documentation/devicetree/overlay-notes.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hj hhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]uh1hhjPubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h设备树覆盖说明h]h设备树覆盖说明}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjxhhhhhKubh)}(h本文档描述了drivers/of/overlay.c中的内核内设备树覆盖功能的实现,是 Documentation/devicetree/dynamic-resolution-notes.rst[1]的配套文档。h]h本文档描述了drivers/of/overlay.c中的内核内设备树覆盖功能的实现,是 Documentation/devicetree/dynamic-resolution-notes.rst[1]的配套文档。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjxhhubjw)}(hhh](j|)}(h覆盖如何工作h]h覆盖如何工作}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjhhhhhKubh)}(hXI设备树覆盖的目的是修改内核的实时树,并使修改以反映变化的方式影响内核的状态。 由于内核主要处理的是设备,任何新的设备节点如果导致一个活动的设备,就应该创建它, 而如果设备节点被禁用或被全部删除,受影响的设备应该被取消注册。h]hXI设备树覆盖的目的是修改内核的实时树,并使修改以反映变化的方式影响内核的状态。 由于内核主要处理的是设备,任何新的设备节点如果导致一个活动的设备,就应该创建它, 而如果设备节点被禁用或被全部删除,受影响的设备应该被取消注册。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hM让我们举个例子,我们有一个foo板,它的基本树形图如下::h]hL让我们举个例子,我们有一个foo板,它的基本树形图如下:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(hX---- foo.dts --------------------------------------------------------------- /* FOO平台 */ /dts-v1/; / { compatible = "corp,foo"; /* 共享的资源 */ res: res { }; /* 芯片上的外围设备 */ ocp: ocp { /* 总是被实例化的外围设备 */ peripheral1 { ... }; }; }; ---- foo.dts ---------------------------------------------------------------h]hX---- foo.dts --------------------------------------------------------------- /* FOO平台 */ /dts-v1/; / { compatible = "corp,foo"; /* 共享的资源 */ res: res { }; /* 芯片上的外围设备 */ ocp: ocp { /* 总是被实例化的外围设备 */ peripheral1 { ... }; }; }; ---- foo.dts ---------------------------------------------------------------}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubh)}(h覆盖bar.dts, ::h]h覆盖bar.dts,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjhhubj)}(hXc---- bar.dts - 按标签覆盖目标位置 ---------------------------- /dts-v1/; /插件/; &ocp { /* bar外围 */ bar { compatible = "corp,bar"; ... /* 各种属性和子节点 */ }; }; ---- bar.dts ---------------------------------------------------------------h]hXc---- bar.dts - 按标签覆盖目标位置 ---------------------------- /dts-v1/; /插件/; &ocp { /* bar外围 */ bar { compatible = "corp,bar"; ... /* 各种属性和子节点 */ }; }; ---- bar.dts ---------------------------------------------------------------}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK1hjhhubh)}(hR当加载(并按照[1]中描述的方式解决)时,应该产生foo+bar.dts::h]hQ当加载(并按照[1]中描述的方式解决)时,应该产生foo+bar.dts:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjhhubj)}(hX---- foo+bar.dts ----------------------------------------------------------- /* FOO平台 + bar外围 */ / { compatible = "corp,foo"; /* 共享资源 */ res: res { }; /* 芯片上的外围设备 */ ocp: ocp { /* 总是被实例化的外围设备 */ peripheral1 { ... }; /* bar外围 */ bar { compatible = "corp,bar"; ... /* 各种属性和子节点 */ }; }; }; ---- foo+bar.dts -----------------------------------------------------------h]hX---- foo+bar.dts ----------------------------------------------------------- /* FOO平台 + bar外围 */ / { compatible = "corp,foo"; /* 共享资源 */ res: res { }; /* 芯片上的外围设备 */ ocp: ocp { /* 总是被实例化的外围设备 */ peripheral1 { ... }; /* bar外围 */ bar { compatible = "corp,bar"; ... /* 各种属性和子节点 */ }; }; }; ---- foo+bar.dts -----------------------------------------------------------}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK?hjhhubh)}(h作为覆盖的结果,已经创建了一个新的设备节点(bar),因此将注册一个bar平台设备, 如果加载了匹配的设备驱动程序,将按预期创建设备。h]h作为覆盖的结果,已经创建了一个新的设备节点(bar),因此将注册一个bar平台设备, 如果加载了匹配的设备驱动程序,将按预期创建设备。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjhhubh)}(hXW如果基础DT不是用-@选项编译的,那么“&ocp”标签将不能用于将覆盖节点解析到基础 DT中的适当位置。在这种情况下,可以提供目标路径。通过标签的目标位置的语法是比 较好的,因为不管标签在DT中出现在哪里,覆盖都可以被应用到任何包含标签的基础DT上。h]hXW如果基础DT不是用-@选项编译的,那么“&ocp”标签将不能用于将覆盖节点解析到基础 DT中的适当位置。在这种情况下,可以提供目标路径。通过标签的目标位置的语法是比 较好的,因为不管标签在DT中出现在哪里,覆盖都可以被应用到任何包含标签的基础DT上。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjhhubh)}(hE上面的bar.dts例子被修改为使用目标路径语法,即为::h]hD上面的bar.dts例子被修改为使用目标路径语法,即为:}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjhhubj)}(hXo---- bar.dts - 通过明确的路径覆盖目标位置 -------------------- /dts-v1/; /插件/; &{/ocp} { /* bar外围 */ bar { compatible = "corp,bar"; ... /* 各种外围设备和子节点 */ } }; ---- bar.dts ---------------------------------------------------------------h]hXo---- bar.dts - 通过明确的路径覆盖目标位置 -------------------- /dts-v1/; /插件/; &{/ocp} { /* bar外围 */ bar { compatible = "corp,bar"; ... /* 各种外围设备和子节点 */ } }; ---- bar.dts ---------------------------------------------------------------}hj8sbah}(h]h ]h"]h$]h&]hhuh1jhhhK_hjhhubeh}(h]id2ah ]h"]覆盖如何工作ah$]h&]uh1jvhjxhhhhhKubjw)}(hhh](j|)}(h内核中关于覆盖的APIh]h内核中关于覆盖的API}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjNhhhhhKmubh)}(h该API相当容易使用。h]h该API相当容易使用。}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjNhhubhenumerated_list)}(hhh](h list_item)}(h调用of_overlay_fdt_apply()来创建和应用一个覆盖的变更集。返回值是一个 错误或一个识别这个覆盖的cookie。 h]h)}(h调用of_overlay_fdt_apply()来创建和应用一个覆盖的变更集。返回值是一个 错误或一个识别这个覆盖的cookie。h]h调用of_overlay_fdt_apply()来创建和应用一个覆盖的变更集。返回值是一个 错误或一个识别这个覆盖的cookie。}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjtubah}(h]h ]h"]h$]h&]uh1jrhjohhhhhNubjs)}(h调用of_overlay_remove()来删除和清理先前通过调用of_overlay_fdt_apply() 而创建的覆盖变更集。不允许删除一个被另一个覆盖的覆盖变化集。 h]h)}(h调用of_overlay_remove()来删除和清理先前通过调用of_overlay_fdt_apply() 而创建的覆盖变更集。不允许删除一个被另一个覆盖的覆盖变化集。h]h调用of_overlay_remove()来删除和清理先前通过调用of_overlay_fdt_apply() 而创建的覆盖变更集。不允许删除一个被另一个覆盖的覆盖变化集。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthjubah}(h]h ]h"]h$]h&]uh1jrhjohhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix)uh1jmhjNhhhhhKqubh)}(h最后,如果你需要一次性删除所有的覆盖,只需调用of_overlay_remove_all(), 它将以正确的顺序删除每一个覆盖。h]h最后,如果你需要一次性删除所有的覆盖,只需调用of_overlay_remove_all(), 它将以正确的顺序删除每一个覆盖。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhjNhhubh)}(h你可以选择注册在覆盖操作中被调用的通知器。详见 of_overlay_notifier_register/unregister和enum of_overlay_notify_action。h]h你可以选择注册在覆盖操作中被调用的通知器。详见 of_overlay_notifier_register/unregister和enum of_overlay_notify_action。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKzhjNhhubh)}(hXOF_OVERLAY_PRE_APPLY、OF_OVERLAY_POST_APPLY或OF_OVERLAY_PRE_REMOVE 的通知器回调可以存储指向覆盖层中的设备树节点或其内容的指针,但这些指针不能持 续到OF_OVERLAY_POST_REMOVE的通知器回调。在OF_OVERLAY_POST_REMOVE通 知器被调用后,包含覆盖层的内存将被kfree()ed。请注意,即使OF_OVERLAY_POST_REMOVE 的通知器返回错误,内存也会被kfree()ed。h]hXOF_OVERLAY_PRE_APPLY、OF_OVERLAY_POST_APPLY或OF_OVERLAY_PRE_REMOVE 的通知器回调可以存储指向覆盖层中的设备树节点或其内容的指针,但这些指针不能持 续到OF_OVERLAY_POST_REMOVE的通知器回调。在OF_OVERLAY_POST_REMOVE通 知器被调用后,包含覆盖层的内存将被kfree()ed。请注意,即使OF_OVERLAY_POST_REMOVE 的通知器返回错误,内存也会被kfree()ed。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjNhhubh)}(hXQdrivers/of/dynamic.c中的变更集通知器是第二种类型的通知器,可以通过应用或移除 覆盖层来触发。这些通知器不允许在覆盖层或其内容中存储指向设备树节点的指针。当包含 覆盖层的内存因移除覆盖层而被释放时,覆盖层代码并不能防止这类指针仍然有效。h]hXQdrivers/of/dynamic.c中的变更集通知器是第二种类型的通知器,可以通过应用或移除 覆盖层来触发。这些通知器不允许在覆盖层或其内容中存储指向设备树节点的指针。当包含 覆盖层的内存因移除覆盖层而被释放时,覆盖层代码并不能防止这类指针仍然有效。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjNhhubh)}(h任何其他保留指向覆盖层节点或数据的指针的代码都被认为是一个错误,因为在移除覆盖层 后,该指针将指向已释放的内存。h]h任何其他保留指向覆盖层节点或数据的指针的代码都被认为是一个错误,因为在移除覆盖层 后,该指针将指向已释放的内存。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjNhhubh)}(hXj覆盖层的用户必须特别注意系统上发生的整体操作,以确保其他内核代码不保留任何指向覆 盖层节点或数据的指针。任何无意中使用这种指针的例子是,如果一个驱动或子系统模块在 应用了覆盖后被加载,并且该驱动或子系统扫描了整个设备树或其大部分,包括覆盖节点。h]hXj覆盖层的用户必须特别注意系统上发生的整体操作,以确保其他内核代码不保留任何指向覆 盖层节点或数据的指针。任何无意中使用这种指针的例子是,如果一个驱动或子系统模块在 应用了覆盖后被加载,并且该驱动或子系统扫描了整个设备树或其大部分,包括覆盖节点。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjNhhubeh}(h]apiah ]h"]内核中关于覆盖的apiah$]h&]uh1jvhjxhhhhhKmubeh}(h]id1ah ]h"]设备树覆盖说明ah$]h&]uh1jvhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j{N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj6error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jj jKjHjju nametypes}(jjKjuh}(j jxjHjjjNu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jDKsRparse_messages]hsystem_message)}(hhh]h)}(hfPossible title underline, too short for the title. Treating it as ordinary text because it's so short.h]hhPossible title underline, too short for the title. Treating it as ordinary text because it’s so short.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOlineK/sourcehuh1jhjhhhhhK/ubatransform_messages] transformerN include_log]=Documentation/translations/zh_CN/devicetree/overlay-notes.rst(NNNNta decorationNhhub.