#define NANDIP_V100 0x100
-#define CHUNKS_PER_SUMMARY 63
-#define YAFFS_OBJECTID_SUMMARY 0x10
-#define YAFFS_SUMMARY_VERSION 1
-
-/* Summary tags don't need the sequence number because that is redundant. */
-struct yaffs_summary_tags {
- unsigned obj_id;
- unsigned chunk_id;
- unsigned n_bytes;
-};
-
-/* Summary header */
-struct yaffs_summary_header {
- unsigned version; /* Must match current version */
- unsigned block; /* Must be this block */
- unsigned seq; /* Must be this sequence number */
- unsigned sum; /* Just add up all the bytes in the tags */
-};
/* this follow must be consistent with fastboot !!! */
enum ecc_type
static int obj_id = YAFFS_NOBJECT_BUCKETS + 1;
static int n_obj, nDirectories, nPages;
-static int summary_index;
-static int current_chunk;
-static struct yaffs_summary_tags *sum_tags;
static int outFile;
memcpy(spareData, pt, sizeof(*pt));
}
-static unsigned yaffs_summary_sum(void)
-{
- unsigned sum = 0;
- u8 *sum_tags_tmp = (u8 *)sum_tags;
- int length = CHUNKS_PER_SUMMARY * sizeof(struct yaffs_summary_tags);
-
- while (length > 0) {
- sum += *sum_tags_tmp;
- sum_tags_tmp++;
- length--;
- }
-
- return sum;
-}
-
-static int yaffs_do_summary(void)
-{
- struct nand_oob_free *oobfree = sel_oob_info->freeoob;
-
- struct yaffs_summary_header hdr;
- hdr.version = YAFFS_SUMMARY_VERSION;
- hdr.block = 0;
- hdr.seq = YAFFS_LOWEST_SEQUENCE_NUMBER;
- hdr.sum = yaffs_summary_sum();
-
- char data[chunkSize];
- memset(data, 0xff, chunkSize);
- memcpy(data, &hdr, sizeof(hdr));
- memcpy(data + sizeof(hdr), sum_tags, CHUNKS_PER_SUMMARY * sizeof(struct yaffs_summary_tags));
-
- if (write(outFile, data, chunkSize) != chunkSize)
- fatal("write");
-
- struct yaffs_ext_tags t;
- memset(&t, 0, sizeof(struct yaffs_ext_tags));
- t.chunk_id = 1;
- t.serial_number = 1;
- t.n_bytes = CHUNKS_PER_SUMMARY * sizeof(struct yaffs_summary_tags) + sizeof(hdr);
- t.obj_id = YAFFS_OBJECTID_SUMMARY;
- t.seq_number = YAFFS_LOWEST_SEQUENCE_NUMBER;
- t.chunk_used = 1;
- nPages++;
-
- struct yaffs_packed_tags2 pt;
- memset(&pt, 0, sizeof(struct yaffs_packed_tags2));
- yaffs_pack_tags2(&dummy_dev, &pt, &t, 1);
-
- char spareData[spareSize];
- memset(spareData, 0xff, spareSize);
- spareData[oobfree->length] = 0;
- spareData[oobfree->length + 1] = 0;
-
- shuffle_oob(&spareData[2], &pt); // use 2bit to mark bad block
-
- if (write(outFile, spareData, spareSize) != spareSize)
- fatal("write");
- return 0;
-}
-
static int write_chunk(u8 *data, u32 id, u32 chunk_id, u32 n_bytes)
{
struct yaffs_ext_tags t;
char spareData[spareSize];
struct nand_oob_free *oobfree = sel_oob_info->freeoob;
- current_chunk++;
- if ((current_chunk % (CHUNKS_PER_SUMMARY + 1)) == 0) {
- error = yaffs_do_summary();
- if (error < 0) {
- printf("Yaffs2 write summary info failure.\n");
- return error;
- }
- memset(sum_tags, 0x0, CHUNKS_PER_SUMMARY * sizeof(struct yaffs_summary_tags));
- current_chunk = 1;
- summary_index = 0;
- }
-
- sum_tags[summary_index].chunk_id = chunk_id;
- sum_tags[summary_index].n_bytes = n_bytes;
- sum_tags[summary_index].obj_id = id;
- summary_index++;
-
if (write(outFile,data,chunkSize) != chunkSize)
fatal("write");
chunkSize = get_pagesize(g_pagetype);
spareSize = sel_oob_info->oobsize;
- printf("fix mount slow after burn, chunkSize %d spareSize %d\n",chunkSize,spareSize);
- int sum_tags_bytes = CHUNKS_PER_SUMMARY * sizeof(struct yaffs_summary_tags);
- sum_tags = (struct yaffs_summary_tags *)malloc(sum_tags_bytes);
- if (sum_tags == NULL) {
- printf("Alloc sum_tags failure.\n");
- exit(1);
- }
- memset(sum_tags, 0x0, sum_tags_bytes);
+ printf("chunkSize %d spareSize %d\n",chunkSize,spareSize);
printf("Processing directory %s into image file %s\n",argv[1],argv[2]);