[U-Boot-Users] [PATCH] JFFS2 command support on OneNAND
Scott Wood
scottwood at freescale.com
Fri Jul 11 23:43:03 CEST 2008
On Mon, Jul 07, 2008 at 11:22:56AM +0900, Kyungmin Park wrote:
> +static int part_validate_onenand(struct mtdids *id, struct part_info *part)
> +{
> +#if defined(CONFIG_CMD_ONENAND)
> + /* info for OneNAND chips */
> + struct mtd_info *mtd;
> +
> + mtd = &onenand_mtd;
> +
> + if ((unsigned long)(part->offset) % mtd->erasesize) {
> + printf("%s%d: partition (%s) start offset"
> + "alignment incorrect\n",
> + MTD_DEV_TYPE(id->type), id->num, part->name);
> + return 1;
> + }
> +
> + if (part->size % mtd->erasesize) {
> + printf("%s%d: partition (%s) size alignment incorrect\n",
> + MTD_DEV_TYPE(id->type), id->num, part->name);
> + return 1;
> + }
> +
> + return 0;
> +#else
> + return 1;
> +#endif
> +}
This looks like a duplicate of part_validate_nand (note that nand_info_t
is just an obfuscatory alias of struct mtd_info).
> +static int read_onenand_cached(u32 off, u32 size, u_char *buf)
> +{
> + u32 bytes_read = 0;
> + size_t retlen;
> + int cpy_bytes;
> +
> + while (bytes_read < size) {
> + if ((off + bytes_read < onenand_cache_off) ||
> + (off + bytes_read >= onenand_cache_off + ONENAND_CACHE_SIZE)) {
> + onenand_cache_off = (off + bytes_read) & ONENAND_PAGE_MASK;
> + if (!onenand_cache) {
> + /* This memory never gets freed but 'cause
> + it's a bootloader, nobody cares */
> + onenand_cache = malloc(ONENAND_CACHE_SIZE);
> + if (!onenand_cache) {
> + printf("read_onenand_cached: can't alloc cache size %d bytes\n",
> + ONENAND_CACHE_SIZE);
> + return -1;
> + }
> + }
> +
> + retlen = ONENAND_CACHE_SIZE;
> + if (onenand_read(&onenand_mtd, onenand_cache_off, retlen,
> + &retlen, onenand_cache) != 0 ||
> + retlen != ONENAND_CACHE_SIZE) {
> + printf("read_onenand_cached: error reading nand off %#x size %d bytes\n",
> + onenand_cache_off, ONENAND_CACHE_SIZE);
> + return -1;
> + }
> + }
> + cpy_bytes = onenand_cache_off + ONENAND_CACHE_SIZE - (off + bytes_read);
> + if (cpy_bytes > size - bytes_read)
> + cpy_bytes = size - bytes_read;
> + memcpy(buf + bytes_read,
> + onenand_cache + off + bytes_read - onenand_cache_off,
> + cpy_bytes);
> + bytes_read += cpy_bytes;
> + }
> + return bytes_read;
> +}
I really would rather not duplicate all of this, which looks extremely
similar to regular NAND. Is there reason why we don't use the mtd_info
function pointer interface?
-Scott
More information about the U-Boot
mailing list