{"id":8272,"date":"2026-10-08T18:14:39","date_gmt":"2026-10-08T18:14:39","guid":{"rendered":"https:\/\/41j.com\/blog\/?p=8272"},"modified":"2026-10-09T00:00:41","modified_gmt":"2026-10-09T00:00:41","slug":"tplink-archer-a10-jp-v2-0-openwrt","status":"publish","type":"post","link":"https:\/\/41j.com\/blog\/2026\/10\/tplink-archer-a10-jp-v2-0-openwrt\/","title":{"rendered":"TPLink Archer A10 JP V2.0 OpenWRT"},"content":{"rendered":"\n<p>I bought this router second hand today. ChatGPT Sol then ported OpenWRT across to it, everything seems to work fine.<\/p>\n\n\n\n<p>If you want to replicate this on your own router it will require some work (mainly modification to bring in the stock wifi calibration). But this might help you get moving. ChatGPTs notes below!<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>This project brings up an experimental OpenWrt port on the <strong>TP-Link Archer A10 hardware revision V2<\/strong>. It has been tested on one router and is not an official OpenWrt release.<\/p>\n\n\n\n<p>&nbsp; <strong>## Hardware<\/strong><\/p>\n\n\n\n<p>&nbsp; \u2022 <strong>SoC:<\/strong> MediaTek MT7621, with 128 MiB RAM.<\/p>\n\n\n\n<p>&nbsp; \u2022 <strong>Flash:<\/strong> ESMT PSU1GA30DT, 128 MiB NAND; 128 KiB erase blocks, 2 KiB pages and 64-byte OOB.<\/p>\n\n\n\n<p>&nbsp; \u2022 <strong>Ethernet:<\/strong> MT7530 switch. Physical WAN corresponds to switch port 0; the four LAN sockets use ports 1\u20134.<\/p>\n\n\n\n<p>&nbsp; \u2022 <strong>Wi-Fi:<\/strong> Two MT7615 radios, used for 2.4 GHz and 5 GHz.<\/p>\n\n\n\n<p>&nbsp; \u2022 <strong>Bootloader:<\/strong> Vendor U-Boot 1.1.3, supporting TFTP RAM loading.<\/p>\n\n\n\n<p>&nbsp; \u2022 <strong>Firmware slots:<\/strong> Two 48 MiB slots, OS0 and OS1, with separate bootloader, environment and calibration partitions.<\/p>\n\n\n\n<p>&nbsp; <strong>## What was done<\/strong><\/p>\n\n\n\n<p>&nbsp; All non-overlapping stock partitions were backed up and checked against the device. Development began with a minimal, read-only NAND initramfs loaded through U-Boot over TFTP. RAM, NAND geometry,<\/p>\n\n\n\n<p>&nbsp; Ethernet and PCIe were validated before adding Wi-Fi using the router\u2019s own calibration.<\/p>\n\n\n\n<p>&nbsp; The persistent boot format was reverse-engineered. The installed OS0 image contains a <strong>4 MiB JFFS2 boot region followed by 44 MiB of UBI<\/strong>, holding a SquashFS root and writable UBIFS overlay. A guarded<\/p>\n\n\n\n<p>&nbsp; installer wrote OS0 and verified its complete contents. Protected partitions, including OS1 and calibration, matched their original backups afterward.<\/p>\n\n\n\n<p>&nbsp; The running system is based on <strong>OpenWrt v25.12.5 \/ Linux 6.12.94<\/strong>. Its final configuration provides:<\/p>\n\n\n\n<p>&nbsp; \u2022 LAN DHCP client, with the upstream connection through a LAN socket.<\/p>\n\n\n\n<p>&nbsp; \u2022 SSH and LuCI management on the leased address.<\/p>\n\n\n\n<p>&nbsp; \u2022 WPA2 APs on both bands, bridged to LAN.<\/p>\n\n\n\n<p>&nbsp; \u2022 No local DHCP server; clients receive addresses from the upstream network.<\/p>\n\n\n\n<p>&nbsp; Persistent boot, management access and automatic AP startup were verified after reboot. The owner confirmed AP client use and LuCI operation. Normal operation no longer requires UART.<\/p>\n\n\n\n<p>&nbsp; <strong>## How to reproduce or adapt it<\/strong><\/p>\n\n\n\n<p>&nbsp; 1. <strong>Confirm the exact hardware revision.<\/strong> Back up your own router and establish UART\/U-Boot recovery before changing flash.<\/p>\n\n\n\n<p>&nbsp; 2. Extract the bundle and read source\/PORTING_GUIDE.md. Clone the pinned OpenWrt revision, apply patches\/archer-a10-v2.patch, and build the minimal RAM profile using config.source-toolchain.seed.<\/p>\n\n\n\n<p>&nbsp; 3. Check the image header, DTB, addresses and partition protection. Boot the initramfs through the documented TFTP procedure and validate hardware incrementally.<\/p>\n\n\n\n<p>&nbsp; 4. Use <strong>your own unit\u2019s calibration<\/strong> for Wi-Fi. The included private Wi-Fi images contain the tested router\u2019s calibration and local MAC addresses.<\/p>\n\n\n\n<p>&nbsp; 5. Review PERSISTENT.md, INSTALL_CANDIDATE.md and RECOVERY.md before considering installation. The OS0 payload is <strong>not<\/strong> a stock web-upgrade or generic sysupgrade image.<\/p>\n\n\n\n<p>&nbsp; 6. Follow OPERATING.md for the final AP\/bridge configuration, then verify access after reboot.<\/p>\n\n\n\n<p>&nbsp; <strong>## Limitations<\/strong><\/p>\n\n\n\n<p>&nbsp; LuCI and the final AP\/management settings were added to the installed overlay; they are <strong>not baked into the included original OS0 image<\/strong>, and a factory reset removes them. The later calibration-<\/p>\n\n\n\n<p>&nbsp; independent shared candidate has not been boot-tested. Generic sysupgrade, stock restoration, bad-block handling on other units, LEDs\/buttons and long-term stability remain unfinished.<\/p>\n\n\n\n<p><a href=\"https:\/\/41j.com\/blog\/wp-content\/uploads\/2026\/10\/archer-a10-v2-porting-source.tar.gz\">https:\/\/41j.com\/blog\/wp-content\/uploads\/2026\/10\/archer-a10-v2-porting-source.tar.gz<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/41j.com\/blog\/wp-content\/uploads\/2026\/10\/mt7621-backup.tar.gz\">https:\/\/41j.com\/blog\/wp-content\/uploads\/2026\/10\/mt7621-backup.tar.gz<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/41j.com\/blog\/wp-content\/uploads\/2026\/10\/archer-a10-v2-port-with-images.tar.gz\">https:\/\/41j.com\/blog\/wp-content\/uploads\/2026\/10\/archer-a10-v2-port-with-images.tar.gz<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I bought this router second hand today. ChatGPT Sol then ported OpenWRT across to it, everything seems to work fine. If you want to replicate this on your own router it will require some work (mainly modification to bring in the stock wifi calibration). But this might help you get moving. ChatGPTs notes below! This [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-8272","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1RRoU-29q","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts\/8272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/comments?post=8272"}],"version-history":[{"count":1,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts\/8272\/revisions"}],"predecessor-version":[{"id":8277,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts\/8272\/revisions\/8277"}],"wp:attachment":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/media?parent=8272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/categories?post=8272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/tags?post=8272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}