Mercurial > nand-ecoscentric
changeset 2972:102e0529ace7
k9 nand: add read_part_page function, tidy a little
| author | Ross Younger <wry@ecoscentric.com> |
|---|---|
| date | Mon, 09 Nov 2009 16:33:21 +0000 |
| parents | 5de26964db69 |
| children | 82fb78794a87 |
| files | packages/devs/nand/samsung_k9/current/ChangeLog packages/devs/nand/samsung_k9/current/include/k9fxx08x0x.inl |
| diffstat | 2 files changed, 31 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/devs/nand/samsung_k9/current/ChangeLog +++ b/packages/devs/nand/samsung_k9/current/ChangeLog @@ -1,3 +1,7 @@ +2009-11-09 Ross Younger <wry@eCosCentric.com> + + * Add read_part_page function. + 2009-10-02 Ross Younger <wry@eCosCentric.com> * Update driver to expose v2 device functions.
--- a/packages/devs/nand/samsung_k9/current/include/k9fxx08x0x.inl +++ b/packages/devs/nand/samsung_k9/current/include/k9fxx08x0x.inl @@ -200,14 +200,7 @@ static int k9_read_begin(cyg_nand_device static int k9_read_stride(cyg_nand_device *dev, void * dest, size_t size) { - if (size) { - if (dest) - read_data_bulk(dev, dest, size); - else { - // Dummy-sink reads - while (size--) read_data_1(dev); - } - } + read_data_bulk(dev, dest, size); return 0; } @@ -223,6 +216,28 @@ static int k9_read_finish(cyg_nand_devic return 0; } +static int k9_read_part(cyg_nand_device *dev, void *dest, + cyg_nand_page_addr page, size_t offset, size_t length) +{ + //k9_priv *priv = dev->priv; + CYG_BYTE addr[4] = { offset & 0xff, (offset >> 8) & 0xff, + page & 0xff, (page >> 8) & 0xff }; + + NAND_CHATTER(7,dev,"Reading page %d (partial; offset %d, length %d)\n", + page, offset, length); + LOCK(dev); + + write_cmd(dev,0x00); + write_addrbytes(dev, &addr[0], 4); + write_cmd(dev,0x30); + wait_ready_or_time(dev, 1, 25 /* tR */); + + read_data_bulk(dev, dest, length); + + UNLOCK(dev); + return 0; +} + static int k9_write_begin(cyg_nand_device *dev, cyg_nand_page_addr page) { k9_priv *priv = dev->priv; @@ -241,14 +256,7 @@ static int k9_write_begin(cyg_nand_devic static int k9_write_stride(cyg_nand_device *dev, const void * src, size_t size) { - if (size) { - if (src) - write_data_bulk(dev, src, size); - else { - // Dummy-source writes - while (size--) write_data_1(dev, 0xff); - } - } + write_data_bulk(dev, src, size); return 0; } @@ -264,7 +272,7 @@ static int k9_write_finish(cyg_nand_devi wait_ready_or_status(dev, 1<<6); if (read_status(dev) & 1) { - NAND_ERROR(dev, "NAND: k9fxx08x0x: Programming failed! Page %u", priv->pagestash); + NAND_ERROR(dev, "k9fxx08x0x: Programming failed! Page %u", priv->pagestash); rv =-EIO; goto done; } else { @@ -290,7 +298,7 @@ static int k9_erase_block(cyg_nand_devic wait_ready_or_status(dev, 1<<6); if (read_status(dev) & 1) { rv = -EIO; - NAND_ERROR(dev, "NAND: k9fxx08x0x: Erasing block %u failed.\n",blk); + NAND_ERROR(dev, "k9fxx08x0x: Erasing block %u failed.\n",blk); goto done; } NAND_CHATTER(7,dev, "Erased block %u OK\n", blk); @@ -332,6 +340,7 @@ static int k9_factorybad(cyg_nand_device CYG_NAND_FUNS_V2(k9f8_funs, k9_devinit, k9_read_begin, k9_read_stride, k9_read_finish, + k9_read_part, k9_write_begin, k9_write_stride, k9_write_finish, k9_erase_block, k9_factorybad);
