+ at91sam7_info->flashmode = 0;
+ at91sam7_info->ext_freq = 0;
+ at91sam7_info->flash_autodetection = 0;
+
+ if (argc < 13)
+ {
+ at91sam7_info->flash_autodetection = 1;
+ return ERROR_OK;
+ }
+
+ COMMAND_PARSE_NUMBER(u32, args[1], base_address);
+
+ COMMAND_PARSE_NUMBER(int, args[3], chip_width);
+ COMMAND_PARSE_NUMBER(int, args[4], bus_width);
+
+ COMMAND_PARSE_NUMBER(int, args[8], banks_num);
+ COMMAND_PARSE_NUMBER(int, args[9], num_sectors);
+ COMMAND_PARSE_NUMBER(u16, args[10], pages_per_sector);
+ COMMAND_PARSE_NUMBER(u16, args[11], page_size);
+ COMMAND_PARSE_NUMBER(u16, args[12], num_nvmbits);
+
+ if (argc == 14) {
+ unsigned long freq;
+ COMMAND_PARSE_NUMBER(ulong, args[13], freq);
+ ext_freq = freq * 1000;
+ at91sam7_info->ext_freq = ext_freq;
+ }
+
+ if ((bus_width == 0) || (banks_num == 0) || (num_sectors == 0) ||
+ (pages_per_sector == 0) || (page_size == 0) || (num_nvmbits == 0))
+ {
+ at91sam7_info->flash_autodetection = 1;
+ return ERROR_OK;
+ }
+
+ target_name = calloc(strlen(args[7]) + 1, sizeof(char));
+ strcpy(target_name, args[7]);
+
+ /* calculate bank size */
+ bank_size = num_sectors * pages_per_sector * page_size;
+
+ for (bnk = 0; bnk < banks_num; bnk++)
+ {
+ if (bnk > 0)
+ {
+ /* create a new bank element */
+ flash_bank_t *fb = malloc(sizeof(flash_bank_t));
+ fb->target = target;
+ fb->driver = bank->driver;
+ fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank));
+ fb->next = NULL;
+
+ /* link created bank in 'flash_banks' list and redirect t_bank */
+ t_bank->next = fb;
+ t_bank = fb;
+ }
+
+ t_bank->bank_number = bnk;
+ t_bank->base = base_address + bnk * bank_size;
+ t_bank->size = bank_size;
+ t_bank->chip_width = chip_width;
+ t_bank->bus_width = bus_width;
+ t_bank->num_sectors = num_sectors;
+
+ /* allocate sectors */
+ t_bank->sectors = malloc(num_sectors * sizeof(struct flash_sector));
+ for (sec = 0; sec < num_sectors; sec++)
+ {
+ t_bank->sectors[sec].offset = sec * pages_per_sector * page_size;
+ t_bank->sectors[sec].size = pages_per_sector * page_size;
+ t_bank->sectors[sec].is_erased = -1;
+ t_bank->sectors[sec].is_protected = -1;
+ }
+
+ at91sam7_info = t_bank->driver_priv;
+
+ at91sam7_info->target_name = target_name;
+ at91sam7_info->flashmode = 0;
+ at91sam7_info->ext_freq = ext_freq;
+ at91sam7_info->num_nvmbits = num_nvmbits;
+ at91sam7_info->num_nvmbits_on = 0;
+ at91sam7_info->pagesize = page_size;
+ at91sam7_info->pages_per_sector = pages_per_sector;
+ }
+