X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fnon_cfi.c;h=f98b108014c621232c38b54cd583e50bb94014d2;hb=ff25e76bad7e57da4ebd363f1b35d4af04acaa67;hp=b9ef1127331c435c364b908ef311d77787abdcf7;hpb=f1bca5898caa8c81bff9383f1649d3454f6ec195;p=openocd.git diff --git a/src/flash/non_cfi.c b/src/flash/non_cfi.c index b9ef112733..f98b108014 100644 --- a/src/flash/non_cfi.c +++ b/src/flash/non_cfi.c @@ -23,20 +23,16 @@ #include "config.h" #endif -#include - -#include "log.h" - -#include "flash.h" -#include "cfi.h" #include "non_cfi.h" +#include "cfi.h" + #define KB 1024 #define MB (1024*1024) -#define ERASE_REGION(num, size) (((size/256)<<16)|(num-1)) +#define ERASE_REGION(num, size) (((size/256) << 16) | (num-1)) /* non-CFI compatible flashes */ -non_cfi_t non_cfi_flashes[] = { +static struct non_cfi non_cfi_flashes[] = { { .mfr = CFI_MFR_SST, .id = 0xd4, @@ -44,6 +40,7 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 64*KB, .interface_desc = 0x0, /* x8 only device */ .max_buf_write_size = 0x0, + .status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7, .num_erase_regions = 1, .erase_region_info = { @@ -57,6 +54,7 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 128*KB, .interface_desc = 0x0, /* x8 only device */ .max_buf_write_size = 0x0, + .status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7, .num_erase_regions = 1, .erase_region_info = { @@ -70,6 +68,7 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 256*KB, .interface_desc = 0x0, /* x8 only device */ .max_buf_write_size = 0x0, + .status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7, .num_erase_regions = 1, .erase_region_info = { @@ -83,6 +82,7 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 512*KB, .interface_desc = 0x0, /* x8 only device */ .max_buf_write_size = 0x0, + .status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7, .num_erase_regions = 1, .erase_region_info = { @@ -96,6 +96,7 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 512*KB, .interface_desc = 0x2, /* x8 or x16 device */ .max_buf_write_size = 0x0, + .status_poll_mask = CFI_STATUS_POLL_MASK_DQ5_DQ6_DQ7, .num_erase_regions = 1, .erase_region_info = { @@ -109,13 +110,14 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 512*KB, .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( 1, 16*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 32*KB), - ERASE_REGION( 7, 64*KB) + ERASE_REGION(1, 16*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 32*KB), + ERASE_REGION(7, 64*KB) } }, { @@ -125,13 +127,105 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 512*KB, .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( 7, 64*KB), - ERASE_REGION( 1, 32*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 16*KB) + ERASE_REGION(7, 64*KB), + ERASE_REGION(1, 32*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 16*KB) + } + }, + + /* SST 39VF* do not support DQ5 status polling - this currently is + only supported by the host algorithm, not by the target code using + the work area. + Only true for 8-bit and 32-bit wide memories. 16-bit wide memories + without DQ5 status polling are supported by the target code. + */ + { + .mfr = CFI_MFR_SST, + .id = 0x2782, /* SST39xF160 */ + .pri_id = 0x02, + .dev_size = 2*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(512, 4*KB) + } + }, + { + .mfr = CFI_MFR_SST, + .id = 0x2783, /* SST39VF320 */ + .pri_id = 0x02, + .dev_size = 4*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(1024, 4*KB) + } + }, + { + .mfr = CFI_MFR_SST, + .id = 0x234b, /* SST39VF1601 */ + .pri_id = 0x02, + .dev_size = 2*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(512, 4*KB) + } + }, + { + .mfr = CFI_MFR_SST, + .id = 0x234a, /* SST39VF1602 */ + .pri_id = 0x02, + .dev_size = 2*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(512, 4*KB) + } + }, + { + .mfr = CFI_MFR_SST, + .id = 0x235b, /* SST39VF3201 */ + .pri_id = 0x02, + .dev_size = 4*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(1024, 4*KB) + } + }, + { + .mfr = CFI_MFR_SST, + .id = 0x235a, /* SST39VF3202 */ + .pri_id = 0x02, + .dev_size = 4*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(1024, 4*KB) } }, { @@ -141,13 +235,14 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 512*KB, .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( 1, 16*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 32*KB), - ERASE_REGION( 7, 64*KB) + ERASE_REGION(1, 16*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 32*KB), + ERASE_REGION(7, 64*KB) } }, { @@ -157,13 +252,14 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 512*KB, .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( 7, 64*KB), - ERASE_REGION( 1, 32*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 16*KB) + ERASE_REGION(7, 64*KB), + ERASE_REGION(1, 32*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 16*KB) } }, { @@ -173,12 +269,13 @@ non_cfi_t non_cfi_flashes[] = { .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( 1, 16*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 32*KB), + ERASE_REGION(1, 16*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 32*KB), ERASE_REGION(15, 64*KB) } }, @@ -189,12 +286,13 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 1*MB, .interface_desc = 0x2, .max_buf_write_size = 0x0, + .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(1, 16*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 32*KB), ERASE_REGION(15, 64*KB) } }, @@ -205,12 +303,13 @@ non_cfi_t non_cfi_flashes[] = { .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( 1, 16*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 32*KB), + ERASE_REGION(1, 16*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 32*KB), ERASE_REGION(15, 64*KB) } }, @@ -222,12 +321,13 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 2*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( 1, 16*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 32*KB), + ERASE_REGION(1, 16*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 32*KB), ERASE_REGION(31, 64*KB) } }, @@ -238,26 +338,14 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 2*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(31, 64*KB), - ERASE_REGION( 1, 32*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 16*KB) - } - }, - { - .mfr = CFI_MFR_SST, - .id = 0x2782, /* SST39xF160 */ - .pri_id = 0x02, - .dev_size = 2*MB, - .interface_desc = 0x2, /* x8 or x16 device with nBYTE */ - .max_buf_write_size = 0x0, - .num_erase_regions = 1, - .erase_region_info = - { - ERASE_REGION(512, 4*KB) + ERASE_REGION(1, 32*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 16*KB) } }, { @@ -267,11 +355,12 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 2*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 = 3, .erase_region_info = { - ERASE_REGION( 8, 8*KB), - ERASE_REGION( 2, 32*KB), + ERASE_REGION(8, 8*KB), + ERASE_REGION(2, 32*KB), ERASE_REGION(30, 64*KB) } }, @@ -282,12 +371,13 @@ non_cfi_t non_cfi_flashes[] = { .dev_size = 2*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 = 3, .erase_region_info = { ERASE_REGION(30, 64*KB), - ERASE_REGION( 2, 32*KB), - ERASE_REGION( 8, 8*KB) + ERASE_REGION(2, 32*KB), + ERASE_REGION(8, 8*KB) } }, { @@ -297,12 +387,13 @@ non_cfi_t non_cfi_flashes[] = { .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( 1, 16*KB), - ERASE_REGION( 2, 8*KB), - ERASE_REGION( 1, 32*KB), + ERASE_REGION(1, 16*KB), + ERASE_REGION(2, 8*KB), + ERASE_REGION(1, 32*KB), ERASE_REGION(15, 64*KB) } }, @@ -312,10 +403,10 @@ non_cfi_t non_cfi_flashes[] = { } }; -void cfi_fixup_non_cfi(flash_bank_t *bank) +void cfi_fixup_non_cfi(struct flash_bank *bank) { - cfi_flash_bank_t *cfi_info = bank->driver_priv; - non_cfi_t *non_cfi = non_cfi_flashes; + struct cfi_flash_bank *cfi_info = bank->driver_priv; + struct non_cfi *non_cfi = non_cfi_flashes; for (non_cfi = non_cfi_flashes; non_cfi->mfr; non_cfi++) { @@ -358,13 +449,14 @@ void cfi_fixup_non_cfi(flash_bank_t *bank) cfi_info->interface_desc = non_cfi->interface_desc; 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; cfi_info->dev_size = non_cfi->dev_size; if (cfi_info->pri_id == 0x2) { - cfi_spansion_pri_ext_t *pri_ext = malloc(sizeof(cfi_spansion_pri_ext_t)); + struct cfi_spansion_pri_ext *pri_ext = malloc(sizeof(struct cfi_spansion_pri_ext)); pri_ext->pri[0] = 'P'; pri_ext->pri[1] = 'R';