diff --git a/jtag/libbrux/flash/jedec.c b/jtag/libbrux/flash/jedec.c index af33a8bd..3ab507f8 100644 --- a/jtag/libbrux/flash/jedec.c +++ b/jtag/libbrux/flash/jedec.c @@ -71,6 +71,7 @@ struct amd_flash_info { const int dev_id; const char *name; const long size; + const u_int8_t interface_width; const int as_method; const int numeraseregions; const struct mtd_erase_region_info regions[4]; @@ -82,6 +83,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29LV160DT, .name = "AMD AM29LV160DT", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -95,6 +97,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29LV160DB, .name = "AMD AM29LV160DB", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -108,6 +111,7 @@ static const struct amd_flash_info table[] = { .dev_id = TC58FVT160, .name = "Toshiba TC58FVT160", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -121,6 +125,7 @@ static const struct amd_flash_info table[] = { .dev_id = MBM29LV160TE, .name = "Fujitsu MBM29LV160TE", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -134,6 +139,7 @@ static const struct amd_flash_info table[] = { .dev_id = TC58FVB160, .name = "Toshiba TC58FVB160", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -147,6 +153,7 @@ static const struct amd_flash_info table[] = { .dev_id = MBM29LV160BE, .name = "Fujitsu MBM29LV160BE", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -160,6 +167,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29LV800BB, .name = "AMD AM29LV800BB", .size = 0x00100000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -173,6 +181,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29F800BB, .name = "AMD AM29F800BB", .size = 0x00100000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -186,6 +195,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29LV800BT, .name = "AMD AM29LV800BT", .size = 0x00100000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -199,6 +209,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29F800BT, .name = "AMD AM29F800BT", .size = 0x00100000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -212,6 +223,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29LV800BB, .name = "AMD AM29LV800BB", .size = 0x00100000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -225,6 +237,7 @@ static const struct amd_flash_info table[] = { .dev_id = MBM29LV800BB, .name = "Fujitsu MBM29LV800BB", .size = 0x00100000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -238,6 +251,7 @@ static const struct amd_flash_info table[] = { .dev_id = M29W800T, .name = "ST M29W800T", .size = 0x00100000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -251,6 +265,7 @@ static const struct amd_flash_info table[] = { .dev_id = M29W160DT, .name = "ST M29W160DT", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -264,6 +279,7 @@ static const struct amd_flash_info table[] = { .dev_id = M29W160DB, .name = "ST M29W160DB", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -277,6 +293,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29BDS323D, .name = "AMD AM29BDS323D", .size = 0x00400000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 3, .regions = { @@ -289,6 +306,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29BDS643D, .name = "AMD AM29BDS643D", .size = 0x00800000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 3, .regions = { @@ -301,6 +319,7 @@ static const struct amd_flash_info table[] = { .dev_id = AT49xV16x, .name = "Atmel AT49xV16x", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 2, .regions = { @@ -312,6 +331,7 @@ static const struct amd_flash_info table[] = { .dev_id = AT49xV16xT, .name = "Atmel AT49xV16xT", .size = 0x00200000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 2, .regions = { @@ -323,6 +343,7 @@ static const struct amd_flash_info table[] = { .dev_id = MX29LV400T, .name = "MX 29LV400T", .size = 0x0080000, + .interface_width = CFI_INTERFACE_X16, /* correct default? */ .as_method = AUTOSELECT_M1, .numeraseregions = 4, .regions = { @@ -336,6 +357,7 @@ static const struct amd_flash_info table[] = { .dev_id = AM29LV040B, .name = "AMD AM29LV040B", .size = 0x0080000, + .interface_width = CFI_INTERFACE_X8, /* checked, ok */ .as_method = AUTOSELECT_M2, .numeraseregions = 1, .regions = { @@ -353,7 +375,7 @@ jedec_detect( bus_t *bus, uint32_t adr, cfi_array_t **cfi_array ) int manid = 0, devid = 0; int ba, bw; int i, j; - cfi_query_structure_t *cfi; + cfi_query_structure_t *cfi; bus_area_t area; *cfi_array = calloc( 1, sizeof (cfi_array_t) ); @@ -377,9 +399,6 @@ jedec_detect( bus_t *bus, uint32_t adr, cfi_array_t **cfi_array ) if (!(*cfi_array)->cfi_chips[0]) return -2; /* out of memory */ - /* annotate chip width */ - (*cfi_array)->cfi_chips[0]->width = (*cfi_array)->bus_width; - /* probe device with Autoselect method 1 */ bus_write(bus, adr, 0xf0); bus_write(bus, adr+0xaaa, 0xaa); @@ -413,7 +432,7 @@ jedec_detect( bus_t *bus, uint32_t adr, cfi_array_t **cfi_array ) if(i==sizeof(table)/sizeof(struct amd_flash_info)) return -4; - cfi = &(*cfi_array)->cfi_chips[0]->cfi; + cfi = &(*cfi_array)->cfi_chips[0]->cfi; cfi->identification_string.pri_id_code = CFI_VENDOR_AMD_SCS; cfi->identification_string.pri_vendor_tbl = NULL; @@ -421,7 +440,36 @@ jedec_detect( bus_t *bus, uint32_t adr, cfi_array_t **cfi_array ) cfi->identification_string.alt_vendor_tbl = NULL; cfi->device_geometry.device_size = table[i].size; - cfi->device_geometry.device_interface = 1; /* 16 bit for now */ + /* annotate chip width */ + cfi->device_geometry.device_interface = table[i].interface_width; + switch (table[i].interface_width) { + case CFI_INTERFACE_X8: + (*cfi_array)->cfi_chips[0]->width = 1; + break; + case CFI_INTERFACE_X16: + (*cfi_array)->cfi_chips[0]->width = 2; + break; + case CFI_INTERFACE_X8_X16: + fprintf(stderr, "Warning: Unsupported interface geometry %s, falling back to %s\n", "CFI_INTERFACE_X8_X16", "CFI_INTERFACE_X16"); + (*cfi_array)->cfi_chips[0]->width = 2; + cfi->device_geometry.device_interface = CFI_INTERFACE_X16; + break; + case CFI_INTERFACE_X32: + (*cfi_array)->cfi_chips[0]->width = 4; + break; + case CFI_INTERFACE_X16_X32: + fprintf(stderr, "Warning: Unsupported interface geometry %s, falling back to %s\n", "CFI_INTERFACE_X16_X32", "CFI_INTERFACE_X32"); + (*cfi_array)->cfi_chips[0]->width = 4; + cfi->device_geometry.device_interface = CFI_INTERFACE_X32; + break; + default: + /* unsupported interface geometry */ + fprintf(stderr, "Error: Unsupported interface geometry %d, bailing out\n", table[i].interface_width); + (*cfi_array)->cfi_chips[0]->width = 1; + cfi->device_geometry.device_interface = CFI_INTERFACE_X8; + return -5; + break; + } cfi->device_geometry.number_of_erase_regions = table[i].numeraseregions;