diff --git a/ecos-rsc4/packages/devs/ubi/current/src/compat.h b/ecos-rsc4/packages/devs/ubi/current/src/compat.h index b5605b4..8acbb07 100644 --- a/ecos-rsc4/packages/devs/ubi/current/src/compat.h +++ b/ecos-rsc4/packages/devs/ubi/current/src/compat.h @@ -36,33 +36,41 @@ typedef long loff_t; #define ENOSPC 28 #define EBADMSG 74 - -#define __swap16gen(x) ({ \ - cyg_uint16 u = (x); \ - ((u & 0x00FF) << 8) | \ - ((u & 0xFF00) >> 8); \ -}) - -#define __swap64gen(x) ({ \ - cyg_uint64 u = (x); \ - ((u & 0x00000000000000FFLL) << 56) | \ - ((u & 0x000000000000FF00LL) << 40) | \ - ((u & 0x0000000000FF0000LL) << 24) | \ - ((u & 0x00000000FF000000LL) << 8) | \ - ((u & 0x000000FF00000000LL) >> 8) | \ - ((u & 0x0000FF0000000000LL) >> 24) | \ - ((u & 0x00FF000000000000LL) >> 40) | \ - ((u & 0xFF00000000000000LL) >> 56); \ -}) - - -#define cpu_to_be16(x) __swap16gen(x) +// This really belongs in ecos/packages/hal/common/current/include/hal_endian.h +#ifndef CYG_SWAP64 +#define CYG_SWAP64(_x_) \ + ({ cyg_uint64 _x = (_x_); \ + ((_x & 0x00000000000000FFLL) << 56) | \ + ((_x & 0x000000000000FF00LL) << 40) | \ + ((_x & 0x0000000000FF0000LL) << 24) | \ + ((_x & 0x00000000FF000000LL) << 8) | \ + ((_x & 0x000000FF00000000LL) >> 8) | \ + ((_x & 0x0000FF0000000000LL) >> 24) | \ + ((_x & 0x00FF000000000000LL) >> 40) | \ + ((_x & 0xFF00000000000000LL) >> 56); }) +#endif + +#if (CYG_BYTEORDER == CYG_LSBFIRST) +# define CYG_CPU_TO_BE64(_x_) CYG_SWAP64((_x_)) +# define CYG_BE64_TO_CPU(_x_) CYG_SWAP64((_x_)) +# define CYG_CPU_TO_LE64(_x_) (_x_) +# define CYG_LE64_TO_CPU(_x_) (_x_) +#elif (CYG_BYTEORDER == CYG_MSBFIRST) +# define CYG_CPU_TO_BE64(_x_) (_x_) +# define CYG_BE64_TO_CPU(_x_) (_x_) +# define CYG_CPU_TO_LE64(_x_) CYG_SWAP64((_x_)) +# define CYG_LE64_TO_CPU(_x_) CYG_SWAP64((_x_)) +#else +# error "Endian mode not selected" +#endif + +#define cpu_to_be16(x) CYG_CPU_TO_BE16(x) #define cpu_to_be32(x) CYG_CPU_TO_BE32(x) -#define cpu_to_be64(x) __swap64gen(x) +#define cpu_to_be64(x) CYG_CPU_TO_BE64(x) -#define be16_to_cpu(x) __swap16gen(x) +#define be16_to_cpu(x) CYG_BE16_TO_CPU(x) #define be32_to_cpu(x) CYG_BE32_TO_CPU(x) -#define be64_to_cpu(x) __swap64gen(x) +#define be64_to_cpu(x) CYG_BE64_TO_CPU(x) #define ubi_err(fmt, ...) diag_printf(fmt "\n", ##__VA_ARGS__) #define ubi_warn(fmt, ...) diag_printf(fmt "\n", ##__VA_ARGS__) diff --git a/ecos-rsc4/packages/devs/ubi/current/src/ubi.c b/ecos-rsc4/packages/devs/ubi/current/src/ubi.c index e02b11d..71f834a 100644 --- a/ecos-rsc4/packages/devs/ubi/current/src/ubi.c +++ b/ecos-rsc4/packages/devs/ubi/current/src/ubi.c @@ -160,33 +160,9 @@ static void do_ubi(int argc,char *argv[]) static int ubi_flash_read(const struct ubi_device *ubi, loff_t ptr, void *buf, int len) { - loff_t page_ptr, page_off; - int page_len = ubi->min_io_size; - int err = FLASH_ERR_OK; - char *page_buf; - - page_buf = malloc(page_len); - - /* make sure all flash access needs to be page aligned */ - while (len > 0) { - page_ptr = ptr & ~(0x800-1); - page_off = ptr - page_ptr; - - err = flash_read((void *)((char *)ubi->flash_base + page_ptr), page_buf, page_len, NULL); - if (err != FLASH_ERR_OK) { - // FIXME convert err for ubi - goto out; - } - - memcpy(buf, page_buf + page_off, (len < (page_len - page_off)) ? len : page_len - page_off); - - ((char *)buf) += page_len; - ptr += page_len; - len -= page_len - page_off; - } + int err = flash_read((void *)((char *)ubi->flash_base + ptr), buf, len, NULL); + // FIXME convert err - out: - free(page_buf); return err; } @@ -443,4 +419,39 @@ ubi_format_cmd(int argc, char *argv[]) ubi_attach_by_scanning(ubi); } +/** + * ubi_dbg_dump_vtbl_record - dump a &struct ubi_vtbl_record object. + * @r: the object to dump + * @idx: volume table index + */ +void ubi_dbg_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx) +{ + int name_len = be16_to_cpu(r->name_len); + + diag_printf("Volume table record %d dump:\n", idx); + diag_printf("\treserved_pebs %d\n", + be32_to_cpu(r->reserved_pebs)); + diag_printf("\talignment %d\n", be32_to_cpu(r->alignment)); + diag_printf("\tdata_pad %d\n", be32_to_cpu(r->data_pad)); + diag_printf("\tvol_type %d\n", (int)r->vol_type); + diag_printf("\tupd_marker %d\n", (int)r->upd_marker); + diag_printf("\tname_len %d\n", name_len); + + if (r->name[0] == '\0') { + diag_printf("\tname NULL\n"); + return; + } + + if (name_len <= UBI_VOL_NAME_MAX && + strnlen(&r->name[0], name_len + 1) == name_len) { + diag_printf("\tname %s\n", &r->name[0]); + } else { + diag_printf("\t1st 5 characters of name: %c%c%c%c%c\n", + r->name[0], r->name[1], r->name[2], r->name[3], + r->name[4]); + } + diag_printf("\tcrc %#08x\n", be32_to_cpu(r->crc)); +} + + // EOF ubi.c diff --git a/ecos-rsc4/packages/devs/ubi/current/src/ubi_vtbl.c b/ecos-rsc4/packages/devs/ubi/current/src/ubi_vtbl.c index 144cd4d..dcfcd3c 100644 --- a/ecos-rsc4/packages/devs/ubi/current/src/ubi_vtbl.c +++ b/ecos-rsc4/packages/devs/ubi/current/src/ubi_vtbl.c @@ -215,6 +215,7 @@ static int vtbl_check(const struct ubi_device *ubi, bad: ubi_err("volume table check failed: record %d, error %d", i, err); + ubi_dbg_dump_vtbl_record(&vtbl[i], i); return -EINVAL; }