ESP-IDF äºçº§å¼å¯¼å è½½ç¨åº (second stage bootloader) ä¸»è¦æ§è¡ä»¥ä¸ä»»å¡ï¼
å 鍿¨¡åçæå°ååå§é ç½®ï¼
妿é ç½®äº flash å å¯ å/æ Secure Bootï¼åå¯¹å ¶è¿è¡åå§åã
æ ¹æ®ååºè¡¨å ota_dataï¼å¦æåå¨ï¼éæ©éè¦å¼å¯¼çåºç¨ç¨åº (app) ååºï¼
å°æ¤åºç¨ç¨åºéåå è½½å° RAMï¼IRAM å DRAMï¼ä¸ï¼æåææ§å¶æè½¬äº¤ç»æ¤åºç¨ç¨åºã
ESP-IDF äºçº§å¼å¯¼å è½½ç¨åºä½äº flash ç 0x1000 åç§»å°åå¤ã
å¦éäºè§£å æ¬ ESP-IDF äºçº§å¼å¯¼å è½½ç¨åºå¨å ç宿´å¯å¨è¿ç¨ï¼è¯·åè åºç¨ç¨åºçå¯å¨æµç¨ã
å¼å¯¼å è½½ç¨åºå ¼å®¹æ§ïå»ºè®®ä½¿ç¨ææ°åå¸ç ESP-IDF çæ¬ãOTAï¼ç©ºä¸åçº§ï¼æ´æ°å¯ä»¥å¨ç°åºç§å½æ°çåºç¨ç¨åºï¼ä½ä¸è½ç§å½ä¸ä¸ªæ°çå¼å¯¼å è½½ç¨åºãå æ¤ï¼å¼å¯¼å è½½ç¨åºæ¯æå¼å¯¼ä» ESP-IDF æ°çæ¬ä¸æå»ºçåºç¨ç¨åºã
ä½ä¸æ¯æå¼å¯¼ä» ESP-IDF æ§çæ¬ä¸æå»ºçç¨åºãå¦æç°æäº§åå¯è½éè¦å°åºç¨ç¨åºéçº§å°æ§çæ¬ï¼é£ä¹å¨æå¨æ´æ° ESP-IDF æ¶ï¼è¯·ç»§ç»ä½¿ç¨æ§çæ¬å¼å¯¼å è½½ç¨åºçäºè¿å¶æä»¶ã
夿³¨
妿å¨çäº§ä¸æµè¯ç°æäº§åç OTA æ´æ°ï¼è¯·ç¡®ä¿æµè¯ä¸ä½¿ç¨çå¼å¯¼å è½½ç¨åºäºè¿å¶æä»¶ä¸ç产ä¸é¨ç½²çç¸åã
ESP-IDF V2.1 ä¹åççæ¬ï䏿°çæ¬ç¸æ¯ï¼ESP-IDF V2.1 ä¹åççæ¬æå»ºçå¼å¯¼å è½½ç¨åºå¯¹ç¡¬ä»¶çé ç½®æ´å°ã使ç¨è¿äºæ©æ ESP-IDF çæ¬çå¼å¯¼å è½½ç¨åºå¹¶æå»ºæ°åºç¨ç¨åºæ¶ï¼è¯·å¯ç¨é ç½®é项 CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERSã
ESP-IDF V3.1 ä¹åççæ¬ïESP-IDF V3.1 ä¹åççæ¬æå»ºçå¼å¯¼å è½½ç¨åºä¸æ¯æååºè¡¨äºè¿å¶æä»¶ä¸ç MD5 æ ¡éªã使ç¨è¿äº ESP-IDF çæ¬çå¼å¯¼å è½½ç¨åºå¹¶æå»ºæ°åºç¨ç¨åºæ¶ï¼è¯·å¯ç¨é ç½®é项 CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERSã
ESP-IDF V5.1 ä¹åççæ¬ïESP-IDF V5.1 ä¹åççæ¬æå»ºçå¼å¯¼å è½½ç¨åºä¸æ¯æ CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAMã使ç¨è¿äº ESP-IDF çæ¬çå¼å¯¼å è½½ç¨åºå¹¶æå»ºæ°åºç¨ç¨åºæ¶ï¼ä¸åºä½¿ç¨è¯¥é项ã
é ç½® SPI flashïæ¯ä¸ª ESP-IDF åºç¨ç¨åºæå¼å¯¼å è½½ç¨åºçäºè¿å¶æä»¶ä¸é½å å«ä¸ä¸ªæä»¶å¤´ï¼å ¶ä¸å ç½®äº CONFIG_ESPTOOLPY_FLASHMODEãCONFIG_ESPTOOLPY_FLASHFREQãå CONFIG_ESPTOOLPY_FLASHSIZEãè¿äºæ¯ç¨äºå¨å¯å¨æ¶é ç½® SPI flashã
ä¸çº§ (ROM) å¼å¯¼å è½½ç¨åº ä» flash ä¸è¯»å äºçº§å¼å¯¼å è½½ç¨åº æä»¶å¤´ä¸çé 置信æ¯ï¼å¹¶ä½¿ç¨è¿äºä¿¡æ¯æ¥å è½½å©ä½ç äºçº§å¼å¯¼å è½½ç¨åºãç¶èï¼æ¤æ¶ç³»ç»çæ¶éé度ä½äºå ¶è¢«é ç½®çé度ï¼å¹¶ä¸å¨è¿ä¸ªé¶æ®µï¼åªæ¯æé¨å flash 模å¼ãå æ¤ï¼å½ äºçº§å¼å¯¼å è½½ç¨åº è¿è¡æ¶ï¼å®ä¼ä»å½ååºç¨ç¨åºçäºè¿å¶æä»¶å¤´ä¸è¯»åæ°æ®ï¼è䏿¯ä» äºçº§å¼å¯¼å è½½ç¨åº çæä»¶å¤´ä¸è¯»åæ°æ®ï¼ï¼å¹¶ä½¿ç¨è¿äºæ°æ®éæ°é ç½® flashãè¿æ ·çé ç½®æµç¨å¯è®© OTA æ´æ°å»æ´æ¹å½å使ç¨ç SPI flash çé ç½®ã
ESP-IDF V4.0 çæ¬ä¹åçå¼å¯¼å è½½ç¨åºä½¿ç¨å ¶èªèº«çæä»¶å¤´æ¥é ç½® SPI flashï¼è¿æå³çæ æ³å¨ OTA æ´æ°æ¶æ´æ¹ SPI flash é ç½®ã为äºä¸æ§çæ¬çå¼å¯¼å è½½ç¨åºå ¼å®¹ï¼åºç¨ç¨åºå¨å ¶å¯å¨æé´ä½¿ç¨åºç¨ç¨åºæä»¶å¤´ä¸çé 置信æ¯éæ°åå§å flash é ç½®ã
æ¥å¿çº§å«ïå¼å¯¼å è½½ç¨åºæ¥å¿ç级å«é»è®¤ä¸º "Info"ãéè¿è®¾ç½® CONFIG_BOOTLOADER_LOG_LEVEL é项ï¼å¯ä»¥å¢å æåå°è¿ä¸ªç级ãè¿ä¸ªæ¥å¿çº§å«ä¸åºç¨ç¨åºä¸ä½¿ç¨çæ¥å¿çº§å«æ¯åå¼çï¼è§ æ¥å¿åºï¼ã
éä½å¼å¯¼å è½½ç¨åºæ¥å¿ç详ç»ç¨åº¦å¯ä»¥ç¨å¾®ç¼©çæ´ä¸ªé¡¹ç®çå¯å¨æ¶é´ã
æ¢å¤åºå设置ï卿´æ°åºç°é®é¢æ¶ï¼æå¥½è½æä¸ç§æ¹æ³è®©è®¾å¤åå°å·²ç¥çæ£å¸¸ç¶æï¼è¿æ¶å¯éæ©æ¢å¤åºå设置ã
è¦åå°åå§åºåè®¾ç½®å¹¶æ¸ é¤ææç¨æ·è®¾ç½®ï¼è¯·å¨å¼å¯¼å è½½ç¨åºä¸é ç½® CONFIG_BOOTLOADER_FACTORY_RESETã
以ä¸ä¸¤ç§æ¹å¼å¯ä»¥å°è®¾å¤æ¢å¤åºå设置ã
æ¸ é¤ä¸ä¸ªæå¤ä¸ªæ°æ®ååºãCONFIG_BOOTLOADER_DATA_FACTORY_RESET é项å è®¸ç¨æ·éæ©åªäºæ°æ®ååºå¨æ¢å¤åºå设置æ¶éè¦è¢«æ¦é¤ã
ç¨æ·å¯ä»¥ä½¿ç¨ä»¥éå·åéçåè¡¨å½¢å¼æå®ååºçåç§°ï¼ä¸ºäºæé«å¯è¯»æ§ï¼å¯ä»¥éæ©æ·»å ç©ºæ ¼ï¼å¦ï¼nvs, phy_init, nvs_custom
ï¼ã
请确ä¿é项éæå®çååºåç§°åååºè¡¨ä¸çåç§°ç¸åãæ¤å¤ä¸è½æå® âappâ ç±»åçååºã
ä»âå·¥åâåºç¨ååºå¯å¨ãå½å¯ç¨ CONFIG_BOOTLOADER_OTA_DATA_ERASE éé¡¹ï¼æ¢å¤åºå设置åï¼è®¾å¤å°ä»é»è®¤çâå·¥åâåºç¨ååºå¯å¨ï¼å¦æååºè¡¨ä¸æ²¡æâå·¥åâåºç¨ååºï¼åä»é»è®¤ç OTA åºç¨ååºå¯å¨ï¼ãè¿ä¸ªæ¢å¤è¿ç¨æ¯éè¿æ¦é¤ OTA æ°æ®ååºæ¥å®æçï¼OTA æ°æ®ååºä¸ä¿åäºå½åéæ©ç OTA ååºæ§½ãâå·¥åâåºç¨ååºæ§½ï¼å¦æåå¨ï¼æ°¸è¿ä¸ä¼éè¿ OTA æ´æ°ï¼å æ¤é置为ä»âå·¥åâåºç¨ååºå¯å¨åæå³ç让åºä»¶åºç¨ç¨åºæ¢å¤æ£å¸¸ç¶æã
è¿ä¸¤ä¸ªé ç½®é项é½å¯ä»¥ç¬ç«å¯ç¨ã
æ¤å¤ï¼ä»¥ä¸é ç½®é项ç¨äºé ç½®è§¦åæ¢å¤åºåè®¾ç½®çæ¡ä»¶ï¼
CONFIG_BOOTLOADER_NUM_PIN_FACTORY_RESET- è¾å ¥ç®¡è (GPIO) çç¼å·ï¼è¯¥ç®¡èç¨äºè§¦åæ¢å¤åºå设置ãå¿ é¡»å¨éç½®æ¶å°æ¤ç®¡èæä½ææé«ï¼å¯é ç½®ï¼æè½è§¦ååºåéç½®äºä»¶ã
CONFIG_BOOTLOADER_HOLD_TIME_GPIO- 管èçµå¹³ä¿ææ¶é´ï¼é»è®¤ä¸º 5 ç§ï¼ã设å¤éç½®åï¼ç®¡èçµå¹³å¿ é¡»ä¿æè¯¥è®¾å®çæ¶é´ï¼æè½æ§è¡æ¢å¤åºå设置æå¼å¯¼æµè¯ååºï¼å¦éç¨ï¼ã
CONFIG_BOOTLOADER_FACTORY_RESET_PIN_LEVEL - 设置管èçµå¹³é«ä½ã设å¤éç½®åï¼æ ¹æ®æ¤è®¾ç½®å°ç®¡èæé«ææä½ï¼æè½è§¦ååºåéç½®äºä»¶ãå¦æç®¡èå ·æå é¨ä¸æï¼å䏿ä¼å¨ç®¡èéæ ·åçæãæå ³ç®¡èå é¨ä¸æç详ç»ä¿¡æ¯ï¼è¯·åè ESP32 çææ¯è§æ ¼ä¹¦ã
妿åºç¨ç¨åºéè¦ç¥éè®¾å¤æ¯å¦è§¦åäºåºåéç½®ï¼å¯ä»¥éè¿è°ç¨ bootloader_common_get_rtc_retain_mem_factory_reset_state()
彿°æ¥ç¡®å®ï¼
å¦æè¯»åå°è®¾å¤åºåéç½®ç¶æä¸º trueï¼ä¼è¿åç¶æ trueï¼è¯´æè®¾å¤å·²ç»è§¦ååºåéç½®ãæ¤åä¼éç½®ç¶æä¸º falseï¼ä»¥ä¾¿åç»çåºåé置触å夿ã
å¦æè¯»åå°è®¾å¤åºåéç½®ç¶æä¸º falseï¼ä¼è¿åç¶æ falseï¼è¯´æè®¾å¤å¹¶æªè§¦ååºåéç½®ï¼æè ä¿åæ¤ç¶æçå ååºå已失æã
åæ¶éè¦æ³¨æè¯¥åè½éè¦å ç¨é¨å RTC FAST å åï¼å ç¨çå åä¸ CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP 大å°ç¸åï¼ã
仿µè¯åºä»¶å¯å¨ïç¨æ·å¯ä»¥ç¼åç¹æ®åºä»¶ç¨äºç产ç¯å¢ä¸æµè¯ï¼å¹¶å¨éè¦çæ¶åè¿è¡ãæ¤æ¶éè¦å¨é¡¹ç®ååºè¡¨ä¸ä¸é¨ç³è¯·ä¸åååºç¨äºä¿å该æµè¯åºä»¶ï¼å ¶ç±»å为 appï¼åç±»å为 testï¼è¯¦æ 请åè ååºè¡¨ï¼ã
å®ç°è¯¥æµè¯åºç¨åºä»¶éè¦ä¸ºæµè¯åºç¨å建ä¸ä¸ªå®å ¨ç¬ç«ç ESP-IDF 项ç®ï¼ESP-IDF ä¸çæ¯ä¸ªé¡¹ç®ä» æå»ºä¸ä¸ªåºç¨ï¼ã该æµè¯åºç¨å¯ä»¥ç¬ç«äºä¸»é¡¹ç®è¿è¡å¼ååæµè¯ï¼ç¶åå¨çææµè¯æ¶ä½ä¸ºä¸ä¸ªé¢ç¼è¯ .bin æä»¶éæå°ä¸»é¡¹ç®çæµè¯åºç¨ç¨åºååºçå°åã
è¦å¨ä¸»é¡¹ç®çå¼å¯¼å è½½ç¨åºä¸æ¯æè¿ä¸ªåè½ï¼è¯·è®¾ç½® CONFIG_BOOTLOADER_APP_TEST å¹¶é 置以ä¸ä¸ä¸ªé项ï¼
CONFIG_BOOTLOADER_NUM_PIN_APP_TEST - 设置å¯å¨ TEST ååºç管èç¼å·ï¼è¯¥ç®¡èå°è¢«é 置为è¾å ¥å¹¶å¯ç¨å é¨ä¸æãè¦è§¦åæµè¯åºç¨ï¼å¿ é¡»å¨éç½®æ¶å°æ¤ç®¡èæä½ææé«ï¼å¯é ç½®ï¼ã
éæ¾ç®¡èè¾å ¥å¹¶éå¯è®¾å¤åï¼å°éæ°å¯ç¨é»è®¤çå¯å¨é¡ºåºï¼å³å¯å¨å·¥åååºæä»»æ OTA åºç¨ååºæ§½ã
CONFIG_BOOTLOADER_HOLD_TIME_GPIO - 设置 GPIO çµå¹³ä¿æçæ¶é´ï¼é»è®¤ä¸º 5 ç§ã设å¤éç½®åï¼ç®¡èçµå¹³å¿ é¡»ä¿æè¯¥è®¾å®çæ¶é´ï¼æè½æ§è¡æ¢å¤åºå设置æå¼å¯¼æµè¯ååºï¼å¦éç¨ï¼ã
CONFIG_BOOTLOADER_APP_TEST_PIN_LEVEL - é ç½®åºå¨ GPIO çé«çµå¹³è¿æ¯ä½çµå¹³ä¸è§¦åæµè¯ååºå¯å¨ãè¥ GPIO æå é¨ä¸æï¼å该åè½å¨éæ ·ç®¡èåå°±ä¼è¢«å¯ç¨ãå ³äºç®¡èå é¨ä¸æç详ç»ä¿¡æ¯ï¼è¯·åè ESP32 æ°æ®è§æ ¼ä¹¦ã
åæ»åååæ»åè½ä¹å¿ é¡»å¨å¼å¯¼å è½½ç¨åºä¸é ç½®ã
请åè OTA API åèææ¡£ ä¸ç åºç¨ç¨åºåæ» å é²åæ» ç« èã
çé¨çïè¯çé å¤ä¸¤ç»çé¨ç宿¶å¨ï¼ä¸»ç³»ç»çé¨ç宿¶å¨ (MWDT_WDT) å RTC çé¨ç宿¶å¨ (RTC_WDT)ãè¯çä¸çµæ¶ï¼ä¸¤ç»çé¨ç宿¶å¨é½ä¼è¢«å¯ç¨ï¼ä½å¨å¼å¯¼å è½½ç¨åºä¸ï¼ä¸¤ç»çé¨ç宿¶å¨é½ä¼è¢«ç¦ç¨ã设置 CONFIG_BOOTLOADER_WDT_ENABLE ï¼é»è®¤è®¾ç½®ï¼å¯ä»¥éæ°å¯ç¨ RTC çé¨ç宿¶å¨ï¼ç¨äºè·è¸ªä»å¯ç¨å¼å¯¼å è½½ç¨åºå°è°ç¨ç¨æ·ä¸»å½æ°çæ¶é´ãæ¤æé´å RTC çé¨ç宿¶å¨å§ç»å¯ç¨ï¼å¹¶ä¸å¦æå¨ 9 ç§å 没æåºç¨ç¨åºæåå¯å¨ï¼å RTC çé¨ç宿¶å¨ä¼èªå¨éç½®è¯çãè¿ä¸åè½å¯ä»¥ææé²æ¢å¯å¨è¿ç¨ä¸ç±äºçµæºä¸ç¨³å®è导è´çæ»æºã
å¯ä»¥éè¿è®¾ç½® CONFIG_BOOTLOADER_WDT_TIME_MS å¹¶éæ°ç¼è¯å¼å¯¼å è½½ç¨åºæ¥è°æ´è¶ æ¶æ¶é´ã
éè¿ç¦ç¨ CONFIG_BOOTLOADER_WDT_ENABLE è®¾ç½®å¹¶éæ°ç¼è¯å¼å¯¼å è½½ç¨åºï¼å¯ä»¥å¨å¼å¯¼å è½½ç¨åºä¸ç¦ç¨ RTC çé¨çï¼ä½å¹¶ä¸å»ºè®®è¿æ ·åã
请åé 硬件çé¨ç宿¶å¨ï¼äºè§£å¦ä½å¨åºç¨ç¨åºä¸ä½¿ç¨ RTC_WDTã
å½éè¦å¯ç¨é¢å¤çå¼å¯¼å è½½ç¨åºåè½ï¼å æ¬ flash å å¯ æå®å ¨å¯å¨ï¼å°¤å ¶æ¯è®¾ç½®é«çº§å« CONFIG_BOOTLOADER_LOG_LEVEL æ¶ï¼çæ§å¼å¯¼å è½½ç¨åº .bin æä»¶ç大å°åå¾é常éè¦ã
å½ä½¿ç¨é»è®¤ç CONFIG_PARTITION_TABLE_OFFSET å¼ 0x8000 æ¶ï¼äºè¿å¶æä»¶æå¤§å¯ä¸º 0x8000 åèã
妿å¼å¯¼å è½½ç¨åºäºè¿å¶æä»¶è¿å¤§ï¼åå¼å¯¼å è½½ç¨åºä¼æå»ºå°å¤±è´¥å¹¶æ¾ç¤º "Bootloader binary size [..] is too large for partition table offset" çé误ã妿æ¤äºè¿å¶æä»¶å·²ç»è¢«ç§å½ï¼é£ä¹ ESP32 å°æ æ³å¯å¨ - æ¥å¿ä¸å°è®°å½æ æååºè¡¨ææ æå¼å¯¼å è½½ç¨åºæ ¡éªåçé误ã
å¯ä»¥ä½¿ç¨å¦ä¸æ¹æ³è§£å³æ¤é®é¢ï¼
å° å¼å¯¼å è½½ç¨åºç¼è¯å¨ä¼å éæ°è®¾ç½®åé»è®¤å¼âSizeâã
éä½ å¼å¯¼å è½½ç¨åºæ¥å¿çº§å«ãå°æ¥å¿çº§å«è®¾ç½®ä¸º Warning, Error æ None é½ä¼æ¾èåå°æç»äºè¿å¶æä»¶ç大å°ï¼ä½ä¹å¯è½ä¼è®©è°è¯å徿´å å°é¾ï¼ã
å° CONFIG_PARTITION_TABLE_OFFSET 设置为é«äº 0x8000 çå¼ï¼ä»¥ä¾¿ç¨åå°ååºè¡¨æ¾ç½®å¨ flash ä¸ï¼è¿æ ·å¯ä»¥å¢å å¼å¯¼å è½½ç¨åºçå¯ç¨ç©ºé´ã妿 ååºè¡¨ ç CSV æä»¶å
å«æç¡®çååºåç§»éï¼åéè¦ä¿®æ¹è¿äºåç§»éï¼ä»èä¿è¯æ²¡æååºçåç§»éä½äº CONFIG_PARTITION_TABLE_OFFSET + 0x1000
ãï¼è¿å
æ¬é ESP-IDF æä¾çé»è®¤ååº CSV æä»¶ï¼
å½å¯ç¨ Secure Boot V2 æ¶ï¼ç±äºå¼å¯¼å è½½ç¨åºæå å è½½å°åºå®å¤§å°çç¼å²åºä¸è¿è¡éªè¯ï¼å¯¹äºè¿å¶æä»¶å¤§å°çç»å¯¹éå¶ä¸º 48 KB (0xC000 åè)ï¼ä¸å æ¬ 4 KB ç¾åï¼ã
仿·±åº¦ç¡ç ä¸å¿«éå¯å¨ïå¼å¯¼å è½½ç¨åºæ CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP é项ï¼å¯ä»¥åå°ä»æ·±åº¦ç¡ç ä¸å¤éçæ¶é´ï¼æå©äºéä½åèï¼ãå½ CONFIG_SECURE_BOOT é项ç¦ç¨æ¶ï¼è¯¥é项å¯ç¨ãç±äºæ ééåæ ¡éªï¼å¤éæ¶é´åå°ã
å¨ç¬¬ä¸æ¬¡å¯å¨æ¶ï¼å¼å¯¼å è½½ç¨åºå°å¯å¨çåºç¨ç¨åºçå°ååå¨å¨ RTC FAST åå¨å¨ä¸ãèå¨å¤éè¿ç¨ä¸ï¼è¿ä¸ªå°åç¨äºå¯å¨èæ é任使£æ¥ï¼ä»èå®ç°äºå¿«éå è½½ã
èªå®ä¹å¼å¯¼å è½½ç¨åºïç¨æ·å¯ä»¥æ©å±æä¿®æ¹å½åçå¼å¯¼å è½½ç¨åºï¼å ·ä½æä¸¤ç§æ¹æ³ï¼ä½¿ç¨é©åå®ç°æéåè¦çå½åç¨åºãè¿ä¸¤ç§æ¹æ³å¨ ESP-IDF 示ä¾ç custom_bootloader æä»¶å¤¹ä¸é½æåç°ã
custom_bootloader/bootloader_hooks ä»ç»äºå¦ä½å°é©åä¸å¼å¯¼å è½½ç¨åºåå§åè¿æ¥ã
custom_bootloader/bootloader_override ä»ç»äºå¦ä½è¦çå¼å¯¼å è½½ç¨åºçå®ç°ã
å¨å¼å¯¼å è½½ç¨åºç代ç ä¸ï¼ä¸è½ä½¿ç¨å ¶ä»ç»ä»¶æä¾ç驱å¨å彿°ï¼é¤éæä¸ªé©±å¨æå½æ°æç¡®å£°ææ¯æå¨å¼å¯¼å è½½ç¨åºä¸è¿è¡ãå¦æç¡®å®éè¦ï¼è¯·å°æéåè½æ¾å¨é¡¹ç®ç bootloader_components ç®å½ä¸ï¼æ³¨æï¼è¿ä¼å¢å å¼å¯¼å è½½ç¨åºç大å°ï¼ã以䏿¯å¯ä»¥å¨å¼å¯¼å è½½ç¨åºä¸ä½¿ç¨çç»ä»¶ç¤ºä¾ï¼
妿å¼å¯¼å è½½ç¨åºè¿å¤§ï¼åå¯è½ä¸å åä¸çååºè¡¨éå ï¼ååºè¡¨é»è®¤ç§å½å¨åç§»é 0x8000 å¤ãå¢å ååºè¡¨åç§»é ï¼å°ååºè¡¨æ¾å¨ flash ä¸é åçåºåï¼è¿æ ·å¯ä»¥å¢å å¼å¯¼å è½½ç¨åºçå¯ç¨ç©ºé´ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4