2 * Copyright (C) 2016 Piotr Dymacz <piotr@dymacz.pl>
4 * SPDX-License-Identifier: GPL-2.0
8 * Custom/miscellaneous commands
13 #include <asm/mipsregs.h>
14 #include <asm/addrspace.h>
15 #include <ar7240_soc.h>
17 /* TODO: remove extern and include header file*/
18 extern void qca_sys_clocks(u32 *cpu_clk, u32 *ddr_clk, u32 *ahb_clk,
19 u32 *spi_clk, u32 *ref_clk);
21 #if defined(CONFIG_CMD_MAC) &&\
22 defined(OFFSET_MAC_ADDRESS)
24 * Show MAC address(es)
26 int do_print_mac(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
28 #if defined(OFFSET_MAC_ADDRESS2)
32 #if defined(OFFSET_MAC_ADDRESS2)
33 // get MAC1 and MAC2 addresses from flash and print them
34 memcpy(buffer, (void *)(CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_MAC_ADDRESS), 6);
35 memcpy(buffer2, (void *)(CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_MAC_ADDRESS2), 6);
37 puts("Current MAC addresses stored in FLASH:\n");
38 printf("MAC1 at 0x%X: %02X:%02X:%02X:%02X:%02X:%02X\n", CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_MAC_ADDRESS,
39 buffer[0] & 0xFF, buffer[1] & 0xFF, buffer[2] & 0xFF, buffer[3] & 0xFF, buffer[4] & 0xFF, buffer[5] & 0xFF);
41 printf("MAC2 at 0x%X: %02X:%02X:%02X:%02X:%02X:%02X\n\n", CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_MAC_ADDRESS2,
42 buffer2[0] & 0xFF, buffer2[1] & 0xFF, buffer2[2] & 0xFF, buffer2[3] & 0xFF, buffer2[4] & 0xFF, buffer2[5] & 0xFF);
44 // get MAC address from flash and print it
45 memcpy(buffer, (void *)(CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_MAC_ADDRESS), 6);
47 printf("Current MAC address stored in FLASH at offset 0x%X: ", CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_MAC_ADDRESS);
48 printf("%02X:%02X:%02X:%02X:%02X:%02X\n\n", buffer[0] & 0xFF, buffer[1] & 0xFF, buffer[2] & 0xFF, buffer[3] & 0xFF, buffer[4] & 0xFF, buffer[5] & 0xFF);
54 #if defined(OFFSET_MAC_ADDRESS2)
55 U_BOOT_CMD(printmac, 1, 1, do_print_mac, "print MAC addresses stored in FLASH\n", NULL);
57 U_BOOT_CMD(printmac, 1, 1, do_print_mac, "print MAC address stored in FLASH\n", NULL);
61 * Change MAC address(es)
63 int do_set_mac(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
64 unsigned char *data_pointer;
68 // allow only 2 arg (command name + mac), second argument length should be 17 (xx:xx:xx:xx:xx:xx)
69 if(argc != 2 || strlen(argv[1]) != 17){
70 print_cmd_help(cmdtp);
75 for(i = 0; i< 17; i++){
76 if(argv[1][i] == ':'){
82 printf_err("given MAC address has wrong format (should be: xx:xx:xx:xx:xx:xx)!\n");
86 // backup block with MAC address from flash in RAM
87 data_pointer = (unsigned char *)CONFIG_LOADADDR;
90 printf_err("couldn't allocate RAM for data block backup!\n");
94 puts("** Notice:\n you should always make a backup of your device\n entire FLASH content before making any changes\n\n");
96 memcpy((void *)data_pointer, (void *)(CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK), OFFSET_MAC_DATA_BLOCK_LENGTH);
98 // store new MAC address in RAM
99 for(i = 0; i < 6; i++){
100 data_pointer[OFFSET_MAC_ADDRESS + i] = simple_strtoul((char *)(argv[1] + i*3), NULL, 16);
103 // now we can erase flash and write data from RAM
105 "erase 0x%lX +0x%lX; cp.b 0x%lX 0x%lX 0x%lX",
106 CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK,
107 OFFSET_MAC_DATA_BLOCK_LENGTH,
109 CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK,
110 OFFSET_MAC_DATA_BLOCK_LENGTH);
112 printf("Executing: %s\n\n", buf);
114 return(run_command(buf, 0));
117 U_BOOT_CMD(setmac, 2, 0, do_set_mac, "save new MAC address in FLASH\n", "xx:xx:xx:xx:xx:xx\n\t- change MAC address stored in FLASH (xx - value in hex format)\n");
119 #endif /* if defined(CONFIG_CMD_MAC) && defined(OFFSET_MAC_ADDRESS) */
121 #if defined(OFFSET_ROUTER_MODEL)
123 * Show TP-Link router model
125 int do_print_model(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
126 unsigned char buffer[8];
128 // get router model from flash and print it
129 memcpy(buffer, (void *)(CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_ROUTER_MODEL), 8);
131 printf("Router model stored in FLASH at offset 0x%X: ", CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_ROUTER_MODEL);
132 printf("%02X%02X%02X%02X%02X%02X%02X%02X\n\n", buffer[0] & 0xFF, buffer[1] & 0xFF, buffer[2] & 0xFF, buffer[3] & 0xFF, buffer[4] & 0xFF, buffer[5] & 0xFF, buffer[6] & 0xFF, buffer[7] & 0xFF);
137 U_BOOT_CMD(printmodel, 1, 1, do_print_model, "print router model stored in FLASH\n", NULL);
139 #endif /* if defined(OFFSET_ROUTER_MODEL) */
141 #if defined(OFFSET_PIN_NUMBER)
145 int do_print_pin(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
146 unsigned char buffer[9];
148 // get pin number from flash and print it
149 memcpy(buffer, (void *)(CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_PIN_NUMBER), 8);
152 printf("Router pin number stored in FLASH at offset 0x%X: ", CFG_FLASH_BASE + OFFSET_MAC_DATA_BLOCK + OFFSET_PIN_NUMBER);
153 printf("%s\n\n", buffer);
158 U_BOOT_CMD(printpin, 1, 1, do_print_pin, "print WPS pin stored in FLASH\n", NULL);
160 #endif /* if defined(OFFSET_PIN_NUMBER) */
162 #if defined(CONFIG_NETCONSOLE)
166 int do_start_nc(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
167 return(run_command("setenv stdin nc;setenv stdout nc;setenv stderr nc;version;", 0));
170 U_BOOT_CMD(startnc, 1, 0, do_start_nc, "start net console\n", NULL);
173 * Start Serial Console
175 int do_start_sc(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
176 return(run_command("setenv stdin serial;setenv stdout serial;setenv stderr serial;version;", 0));
179 U_BOOT_CMD(startsc, 1, 0, do_start_sc, "start serial console\n", NULL);
181 #endif /* if defined(CONFIG_NETCONSOLE) */
183 #if defined(CONFIG_CMD_ENV) && defined(CONFIG_CMD_FLASH)
185 * Erase environment sector
187 int do_default_env(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){
190 ulong end_addr, flash_sect_addr;
191 #if defined(CFG_ENV_SECT_SIZE) && (CFG_ENV_SECT_SIZE > CFG_ENV_SIZE)
194 unsigned char env_buffer[CFG_ENV_SECT_SIZE];
197 #if defined(CFG_ENV_SECT_SIZE) && (CFG_ENV_SECT_SIZE > CFG_ENV_SIZE)
198 flash_offset = CFG_ENV_ADDR & (CFG_ENV_SECT_SIZE-1);
199 flash_sect_addr = CFG_ENV_ADDR & ~(CFG_ENV_SECT_SIZE-1);
201 /* copy whole env sector to temporary buffer */
202 memcpy(env_buffer, (void *)flash_sect_addr, CFG_ENV_SECT_SIZE);
205 memset((uchar *)((unsigned long)env_buffer + flash_offset), 0xFF, CFG_ENV_SIZE);
207 len = CFG_ENV_SECT_SIZE;
209 flash_sect_addr = CFG_ENV_ADDR;
213 end_addr = flash_sect_addr + len - 1;
215 /* erase whole env sector */
216 if(flash_sect_erase(flash_sect_addr, end_addr)){
220 #if defined(CFG_ENV_SECT_SIZE) && (CFG_ENV_SECT_SIZE > CFG_ENV_SIZE)
221 /* restore data from buffer in FLASH */
222 rc = flash_write((char *)env_buffer, flash_sect_addr, len);
233 U_BOOT_CMD(defenv, 1, 0, do_default_env, "reset environment variables to their default values\n", NULL);
234 #endif /* if CONFIG_CMD_ENV && CONFIG_CMD_FLASH */
237 * Allows to get reset button status:
238 * - returns 0 if button is pressed
239 * - returns 1 if button is not pressed
241 * Logic here must be inverted as in shell
242 * 0 means success/true
244 * This allows to use it in scripts, ex.:
245 * if button; then ...; else ...; fi ...
248 * button && echo pressed!
249 * button || echo not pressed!
251 #if defined(CONFIG_CMD_BUTTON) &&\
252 defined(CONFIG_GPIO_RESET_BTN)
253 int do_button(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
255 #if defined(CFG_HUSH_PARSER)
256 return !reset_button_status();
258 int btn = reset_button_status();
261 puts("Reset button is pressed\n");
263 puts("Reset button is not pressed\n");
269 U_BOOT_CMD(button, 1, 1, do_button,
270 "get reset button status\n", NULL);
271 #endif /* CONFIG_CMD_BUTTON && CONFIG_GPIO_RESET_BTN */
274 * Allows to delay execution
275 * for a given/specified time (in ms)
277 #if defined(CONFIG_CMD_SLEEP)
278 int do_sleep(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
281 print_cmd_help(cmdtp);
285 milisecdelay(simple_strtoul(argv[1], NULL, 10));
290 U_BOOT_CMD(sleep, 2, 1, do_sleep,
291 "sleep for specified time\n", "ms\n"
292 "\t- sleep for 'ms' number of milliseconds\n");
293 #endif /* CONFIG_CMD_SLEEP */
298 #if defined(CONFIG_CMD_LED)
299 int do_ledon(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
306 int do_ledoff(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
313 U_BOOT_CMD(ledon, 1, 1, do_ledon, "turn LED/s on\n", NULL);
314 U_BOOT_CMD(ledoff, 1, 1, do_ledoff, "turn LED/s off\n", NULL);
315 #endif /* CONFIG_CMD_LED */
318 * Checks if last reset was caused by watchdog
320 #if defined(CONFIG_CMD_RSTBYWDT)
321 int do_rstbywdt(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
323 return !last_reset_wdt();
326 U_BOOT_CMD(rstbywdt, 1, 1, do_rstbywdt, "check if last reset was caused by watchdog\n", NULL);
327 #endif /* CONFIG_CMD_RSTBYWDT */