On 24.07.2010 00:26, Daniel Lenski wrote:
> This patch should enable read/write/erase support for these
> chips, but does *not* implement unlock functionality for them yet,
> because they have more complex protection features than simply
> BPx block-protect bits.
>
> Datasheets:
> http://www.amictechnology.com/pdf/A25L512.pdf
> http://www.amictechnology.com/pdf/A25L010.pdf
> http://www.amictechnology.com/pdf/A25L020.pdf
> http://www.amictechnology.com/pdf/A25L040.pdf
> http://www.amictechnology.com/pdf/A25L080.pdf
> http://www.amictechnology.com/pdf/A25L016.pdf
> http://www.amictechnology.com/pdf/A25L032.pdf
> http://www.amictechnology.com/pdf/A25LQ032.pdf
>
> IDs:
> 0x37 0x3010 is A25L512 (uniform 4k sectors)
> 0x37 0x3011 is A25L010 (uniform 4k sectors)
> 0x37 0x3012 is A25L020 (uniform 4k sectors)
> 0x37 0x3013 is A25L040 (uniform 4k sectors)
> 0x37 0x3014 is A25L080 (uniform 4k sectors)
> 0x37 0x3015 is A25L016 (uniform 4k sectors)
> 0x37 0x3016 is A25L032 (uniform 4k sectors)
> 0x37 0x4016 is A25LQ032 (uniform 4k sectors, has quad-rate read)
>
> Please note that the IDs of the newer chips all use AMIC_ID_NOPREFIX
> instead of AMIC_ID, and that means they use probe_spi_rdid instead of
> probe_spi_rdid4.
>
> Signed-off-by: Dan Lenski <[email protected]>
>   

Thanks for your patch! Review follows.

General remark: Can you order the eraseblock definitions by eraseblock
size (smallest one first)? This allows us to use a better reflashing
granularity in the first write/erase attempt, and reserves bigger
granularities for the case where smaller granularities fail.


> diff --git a/flashchips.c b/flashchips.c
> index c6d265e..29dad48 100644
> --- a/flashchips.c
> +++ b/flashchips.c
> @@ -1532,6 +1532,292 @@ struct flashchip flashchips[] = {
>  
>       {
>               .vendor         = "AMIC",
> +             .name           = "A25L512",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25L512,
> +             .total_size     = 64,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 1 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 1 } },
> +                             .block_erase = spi_block_erase_52,
>   

I can't find the 52h SPI opcode in the datasheet.


> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 16 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
>   

I can't find the 60h SPI opcode in the datasheet.


> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
> +                     }
> +             },
> +             .unlock         = NULL,
>   

Can you add a comment so it looks like this:

                .unlock         = NULL, /* Two-byte status reg */



> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +
> +     {
> +             .vendor         = "AMIC",
> +             .name           = "A25L010",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25L010,
> +             .total_size     = 128,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 2 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 2 } },
> +                             .block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 32 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 128 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +                     }, {
> +                             .eraseblocks = { { 128 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
> +                     }
> +             },
> +             .unlock         = NULL,
> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +
> +     {
> +             .vendor         = "AMIC",
> +             .name           = "A25L020",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25L020,
> +             .total_size     = 256,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 4 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 4 } },
> +                             .block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 64 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 256 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +                     }, {
> +                             .eraseblocks = { { 256 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
> +                     }
> +             },
> +             .unlock         = NULL,
> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +
> +     {
> +             .vendor         = "AMIC",
> +             .name           = "A25L040",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25L040,
> +             .total_size     = 512,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 8 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 8 } },
> +                             .block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 128 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 512 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +                     }, {
> +                             .eraseblocks = { { 512 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
> +                     }
> +             },
> +             .unlock         = NULL,
> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +
> +     {
> +             .vendor         = "AMIC",
> +             .name           = "A25L080",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25L080,
> +             .total_size     = 1024,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 16 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 16 } },
> +                             .block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 256 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 1024 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +                     }, {
> +                             .eraseblocks = { { 1024 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
> +                     }
> +             },
> +             .unlock         = NULL,
> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +
> +     {
> +             .vendor         = "AMIC",
> +             .name           = "A25L016",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25L016,
> +             .total_size     = 2048,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 32 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 32 } },
> +                             .block_erase = spi_block_erase_52,
>   

I can't find 52h.


> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 512 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 2048 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
>   

I can't find 60h.


> +                     }, {
> +                             .eraseblocks = { { 2048 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
> +                     }
> +             },
> +             .unlock         = NULL,
> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +
> +     {
> +             .vendor         = "AMIC",
> +             .name           = "A25L032",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25L032,
> +             .total_size     = 4096,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 64 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 64 } },
> +                             .block_erase = spi_block_erase_52,
> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 1024 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 4096 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
> +                     }, {
> +                             .eraseblocks = { { 4096 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
>   

Can you use the order 20, 52, d8, 60, c7 here?


> +                     }
> +             },
> +             .unlock         = NULL,
> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +     {
> +             .vendor         = "AMIC",
> +             .name           = "A25LQ032",
> +             .bustype        = CHIP_BUSTYPE_SPI,
> +             .manufacture_id = AMIC_ID_NOPREFIX,
> +             .model_id       = AMIC_A25LQ032,
> +             .total_size     = 4096,
> +             .page_size      = 256,
> +             .tested         = TEST_UNTESTED,
> +             .probe          = probe_spi_rdid,
> +             .probe_timing   = TIMING_ZERO,
> +             .block_erasers  =
> +             {
> +                     {
> +                             .eraseblocks = { { 64 * 1024, 64 } },
> +                             .block_erase = spi_block_erase_d8,
> +                     }, {
> +                             .eraseblocks = { { 64 * 1024, 64 } },
> +                             .block_erase = spi_block_erase_52,
> +                     }, {
> +                             .eraseblocks = { { 4 * 1024, 1024 } },
> +                             .block_erase = spi_block_erase_20,
> +                     }, {
> +                             .eraseblocks = { { 4096 * 1024, 1} },
> +                             .block_erase = spi_block_erase_60,
> +                     }, {
> +                             .eraseblocks = { { 4096 * 1024, 1} },
> +                             .block_erase = spi_block_erase_c7,
>   

Can you use the order 20, 52, d8, 60, c7 here?


> +                     }
> +             },
> +             .unlock         = NULL,
> +             .write          = spi_chip_write_256,
> +             .read           = spi_chip_read,
> +     },
> +
> +     {
> +             .vendor         = "AMIC",
>               .name           = "A29002B",
>               .bustype        = CHIP_BUSTYPE_PARALLEL,
>               .manufacture_id = AMIC_ID_NOPREFIX,
> diff --git a/flashchips.h b/flashchips.h
> index 3e2befa..0b16e3b 100644
> --- a/flashchips.h
> +++ b/flashchips.h
> @@ -88,6 +88,14 @@
>  #define AMIC_A25L80P         0x2014  /* Seems that no A25L80PT exists */
>  #define AMIC_A25L16PT                0x2025
>  #define AMIC_A25L16PU                0x2015
> +#define AMIC_A25L512         0x3010
> +#define AMIC_A25L010         0x3011
> +#define AMIC_A25L020         0x3012
> +#define AMIC_A25L040         0x3013
> +#define AMIC_A25L080         0x3014
> +#define AMIC_A25L016         0x3015
> +#define AMIC_A25L032         0x3016
> +#define AMIC_A25LQ032                0x4016
>  #define AMIC_A29002B         0x0d
>  #define AMIC_A29002T         0x8C    /* Same as A290021T */
>  #define AMIC_A29040B         0x86
>   

Looks good otherwise.

Regards,
Carl-Daniel

-- 
http://www.hailfinger.org/


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to