cfi: add sst39vf6401b
[openocd-genbsdl] / src / flash / nor / non_cfi.c
index 7e73afa..c68ace6 100644 (file)
@@ -230,6 +230,20 @@ static struct non_cfi non_cfi_flashes[] = {
                }
        },
        {
+       .mfr = CFI_MFR_SST,
+           .id = 0x236d,               /* SST39VF6401B */
+           .pri_id = 0x02,
+           .dev_size = 8*MB,
+           .interface_desc = 0x2,      /* x8 or x16 device with nBYTE */
+           .max_buf_write_size = 0x0,
+           .status_poll_mask = CFI_STATUS_POLL_MASK_DQ6_DQ7,
+           .num_erase_regions = 1,
+           .erase_region_info =
+           {
+               ERASE_REGION(2048, 4*KB)
+           }
+       },
+       {
                .mfr = CFI_MFR_AMD,
                .id = 0x22ab,                           /* AM29F400BB */
                .pri_id = 0x02,
@@ -280,6 +294,40 @@ static struct non_cfi non_cfi_flashes[] = {
                        ERASE_REGION(15, 64*KB)
                }
        },
+   {
+               .mfr = CFI_MFR_FUJITSU,
+               .id = 0x22ea,                           /* MBM29SL800TE */
+               .pri_id = 0x02,
+               .dev_size = 1*MB,
+               .interface_desc = 0x2,          /* x8 or x16 device with nBYTE */
+               .max_buf_write_size = 0x0,
+               .status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7,
+               .num_erase_regions = 4,
+               .erase_region_info =
+               {
+                       ERASE_REGION(15, 64*KB),
+                       ERASE_REGION(1,  32*KB),
+                       ERASE_REGION(2,  8*KB),
+                       ERASE_REGION(1,  16*KB)
+               }
+       },
+       {
+               .mfr = CFI_MFR_FUJITSU,
+               .id = 0xba,                             /* 29LV400BC */
+               .pri_id = 0x02,
+               .dev_size = 512*KB,
+               .interface_desc = 0x1,          /* x8 or x16 device w/ nBYTE */
+               .max_buf_write_size = 0x00,
+               .status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7,
+               .num_erase_regions = 4,
+               .erase_region_info =
+               {
+                       ERASE_REGION(1, 16*KB),
+                       ERASE_REGION(2,  8*KB),
+                       ERASE_REGION(1, 32*KB),
+                       ERASE_REGION(7, 64*KB)
+               }
+       },
        {
                .mfr = CFI_MFR_AMIC,
                .id = 0xb31a,                           /* A29L800A */
@@ -452,7 +500,11 @@ void cfi_fixup_non_cfi(struct flash_bank *bank)
        cfi_info->max_buf_write_size = non_cfi->max_buf_write_size;
        cfi_info->status_poll_mask = non_cfi->status_poll_mask;
        cfi_info->num_erase_regions = non_cfi->num_erase_regions;
-       cfi_info->erase_region_info = non_cfi->erase_region_info;
+       size_t erase_region_info_size = sizeof(*cfi_info->erase_region_info) *
+                       cfi_info->num_erase_regions;
+       cfi_info->erase_region_info = malloc(erase_region_info_size);
+       memcpy(cfi_info->erase_region_info,
+                       non_cfi->erase_region_info, erase_region_info_size);
        cfi_info->dev_size = non_cfi->dev_size;
 
        if (cfi_info->pri_id == 0x2)