Mercurial > nand-ecoscentric
changeset 2973:82fb78794a87
st nand: add read_part_page support, tidy a little
| author | Ross Younger <wry@ecoscentric.com> |
|---|---|
| date | Mon, 09 Nov 2009 16:33:25 +0000 |
| parents | 102e0529ace7 |
| children | 54682dd5e6fe |
| files | packages/devs/nand/st/nandxxxx3a/current/ChangeLog packages/devs/nand/st/nandxxxx3a/current/include/nandxxxx3a.inl |
| diffstat | 2 files changed, 33 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/devs/nand/st/nandxxxx3a/current/ChangeLog +++ b/packages/devs/nand/st/nandxxxx3a/current/ChangeLog @@ -1,3 +1,7 @@ +2009-11-09 Ross Younger <wry@ecoscentric.com> + + * Driver update: add read_part_page function. + 2009-11-06 Ross Younger <wry@ecoscentric.com> * nand_st_xxxx3a.sgml: Remove link to cortexm hal.
--- a/packages/devs/nand/st/nandxxxx3a/current/include/nandxxxx3a.inl +++ b/packages/devs/nand/st/nandxxxx3a/current/include/nandxxxx3a.inl @@ -198,8 +198,7 @@ static int nandxxxx3a_read_begin(cyg_nan static int nandxxxx3a_read_stride(cyg_nand_device *dev, void *dest, size_t size) { //struct nandxxxx3a_priv *priv = dev->priv; - if (dest && size) - read_data_bulk(dev, dest, size); + read_data_bulk(dev, dest, size); return 0; } @@ -218,6 +217,29 @@ static int nandxxxx3a_read_finish(cyg_na return 0; } +static int nandxxxx3a_read_part(cyg_nand_device *dev, void *dest, + cyg_nand_page_addr page, size_t offset, size_t length) +{ + //struct nandxxxx3a_priv *priv = dev->priv; + + NAND_CHATTER(7,dev,"Reading page %d (partial; offset %d, length %d)\n", + page, offset, length); + + cyg_nand_column_addr col = offset & 0xff; + CYG_BYTE cmd = offset & 256 ? 1 /* READ_B */ : 0 /* READ_A */; + LOCK(dev); + + write_cmd(dev, cmd); + write_addr(dev, page, col); + wait_ready_or_time(dev, 1, 12); + read_data_bulk(dev, dest, length); + + // read A? read B? + UNLOCK(dev); + return 0; +} + + static int nandxxxx3a_write_begin(cyg_nand_device *dev, cyg_nand_page_addr page) { struct nandxxxx3a_priv *priv = dev->priv; @@ -235,10 +257,8 @@ static int nandxxxx3a_write_stride(cyg_n const void *src, size_t size) { struct nandxxxx3a_priv *priv = dev->priv; - if (src && size) { - write_data_bulk(dev, src, size); - priv->written += size; - } + write_data_bulk(dev, src, size); + priv->written += size; return 0; } @@ -334,7 +354,9 @@ static int nandxxxx3a_factorybad(cyg_nan CYG_NAND_FUNS_V2(nandxxxx3a_funs, nandxxxx3a_devinit, nandxxxx3a_read_begin, nandxxxx3a_read_stride, - nandxxxx3a_read_finish, nandxxxx3a_write_begin, + nandxxxx3a_read_finish, + nandxxxx3a_read_part, + nandxxxx3a_write_begin, nandxxxx3a_write_stride, nandxxxx3a_write_finish, nandxxxx3a_erase_block, nandxxxx3a_factorybad);
