creation of the flash tool.
extern int trace_on;
-struct isp_command {
- char* name;
- int nb_args;
- int (*handler)(int arg_count, char** args);
-};
-
/* Max should be 1270 for read memory, a little bit more for writes */
#define SERIAL_BUFSIZE 1300
return ret;
}
-int isp_cmd_unlock(int arg_count, char** args)
+int isp_cmd_unlock(int quiet)
{
int ret = 0;
printf("Unlock error.\n");
return -1;
}
- printf("Device memory protection unlocked.\n");
+ if (quiet == 0) {
+ printf("Device memory protection unlocked.\n");
+ }
return 0;
}
-int isp_cmd_read_uid(int arg_count, char** args)
+int isp_cmd_read_uid(void)
{
char buf[REP_BUFSIZE];
char* tmp = NULL;
return 0;
}
-int isp_cmd_part_id(int arg_count, char** args)
+int isp_cmd_part_id(int quiet)
{
char buf[REP_BUFSIZE];
int ret = 0, len = 0;
}
/* FIXME : some part IDs are on two 32bits values */
part_id = strtoul(buf, NULL, 10);
- printf("Part ID is 0x%08lx\n", part_id);
+ if (quiet == 0) {
+ printf("Part ID is 0x%08lx\n", part_id);
+ }
- return 0;
+ return part_id;
}
-int isp_cmd_boot_version(int arg_count, char** args)
+int isp_cmd_boot_version(void)
{
char buf[REP_BUFSIZE];
int ret = 0, len = 0;
unsigned long int addr1 = 0, addr2 = 0;
unsigned long int length = 0;
- /* Check compare arguments */
+ /* Check arguments */
if (arg_count != 3) {
printf("%s command needs two addresses and byte count.\n", name);
return -7;
return -6;
}
- /* Create compare request */
+ /* Create request */
len = snprintf(buf, SERIAL_BUFSIZE, "%c %lu %lu %lu\r\n", cmd, addr1, addr2, length);
if (len > SERIAL_BUFSIZE) {
len = SERIAL_BUFSIZE;
}
- /* Send compare request */
+ /* Send request */
if (isp_serial_write(buf, len) != len) {
printf("Unable to send %s request.\n", name);
return -5;
}
-static struct isp_command isp_cmds_list[] = {
- {"unlock", 0, isp_cmd_unlock},
- {"write-to-ram", 2, isp_cmd_write_to_ram},
- {"read-memory", 3, isp_cmd_read_memory},
- {"prepare-for-write", 2, isp_cmd_prepare_for_write},
- {"copy-ram-to-flash", 3, isp_cmd_copy_ram_to_flash},
- {"go", 2, isp_cmd_go},
- {"erase", 2, isp_cmd_erase},
- {"blank-check", 2, isp_cmd_blank_check},
- {"read-part-id", 0, isp_cmd_part_id},
- {"read-boot-version", 0, isp_cmd_boot_version},
- {"compare", 3, isp_cmd_compare},
- {"read-uid", 0, isp_cmd_read_uid},
- {NULL, 0, NULL}
-};
-
-void isp_warn_trailing_args(int cmd_num, int arg_count, char** args)
-{
- int i = 0;
- printf("command \"%s\" needs %d args, got %d.\n",
- isp_cmds_list[cmd_num].name,
- isp_cmds_list[cmd_num].nb_args, arg_count);
- for (i=0; i<arg_count; i++) {
- printf("\targ[%d] : \"%s\"\n", i, args[i]);
- }
-}
-
-/* Handle one command
- * Return positive or NULL value when command handling is OK, or negative value otherwise.
- */
-int isp_handle_command(char* cmd, int arg_count, char** args)
-{
- int cmd_found = -1;
- int ret = 0;
- int index = 0;
-
- if (cmd == NULL) {
- printf("isp_handle_command called with no command !\n");
- return -1;
- }
-
- while ((cmd_found == -1) && (isp_cmds_list[index].name != NULL)) {
- if (strncmp(isp_cmds_list[index].name, cmd, strlen(isp_cmds_list[index].name)) == 0) {
- cmd_found = index;
- break;
- }
- index++;
- }
- if (cmd_found == -1) {
- printf("Unknown command \"%s\", use -h or --help for a list.\n", cmd);
- return -2;
- }
- if (arg_count != isp_cmds_list[cmd_found].nb_args) {
- isp_warn_trailing_args(cmd_found, arg_count, args);
- }
- ret = isp_cmds_list[cmd_found].handler(arg_count, args);
-
- return ret;
-}
-
*
*********************************************************************/
-/* List of commands to be supported :
- synchronize
- unlock
- set-baud-rate
- echo
- write-to-ram
- read-memory
- prepare-for-write
- copy-ram-to-flash
- go
- erase
- blank-check
- read-part-id
- read-boot-version
- compare
- read-uid
-*/
-
-#ifndef ISP_COMMADS_H
-#define ISP_COMMADS_H
-
-int isp_ret_code(char* buf);
+#ifndef ISP_COMMANDS_H
+#define ISP_COMMANDS_H
+
+
/* Connect or reconnect to the target.
* Return positive or NULL value when connection is OK, or negative value otherwise.
*/
int isp_connect(unsigned int crystal_freq);
-/* Handle one command
- * Return positive or NULL value when command handling is OK, or negative value otherwise.
- */
-int isp_handle_command(char* cmd, int arg_count, char** args);
-#endif /* ISP_COMMADS_H */
+
+int isp_send_buf_to_ram(char* data, unsigned long int addr, unsigned int count);
+
+
+int isp_cmd_unlock(int quiet);
+
+int isp_cmd_read_uid(void);
+
+int isp_cmd_part_id(int quiet);
+
+int isp_cmd_boot_version(void);
+
+int isp_cmd_read_memory(int arg_count, char** args);
+
+int isp_cmd_write_to_ram(int arg_count, char** args);
+
+int isp_cmd_compare(int arg_count, char** args);
+
+int isp_cmd_copy_ram_to_flash(int arg_count, char** args);
+
+int isp_cmd_go(int arg_count, char** args);
+
+int isp_cmd_blank_check(int arg_count, char** args);
+
+int isp_cmd_prepare_for_write(int arg_count, char** args);
+
+int isp_cmd_erase(int arg_count, char** args);
+
+
+#endif /* ISP_COMMANDS_H */
#include <termios.h> /* for serial config */
#include <ctype.h>
+#include <string.h> /* strncmp, strlen */
+
#include "isp_utils.h"
#include "isp_commands.h"
#define PROG_NAME "LPC11xx ISP"
-#define VERSION "0.01"
+#define VERSION "1.0"
/* short explanation on exit values:
*
" Default baudrate is B115200\n" \
" <device> is the (host) serial line used to programm the device\n" \
" <command> is one of:\n" \
+ " \t unlock, write-to-ram, read-memory, prepare-for-write, copy-ram-to-flash, go, erase,\n" \
+ " \t blank-check, read-part-id, read-boot-version, compare, and read-uid.\n" \
+ " command specific arguments are as follow:\n" \
" \t unlock \n" \
" \t write-to-ram address file : send 'file' to 'address' in ram\n" \
" \t read-memory address count file : read 'count' bytes from 'address', store then in 'file'\n" \
int trace_on = 0;
+int isp_handle_command(char* cmd, int arg_count, char** args);
int main(int argc, char** argv)
{
return 0;
}
+struct isp_command {
+ int cmd_num;
+ char* name;
+ int nb_args;
+ int (*handler)(int arg_count, char** args);
+};
+
+
+static struct isp_command isp_cmds_list[] = {
+ {0, "unlock", 0, NULL},
+ {1, "write-to-ram", 2, isp_cmd_write_to_ram},
+ {2, "read-memory", 3, isp_cmd_read_memory},
+ {3, "prepare-for-write", 2, isp_cmd_prepare_for_write},
+ {4, "copy-ram-to-flash", 3, isp_cmd_copy_ram_to_flash},
+ {5, "go", 2, isp_cmd_go},
+ {6, "erase", 2, isp_cmd_erase},
+ {7, "blank-check", 2, isp_cmd_blank_check},
+ {8, "read-part-id", 0, NULL},
+ {9, "read-boot-version", 0, NULL},
+ {10, "compare", 3, isp_cmd_compare},
+ {11, "read-uid", 0, NULL},
+ {-1, NULL, 0, NULL}
+};
+
+void isp_warn_args(int cmd_num, int arg_count, char** args)
+{
+ int i = 0;
+ printf("command \"%s\" needs %d args, got %d.\n",
+ isp_cmds_list[cmd_num].name,
+ isp_cmds_list[cmd_num].nb_args, arg_count);
+ for (i=0; i<arg_count; i++) {
+ printf("\targ[%d] : \"%s\"\n", i, args[i]);
+ }
+}
+
+/* Handle one command
+ * Return positive or NULL value when command handling is OK, or negative value otherwise.
+ */
+int isp_handle_command(char* cmd, int arg_count, char** args)
+{
+ int cmd_found = -1;
+ int ret = 0;
+ int index = 0;
+
+ if (cmd == NULL) {
+ printf("isp_handle_command called with no command !\n");
+ return -1;
+ }
+
+ while ((cmd_found == -1) && (isp_cmds_list[index].name != NULL)) {
+ if (strncmp(isp_cmds_list[index].name, cmd, strlen(isp_cmds_list[index].name)) == 0) {
+ cmd_found = index;
+ break;
+ }
+ index++;
+ }
+ if (cmd_found == -1) {
+ printf("Unknown command \"%s\", use -h or --help for a list.\n", cmd);
+ return -2;
+ }
+ if (arg_count != isp_cmds_list[cmd_found].nb_args) {
+ isp_warn_args(cmd_found, arg_count, args);
+ }
+
+ switch (isp_cmds_list[cmd_found].cmd_num) {
+ case 0: /* unlock */
+ ret = isp_cmd_unlock(0);
+ break;
+ case 8: /* read-part-id */
+ ret = isp_cmd_part_id(0);
+ break;
+ case 9: /* read-boot-version */
+ ret = isp_cmd_boot_version();
+ break;
+ case 11: /* read-uid */
+ ret = isp_cmd_read_uid();
+ break;
+ default:
+ ret = isp_cmds_list[cmd_found].handler(arg_count, args);
+ }
+
+ return ret;
+}
+