+
+ base_address = strtoul(args[1], NULL, 0);
+ chip_width = atoi(args[3]);
+ bus_width = atoi(args[4]);
+ banks_num = atoi(args[8]);
+ num_sectors = atoi(args[9]);
+ pages_per_sector = atoi(args[10]);
+ page_size = atoi(args[11]);
+ num_nvmbits = atoi(args[12]);
+
+ 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 = &at91sam7_flash;
+ fb->driver_priv = malloc(sizeof(at91sam7_flash_bank_t));
+ 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(flash_sector_t));
+ 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;
+ }
+