Тут возникло глобальное недопонимание. Я настраиваю yaffs2 для применения на AT45DB321D -- NAND, сектор 512+16 байт. chunk делаю размером в 2 сектора флеши -- 1024 байт данные 32 байта на всё остальное.
В документации http://www.yaffs.net/yaffs-2-specification есть таблица Tag structure, из которой следует, что мне как раз хватает на всё, включая ECC на данные и на саму структуру тэгов тоже.
Код
╔═══════════════╦═════════════════════════════════════╦═════════════════════╦═════════════════════╗
║ Field ║ Comment ║ Size for 1kb chunks ║ Size for 2kB chunks ║
╠═══════════════╬═════════════════════════════════════╬═════════════════════╬═════════════════════╣
║ blockState ║ Block state. non-0xFF for bad block ║ 1 ║ 1 ║
║ chunkId ║ 32-bit chunk Id ║ 4 ║ 4 ║
║ objectId ║ 32-bit object Id ║ 4 ║ 4 ║
║ nBytes ║ Number of data bytes in this chunk ║ 2 ║ 2 ║
║ blockSequence ║ sequence number for this block ║ 4 ║ 4 ║
║ tagsEcc ║ ECC on tags area ║ 3 ║ 3 ║
║ ecc ║ ECC, 3 bytes/256 bytes of data ║ 12 ║ 24 ║
║ Total ║ ║ 30 ║ ║
╚═══════════════╩═════════════════════════════════════╩═════════════════════╩═════════════════════╝
║ Field ║ Comment ║ Size for 1kb chunks ║ Size for 2kB chunks ║
╠═══════════════╬═════════════════════════════════════╬═════════════════════╬═════════════════════╣
║ blockState ║ Block state. non-0xFF for bad block ║ 1 ║ 1 ║
║ chunkId ║ 32-bit chunk Id ║ 4 ║ 4 ║
║ objectId ║ 32-bit object Id ║ 4 ║ 4 ║
║ nBytes ║ Number of data bytes in this chunk ║ 2 ║ 2 ║
║ blockSequence ║ sequence number for this block ║ 4 ║ 4 ║
║ tagsEcc ║ ECC on tags area ║ 3 ║ 3 ║
║ ecc ║ ECC, 3 bytes/256 bytes of data ║ 12 ║ 24 ║
║ Total ║ ║ 30 ║ ║
╚═══════════════╩═════════════════════════════════════╩═════════════════════╩═════════════════════╝
Однако, когда вызываются мои функции чтения или записи chunk'а, мне передаётся oob_len равный 28 байт. Причина в том, что в файле yaffs_packedtags2.h есть структура:
Код
struct yaffs_packed_tags2 {
struct yaffs_packed_tags2_tags_only t;
struct yaffs_ecc_other ecc;
};
struct yaffs_packed_tags2_tags_only t;
struct yaffs_ecc_other ecc;
};
А в yaffs_ecc.h
Код
struct yaffs_ecc_other {
unsigned char col_parity;
unsigned line_parity;
unsigned line_parity_prime;
};
unsigned char col_parity;
unsigned line_parity;
unsigned line_parity_prime;
};
Которые как раз и получаются размером 28 байт, если учесть выравнивание 4 байта. Т.е. на 12 байт для ECC для данных места не хватает.
Вопрос, как мне получить показатели, которые приведены в таблице в документации?