From e9d3a5e1e1e9c55b1d79ac2d5020faf97a82d6c6 Mon Sep 17 00:00:00 2001 From: Kyungmin Park Date: Thu, 30 Jul 2009 19:06:01 +0900 Subject: [PATCH] s5pc110: checksum: Support 8KiB and 16KiB Signed-off-by: Kyungmin Park --- onenand_ipl/board/samsung/universal/checksum.c | 41 +++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/onenand_ipl/board/samsung/universal/checksum.c b/onenand_ipl/board/samsung/universal/checksum.c index 3b766ac..1eb593c 100644 --- a/onenand_ipl/board/samsung/universal/checksum.c +++ b/onenand_ipl/board/samsung/universal/checksum.c @@ -6,7 +6,27 @@ #include #include -#define IPL_14K (0x3800 - 0x4) +#ifndef SZ_8K +#define SZ_8K 0x2000 +#endif +#ifndef SZ_14K +#define SZ_14K 0x3800 +#endif + +/* + * For 2KiB page OneNAND + * +------+------+------+------+ + * | 2KiB | 2KiB | 2KiB | 2KiB | + * +------+------+------+------+ + */ +#define CHECKSUM_8K (SZ_8K - 0x4) +/* + * For 4KiB page OneNAND + * +----------------+----------------+----------------+----------------+ + * | 2KiB, reserved | 2KiB, reserved | 2KiB, reserved | 2KiB, reserved | + * +----------------+----------------+----------------+----------------+ + */ +#define CHECKSUM_16K (SZ_14K - 0x4) int main(int argc, char *argv[]) { @@ -15,6 +35,8 @@ int main(int argc, char *argv[]) char buf; int fd; unsigned int sum = 0; + struct stat stat; + off_t size; fd = open(argv[1], O_RDWR); @@ -23,12 +45,23 @@ int main(int argc, char *argv[]) return 1; } - for (i = 0; i < IPL_14K; i++) { + ret = fstat(fd, &stat); + if (ret < 0) { + perror("fstat"); + return 1; + } + + if (stat.st_size > SZ_8K) + size = CHECKSUM_16K; + else + size = CHECKSUM_8K; + + for (i = 0; i < size; i++) { ret = read(fd, &buf, 1); if (ret < 0) { - printf("write err: %d\n", ret); - break; + perror("read"); + return 1; } sum += (buf & 0xFF); -- 2.7.4