static int cmd_hal(int argc, char *argv[]) { int i; int result; amb_hal_function_info_t *finfo; if (argc == 1) { /* Enumerate HAL */ finfo = (amb_hal_function_info_t *) (g_haladdr + 128); for (i = 0; finfo[i].function != NULL; i++) { uart_putdec(i); uart_putchar(' '); uart_puthex((u32) finfo[i].function); uart_putchar(' '); uart_putstr((char *) (g_haladdr + (u32) finfo[i].name)); uart_putstr("\r\n"); } return 0; } /* Invoke HAL */ result = hal_call_name(argc -1, &argv[1]); uart_putstr("result = "); uart_putdec(result); uart_putstr("\r\n"); return 0; }
/** * Run diagnostic on IR: continuously display the current value. */ void diag_ir(void) { int i; u32 data; /* Set IR sampling frequency */ rct_set_ir_pll(); /* config IR GPIO */ gpio_config_hw(IR_IN); uart_putstr("running IR diagnostics...\r\n"); uart_putstr("press any key to quit!\r\n"); writel(IR_CONTROL_REG, IR_CONTROL_RESET); writel(IR_CONTROL_REG, IR_CONTROL_ENB); for (i = 0; ; i++) { if (uart_poll()) break; while (readl(IR_STATUS_REG) == 0x0); data = readl(IR_DATA_REG); uart_putdec(data); uart_putchar(' '); if (i == 8) { uart_putstr("\r\n"); i = 0; } } writel(IR_CONTROL_REG, 0x0); uart_putstr("\r\ndone!\r\n"); }
static int cmd_nand_erase(int argc, char *argv[]) { u32 start_block, block, blocks, total_blocks; int i, rval; total_blocks = flnand.blocks_per_bank * flnand.banks; if (argc != 3) { uart_putstr("nand_erase [block] [blocks]!\r\n"); uart_putstr("Total blocks: "); uart_putdec(total_blocks); uart_putstr("\r\n"); return -1; } putstr("erase nand blocks including any bad blocks...\r\n"); putstr("press enter to start!\r\n"); putstr("press any key to terminate!\r\n"); rval = uart_wait_escape(0xffffffff); if (rval == 0) return -1; strtou32(argv[1], &start_block); strtou32(argv[2], &blocks); for (i = 0, block = start_block; i < blocks; i++, block++) { if (uart_poll()) break; if (block >= total_blocks) break; rval = nand_erase_block(block); putchar('.'); if ((i & 0xf) == 0xf) { putchar(' '); putdec(i); putchar('/'); putdec(blocks); putstr(" ("); putdec(i * 100 / blocks); putstr("%)\t\t\r"); } if (rval < 0) { putstr("\r\nfailed at block "); putdec(block); putstr("\r\n"); } } putstr("\r\ndone!\r\n"); return 0; }
/* address must be aligned to 4 and size must be multiple of 4 */ static NOINSTR void emit_core_dump_section(int fd, const char *name, uint32_t addr, uint32_t size) { struct cs_base64_ctx ctx; int col_counter = 0; uart_puts(fd, ",\""); uart_puts(fd, name); uart_puts(fd, "\": {\"addr\": "); uart_putdec(fd, addr); uart_puts(fd, ", \"data\": \""); core_dump_emit_char_fd = fd; cs_base64_init(&ctx, core_dump_emit_char, &col_counter); uint32_t end = addr + size; while (addr < end) { uint32_t buf; buf = *((uint32_t *) addr); addr += sizeof(uint32_t); cs_base64_update(&ctx, (char *) &buf, sizeof(uint32_t)); } cs_base64_finish(&ctx); uart_puts(fd, "\"}"); }
/******************************************************************************* * Do it. * ******************************************************************************/ int main() { clock_init(); uart_init(); uart_puts("\r\nInitializing...\r\n"); timer_init(); io_init(); uart_puts("Starting drive...\r\n"); c1541_init(); cli_init(); for (;;) { #ifdef CONFIG_GDBSIM uart_putdec(demon_clock()); uart_putcrlf(); #endif cli_check(); } return 0; }