Add more stock U-Boot images
[oweals/u-boot_mod.git] / README.md
1 U-Boot 1.1.4 modification for routers
2 ==========
3
4 Ready snapshot/test images
5 --------------------------
6 Starting from 24.09.2016, ready images, built on **Raspberry Pi 3** with **LEDE** toolchain, are available **[on my server](http://projects.dymacz.pl)**.
7
8 Images are built and uploaded on FTP only when master branch in repository was updated - custom script checks this once per day. On the FTP you will find also toolchain which is used to build images.
9
10 Table of contents
11 -----------------
12
13 - [Introduction](#introduction)
14 - [Supported devices](#supported-devices)
15 - [Known issues](#known-issues)
16 - [Modifications, changes](#modifications-changes)
17         - [Web server](#web-server)
18         - [Network Console](#network-console)
19         - [Writable environment variables](#writable-environment-variables)
20         - [Other](#other)
21         - [Supported FLASH chips](#supported-flash-chips)
22 - [How to install it?](#how-to-install-it)
23         - [Cautions, backups](#cautions-backups)
24         - [Using external programmer](#using-external-programmer)
25         - [Using UART, U-Boot console and TFTP server](#using-uart-u-boot-console-and-tftp-server)
26                 - [Important notice!](#important-notice)
27                 - [Step by step instructions](#step-by-step-instructions)
28         - [Using OpenWrt](#using-openwrt)
29         - [Using DD-WRT](#using-dd-wrt)
30 - [How to use it?](#how-to-use-it)
31 - [How to compile the code?](#how-to-compile-the-code)
32     - [Building on Linux](#building-on-linux)
33     - [Building on OS X](#building-on-macos-os-x)
34 - [FAQ](#faq)
35 - [License, outdated sources etc.](#license-outdated-sources-etc)
36 - [Credits](#credits)
37
38 Introduction
39 ------------
40
41 In short, this project is a deep modification of **U-Boot 1.1.4** sources, mostly from **TP-Link**, but some code fragments were taken also from **D-Link**, **Netgear**, **ZyXEL** and **Belkin**. All these companies are using SDK from Qualcomm/Atheros which includes modified version of **U-Boot 1.1.4**.
42
43 You can download original sources from the following pages:
44
45 - [TP-Link GPL Code Center](http://www.tp-link.com/en/support/gpl/ "TP-Link GPL Code Center")
46 - [D-Link GPL Source Code Support](http://tsd.dlink.com.tw/GPL.asp "D-Link GPL Source Code Support")
47 - [NETGEAR Open Source Code for Programmers (GPL)](http://kb.netgear.com/app/answers/detail/a_id/2649/~/netgear-open-source-code-for-programmers-%28gpl%29 "NETGEAR Open Source Code for Programmers (GPL)")
48 - [ZyXEL GPL-OSS](http://www.zyxel.com/us/en/form/gpl_oss_form.shtml "ZyXEL GPL-OSS")
49 - [Belkin Open Source Code Center](http://www.belkin.com/us/support-article?articleNum=51238 "Belkin Open Source Code Center")
50
51 The concept for this project came from another U-Boot modification, dedicated to a small and very popular TP-Link router - model **TL-WR703N**, which includes web fail safe mode: **[wr703n-uboot-with-web-failsafe](http://code.google.com/p/wr703n-uboot-with-web-failsafe/)**. I was using it and decided to make my own version, which could have some improvements, additional capabilities, support for different models and work with all modern web browsers.
52
53 First version of this modification was introduced on **OpenWrt** forum in [this thread](https://forum.openwrt.org/viewtopic.php?id=43237), at the end of March 2013 and was dedicated only for TP-Link routers with **Atheros AR9331** SoC. Now, it supports also models from different manufacturers, devices with **Atheros AR934x**, **Qualcomm Atheros QCA953x**, **Qualcomm Atheros QCA955x** and other (in the near future **Qualcomm Atheros QCA956x** and **MediaTek MT762x**) are under development.
54
55 You can find some information about previous versions of this project also on my [blog](http://www.tech-blog.pl), in [this article](http://www.tech-blog.pl/2013/03/29/zmodyfikowany-u-boot-dla-routerow-tp-link-z-atheros-ar9331-z-trybem-aktualizacji-oprogramowania-przez-www-i-konsola-sieciowa-netconsole/). It is in Polish, but [Google Translator](http://translate.google.com/translate?hl=pl&sl=pl&tl=en&u=http%3A%2F%2Fwww.tech-blog.pl%2F2013%2F03%2F29%2Fzmodyfikowany-u-boot-dla-routerow-tp-link-z-atheros-ar9331-z-trybem-aktualizacji-oprogramowania-przez-www-i-konsola-sieciowa-netconsole%2F&sandbox=1) will help you to understand it.
56
57 If you like this project, you may [buy me a beer](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=FN3XW36YHSY2S&lc=US&item_name=For%20a%20great%20job%21&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted)!
58
59 Supported devices
60 -----------------
61
62 Currently supported devices:
63
64 - **Atheros AR9331**:
65   - 8devices Carambola 2 (for version with development board, [photos in my gallery](http://galeria.tech-blog.pl/8devices_Carambola_2/))
66   - ALFA Network AP121F
67   - ALFA Network Hornet-UB/Hornet-UB-64 (aka Hornet-UB x2)
68   - ALFA Network Tube2H
69   - Black Swift
70   - CreatComm Technology D3321
71   - Dragino MS14/N
72   - GainStrong Oolite v1/Elink EL-M150 module with dev board ([photos in my gallery](http://galeria.tech-blog.pl/Elink_EL-M150_Development-Board/))
73   - GL.iNet 64xxA ([photos in my gallery](http://galeria.tech-blog.pl/GLiNet/))
74   - GL.iNet GL-AR150
75   - GL.iNet GL-USB150
76   - Hak5 LAN Turtle
77   - Hak5 Packet Squirrel
78   - Hak5 WiFi Pineapple NANO
79   - TP-Link TL-MR10U v1 ([photos in my gallery](http://galeria.tech-blog.pl/TP-Link_TL-MR10U/))
80   - TP-Link TL-MR13U v1
81   - TP-Link TL-MR3020 v1 ([photos in my gallery](http://galeria.tech-blog.pl/TPLINK_TL-MR3020/))
82   - TP-Link TL-MR3040 v1 and v2
83   - TP-Link TL-MR3220 v2
84   - TP-Link TL-WR703N v1, ([photos in my gallery](http://galeria.tech-blog.pl/TPLINK_TL-WR703N/))
85   - TP-Link TL-WR710N v1 (version for European market, [photos in my gallery](http://galeria.tech-blog.pl/TP-Link_TL-WR710N-EU/))
86   - TP-Link TL-WR720N v3 (version for Chinese market)
87   - TP-Link TL-WR740N v4 (and similar, like TL-WR741ND v4)
88   - Village Telco Mesh Potato 2 (based on Dragino MS14/N)
89
90 - **Atheros AR1311 (similar to AR9331)**
91   - D-Link DIR-505 H/W ver. A1 ([photos in my gallery](http://galeria.tech-blog.pl/D-Link_DIR-505/))
92
93 - **Atheros AR9341**:
94   - EnGenius ENS202EXT
95   - TP-Link TL-MR3420 v2
96   - TP-Link TL-WA801ND v2
97   - TP-Link TL-WA830RE v2
98   - TP-Link TL-WR841N/D v8
99   - YunCore CPE870
100
101 - **Atheros AR9342**:
102   - TP-Link TL-WR1041N v2
103
104 - **Atheros AR9344**:
105   - ALFA Network N5Q
106   - GL.iNet GL-AR300
107   - TP-Link TL-WDR3500 v1
108   - TP-Link TL-WDR3600 v1
109   - TP-Link TL-WDR43x0 v1
110
111 - **Qualcomm Atheros QCA953x**:
112   - ALFA Network R36A
113   - Comfast CF-E314N
114   - Comfast CF-E320N v2
115   - Comfast CF-E520N/CF-E530N
116   - GainStrong Oolite v5.2 (module and dev board)
117   - GL.iNet GL-AR300M Lite
118   - GL.iNet GL-AR750
119   - P&W CPE505N
120   - P&W R602N
121   - TP-Link TL-MR22U v1
122   - TP-Link TL-MR3420 v3
123   - TP-Link TL-MR6400 v1, v2
124   - TP-Link TL-WA850RE v2
125   - TP-Link TL-WR802N
126   - TP-Link TL-WR810N v1, v2
127   - TP-Link TL-WR820N (version for Chinese market)
128   - TP-Link TL-WR841N/D v9, v10, v11
129   - TP-Link TL-WR842N/D v3
130   - TP-Link TL-WR902AC v1
131   - Wallys DR531
132   - WHQX E600G/AC v2
133   - YunCore AP90Q
134   - YunCore CPE830
135   - YunCore T830
136   - Zbtlink ZBT-WE1526
137
138 I tested this modification on most of these devices, with OpenWrt and OFW firmware. If you are not sure about the version of your device, please contact with me **before** you try to make an upgrade. Changing bootloader to a wrong version will probably damage your router and you will need special hardware to fix it, so please, **be very careful**.
139
140 More information about supported devices:
141
142 | Model | SoC | FLASH | RAM | U-Boot image | U-Boot env |
143 |:--- | :--- | ---: | ---: | ---: | ---: |
144 | [8devices Carambola 2](http://8devices.com/carambola-2) | AR9331 | 16 MiB | 64 MiB DDR2 | 256 KiB | R/W |
145 | ALFA Network AP121F | AR9331 | 16 MiB | 64 MiB DDR1 | 192 KiB, LZMA | R/W |
146 | [ALFA Network Hornet-UB](https://wiki.openwrt.org/toh/alfa.network/hornet-ub) | AR9331 | 8/16 MiB | 32/64 MiB DDR1 | 256 KiB | R/W |
147 | ALFA Network N5Q | AR9344 | 16 MiB | 64 MiB DDR2 | 384 KiB, LZMA | R/W |
148 | ALFA Network R36A | QCA9531 | 16 MiB | 64 MiB DDR2 | 384 KiB, LZMA | R/W |
149 | ALFA Network Tube2H | AR9331 | 8/16 MiB | 32/64 MiB DDR1 | 256 KiB | R/W |
150 | [Black Swift](http://www.black-swift.com) | AR9331 | 16 MiB | 64 MiB DDR2 | 128 KiB, LZMA | R/W |
151 | Comfast CF-E314N | QCA9531 | 16 MiB | 64 MiB DDR2 | 64 KiB, LZMA | RO |
152 | Comfast CF-E320N v2 | QCA9531 | 16 MiB | 64 MiB DDR2 | 64 KiB, LZMA | RO |
153 | Comfast CF-E520N/CF-E530N | QCA9531 | 8 MiB | 32 MiB DDR2 | 64 KiB, LZMA | RO |
154 | CreatComm Technology D3321 | AR9331 | 8 MiB | 32 MiB DDR1 | 256 KiB | RW |
155 | [D-Link DIR-505 H/W ver. A1](http://wiki.openwrt.org/toh/d-link/dir-505) | AR1311 | 8 MiB | 64 MiB DDR2 | 64 KiB, LZMA | RO |
156 | [Dragino MS14/N](http://wiki.openwrt.org/toh/dragino/ms14) | AR9331 | 16 MiB | 64 MiB DDR1 | 192 KiB | R/W |
157 | [EnGenius ENS202EXT](https://wiki.openwrt.org/toh/engenius/engenius_ens202ext_1.0.0) | AR9341 | 16 MiB | 64 MiB DDR1 | 256 KiB | R/W |
158 | GainStrong Oolite v1/Elink EL-M150 module | AR9331 | 4/8/16 MiB | 64 MiB DDR2 | 64 KiB, LZMA | RO |
159 | GainStrong Oolite v5.2 | QCA9531 | 16 MiB | 64/128 MiB DDR2 | 256 KiB, LZMA | RO |
160 | [GL.iNet 64xxA](http://wiki.openwrt.org/toh/gl-inet/gl-inet) | AR9331 | 8/16 MiB | 64 MiB DDR1 | 64 KiB | RO |
161 | GL.iNet GL-AR150 | AR9331 | 16 MiB | 64 MiB DDR2 | 256 KiB | R/W |
162 | GL.iNet GL-AR300 | AR9344 | 16 MiB | 128 MiB DDR2 | 256 KiB | R/W |
163 | GL.iNet GL-AR300M Lite | QCA9531 | 16 MiB | 128 MiB DDR2 | 256 KiB | R/W |
164 | GL.iNet GL-AR750 | QCA9531 | 16 MiB | 128 MiB DDR2 | 256 KiB | R/W |
165 | GL.iNet GL-USB150 | AR9331 | 16 MiB | 64 MiB DDR2 | 256 KiB | R/W |
166 | Hak5 LAN Turtle | AR9331 | 16 MiB | 64 MiB DDR2 | 128 KiB | R/W |
167 | Hak5 Packet Squirrel | AR9331 | 16 MiB | 64 MiB DDR2 | 128 KiB | R/W |
168 | Hak5 WiFi Pineapple NANO | AR9331 | 16 MiB | 64 MiB DDR2 | 128 KiB | R/W |
169 | P&W CPE505N | QCA9531 | 16 MiB | 64 MiB DDR2 | 256 KiB | R/W |
170 | P&W R602N | QCA9531 | 16 MiB | 64 MiB DDR2 | 256 KiB | R/W |
171 | [TP-Link TL-MR10U v1](http://wiki.openwrt.org/toh/tp-link/tl-mr10u) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
172 | [TP-Link TL-MR13U v1](http://wiki.openwrt.org/toh/tp-link/tl-mr13u) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
173 | [TP-Link TL-MR22U v1](https://wiki.openwrt.org/toh/tp-link/tp-link_tl-mr22u_v1) | QCA9531 | 8 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
174 | [TP-Link TL-MR3020 v1](http://wiki.openwrt.org/toh/tp-link/tl-mr3020) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
175 | [TP-Link TL-MR3040 v1/2](http://wiki.openwrt.org/toh/tp-link/tl-mr3040) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
176 | [TP-Link TL-MR3220 v2](http://wiki.openwrt.org/toh/tp-link/tl-mr3420) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
177 | [TP-Link TL-MR3420 v2](http://wikidevi.com/wiki/TP-LINK_TL-MR3420_v2) | AR9341 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
178 | [TP-Link TL-MR3420 v3](http://wikidevi.com/wiki/TP-LINK_TL-MR3420_v3) | QCA9531 | 4 MiB | 32 MiB DDR2 | 64 KiB, LZMA | RO |
179 | TP-Link TL-MR6400 v1/2 | QCA9531 | 8 MiB | 64 MiB DDR1 | 64 KiB, LZMA | RO |
180 | [TP-Link TL-WA801ND v2](http://wikidevi.com/wiki/TP-LINK_TL-WA801ND_v2) | AR9341 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
181 | [TP-Link TL-WA830RE v2](http://wikidevi.com/wiki/TP-LINK_TL-WA830RE_v2) | AR9341 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
182 | TP-Link TL-WA850RE v2 | QCA9533 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
183 | [TP-Link TL-WDR3500 v1](http://wiki.openwrt.org/toh/tp-link/tl-wdr3500) | AR9344 | 8 MiB | 128 MiB DDR2 | 64 KiB, LZMA | RO |
184 | [TP-Link TL-WDR3600 v1](http://wiki.openwrt.org/toh/tp-link/tl-wdr3600) | AR9344 | 8 MiB | 128 MiB DDR2 | 64 KiB, LZMA | RO |
185 | [TP-Link TL-WDR43x0 v1](http://wiki.openwrt.org/toh/tp-link/tl-wdr4300) | AR9344 | 8 MiB | 128 MiB DDR2 | 64 KiB, LZMA | RO |
186 | [TP-Link TL-WR1041N v2](http://wiki.openwrt.org/toh/tp-link/tl-wr1041n) | AR9342 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
187 | [TP-Link TL-WR703N](http://wiki.openwrt.org/toh/tp-link/tl-wr703n) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
188 | [TP-Link TL-WR710N v1](http://wiki.openwrt.org/toh/tp-link/tl-wr710n) | AR9331 | 8 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
189 | [TP-Link TL-WR720N v3](http://wiki.openwrt.org/toh/tp-link/tl-wr720n) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
190 | [TP-Link TL-WR740N v4](http://wiki.openwrt.org/toh/tp-link/tl-wr740n) | AR9331 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
191 | [TP-Link TL-WR802N](https://wikidevi.com/wiki/TP-LINK_TL-WR802N_v1.0) | QCA9533 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
192 | [TP-Link TL-WR810N v1](https://wiki.openwrt.org/toh/tp-link/tl-wr810n) | QCA9531 | 8 MiB | 64 MiB DDR2 | 64 KiB, LZMA | RO |
193 | TP-Link TL-WR810N v2 | QCA9533 | 8 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
194 | [TP-Link TL-WR820N](https://wiki.openwrt.org/toh/tp-link/tl-wr820n) | QCA9531 | 4 MiB | 64 MiB DDR2 | 64 KiB, LZMA | RO |
195 | [TP-Link TL-WR841N/D v8](http://wiki.openwrt.org/toh/tp-link/tl-wr841nd) | AR9341 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
196 | [TP-Link TL-WR841N/D v9/10/11](https://wiki.openwrt.org/toh/tp-link/tl-wr841nd) | QCA9533 | 4 MiB | 32 MiB DDR1 | 64 KiB, LZMA | RO |
197 | TP-Link TL-WR842N/D v3 | QCA9531 | 16 MiB | 64 MiB DDR2 | 64 KiB, LZMA | RO |
198 | TP-Link TL-WR902AC v1 | QCA9531 | 8 MiB | 64 MiB DDR2 | 128 KiB, LZMA | RO |
199 | Village Telco Mesh Potato 2 | AR9331 | 16 MiB | 64 MiB DDR1 | 192 KiB | R/W |
200 | Wallys DR531 | QCA9531 | 8 MiB | 64 MiB DDR2 | 192 KiB | R/W |
201 | WHQX E600G/AC v2 | QCA9531 | 8/16 MiB | 64/128 MiB DDR2 | 256 KiB | R/W |
202 | YunCore AP90Q | QCA9531 | 16 MiB | 128 MiB DDR2 | 256 KiB | R/W |
203 | YunCore CPE830 | QCA9531 | 16 MiB | 64 MiB DDR2 | 256 KiB | R/W |
204 | YunCore CPE870 | AR9341 | 8 MiB | 64 MiB DDR2 | 64 KiB, LZMA | R/W |
205 | YunCore T830 | QCA9531 | 16 MiB | 128 MiB DDR2 | 256 KiB | R/W |
206 | Zbtlink ZBT-WE1526 | QCA9531 | 16 MiB | 128 MiB DDR2 | 256 KiB | R/W |
207
208 *(LZMA) - U-Boot binary image is compressed with LZMA.*
209 *(R/W) - environment exists in separate FLASH block which allows you to save it and keep after power down.*
210 *(RO) - environment is read only, you can change and add new variables only during runtime.*
211
212 Known issues
213 ------------
214
215 ~~Current release is not loading kernel from some versions of TP-Link's official firmware. If you want to use the so-called OFW in any of supported TP-Link's router, do not use this modification. I am working on a solution for this issue.~~
216
217 Modifications, changes
218 ----------------------
219
220 ### Web server
221
222 The most important change is an inclusion of a web server, based on **[uIP 0.9 TCP/IP stack](https://github.com/adamdunkels/uip/tags)**. It allows to upgrade **firmware**, **U-Boot** and **ART** (Atheros Radio Test) images, directly from your web browser, without need to access serial console and running a TFTP server. You can find similar firmware recovery mode, also based on uIP 0.9 TCP/IP stack, in **D-Link** routers.
223
224 Web server contains 7 pages:
225
226 1. index.html (allows to upgrade firmware image, screenshot below)
227 2. uboot.html (allows to upgrade U-Boot image)
228 3. art.html (allows to upgrade ART image)
229 4. flashing.html
230 5. 404.html
231 6. fail.html
232 7. style.css
233
234 ![](http://www.tech-blog.pl/wordpress/wp-content/uploads/2015/11/uboot_mod_firmware_upgrade.jpg)
235
236 ![](http://www.tech-blog.pl/wordpress/wp-content/uploads/2015/11/uboot_mod_firmware_upgrade_progress.jpg)
237
238 ![](http://www.tech-blog.pl/wordpress/wp-content/uploads/2015/11/uboot_mod_uboot_upgrade.jpg)
239
240
241 ### Network Console
242
243 Second, very useful modification is a network console (it is a part of original U-Boot sources, but none of the manufacturers included it). It allows you to communicate with U-Boot console over the Ethernet, using UDP protocol (default UDP port: 6666, router IP: 192.168.1.1).
244
245 ![](http://www.tech-blog.pl/wordpress/wp-content/uploads/2013/04/u-boot_mod_for_tp-link_with_ar9331_netconsole.jpg)
246
247 You could also use netcat instead of Hercules utility on Mac/Linux:
248 ```
249 # nc -u -p 6666 192.168.1.1 6666
250 ```
251
252 ### Writable environment variables
253
254 U-Boot uses special "**environment variables**" which are used for storing values of many different settings, like IP addresses of device and remote server for TFTP transaction, serial console baud rate, boot command, etc. Environment is usually stored in separate FLASH sector or its part, so all changes can be saved permanently.
255
256 None of the popular manufacturers provides this feature and use so called "**read-only environment**" (embedded in U-Boot image), which means that all changes made during a runtime will be lost after device restart and there is no way to store them in FLASH.
257
258 This modification uses writable environment variables in almost all supported devices, so you can do for example:
259
260 ```
261 uboot> setenv ipaddr 192.168.1.100
262 uboot> saveenv
263 Saving environment to FLASH...
264
265 Erase FLASH from 0x9F010000 to 0x9F01FFFF in bank #1
266 Erasing: #
267
268 Erased sectors: 1
269
270 Writing at address: 0x9F010000
271
272 uboot> reset
273 ```
274
275 Which will change device IP address and save updated environment variables in FLASH. From next power up, the device will use new value for its IP address.
276
277 Using command **run** and writable environment variables you are able to write custom, small scripts like below example, used for firmware upgrade using TFTP method:
278
279 ```
280 uboot> printenv
281 [...]
282 firmware_addr=0x9F020000
283 firmware_name=firmware.bin
284 firmware_upg=if ping $serverip; then tftp $loadaddr $firmware_name && erase $firmware_addr +$filesize && cp.b $loadaddr $firmware_addr $filesize && echo OK!; else echo ERROR! Server not reachable!; fi
285 [...]
286
287 uboot> run firmware_upg
288 Ethernet mode (duplex/speed): 1/100 Mbps
289 Using eth0 device
290
291 Ping OK, host 192.168.1.2 is alive!
292
293
294 TFTP from IP: 192.168.1.2
295       Our IP: 192.168.1.1
296     Filename: 'firmware.bin'
297 Load address: 0x80800000
298        Using: eth0
299
300      Loading: ########################################
301               ########################################
302               ########################################
303               ########################################
304               ########################################
305               ########################################
306               ########################################
307               ########################################
308               ########################################
309               ########################################
310               ########################################
311               ########################################
312               ########################################
313               ########################################
314               ########################################
315               ########################################
316               ########################################
317               ########################################
318               ########################################
319               #########
320
321 TFTP transfer complete!
322
323 Bytes transferred: 3932160 (0x3c0000)
324 Erase FLASH from 0x9F020000 to 0x9F3DFFFF in bank #1
325 Erasing: #######################################
326          #####################
327
328 Erased sectors: 60
329
330 Copying to FLASH...
331 Writing at address: 0x9F020000
332
333 Done!
334
335 OK!
336 uboot>
337 ```
338
339 ### Other
340
341 Moreover:
342
343 - Faster boot up
344 - Unnecessary information from boot up sequence were removed
345 - FLASH chip is automatically recognized (using JEDEC ID)
346 - Ethernet MAC is set from FLASH (no more "No valid address in FLASH. Using fixed address")
347 - Automatic kernel booting can be interrupted using any key
348 - Better UART serial console driver with support for different baud rates
349 - Press and hold reset button to run:
350   - Web server (min. 3 seconds)
351   - U-Boot serial console (min. 5 seconds)
352   - U-Boot network console (min. 7 seconds)
353 - Additional commands (in comparison to the default version; availability depends on router model):
354   -  defenv
355   -  httpd
356   -  itest
357   -  loadb
358   -  loady
359   -  printmac
360   -  setmac
361   -  printmodel
362   -  printpin
363   -  startnc
364   -  startsc
365   -  ping
366   -  dhcp
367   -  sntp
368   -  iminfo
369 - Overclocking and underclocking possibilities (for now, only routers with AR9331)
370
371 ### Supported FLASH chips
372
373 FLASH type detection may be very useful for people who has exchanged the FLASH chip in their routers. You will not need to recompile U-Boot sources, to have access to overall FLASH space in U-Boot console.
374
375 If you use FLASH type which is not listed below, this version of U-Boot will try to get information about the chip using **Serial Flash Discoverable Parameter** (**SFDP**, more information: https://www.jedec.org/standards-documents/docs/jesd216b) standard. If your chip does not support SFDP, it will use default size for your router and, in most supported models, updating the ART image will not be available.
376
377 Currently supported FLASH types:
378
379 **4 MiB**:
380
381 - Spansion S25FL032P (4 MiB, JEDEC ID: 01 0215)*
382 - Atmel AT25DF321 (4 MiB, JEDEC ID: 1F 4700)
383 - EON EN25Q32 (4 MiB, JEDEC ID: 1C 3016)*
384 - EON EN25F32 (4 MiB, JEDEC ID: 1C 3116)*
385 - Micron M25P32 (4 MiB, JEDEC ID: 20 2016)
386 - Windbond W25Q32 (4 MiB, JEDEC ID: EF 4016)
387 - Macronix MX25L320 (4 MiB, JEDEC ID: C2 2016)
388 - GigaDevice GD25Q32 (4 MiB, JEDEC ID: C8 4016)*
389
390 **8 MiB**:
391
392 - Spansion S25FL064P (8 MiB, JEDEC ID: 01 0216)
393 - Atmel AT25DF641 (8 MiB, JEDEC ID: 1F 4800)
394 - EON EN25Q64 (8 MiB, JEDEC ID: 1C 3017)*
395 - Micron M25P64 (8 MiB, JEDEC ID: 20 2017)
396 - Windbond W25Q64 (8 MiB, JEDEC ID: EF 4017)*
397 - Macronix MX25L64 (8 MiB, JEDEC ID: C2 2017, C2 2617)
398 - GigaDevice GD25Q64 (8 MiB, JEDEC ID: C8 4017)
399
400 **16 MiB**:
401
402 - Winbond W25Q128 (16 MB, JEDEC ID: EF 4018)*
403 - Winbond W25Q128FW (16 MB, JEDEC ID: EF 6018, 1,8 V)*
404 - Macronix MX25L128 (16 MB, JEDEC ID: C2 2018, C2 2618)
405 - Spansion S25FL127S (16 MB, JEDEC ID: 01 2018)*
406 - Micron N25Q128 (16 MB, JEDEC ID: 20 BA18)
407 - GigaDevice GD25Q128 (16 MiB, JEDEC ID: C8 4018)
408
409 (*) tested
410
411 If you want to use other type, please contact with me or make changes in the code, test them and send a pull request or a patch.
412
413 How to install it?
414 ------------------
415
416 ### Cautions, backups
417
418 **You do so at your own risk!**
419 **If you make any mistake or something goes wrong during upgrade, in worst case, your router will not boot again!**
420
421 It is a good practice to backup your original U-Boot image/partition (especially for TP-Link devices) **before** you make any changes. For example, using OpenWrt (TP-Link TL-WR703N with 16 MiB FLASH):
422
423 ```
424 cat /proc/mtd
425 ```
426
427 This command will show you all **MTD** (Memory Technology Device) partitions:
428
429 ```
430 dev:    size   erasesize  name
431 mtd0: 00020000 00010000 "u-boot"
432 mtd1: 000eeb70 00010000 "kernel"
433 mtd2: 00ee1490 00010000 "rootfs"
434 mtd3: 00c60000 00010000 "rootfs_data"
435 mtd4: 00010000 00010000 "art"
436 mtd5: 00fd0000 00010000 "firmware"
437 ```
438
439 As you can see, `u-boot` partition size is **0x20000** (128 KiB) and my image for this model has smaller size: **0x1EC00** (123 KiB) - it is a very important difference! You should remember about this if you want to use `mtd` utility or serial console and U-Boot command line, to change the bootloader.
440
441 To backup `u-boot` partition in RAM, run:
442
443 ```
444 cat /dev/mtd0 > /tmp/uboot_backup.bin
445 ```
446
447 And then connect to your router using `SCP protocol` and download from `/tmp` the `uboot_backup.bin` file.
448
449 ### Using external programmer
450
451 If you have an external FLASH programmer (all supported devices have **SPI NOR FLASH** chips), you probably know how to use it. Download package with prebuilt images or compile the code, choose right file for your device and put it on FLASH at the beginning (offset `0x00000`). Remember to first erase block(s) - with high probability, if you use some kind of automatic mode, the programmer will do it for you.
452
453 All prebuilt images are padded with 0xFF and since change "**![Extend maximum U-Boot image size up to 123 KB](https://github.com/pepe2k/u-boot_mod/commit/7829f50c0e92024fde613cb01e65cbdeae1f126b)**", in most supported devices, **their size is no longer a multiple of 64 KiB block**. For example, **TP-Link** uses only first **64 KiB** block to store compressed U-Boot image (in most of their modern devices). In the second 64 KiB block they store additional information like MAC address, model number and WPS pin number. This modification will use both sectors for U-Boot image and also other data, including small block for writable environment variables.
454
455 Below image with beginning part of FLASH memory map for TP-Link TL-MR3020 shows differences between stock version and this modification.
456
457 ![](http://www.tech-blog.pl/wordpress/wp-content/uploads/2016/03/mr3020_u-boot-modification_flash-map_comparison.png)
458
459 On the other hand, U-Boot image in **Carambola 2** from **8devices** may have up to **256 KiB** (4x 64 KiB block), they use uncompressed version and environment stored in FLASH. Immediately after the Carambola 2 U-Boot partition is an area which contains U-Boot environment variables (1x 64 KiB block), called `u-boot-env`:
460
461 ```
462 dev:    size   erasesize  name
463 mtd0: 00040000 00010000 "u-boot"
464 mtd1: 00010000 00010000 "u-boot-env"
465 mtd2: 00f90000 00010000 "firmware"
466 mtd3: 00e80000 00010000 "rootfs"
467 mtd4: 00cc0000 00010000 "rootfs_data"
468 mtd5: 00010000 00010000 "nvram"
469 mtd6: 00010000 00010000 "art"
470 ```
471
472 ### Using UART, U-Boot console and TFTP server
473
474 **WARNING! This method is highly not recommended!**
475
476 It is probably the most common method to change firmware in case of any problems. Main disadvantage of this approach is the need to connect with device using a serial port (this does not apply to Carambola 2 with development board, which already has a built-in USB-UART adapter, based on FTDI FT232RQ).
477
478 #### Important notice!
479
480 All these devices have an UART interface integrated inside the SoC, which operates at TTL 3.3 V (in fact, GPIO pins can work at this voltage, but their real range is < 3 V)!
481
482 Please, **do not** connect any RS232 +/- 12 V cable or any adapter without logic level converter, because it may damage your device. It would be the best if you use any USB to UART adapter with integrated 3.3 V logic level converter. And please, remember that **you should connect only RX, TX and GND signals**. **DO NOT** connect together 3.3 V signals from router and from adapter if you do not know what are you doing, because you may burn out your adapter and/or router! Connect the adapter using USB port in your PC and router with original power supply.
483
484 For a long time I have been using without any problems a small and very cheap (about 1-2 USD) **CP2102** based adapter. Go to [Serial Console article in OpenWrt Wiki](http://wiki.openwrt.org/doc/hardware/port.serial) for more, detailed information.
485
486 #### Step by step instructions
487
488 1. Install and configure any **TFTP server** on your PC (on Windows, you can use [TFTP32](http://tftpd32.jounin.net)).
489
490 2. Set a fixed IP address on your PC (in this tutorial we will use **192.168.1.2** for the PC and **192.168.1.1** for the router) and connect it to the router, using RJ45 network cable (in most case you will need to use one of the available LAN ports, but WAN port should also work).
491
492 3. Connect USB to UART adapter to the router and start any application to communicate with it, like [PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html).
493 Configure adapter to use the following settings:
494   * Baud rate: 115200
495   * Data bits: 8
496   * Parity control: none
497   * Stop bits: 1
498   * Handshaking: none
499 4. Power on the router, wait for a line like one of the following and interrupt the process of loading a kernel:
500
501   `Autobooting in 1 seconds` (for most **TP-Link** routers, you should enter `tpl` at this point)
502   `Hit ESC key to stop autoboot:  1` (for **8devices Carambola 2**, use `ESC` key)
503   `Hit any key to stop autoboot:  1` (for **D-Link DIR-505**, use any key)
504
505 5. Set `ipaddr` and `serverip` environment variables:
506
507   ```
508   hornet> setenv ipaddr 192.168.1.1
509   hornet> setenv serverip 192.168.1.2
510   ```
511 6. Check the changes:
512
513   ```
514   hornet> printenv ipaddr
515   ipaddr=192.168.1.1
516   hornet> printenv serverip
517   serverip=192.168.1.2
518   ```
519
520 7. Due to differences in FLASH memory map and sizes of original and modified version of U-Boot, you must first make a backup of the partition with original version in RAM. **If you skip this step or make a mistake, your device will be probably broken!**
521
522   This step is different between supported models, so you should pay attention to the size of image with modified version of U-Boot, **round it to the nearest multiple of 64 KiB** and use this value in all next steps.
523
524   For example, if image of the modified version is **123 KiB** (**0x1EC00**) you must first make a backup of **128 KiB** (**0x20000**) in RAM, at the same address where you are going to download the image:
525
526   ```
527   hornet> cp.b 0x9F000000 0x80800000 0x20000
528   ```
529
530   Using the same offset address in RAM for backup and new image will end up with combination of both images and preserve additional data like MAC address, model number and PIN.
531
532 8. Download and store in RAM proper image for your router, using `tftpboot` command in U-Boot console (in this example, for **TP-Link TL-MR3020**):
533
534   ```
535   hornet> tftpboot 0x80800000 uboot_for_tp-link_tl-mr3020.bin
536   eth1 link down
537   Using eth0 device
538   TFTP from server 192.168.1.2; our IP address is 192.168.1.1
539   Filename 'uboot_for_tp-link_tl-mr3020.bin'.
540   Load address: 0x80800000
541   Loading: #########################
542   done
543   Bytes transferred = 125952 (1ec00 hex)
544
545   hornet>
546   ```
547
548 9. Next step is very risky! You are going to delete existing U-Boot image from FLASH in your device and copy from RAM the new one. If something goes wrong (for example, a power failure), your router, without bootloader, will not boot again!
549
550   You should also note the size of image and use value from step 7. In all cases, the start address of FLASH is **0x9F000000** and for RAM: **0x80000000** (as you may noticed, I did not use start address of RAM to store image and you should follow this approach).
551
552   Please, do not make any mistake with offsets and sizes during next steps!
553
554 10. Erase appropriate FLASH space for new U-Boot image (this command will remove default U-Boot image!):
555
556   ```
557   hornet> erase 0x9F000000 +0x20000
558
559   First 0x0 last 0x1 sector size 0x10000
560   Erased 2 sectors
561   hornet>
562   ```
563
564 11. Now your router does not have U-Boot, so do not wait and copy to FLASH the new one, stored earlier in RAM:
565
566   ```
567   hornet> cp.b 0x80800000 0x9F000000 0x20000
568
569   Copy to Flash... write addr: 9f000000
570   done
571   ```
572
573 12. If you want, you can check content of the newly written FLASH and compare it to the image on your PC (or better also do such a "legit memory content" comparison prior to writing!), using `md` command in U-Boot console, which prints indicated memory area (press only ENTER after first execution of this command to move further in memory):
574
575   ```
576   hornet> md 0x9F000000
577
578   9f000000: 100000ff 00000000 100000fd 00000000    ................
579   9f000010: 10000222 00000000 10000220 00000000    ..."....... ....
580   9f000020: 1000021e 00000000 1000021c 00000000    ................
581   9f000030: 1000021a 00000000 10000218 00000000    ................
582   9f000040: 10000216 00000000 10000214 00000000    ................
583   9f000050: 10000212 00000000 10000210 00000000    ................
584   9f000060: 1000020e 00000000 1000020c 00000000    ................
585   9f000070: 1000020a 00000000 10000208 00000000    ................
586   9f000080: 10000206 00000000 10000204 00000000    ................
587   9f000090: 10000202 00000000 10000200 00000000    ................
588   9f0000a0: 100001fe 00000000 100001fc 00000000    ................
589   9f0000b0: 100001fa 00000000 100001f8 00000000    ................
590   9f0000c0: 100001f6 00000000 100001f4 00000000    ................
591   9f0000d0: 100001f2 00000000 100001f0 00000000    ................
592   9f0000e0: 100001ee 00000000 100001ec 00000000    ................
593   9f0000f0: 100001ea 00000000 100001e8 00000000    ................
594   ```
595
596 12. If you are sure that everything went OK, you may reset the board using below command or just reset power:
597
598   ```
599   hornet> reset
600   ```
601
602 ### Using OpenWrt
603
604 **This method is recommended!**
605
606 Starting from official release "**[2014-11-19](https://github.com/pepe2k/u-boot_mod/releases/tag/2014-11-19)**", you will find ready **OpenWrt** images, with unlocked `u-boot` partition, embedded U-Boot image and dedicated small script for easy update process inside release tarball. All you need to do is download last release, select proper OpenWrt image for your device, install it and invoke one command: `u-boot-upgrade`:
607
608 ```
609 root@OpenWrt:/# u-boot-upgrade
610
611 =================================================================
612      DISCLAIMER: you are using this script at your own risk!
613
614      The author of U-Boot modification and this script takes
615      no responsibility for any of the results of using them.
616
617           Updating U-Boot is a very dangerous operation
618         and may damage your device! You have been warned!
619 =================================================================
620    Are you sure you want to continue (type 'yes' or 'no')? yes
621 =================================================================
622
623 [ ok ] Found U-Boot image file: uboot_for_tp-link_tl-mr3020.bin
624        Do you want to use this file (type 'yes' or 'no')? yes
625 [ ok ] MD5 checksum of new U-Boot image file is correct
626 [ ok ] Backup of /dev/mtd0 successfully created
627        Do you want to store backup in /etc/u-boot_mod/backup/ (recommended, type 'yes' or 'no')? no
628 [ ok ] New U-Boot image successfully combined with backup file
629 [info] New U-Boot image is ready to be written into FLASH
630        Are you sure you want to continue (type 'yes' or 'no')? yes
631 [ ok ] New U-Boot image successfully written info FLASH
632 [ ok ] MD5 checksum of mtd0 and new U-Boot image are equal
633 [info] Done!
634 ```
635
636 ### Using DD-WRT
637
638 **WARNING! This method is not recommended!**
639
640 1. Login into the router using telnet or SSH and find out which of the mtd partitions is the first one. In DD-WRT it is usally called `RedBoot`:
641
642   ```
643   root@DD-WRT:~# cat /proc/mtd
644   dev:    size   erasesize  name
645   mtd0: 00020000 00010000 "RedBoot"
646   mtd1: 003c0000 00010000 "linux"
647   mtd2: 002c0000 00010000 "rootfs"
648   mtd3: 00010000 00010000 "ddwrt"
649   mtd4: 00010000 00010000 "nvram"
650   mtd5: 00010000 00010000 "board_config"
651   mtd6: 00400000 00010000 "fullflash"
652   mtd7: 00020000 00010000 "fullboot"
653   ```
654
655   In this case, for **TP-Link TL-MR3020**, the `RedBoot` partition is the one, which contains U-Boot and additional data (MAC address, model number, PIN).
656
657   **Warning!** If size of the first partition is smaller than the size of the modified U-Boot image, you should not continue!
658
659 2. Using SCP or other method, transfer the new U-Boot image and corresponding MD5 file to the `/tmp` folder in device.
660
661   ```
662   root@DD-WRT:/tmp# ls -la
663   [...]
664   -rw-r--r--    1 root     root        125952 Nov  5  2015 uboot_for_tp-link_tl-mr3020.bin
665   -rw-r--r--    1 root     root            66 Nov  5  2015 uboot_for_tp-link_tl-mr3020.md5
666   [...]
667   ```
668
669 3. Verify the MD5 sum of the image:
670
671   ```
672   root@DD-WRT:/tmp# md5sum uboot_for_tp-link_tl-mr3020.bin
673   aaae0f772ce007f7d1542b9233dd765b  uboot_for_tp-link_tl-mr3020.bin
674
675   root@DD-WRT:/tmp# cat uboot_for_tp-link_tl-mr3020.md5
676   aaae0f772ce007f7d1542b9233dd765b *uboot_for_tp-link_tl-mr3020.bin
677   ```
678
679 4. Make a backup of the current `RedBoot` partition (`mtd0`):
680
681   ```
682   root@DD-WRT:/tmp# dd if=/dev/mtd0 of=uboot_factory.bin
683   256+0 records in
684   256+0 records out
685   ```
686
687 5. Using SCP or other method, transfer backuped `RedBoot` original partition to some safe place (I highly recommended you to save backup somewhere!).
688
689 6. You need to combine together original image and the one with U-Boot modification, but it seems that `dd` from DD-WRT does not support `conv=notrunc`, so we will use different approach:
690
691   ```
692   root@DD-WRT:/tmp# dd if=uboot_factory.bin of=uboot_rest.bin bs=1 skip=$(wc -c < uboot_for_tp-link_tl-mr3020.bin)
693   5120+0 records in
694   5120+0 records out
695
696   root@DD-WRT:/tmp# cat uboot_for_tp-link_tl-mr3020.bin uboot_rest.bin > uboot_new.bin
697   ```
698
699 7. **Danger**: This is the point of no return, if you have any errors or problems, please revert the original image at any time using:
700
701   ```
702   root@DD-WRT:/tmp# mtd write uboot_factory.bin "RedBoot"
703   Unlocking RedBoot ...
704   Writing from uboot_orig.bin to RedBoot ...
705   ```
706
707 8. Now, to actually flash the new image, run:
708
709   ```
710   root@DD-WRT:/tmp# mtd write uboot_new.bin "RedBoot"
711   Unlocking RedBoot ...
712   Writing from uboot_new.bin to RedBoot ...
713   ```
714
715 9. If you are sure that everything went OK, you may reboot the device:
716
717   ```
718   root@DD-WRT:/tmp# reboot
719   ```
720
721 How to use it?
722 --------------
723
724 [TODO]
725
726 How to compile the code?
727 ------------------------
728
729 ### Building on Linux
730
731 You can use one of the free toolchains:
732
733 - Recommended and used for snapshots build: [LEDE SDK for AR71xx MIPS (17.01.0 release)](https://downloads.lede-project.org/releases/17.01.0/targets/ar71xx/generic/lede-sdk-17.01.0-ar71xx-generic_gcc-5.4.0_musl-1.1.16.Linux-x86_64.tar.xz),
734 - Recommended: [LEDE SDK for AR71xx MIPS (trunk snapshot)](https://downloads.lede-project.org/snapshots/targets/ar71xx/generic/lede-sdk-ar71xx-generic_gcc-5.4.0_musl.Linux-x86_64.tar.xz),
735 - [OpenWrt SDK for AR71xx MIPS (Chaos Calmer release)](https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/OpenWrt-SDK-15.05.1-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2),
736 - [OpenWrt Toolchain for AR71xx MIPS (trunk snapshot)](https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/OpenWrt-Toolchain-ar71xx-generic_gcc-5.3.0_musl-1.1.16.Linux-x86_64.tar.bz2),
737 - [ELDK (Embedded Linux Development Kit)](http://bit.ly/2djaTMn),
738 - or any others...
739
740 I am using **OpenWrt Toolchain for AR71xx MIPS** (32-bit, virtual machine) and all released binary images were/will be built using this set.
741
742 All you need to do, after choosing a toolchain, is to modify [Makefile](Makefile) - change or remove `export MAKECMD` and if needed add `export PATH`. For example, to use OpenWrt Toolchain instead of Sourcery CodeBench Lite, download it and extract into `toolchain` folder, inside the top dir and change first lines in [Makefile](Makefile):
743
744 ```
745 export BUILD_TOPDIR=$(PWD)
746 export STAGING_DIR=$(BUILD_TOPDIR)/tmp
747
748 export MAKECMD=make --silent ARCH=mips CROSS_COMPILE=mips-openwrt-linux-uclibc-
749 export PATH:=$(BUILD_TOPDIR)/toolchain/bin/:$(PATH)
750 ```
751
752 To build image, run `make model` inside top dir, for example, command:
753
754 ```
755 make tplink_wr703n
756 ```
757
758 will start building U-Boot image for **TP-Link TL-WR703N**.
759
760 ### Building on macOS (OS X)
761
762 You can build using the OpenWrt/LEDE toolchain as above under macOS (OS X) as long as you install several gnu command line tools via brew. Note that bash is required to correct the usage of colorized echo output within the Makefiles (I was suprised how inconsistent FreeBSD is with Linux/GNU in this regard).
763
764 ```
765 brew install bash coreutils gnu-sed
766 ```
767
768 Subsequently, in addition to the toolchain being in your path, you will need to point your path as instructed by brew to the gnu binaries (only required for the build).
769
770 ```
771 export PATH=/usr/local/opt/coreutils/libexec/gnubin:/usr/local/opt/gnu-sed/libexec/gnubin:$PATH
772 ```
773
774 This process was tested on Yosemite and El Capitan.
775
776 FAQ
777 ---
778
779 #### 1. My device is not supported, but has the same hardware as one in the list, can I use this modification?
780
781 *It could be dangerous! I know that a lot of routers uses the same hardware - for example, TP-Link has a battery powered routers set, which contains: TL-MR10U, TL-MR11U (TL-MR3040 in Europe) TL-MR12U and TL-MR13U. All of them has the same platform: Atheros AR9331 with 32 MiB of DDR RAM and 4 MiB of SPI NOR FLASH. But, there may exist a slight difference, like GPIO pin number for reset button or LED(s), that may cause problems.*
782
783 *You can try, but remember that you are doing this only at your own risk!*
784
785 #### 2. I want to overclock my router, how can I do this?
786
787 *Currently, this option is available only for routers with Atheros AR9331 (please, look at [ap121.h](u-boot/include/configs/ap121.h) file which contains all information about PLL register configuration and an untypical clocks for CPU, RAM and AHB). What more, you will need to compile the code yourself, because I will not publish images with non-default clocks.*
788
789 *And again, remember that you are doing this only at your own risk!*
790
791 #### 3. Do you test all prebuilt images before you publish them?
792
793 *No, because I do not have all supported devices, only few of them. But, I make tests for every supported SoC types.*
794
795 #### 4. I would like you to add support for device X.
796
797 *You can do it yourself and send me a pull request or a patch. If you do not want to, or do not know how to do it, please contact with me directly.*
798
799 #### 5. My device does not boot after upgrade!
800
801 *I told you... bootloader, in this case U-Boot, is the most important piece of code inside your device. It is responsible for hardware initialization and booting an OS (kernel in this case), i.e. it is the bridge head for delegating to / flashing kernel and rootfs images. So, if during the upgrade something went wrong, your device will not boot any more. The only way to recover from such a situation in a mild way is via a JTAG adapter connection. In case of a lack of JTAG connection, you would even need to remove the FLASH chip, load proper image using an external programmer and solder it back.*
802
803 License, outdated sources etc.
804 ------------------------------
805
806 **[U-Boot](http://www.denx.de/wiki/U-Boot/WebHome "U-Boot")** project is Free Software, licensed under version 2 of the **GNU General Public License**. All information about license, contributors etc., are included with sources, inside *u-boot* folder.
807
808 You should know, that most routers, especially those based on Atheros SoCs, uses very old versions of U-Boot (1.1.4 is from 2005/2006). So, *these sources are definitely outdated* (do not even try to merge them with official release), but it was easier for me to modify them, than move TP-Link/Atheros changes to the current version. Moreover, lot of unnecessary code fragments and source files were removed for ease of understanding the code.
809
810 Credits
811 -------
812
813 - Thanks to M-K O'Connell for donating a router with QCA9563
814 - Thanks to Krzysztof M. for donating a TL-WDR3600 router
815 - Thanks to *pupie* from OpenWrt forum for his great help
816 - Thanks for all donators and for users who contributed in code development