2 * Copyright (c) 2013 Qualcomm Atheros, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted (subject to the limitations in the
7 * disclaimer below) provided that the following conditions are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the
17 * * Neither the name of Qualcomm Atheros nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
22 * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
23 * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
33 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 #include "athos_api.h"
38 #if defined(PROJECT_K2)
39 #if SYSTEM_MODULE_SFLASH
40 #include "sflash_api.h"
42 #endif /* #if defined(PROJECT_K2) */
44 #if defined(SYSTEM_MODULE_DBG)
46 /* Function prototypes */
47 static int db_help_cmd(char *, char *, char *, char *);
48 static int db_ldr_cmd(char *, char *, char *, char *);
49 static int db_str_cmd(char *, char *, char *, char *);
50 static int db_info_cmd(char *, char *, char *, char *);
51 static int db_usb_cmd(char *, char *, char *, char *);
52 static int db_intr_cmd(char *, char *, char *, char *);
54 static int db_cmd_starthtc(char *cmd, char *param1, char *param2, char *param3);
56 static int db_wdt_cmd(char *cmd, char *param1, char *param2, char *param3);
58 #if defined(PROJECT_K2)
59 #if SYSTEM_MODULE_SFLASH
60 static int db_cmd_sferase(char *cmd, char *param1, char *param2, char *param3);
61 static int db_cmd_sfpg(char *cmd, char *param1, char *param2, char *param3);
62 static int db_cmd_sfru(char *cmd, char *param1, char *param2, char *param3);
63 static int db_cmd_sfrm(char *cmd, char *param1, char *param2, char *param3);
64 static int db_cmd_sfrdsr(char *cmd, char *param1, char *param2, char *param3);
66 #endif /* #if defined(PROJECT_K2) */
67 static int db_cmd_memcmp(char *cmd, char *param1, char *param2, char *param3);
68 static int db_cmd_memdump(char *cmd, char *param1, char *param2, char *param3);
70 static int db_clock_cmd(char *cmd, char *param1, char *param2, char *param3);
72 static uint16_t db_get_cmd_line(uint8_t ch, char *cmd_line, uint16_t *i);
73 static int db_formalize_command(char *, char *);
74 static int db_ascii_to_hex(char *, unsigned long *);
75 static int db_hex_to_ascii(unsigned long, char *);
76 static void zf_debug_task(void);
78 /* Console debug command table */
79 const struct DB_COMMAND_STRUCT command_table[] =
81 {"HELP", ", List all debug commands", db_help_cmd},
82 {"?", ", Equal to HELP comamnd", db_help_cmd},
84 /* Basic load/store/dump command */
85 {"LDR", "<Hex addr>, Load word", db_ldr_cmd},
86 {"LDRH", "<Hex addr>, Load half word", db_ldr_cmd},
87 {"LDRB", "<Hex addr>, Load byte", db_ldr_cmd},
88 {"STR", "<Hex addr> <Hex value>, Store word", db_str_cmd},
89 {"STRH", "<Hex addr> <Hex value>, Store half word", db_str_cmd},
90 {"STRB", "<Hex addr> <Hex value>, Store byte", db_str_cmd},
91 {"INFO", ", Print debug information", db_info_cmd},
92 {"USB", ", usb releated command", db_usb_cmd},
93 {"INTR", ", intr releated command", db_intr_cmd},
94 {"CLOCK", ", change the clock...", db_clock_cmd},
95 {"HTCR", "Issue HTC ready to host", db_cmd_starthtc},
96 {"WDT", ", wdt debug command", db_wdt_cmd},
97 #if defined(PROJECT_K2)
98 #if SYSTEM_MODULE_SFLASH
99 {"SFE", ", S<Hex>/B<Hex>/C, SPI Flash chip erase", db_cmd_sferase},
100 {"SFPG", "<Hex addr> <Hex len> <Hex buf>, SPI Flash program", db_cmd_sfpg},
101 {"SFRU", "f/r <Hex addr> <Hex addr>, SPI Flash fast read/read to UART", db_cmd_sfru},
102 {"SFRM", "f/r <Hex addr> <Hex addr>, SPI Flash fast read/read to Memory 0x520000", db_cmd_sfrm},
103 {"SFRDSR", ", SPI Flash status register read", db_cmd_sfrdsr},
105 #endif /* #if defined(PROJECT_K2) */
106 {"MEMCMP", "<Hex addr> <Hex addr> <Hex len>, memory comparison", db_cmd_memcmp},
107 {"MEMDMP", "<Hex addr> <Hex addr>, memory dump", db_cmd_memdump},
109 /* {Command, Help description, function} */
112 char cmd_buffer[COMMAND_BUFFER_SIZE][DB_MAX_COMMAND_LENGTH]; /* Backup previous command */
115 char raw_cmd[DB_MAX_COMMAND_LENGTH];
116 char cmd_str[DB_MAX_COMMAND_LENGTH*4];
121 static void db_incorect_format(void)
123 A_PRINTF("Error! Incorrect format.\n\r");
126 static void db_unknown_command(void)
128 A_PRINTF("Error! Unknown command.\n\r");
131 static void db_print_dump(const char *mem1, const char *mem2)
138 A_PRINTF("\n\r%06x: ", mem1);
142 A_PRINTF("%04x ", *(uint16_t *)mem1);
150 if (*tmp > 0x20 && *tmp < 0x7e)
151 A_PRINTF("%c", *tmp);
155 } while (tmp < mem1);
158 } while (mem1 < mem2);
162 static void zf_debug_init(void)
167 while ((zm_get_char(&ch)) != 0)
172 cmd_buf_full = FALSE;
177 static void zf_debug_task(void)
182 if ((zm_get_char(&ch)) == 0)
187 if (db_get_cmd_line(ch, raw_cmd, &gvLen) == 0)
192 if (db_formalize_command(raw_cmd, cmd_str))
197 cmd_not_found = TRUE;
198 while(command_table[i].cmd_func)
200 if (!strcmp(command_table[i].cmd_str, cmd_str))
202 cmd_not_found = FALSE;
203 command_table[i].cmd_func(cmd_str,
204 cmd_str+DB_MAX_COMMAND_LENGTH,
205 cmd_str+DB_MAX_COMMAND_LENGTH*2,
206 cmd_str+DB_MAX_COMMAND_LENGTH*3);
213 A_PRINTF("Error, HELP for command list.\n\r");
222 static uint16_t db_get_cmd_line(uint8_t ch, char *cmd_line, uint16_t *i)
228 case '\\' : /* Last command */
230 if (pressed_time >= COMMAND_BUFFER_SIZE)
234 cmd_buf_loc = cmd_buf_ptr - pressed_time;
237 if (cmd_buf_full == TRUE)
239 cmd_buf_loc += COMMAND_BUFFER_SIZE;
247 if (A_STRLEN(cmd_buffer[cmd_buf_loc]) != 0)
249 A_STRCPY(cmd_line, cmd_buffer[cmd_buf_loc]);
250 *i = A_STRLEN(cmd_buffer[cmd_buf_loc]);
252 A_PRINTF("%s", cmd_line);
255 case 13 : /* Return */
261 //Filter duplicated string in command history
262 if (strcmp(cmd_buffer[(cmd_buf_ptr==0)?(COMMAND_BUFFER_SIZE-1):(cmd_buf_ptr-1)], cmd_line) != 0)
264 A_STRCPY(cmd_buffer[cmd_buf_ptr++], cmd_line);
267 if (cmd_buf_ptr >= COMMAND_BUFFER_SIZE)
273 case '\b' : /* Backspace */
284 if ((ch >= ' ') && (ch <= '~'))
287 if (*i < DB_MAX_COMMAND_LENGTH-2)
289 if ((ch >= 0x11) && (ch <= 0x7e))
291 //if ((buf <= 'z') && (buf >= 'a'))
307 } /* end of switch */
313 static int db_formalize_command(char *raw_str, char *cmd_str)
322 /* Remove preceeding spaces */
323 while (raw_str[i++] == ' '){}
326 /* Copy command string */
328 while(raw_str[i] && (raw_str[i] != ' '))
332 if ((raw_str[i] <= 'z') && (raw_str[i] >= 'a'))
334 raw_str[i] -= 'a' - 'A';
336 cmd_str[k*DB_MAX_COMMAND_LENGTH + j++] = raw_str[i++];
340 cmd_str[k*DB_MAX_COMMAND_LENGTH + j++] = raw_str[i++];
343 cmd_str[k*DB_MAX_COMMAND_LENGTH + j] = 0;
345 return (int)A_STRLEN(cmd_str);
348 static int db_ascii_to_hex(char *num_str, unsigned long *hex_num)
355 if ((num_str[i] >= '0') && (num_str[i] <= '9'))
358 *hex_num += (num_str[i] - '0');
360 else if ((num_str[i] >= 'A') && (num_str[i] <= 'F'))
363 *hex_num += (num_str[i] - 'A' + 10);
365 else if ((num_str[i] >= 'a') && (num_str[i] <= 'f'))
368 *hex_num += (num_str[i] - 'a' + 10);
379 int db_ascii_to_int(char *num_str, unsigned long *int_num)
386 if ((num_str[i] >= '0') && (num_str[i] <= '9'))
389 *int_num += (num_str[i] - '0');
400 static int db_hex_to_ascii(unsigned long hex_num, char *num_str)
403 unsigned long four_bits;
407 four_bits = (hex_num >> i*4) & 0xf;
410 num_str[7-i] = four_bits + '0';
414 num_str[7-i] = four_bits - 10 + 'A';
421 int db_help_cmd(char *cmd, char *param1, char *param2, char *param3)
427 A_PRINTF("%s %s\n", ATH_DEBUGGER_VERSION_STR, ATH_COMMAND_LIST_STR);
429 while (command_table[i].cmd_func)
431 A_PRINTF("%s\t%s\n\r", command_table[i].cmd_str,
432 command_table[i].help_str);
438 static int db_ldr_cmd(char *cmd, char *param1, char *param2, char *param3)
445 if (db_ascii_to_hex(param1, &addr) != -1)
449 A_PRINTF("Error! bad address 0x%08x.\n\r",
450 (unsigned long)addr);
453 if (strcmp(cmd, "LDR") == 0)
456 //val = *(unsigned long *)addr;
458 val = HAL_WORD_REG_READ(addr);
460 else if (strcmp(cmd, "LDRH") == 0)
463 val = HAL_HALF_WORD_REG_READ(addr);
465 else if (strcmp(cmd, "LDRB") == 0)
469 db_hex_to_ascii(val, val_str);
470 db_hex_to_ascii(addr, addr_str);
472 A_PRINTF("%s : %s\n\r", addr_str, val_str);
476 db_incorect_format();
480 static int db_str_cmd(char *cmd, char *param1, char *param2, char *param3)
487 if ((A_STRLEN(param2) > 0) &&
488 (db_ascii_to_hex(param1, &addr) != -1) &&
489 (db_ascii_to_hex(param2, &val) != -1))
491 if (strcmp(cmd, "STR") == 0)
494 //HAL_WORD_REG_WRITE(addr, val);
495 HAL_WORD_REG_WRITE(addr, val);
496 //*(volatile unsigned long *)(addr & 0xfffffffc) = (unsigned long)val;
499 else if (strcmp(cmd, "STRH") == 0)
502 //*(volatile unsigned short *)(addr & 0xfffffffe) = (unsigned short)val;
503 HAL_HALF_WORD_REG_WRITE(addr, val);
505 else if (strcmp(cmd, "STRB") == 0)
507 if( addr & 0x00f00000 )
508 HAL_BYTE_REG_WRITE(addr, val);
510 HAL_BYTE_REG_WRITE(addr^3, val);
511 //*(volatile unsigned char *)addr = (unsigned char)val;
514 db_hex_to_ascii(val, val_str);
515 db_hex_to_ascii(addr, addr_str);
517 A_PRINTF("%s : %s\n\r", addr_str, val_str);
521 db_incorect_format();
525 LOCAL void dbg_timer_func(A_HANDLE alarm, void *data)
527 A_PRINTF("this is a timer alarm function 0x%08x\n\r", xthal_get_ccount());
532 static int db_intr_cmd(char *cmd, char *param1, char *param2, char *param3)
534 #if SYSTEM_MODULE_INTR
535 uint32_t pending_intrs;
537 if(strcmp(param1, "read") == 0 )
540 /* Update snapshot of pending interrupts */
542 pending_intrs = A_INTR_GET_INTRPENDING();
544 A_PRINTF("intr mask [0x%08x]\n\r", xthal_get_intenable());
545 A_PRINTF("intr on [0x%08x]\n\r", pending_intrs);
548 else if (strcmp(param1, "timer") == 0 )
552 if (strcmp(param2, "on") == 0 )
554 /* TODO: this part is probably dead. */
555 pending_intrs = A_INTR_GET_INTRENABLE()|CMNOS_IMASK_XTTIMER;
556 A_INTR_SET_INTRENABLE(pending_intrs);
557 A_PRINTF("- intr [0x%08x]\n\r", pending_intrs);
559 else if ( strcmp(param2, "off") == 0 )
561 pending_intrs = A_INTR_GET_INTRENABLE()&(~CMNOS_IMASK_XTTIMER);
562 A_INTR_SET_INTRENABLE(pending_intrs);
563 A_PRINTF("- intr [0x%08x]\n\r", pending_intrs);
566 else if( db_ascii_to_hex(param2, &data)==0 )
568 if( data>=0 && data <=10 )
573 A_PRINTF("==>set cb to %d seconds \n\r", delay);
579 A_PRINTF("\tintr read - read the interrenable status\n\r");
580 A_PRINTF("\tintr timer on/off/tick - timer attach on/off/ticks\n\r");
584 #endif //#if SYSTEM_MODULE_INTR
588 static int db_usb_cmd(char *cmd, char *param1, char *param2, char *param3)
590 A_PRINTF("THIS IS USB COMMAND\n\r");
592 if( strcmp(param1, "que") == 0 )
594 HIFusb_DescTraceDump();
598 A_PRINTF("\tusb que - dump descriptor queue\n\r");
599 A_PRINTF("\tusb fw on/off - enable/disable write fw download to ram\n\r");
605 static void clk_change(uint32_t clk, uint32_t ratio, uint32_t baud)
607 uint32_t clk_sel = 0;
630 HAL_WORD_REG_WRITE(0x50040, (0x300|clk_sel|(ratio>>1)<<12));
631 A_UART_HWINIT((clk*1000*1000)/ratio, baud);
635 static int db_clock_cmd(char *cmd, char *param1, char *param2, char *param3)
638 uint32_t baud = 19200;
641 if( db_ascii_to_int(param1, &clk) != -1 )
643 A_PRINTF("changing clock to %d\n", clk);
644 clk_change(clk, ratio, baud);
648 static int db_info_cmd(char *cmd, char *param1, char *param2, char *param3)
652 if(strcmp(param1, "ram") == 0 )
656 #if 0 /* TODO: SYSTEM_MODULE_SYS_MONITOR depends on _ROM_ or _RAM_ which
658 else if(strcmp(param1, "cpu") == 0)
659 zfPrintCpuUtilization();
662 HIFusb_DescTraceDump();
673 register uint32_t data1;
674 if( db_ascii_to_hex(param1, &data1)==0 )
676 __asm__ __volatile__ (
678 : "=a" (ccount1) : : "memory"
680 data = *(volatile uint32_t *)(data1);
681 __asm__ __volatile__ (
683 : "=a" (ccount2) : : "memory"
685 A_PRINTF("\n\rread 0x%08x (0x%08x) use %d clocks\n\r", data1, data, ccount2-ccount1);
688 __asm__ __volatile__ (
690 : "=a" (ccount1) : : "memory"
692 data = *(volatile uint32_t *)(data1);
693 __asm__ __volatile__ (
695 : "=a" (ccount2) : : "memory"
697 A_PRINTF("\n\rread 0x%08x (0x%08x) use %d clocks\n\r", data1, data, ccount2-ccount1);
700 __asm__ __volatile__ (
702 : "=a" (ccount1) : : "memory"
704 data = *(volatile uint32_t *)(data2);
705 __asm__ __volatile__ (
707 : "=a" (ccount2) : : "memory"
709 A_PRINTF("read 0x%08x (0x%08x) use %d clocks\n\r", data2, data, ccount2-ccount1);
712 __asm__ __volatile__ (
714 : "=a" (ccount1) : : "memory"
716 data = *(volatile uint32_t *)(data3);
717 __asm__ __volatile__ (
719 : "=a" (ccount2) : : "memory"
721 A_PRINTF("read 0x%08x (0x%08x) use %d clocks\n\r", data3, data, ccount2-ccount1);
728 static int db_cmd_starthtc(char *cmd, char *param1, char *param2, char *param3)
730 extern htc_handle_t htc_handle;
731 HTC_Ready(htc_handle);
734 static int db_wdt_cmd(char *cmd, char *param1, char *param2, char *param3)
736 if ( strcmp(param1, "rst") == 0 )
738 A_PRINTF(" reseting...\n\n\r");
741 else if( strcmp(param1, "on") == 0 )
745 else if (strcmp(param1, "off") == 0 )
749 else if ( strcmp(param1, "boot") == 0 )
751 A_PRINTF("Last BOOT is ");
752 if (ENUM_WDT_BOOT == A_WDT_LASTBOOT() )
755 A_PRINTF("normal boot");
757 else if (strcmp(param1, "loop") == 0 )
760 uint32_t time_offset;
761 A_PRINTF(" doing the wdt reseting...");
763 if( db_ascii_to_hex(param2, &time_offset)!=0 )
765 if( time_offset < 0 || time_offset >0xffffffff )
766 time_offset = 0xffffff;
768 A_PRINTF(" (wdt tick: 0x%08x...\n\n\r", time_offset);
769 wdt_cmd.cmd = WDT_TIMEOUT;
770 wdt_cmd.timeout = time_offset;
775 else if (strcmp(param1, "noloop") == 0 )
778 uint32_t time_offset;
779 A_PRINTF(" doing the wdt reseting...");
781 if( db_ascii_to_hex(param3, &time_offset)!=0 )
783 if( time_offset < 0 || time_offset >0xffffffff )
784 time_offset = 0xffffff;
786 A_PRINTF(" (wdt tick: 0x%08x...\n\n\r", time_offset);
788 wdt_cmd.cmd = WDT_TIMEOUT;
789 wdt_cmd.timeout = time_offset;
793 else if( strcmp(param1, "event") == 0 )
795 uint32_t event= 0x00123400;
796 #define USB_BYTE_REG_WRITE(addr, val) HAL_BYTE_REG_WRITE(USB_CTRL_BASE_ADDRESS|(uint8_t)(addr^3), (val))
797 #define USB_BYTE_REG_READ(addr) HAL_BYTE_REG_READ(USB_CTRL_BASE_ADDRESS|(uint8_t)(addr^3))
799 #define USB_WORD_REG_WRITE(addr, val) HAL_WORD_REG_WRITE(USB_CTRL_BASE_ADDRESS|(uint32_t)(addr), (val))
800 #define USB_WORD_REG_READ(addr) HAL_WORD_REG_READ(USB_CTRL_BASE_ADDRESS|(uint32_t)(addr))
803 USB_BYTE_REG_WRITE(0x17, USB_BYTE_REG_READ(0x17)|0xc0);
805 //ZM_CBUS_FIFO_SIZE_REG = 0xf;
806 USB_WORD_REG_WRITE(0x100, 0x0f);
808 //ZM_EP3_DATA_REG = event;
809 USB_WORD_REG_WRITE(0xF8, event);
812 USB_BYTE_REG_WRITE(0xAE, USB_BYTE_REG_READ(0xAE)|0x08);
815 USB_BYTE_REG_WRITE(0x17, USB_BYTE_REG_READ(0x17)&0xbf);
819 #if defined(PROJECT_K2)
820 #if SYSTEM_MODULE_SFLASH
821 /* Serial Flash -> Chip Erase, Sector Erase, Block Erase */
822 static int db_cmd_sferase(char *cmd, char *param1, char *param2, char *param3)
826 if (strcmp(param1, "s") == 0)
828 if (db_ascii_to_hex(param2, &addr) != -1 && addr < SPI_FLASH_MAX_SIZE)
830 /* Sector size is 4K (0x1000) */
831 A_PRINTF("Sector addr : 0x%08X\n\r", addr - addr%0x1000);
832 A_SFLASH_ERASE(ZM_SFLASH_SECTOR_ERASE, addr);
837 db_incorect_format();
840 else if (strcmp(param2, "b") == 0)
842 if (db_ascii_to_hex(param2, &addr) != -1 && addr < SPI_FLASH_MAX_SIZE)
844 /* Sector size is 64K (0x10000) */
845 A_PRINTF("Block addr : 0x%08X\n\r", addr - addr%0x10000);
846 A_SFLASH_ERASE(ZM_SFLASH_BLOCK_ERASE, addr);
851 db_incorect_format();
855 else if (strcmp(param1, "c") == 0)
857 A_SFLASH_ERASE(ZM_SFLASH_CHIP_ERASE, addr);
863 db_unknown_command();
867 /* Serial Flash -> Program */
868 static int db_cmd_sfpg(char *cmd, char *param1, char *param2, char *param3)
870 unsigned long addr, len, buf;
872 if (db_ascii_to_hex(param1, &addr) != -1 &&
873 db_ascii_to_hex(param2, &len) != -1 &&
874 db_ascii_to_hex(param3, &buf) != -1 &&
875 ((addr+len) <= SPI_FLASH_MAX_SIZE) &&
876 addr%4 == 0 && len%4 == 0 && buf%4 == 0 &&
877 ((buf >=0x500000 && buf < 0x528000) || (buf >=0x4e0000 && buf < 0x4e6000)) )
879 A_SFLASH_PROG(addr, len, (A_UINT8 *)buf);
885 db_incorect_format();
889 /* Serial Flash -> Read, Fast Read to UART */
890 static int db_cmd_sfru(char *cmd, char *param1, char *param2, char *param3)
893 unsigned long addr1, addr2, t_addr;
896 if (strcmp(param1, "r") == 0)
898 else if (strcmp(param1, "f") == 0)
902 db_unknown_command();
906 if (db_ascii_to_hex(param2, &addr1) != -1 &&
907 db_ascii_to_hex(param3, &addr2) != -1 &&
908 addr1 < addr2 && addr1 < SPI_FLASH_MAX_SIZE &&
909 addr2 < SPI_FLASH_MAX_SIZE && addr1%4 == 0)
911 A_PRINTF("addr data data data data data data data data\n\r");
912 A_PRINTF("====== ======== ======== ======== ======== ======== ======== ======== ========");
914 for (i = 0, t_addr = addr1; t_addr < addr2; i++, t_addr += 4)
917 A_PRINTF("\n\r%06X ", t_addr);
919 A_SFLASH_READ(fast, t_addr, 4, (A_UINT8 *)&val);
920 A_PRINTF("%08X ", val);
927 db_incorect_format();
931 /* Serial Flash -> Read, Fast Read to Memory */
932 static int db_cmd_sfrm(char *cmd, char *param1, char *param2, char *param3)
935 unsigned long addr1, addr2, t_addr;
937 A_UINT8 *buf = (A_UINT8 *)0x520000;
939 if (strcmp(param1, "r") == 0)
941 else if (strcmp(param1, "f") == 0)
945 db_unknown_command();
949 if (db_ascii_to_hex(param2, &addr1) != -1 &&
950 db_ascii_to_hex(param3, &addr2) != -1 &&
951 addr1 < addr2 && addr1 < SPI_FLASH_MAX_SIZE &&
952 addr2 < SPI_FLASH_MAX_SIZE && addr1%4 == 0)
954 for (i = 0, t_addr = addr1; t_addr < addr2; i++, t_addr += 4)
956 A_SFLASH_READ(fast, t_addr, 4, buf + i*4);
963 db_incorect_format();
967 /* Serial Flash -> Read Status Register */
968 static int db_cmd_sfrdsr(char *cmd, char *param1, char *param2, char *param3)
970 A_PRINTF("0x%02X\n\r", A_SFLASH_RDSR());
974 #endif /* #if defined(PROJECT_K2) */
976 /* Memory Comparison */
977 static int db_cmd_memcmp(char *cmd, char *param1, char *param2, char *param3)
979 unsigned long addr1, addr2, len;
980 A_UINT8 *buf1, *buf2;
982 if (db_ascii_to_hex(param1, &addr1) != -1 &&
983 db_ascii_to_hex(param2, &addr2) != -1 &&
984 db_ascii_to_hex(param3, &len) != -1 &&
985 addr1 != addr2 && addr1%4 == 0 && addr2%4 == 0 && len%4 == 0)
987 buf1 = (A_UINT8 *)addr1;
988 buf2 = (A_UINT8 *)addr2; ;
990 A_PRINTF("memcmp(buf1, buf2, len) = %d\n\r", A_MEMCMP(buf1, buf2, len));
994 db_incorect_format();
999 static int db_cmd_memdump(char *cmd, char *param1, char *param2, char *param3)
1001 unsigned long addr1, addr2;
1003 if (db_ascii_to_hex(param1, &addr1) != -1 && db_ascii_to_hex(param2, &addr2) != -1 && addr1 < addr2 && addr1%4 == 0)
1005 db_print_dump((const char *)addr1, (const char *)addr2);
1009 db_incorect_format();
1012 void cmnos_dbg_module_install(struct dbg_api *apis)
1014 apis->_dbg_init = zf_debug_init;
1015 apis->_dbg_task = zf_debug_task;
1018 #endif /* SYSTEM_MODULE_DBG */