/* * JzBoot: an USB bootloader for JZ series of Ingenic(R) microprocessors. * Copyright (C) 2010 Peter Zotov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "shell.h" #include "config.h" #include "ingenic.h" #include "config.h" static int usbboot_boot(int argc, char *argv[]); static int usbboot_load(int argc, char *argv[]); static int usbboot_go(int argc, char *argv[]); static int usbboot_nquery(int argc, char *argv[]); static int usbboot_ndump(int argc, char *argv[]); static int usbboot_nerase(int argc, char *argv[]); static int usbboot_nprogram(int argc, char *argv[]); const shell_command_t usbboot_cmdset[] = { { "boot", "- Reconfigure stage2", usbboot_boot }, { "load", " - Load file to SDRAM", usbboot_load }, { "go", "
- Jump to
", usbboot_go }, { "nquery", " - Query NAND information", usbboot_nquery }, { "ndump", " - Dump NAND to file", usbboot_ndump }, { "ndump_oob", " - Dump NAND with OOB to file", usbboot_ndump }, { "nerase", " - Erase NAND blocks", usbboot_nerase }, { "nprogram", " - Program NAND from file", usbboot_nprogram }, { "nprogram_oob", " - Program NAND with OOB from file", usbboot_nprogram }, { NULL, NULL, NULL } }; static int usbboot_boot(int argc, char *argv[]) { int ret = ingenic_configure_stage2(shell_device()); if(ret == -1) perror("ingenic_configure_stage2"); return ret; } static int usbboot_load(int argc, char *argv[]) { if(argc != 3) { printf("Usage: %s \n", argv[0]); return -1; } int ret = ingenic_load_sdram_file(shell_device(), strtoul(argv[2], NULL, 0), argv[1]); if(ret == -1) perror("ingenic_load_sdram_file"); return ret; } static int usbboot_go(int argc, char *argv[]) { if(argc != 2) { printf("Usage: %s
\n", argv[0]); return -1; } int ret = ingenic_go(shell_device(), strtoul(argv[1], NULL, 0)); if(ret == -1) perror("ingenic_go"); return ret; } static int usbboot_nquery(int argc, char *argv[]) { if(argc != 2) { printf("Usage: %s \n", argv[0]); return -1; } nand_info_t info; int ret = ingenic_query_nand(shell_device(), atoi(argv[1]), &info); if(ret == -1) { perror("ingenic_query_nand"); return -1; } printf( "VID: %02hhX\n" "PID: %02hhX\n" "Chip: %02hhX\n" "Page: %02hhX\n" "Plane: %02hhX\n", info.vid, info.pid, info.chip, info.page, info.plane); return 0; } static int usbboot_ndump(int argc, char *argv[]) { if(argc != 5) { printf("Usage: %s \n", argv[0]); return -1; } int type = strcmp(argv[0], "ndump_oob") ? NO_OOB : OOB_ECC; if(cfg_getenv("NAND_RAW")) type |= NAND_RAW; int ret = ingenic_dump_nand(shell_device(), atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), type, argv[4]); if(ret == -1) perror("ingenic_dump_nand"); return ret; } static int usbboot_nerase(int argc, char *argv[]) { if(argc != 4) { printf("Usage: %s \n", argv[0]); return -1; } int ret = ingenic_erase_nand(shell_device(), atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); if(ret == -1) perror("ingenic_erase_nand"); return ret; } static int usbboot_nprogram(int argc, char *argv[]) { if(argc != 4) { printf("Usage: %s \n", argv[0]); return -1; } int type = strcmp(argv[0], "nprogram_oob") ? NO_OOB : OOB_ECC; if(strcmp(argv[0], "nprogram_oob") == 0) { if(cfg_getenv("NAND_RAW")) type = OOB_ECC; else type = OOB_NO_ECC; } else type = NO_OOB; int ret = ingenic_program_nand(shell_device(), atoi(argv[1]), atoi(argv[2]), type, argv[3]); if(ret == -1) perror("ingenic_program_nand"); return ret; }