.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/devicetree/overlay-notes.rst :翻译: å¸å»¶è…¾ Yanteng Si <siyanteng@loongson.cn> :æ ¡è¯‘: ============== è®¾å¤‡æ ‘è¦†ç›–è¯´æ˜Ž ============== 本文档æè¿°äº†drivers/of/overlay.cä¸çš„å†…æ ¸å†…è®¾å¤‡æ ‘è¦†ç›–åŠŸèƒ½çš„å®žçŽ°ï¼Œæ˜¯ Documentation/devicetree/dynamic-resolution-notes.rst[1]çš„é…套文档。 覆盖如何工作 ------------ è®¾å¤‡æ ‘è¦†ç›–çš„ç›®çš„æ˜¯ä¿®æ”¹å†…æ ¸çš„å®žæ—¶æ ‘ï¼Œå¹¶ä½¿ä¿®æ”¹ä»¥åæ˜ å˜åŒ–的方å¼å½±å“å†…æ ¸çš„çŠ¶æ€ã€‚ ç”±äºŽå†…æ ¸ä¸»è¦å¤„ç†çš„æ˜¯è®¾å¤‡ï¼Œä»»ä½•新的设备节点如果导致一个活动的设备,就应该创建它, 而如果设备节点被ç¦ç”¨æˆ–è¢«å…¨éƒ¨åˆ é™¤ï¼Œå—å½±å“çš„è®¾å¤‡åº”è¯¥è¢«å–æ¶ˆæ³¨å†Œã€‚ 让我们举个例å,我们有一个fooæ¿ï¼Œå®ƒçš„åŸºæœ¬æ ‘å½¢å›¾å¦‚ä¸‹:: ---- foo.dts --------------------------------------------------------------- /* FOOå¹³å° */ /dts-v1/; / { compatible = "corp,foo"; /* å…±äº«çš„èµ„æº */ res: res { }; /* 芯片上的外围设备 */ ocp: ocp { /* 总是被实例化的外围设备 */ peripheral1 { ... }; }; }; ---- foo.dts --------------------------------------------------------------- 覆盖bar.dts, :: ---- bar.dts - æŒ‰æ ‡ç¾è¦†ç›–ç›®æ ‡ä½ç½® ---------------------------- /dts-v1/; /æ’ä»¶/; &ocp { /* bar外围 */ bar { compatible = "corp,bar"; ... /* å„ç§å±žæ€§å’Œå节点 */ }; }; ---- bar.dts --------------------------------------------------------------- å½“åŠ è½½ï¼ˆå¹¶æŒ‰ç…§[1]ä¸æè¿°çš„æ–¹å¼è§£å†³ï¼‰æ—¶ï¼Œåº”该产生foo+bar.dts:: ---- foo+bar.dts ----------------------------------------------------------- /* FOOå¹³å° + bar外围 */ / { compatible = "corp,foo"; /* å…±äº«èµ„æº */ res: res { }; /* 芯片上的外围设备 */ ocp: ocp { /* 总是被实例化的外围设备 */ peripheral1 { ... }; /* bar外围 */ bar { compatible = "corp,bar"; ... /* å„ç§å±žæ€§å’Œå节点 */ }; }; }; ---- foo+bar.dts ----------------------------------------------------------- 作为覆盖的结果,已ç»åˆ›å»ºäº†ä¸€ä¸ªæ–°çš„设备节点(barï¼‰ï¼Œå› æ¤å°†æ³¨å†Œä¸€ä¸ªbarå¹³å°è®¾å¤‡ï¼Œ å¦‚æžœåŠ è½½äº†åŒ¹é…的设备驱动程åºï¼Œå°†æŒ‰é¢„期创建设备。 如果基础DT䏿˜¯ç”¨-@选项编译的,那么“&ocpâ€æ ‡ç¾å°†ä¸èƒ½ç”¨äºŽå°†è¦†ç›–节点解æžåˆ°åŸºç¡€ DTä¸çš„适当ä½ç½®ã€‚åœ¨è¿™ç§æƒ…况下,å¯ä»¥æä¾›ç›®æ ‡è·¯å¾„ã€‚é€šè¿‡æ ‡ç¾çš„ç›®æ ‡ä½ç½®çš„è¯æ³•是比 è¾ƒå¥½çš„ï¼Œå› ä¸ºä¸ç®¡æ ‡ç¾åœ¨DTä¸å‡ºçŽ°åœ¨å“ªé‡Œï¼Œè¦†ç›–éƒ½å¯ä»¥è¢«åº”ç”¨åˆ°ä»»ä½•åŒ…å«æ ‡ç¾çš„基础DT上。 上é¢çš„bar.dts例åè¢«ä¿®æ”¹ä¸ºä½¿ç”¨ç›®æ ‡è·¯å¾„è¯æ³•,å³ä¸º:: ---- bar.dts - é€šè¿‡æ˜Žç¡®çš„è·¯å¾„è¦†ç›–ç›®æ ‡ä½ç½® -------------------- /dts-v1/; /æ’ä»¶/; &{/ocp} { /* bar外围 */ bar { compatible = "corp,bar"; ... /* å„ç§å¤–围设备和å节点 */ } }; ---- bar.dts --------------------------------------------------------------- å†…æ ¸ä¸å…³äºŽè¦†ç›–çš„API ------------------- 该API相当容易使用。 1) 调用of_overlay_fdt_apply()æ¥åˆ›å»ºå’Œåº”ç”¨ä¸€ä¸ªè¦†ç›–çš„å˜æ›´é›†ã€‚返回值是一个 错误或一个识别这个覆盖的cookie。 2) 调用of_overlay_remove()æ¥åˆ 除和清ç†å…ˆå‰é€šè¿‡è°ƒç”¨of_overlay_fdt_apply() è€Œåˆ›å»ºçš„è¦†ç›–å˜æ›´é›†ã€‚ä¸å…è®¸åˆ é™¤ä¸€ä¸ªè¢«å¦ä¸€ä¸ªè¦†ç›–的覆盖å˜åŒ–集。 最åŽï¼Œå¦‚æžœä½ éœ€è¦ä¸€æ¬¡æ€§åˆ 除所有的覆盖,åªéœ€è°ƒç”¨of_overlay_remove_all(), 它将以æ£ç¡®çš„顺åºåˆ 除æ¯ä¸€ä¸ªè¦†ç›–。 ä½ å¯ä»¥é€‰æ‹©æ³¨å†Œåœ¨è¦†ç›–æ“作ä¸è¢«è°ƒç”¨çš„é€šçŸ¥å™¨ã€‚è¯¦è§ of_overlay_notifier_register/unregisterå’Œenum of_overlay_notify_action。 OF_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。 drivers/of/dynamic.cä¸çš„å˜æ›´é›†é€šçŸ¥å™¨æ˜¯ç¬¬äºŒç§ç±»åž‹çš„通知器,å¯ä»¥é€šè¿‡åº”用或移除 覆盖层æ¥è§¦å‘。这些通知器ä¸å…许在覆盖层或其内容ä¸å˜å‚¨æŒ‡å‘è®¾å¤‡æ ‘èŠ‚ç‚¹çš„æŒ‡é’ˆã€‚å½“åŒ…å« è¦†ç›–å±‚çš„å†…å˜å› 移除覆盖层而被释放时,覆盖层代ç å¹¶ä¸èƒ½é˜²æ¢è¿™ç±»æŒ‡é’ˆä»ç„¶æœ‰æ•ˆã€‚ 任何其他ä¿ç•™æŒ‡å‘覆盖层节点或数æ®çš„æŒ‡é’ˆçš„代ç éƒ½è¢«è®¤ä¸ºæ˜¯ä¸€ä¸ªé”™è¯¯ï¼Œå› ä¸ºåœ¨ç§»é™¤è¦†ç›–å±‚ åŽï¼Œè¯¥æŒ‡é’ˆå°†æŒ‡å‘已释放的内å˜ã€‚ 覆盖层的用户必须特别注æ„系统上å‘生的整体æ“作,以确ä¿å…¶ä»–å†…æ ¸ä»£ç ä¸ä¿ç•™ä»»ä½•指å‘覆 盖层节点或数æ®çš„æŒ‡é’ˆã€‚ä»»ä½•æ— æ„ä¸ä½¿ç”¨è¿™ç§æŒ‡é’ˆçš„ä¾‹åæ˜¯ï¼Œå¦‚果一个驱动或å系统模å—在 应用了覆盖åŽè¢«åŠ è½½ï¼Œå¹¶ä¸”è¯¥é©±åŠ¨æˆ–å系统扫æäº†æ•´ä¸ªè®¾å¤‡æ ‘或其大部分,包括覆盖节点。