NOR: add read() callback to struct flash_driver

Final target is to force bus_width size during CFI flash
read.
In this first step I need to replace default flash read
with flash specific implementation.
This patch introduces:
- flash_driver_read() layer;
- default_flash_read(), backward compatible;
- read() callback in struct flash_driver;
- proper initialization in every flash_driver instance.

Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
__archive__
Antonio Borneo 2010-05-11 11:16:33 +08:00 committed by Øyvind Harboe
parent 24ebfffff5
commit bc8be110ff
23 changed files with 72 additions and 1 deletions

View File

@ -417,6 +417,7 @@ struct flash_driver aduc702x_flash = {
.erase = aduc702x_erase, .erase = aduc702x_erase,
.protect = aduc702x_protect, .protect = aduc702x_protect,
.write = aduc702x_write, .write = aduc702x_write,
.read = default_flash_read,
.probe = aduc702x_probe, .probe = aduc702x_probe,
.auto_probe = aduc702x_probe, .auto_probe = aduc702x_probe,
.erase_check = default_flash_blank_check, .erase_check = default_flash_blank_check,

View File

@ -2505,6 +2505,7 @@ struct flash_driver at91sam3_flash = {
.erase = sam3_erase, .erase = sam3_erase,
.protect = sam3_protect, .protect = sam3_protect,
.write = sam3_write, .write = sam3_write,
.read = default_flash_read,
.probe = sam3_probe, .probe = sam3_probe,
.auto_probe = sam3_auto_probe, .auto_probe = sam3_auto_probe,
.erase_check = sam3_erase_check, .erase_check = sam3_erase_check,

View File

@ -1207,6 +1207,7 @@ struct flash_driver at91sam7_flash = {
.erase = at91sam7_erase, .erase = at91sam7_erase,
.protect = at91sam7_protect, .protect = at91sam7_protect,
.write = at91sam7_write, .write = at91sam7_write,
.read = default_flash_read,
.probe = at91sam7_probe, .probe = at91sam7_probe,
.auto_probe = at91sam7_probe, .auto_probe = at91sam7_probe,
.erase_check = at91sam7_erase_check, .erase_check = at91sam7_erase_check,

View File

@ -497,6 +497,7 @@ struct flash_driver avr_flash = {
.erase = avrf_erase, .erase = avrf_erase,
.protect = avrf_protect, .protect = avrf_protect,
.write = avrf_write, .write = avrf_write,
.read = default_flash_read,
.probe = avrf_probe, .probe = avrf_probe,
.auto_probe = avrf_auto_probe, .auto_probe = avrf_auto_probe,
.erase_check = default_flash_mem_blank_check, .erase_check = default_flash_mem_blank_check,

View File

@ -2467,6 +2467,8 @@ struct flash_driver cfi_flash = {
.erase = cfi_erase, .erase = cfi_erase,
.protect = cfi_protect, .protect = cfi_protect,
.write = cfi_write, .write = cfi_write,
/* FIXME: access flash at bus_width size */
.read = default_flash_read,
.probe = cfi_probe, .probe = cfi_probe,
.auto_probe = cfi_auto_probe, .auto_probe = cfi_auto_probe,
/* FIXME: access flash at bus_width size */ /* FIXME: access flash at bus_width size */

View File

@ -3,6 +3,7 @@
* Copyright (C) 2007-2010 Øyvind Harboe <oyvind.harboe@zylin.com> * * Copyright (C) 2007-2010 Øyvind Harboe <oyvind.harboe@zylin.com> *
* Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> * * Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> *
* Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> * * Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
* Copyright (C) 2010 by Antonio Borneo <borneo.antonio@gmail.com> *
* * * *
* This program is free software; you can redistribute it and/or modify * * This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by * * it under the terms of the GNU General Public License as published by *
@ -100,6 +101,29 @@ int flash_driver_write(struct flash_bank *bank,
return retval; return retval;
} }
int flash_driver_read(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count)
{
int retval;
LOG_DEBUG("call flash_driver_read()");
retval = bank->driver->read(bank, buffer, offset, count);
if (retval != ERROR_OK)
{
LOG_ERROR("error reading to flash at address 0x%08" PRIx32 " at offset 0x%8.8" PRIx32 " (%d)",
bank->base, offset, retval);
}
return retval;
}
int default_flash_read(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count)
{
return target_read_buffer(bank->target, offset + bank->base, count, buffer);
}
void flash_bank_add(struct flash_bank *bank) void flash_bank_add(struct flash_bank *bank)
{ {
/* put flash bank in linked list */ /* put flash bank in linked list */

View File

@ -3,6 +3,7 @@
* Copyright (C) 2007,2008 Øyvind Harboe <oyvind.harboe@zylin.com> * * Copyright (C) 2007,2008 Øyvind Harboe <oyvind.harboe@zylin.com> *
* Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> * * Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> *
* Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> * * Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
* Copyright (C) 2010 by Antonio Borneo <borneo.antonio@gmail.com> *
* * * *
* This program is free software; you can redistribute it and/or modify * * This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by * * it under the terms of the GNU General Public License as published by *
@ -135,6 +136,16 @@ int flash_write(struct target *target,
void flash_set_dirty(void); void flash_set_dirty(void);
/// @returns The number of flash banks currently defined. /// @returns The number of flash banks currently defined.
int flash_get_bank_count(void); int flash_get_bank_count(void);
/**
* Provides default read implementation for flash memory.
* @param bank The bank to read.
* @param buffer The data bytes read.
* @param offset The offset into the chip to read.
* @param count The number of bytes to read.
* @returns ERROR_OK if successful; otherwise, an error code.
*/
int default_flash_read(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count);
/** /**
* Provides default erased-bank check handling. Checks to see if * Provides default erased-bank check handling. Checks to see if
* the flash driver knows they are erased; if things look uncertain, * the flash driver knows they are erased; if things look uncertain,

View File

@ -3,6 +3,7 @@
* Copyright (C) 2007,2008 Øyvind Harboe <oyvind.harboe@zylin.com> * * Copyright (C) 2007,2008 Øyvind Harboe <oyvind.harboe@zylin.com> *
* Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> * * Copyright (C) 2008 by Spencer Oliver <spen@spen-soft.co.uk> *
* Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> * * Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
* Copyright (C) 2010 by Antonio Borneo <borneo.antonio@gmail.com> *
* * * *
* This program is free software; you can redistribute it and/or modify * * This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by * * it under the terms of the GNU General Public License as published by *
@ -130,6 +131,20 @@ struct flash_driver
int (*write)(struct flash_bank *bank, int (*write)(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count); uint8_t *buffer, uint32_t offset, uint32_t count);
/**
* Read data from the flash. Note CPU address will be
* "bank->base + offset", while the physical address is
* dependent upon current target MMU mappings.
*
* @param bank The bank to read.
* @param buffer The data bytes read.
* @param offset The offset into the chip to read.
* @param count The number of bytes to read.
* @returns ERROR_OK if successful; otherwise, an error code.
*/
int (*read)(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count);
/** /**
* Probe to determine what kind of flash is present. * Probe to determine what kind of flash is present.
* This is invoked by the "probe" script command. * This is invoked by the "probe" script command.

View File

@ -436,6 +436,7 @@ struct flash_driver ecosflash_flash = {
.erase = ecosflash_erase, .erase = ecosflash_erase,
.protect = ecosflash_protect, .protect = ecosflash_protect,
.write = ecosflash_write, .write = ecosflash_write,
.read = default_flash_read,
.probe = ecosflash_probe, .probe = ecosflash_probe,
.auto_probe = ecosflash_probe, .auto_probe = ecosflash_probe,
.erase_check = default_flash_blank_check, .erase_check = default_flash_blank_check,

View File

@ -141,6 +141,7 @@ struct flash_driver faux_flash = {
.erase = faux_erase, .erase = faux_erase,
.protect = faux_protect, .protect = faux_protect,
.write = faux_write, .write = faux_write,
.read = default_flash_read,
.probe = faux_probe, .probe = faux_probe,
.auto_probe = faux_probe, .auto_probe = faux_probe,
.erase_check = default_flash_blank_check, .erase_check = default_flash_blank_check,

View File

@ -40,6 +40,8 @@ int flash_driver_erase(struct flash_bank *bank, int first, int last);
int flash_driver_protect(struct flash_bank *bank, int set, int first, int last); int flash_driver_protect(struct flash_bank *bank, int set, int first, int last);
int flash_driver_write(struct flash_bank *bank, int flash_driver_write(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count); uint8_t *buffer, uint32_t offset, uint32_t count);
int flash_driver_read(struct flash_bank *bank,
uint8_t *buffer, uint32_t offset, uint32_t count);
/* write (optional verify) an image to flash memory of the given target */ /* write (optional verify) an image to flash memory of the given target */
int flash_write_unlock(struct target *target, struct image *image, int flash_write_unlock(struct target *target, struct image *image,

View File

@ -814,6 +814,7 @@ struct flash_driver lpc2000_flash = {
.erase = lpc2000_erase, .erase = lpc2000_erase,
.protect = lpc2000_protect, .protect = lpc2000_protect,
.write = lpc2000_write, .write = lpc2000_write,
.read = default_flash_read,
.probe = lpc2000_probe, .probe = lpc2000_probe,
.auto_probe = lpc2000_probe, .auto_probe = lpc2000_probe,
.erase_check = lpc2000_erase_check, .erase_check = lpc2000_erase_check,

View File

@ -478,6 +478,7 @@ struct flash_driver lpc288x_flash = {
.erase = lpc288x_erase, .erase = lpc288x_erase,
.protect = lpc288x_protect, .protect = lpc288x_protect,
.write = lpc288x_write, .write = lpc288x_write,
.read = default_flash_read,
.probe = lpc288x_probe, .probe = lpc288x_probe,
.auto_probe = lpc288x_probe, .auto_probe = lpc288x_probe,
.erase_check = lpc288x_erase_check, .erase_check = lpc288x_erase_check,

View File

@ -1830,6 +1830,7 @@ struct flash_driver lpc2900_flash =
.erase = lpc2900_erase, .erase = lpc2900_erase,
.protect = lpc2900_protect, .protect = lpc2900_protect,
.write = lpc2900_write, .write = lpc2900_write,
.read = default_flash_read,
.probe = lpc2900_probe, .probe = lpc2900_probe,
.auto_probe = lpc2900_probe, .auto_probe = lpc2900_probe,
.erase_check = lpc2900_erase_check, .erase_check = lpc2900_erase_check,

View File

@ -353,6 +353,7 @@ struct flash_driver ocl_flash = {
.erase = ocl_erase, .erase = ocl_erase,
.protect = ocl_protect, .protect = ocl_protect,
.write = ocl_write, .write = ocl_write,
.read = default_flash_read,
.probe = ocl_probe, .probe = ocl_probe,
.erase_check = ocl_erase_check, .erase_check = ocl_erase_check,
.protect_check = ocl_protect_check, .protect_check = ocl_protect_check,

View File

@ -766,6 +766,7 @@ struct flash_driver pic32mx_flash = {
.erase = pic32mx_erase, .erase = pic32mx_erase,
.protect = pic32mx_protect, .protect = pic32mx_protect,
.write = pic32mx_write, .write = pic32mx_write,
.read = default_flash_read,
.probe = pic32mx_probe, .probe = pic32mx_probe,
.auto_probe = pic32mx_auto_probe, .auto_probe = pic32mx_auto_probe,
.erase_check = default_flash_mem_blank_check, .erase_check = default_flash_mem_blank_check,

View File

@ -1261,6 +1261,7 @@ struct flash_driver stellaris_flash = {
.erase = stellaris_erase, .erase = stellaris_erase,
.protect = stellaris_protect, .protect = stellaris_protect,
.write = stellaris_write, .write = stellaris_write,
.read = default_flash_read,
.probe = stellaris_probe, .probe = stellaris_probe,
.auto_probe = stellaris_probe, .auto_probe = stellaris_probe,
.erase_check = default_flash_mem_blank_check, .erase_check = default_flash_mem_blank_check,

View File

@ -1293,6 +1293,7 @@ struct flash_driver stm32x_flash = {
.erase = stm32x_erase, .erase = stm32x_erase,
.protect = stm32x_protect, .protect = stm32x_protect,
.write = stm32x_write, .write = stm32x_write,
.read = default_flash_read,
.probe = stm32x_probe, .probe = stm32x_probe,
.auto_probe = stm32x_auto_probe, .auto_probe = stm32x_auto_probe,
.erase_check = default_flash_mem_blank_check, .erase_check = default_flash_mem_blank_check,

View File

@ -790,6 +790,7 @@ struct flash_driver str7x_flash = {
.erase = str7x_erase, .erase = str7x_erase,
.protect = str7x_protect, .protect = str7x_protect,
.write = str7x_write, .write = str7x_write,
.read = default_flash_read,
.probe = str7x_probe, .probe = str7x_probe,
.auto_probe = str7x_probe, .auto_probe = str7x_probe,
.erase_check = default_flash_blank_check, .erase_check = default_flash_blank_check,

View File

@ -701,6 +701,7 @@ struct flash_driver str9x_flash = {
.erase = str9x_erase, .erase = str9x_erase,
.protect = str9x_protect, .protect = str9x_protect,
.write = str9x_write, .write = str9x_write,
.read = default_flash_read,
.probe = str9x_probe, .probe = str9x_probe,
.auto_probe = str9x_probe, .auto_probe = str9x_probe,
.erase_check = default_flash_blank_check, .erase_check = default_flash_blank_check,

View File

@ -1247,6 +1247,7 @@ struct flash_driver str9xpec_flash = {
.erase = str9xpec_erase, .erase = str9xpec_erase,
.protect = str9xpec_protect, .protect = str9xpec_protect,
.write = str9xpec_write, .write = str9xpec_write,
.read = default_flash_read,
.probe = str9xpec_probe, .probe = str9xpec_probe,
.auto_probe = str9xpec_probe, .auto_probe = str9xpec_probe,
.erase_check = str9xpec_erase_check, .erase_check = str9xpec_erase_check,

View File

@ -559,7 +559,7 @@ COMMAND_HANDLER(handle_flash_fill_command)
goto done; goto done;
} }
err = target_read_buffer(target, address + wrote, cur_size, readback); err = flash_driver_read(bank, readback, address - bank->base + wrote, cur_size);
if (err != ERROR_OK) if (err != ERROR_OK)
{ {
retval = err; retval = err;

View File

@ -1264,6 +1264,7 @@ struct flash_driver tms470_flash = {
.erase = tms470_erase, .erase = tms470_erase,
.protect = tms470_protect, .protect = tms470_protect,
.write = tms470_write, .write = tms470_write,
.read = default_flash_read,
.probe = tms470_probe, .probe = tms470_probe,
.auto_probe = tms470_auto_probe, .auto_probe = tms470_auto_probe,
.erase_check = tms470_erase_check, .erase_check = tms470_erase_check,