aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-bsp
diff options
context:
space:
mode:
authorAndrea Adami <andrea.adami@gmail.com>2011-08-07 22:37:53 +0200
committerPaul Eggleton <paul.eggleton@linux.intel.com>2011-09-04 14:47:10 +0100
commitd0ddf43e42976bbf7baf30f7d144598af1767b36 (patch)
tree032f40effbc9eaa0b34441908be6047ab25c259a /recipes-bsp
parent5a29836c6e5c2ad7580962085bd91b861895be2b (diff)
downloadmeta-handheld-d0ddf43e42976bbf7baf30f7d144598af1767b36.tar.gz
nandlogical: switch to remote SRC_URI
* add patch against original source * fix license * bump PR Signed-off-by: Andrea Adami <andrea.adami@gmail.com> Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Diffstat (limited to 'recipes-bsp')
-rw-r--r--recipes-bsp/zaurus-utils/nandlogical/nandlogical.c386
-rw-r--r--recipes-bsp/zaurus-utils/nandlogical/oobblock-to-writesize.patch34
-rw-r--r--recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb15
3 files changed, 44 insertions, 391 deletions
diff --git a/recipes-bsp/zaurus-utils/nandlogical/nandlogical.c b/recipes-bsp/zaurus-utils/nandlogical/nandlogical.c
deleted file mode 100644
index d88d1c2..0000000
--- a/recipes-bsp/zaurus-utils/nandlogical/nandlogical.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- NAND logical utility for Sharp Zaurus SL-C7x0/860/7500/Cxx00
- version 1.0
- Copyright 2006 Alexander Chukov <sash@pdaXrom.org>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- */
-
-#define _GNU_SOURCE
-#include <ctype.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <asm/types.h>
-#include <mtd/mtd-user.h>
-
-int fd;
-
-unsigned char *readbuf;
-unsigned char *oobbuf;
-unsigned long *log2phy;
-
-struct mtd_oob_buf oob = {0, 16, NULL};
-
-struct nand_oobinfo none_oobinfo = {
- .useecc = MTD_NANDECC_OFF,
-};
-
-#define NAND_LOGICAL_SIZE (7 * 1024 * 1024)
-
-/////////////////////////////////////////////////////////////////////
-// oob structure
-/////////////////////////////////////////////////////////////////////
-
-#define NAND_NOOB_LOGADDR_00 8
-#define NAND_NOOB_LOGADDR_01 9
-#define NAND_NOOB_LOGADDR_10 10
-#define NAND_NOOB_LOGADDR_11 11
-#define NAND_NOOB_LOGADDR_20 12
-#define NAND_NOOB_LOGADDR_21 13
-
-static uint nand_get_logical_no(unsigned char *oob)
-{
- unsigned short us,bit;
- int par;
- int good0, good1;
-
- if(oob[NAND_NOOB_LOGADDR_00] == oob[NAND_NOOB_LOGADDR_10] &&
- oob[NAND_NOOB_LOGADDR_01] == oob[NAND_NOOB_LOGADDR_11]){
- good0 = NAND_NOOB_LOGADDR_00;
- good1 = NAND_NOOB_LOGADDR_01;
- }else
- if(oob[NAND_NOOB_LOGADDR_10] == oob[NAND_NOOB_LOGADDR_20] &&
- oob[NAND_NOOB_LOGADDR_11] == oob[NAND_NOOB_LOGADDR_21]){
- good0 = NAND_NOOB_LOGADDR_10;
- good1 = NAND_NOOB_LOGADDR_11;
- }else
- if(oob[NAND_NOOB_LOGADDR_20] == oob[NAND_NOOB_LOGADDR_00] &&
- oob[NAND_NOOB_LOGADDR_21] == oob[NAND_NOOB_LOGADDR_01]){
- good0 = NAND_NOOB_LOGADDR_20;
- good1 = NAND_NOOB_LOGADDR_21;
- }else{
- return (uint)-1;
- }
-
- us = (((unsigned short)(oob[good0]) & 0x00ff) << 0) |
- (((unsigned short)(oob[good1]) & 0x00ff) << 8);
-
- par = 0;
- for(bit = 0x0001; bit != 0; bit <<= 1){
- if(us & bit){
- par++;
- }
- }
- if(par & 1){
- return (uint)-2;
- }
-
- if(us == 0xffff){
- return 0xffff;
- }else{
- return ((us & 0x07fe) >> 1);
- }
-}
-
-static void nand_set_logical_no(uint log_no, unsigned char *oob)
-{
- unsigned short us,bit;
- int par;
-
- us = (((log_no & 0x03ff) << 1) | 0x1000);
-
- par = 0;
- for(bit = 0x0001; bit != 0; bit <<= 1){
- if(us & bit){
- par++;
- }
- }
- if(par & 1){
- us |= 0x0001;
- }
-
- oob[NAND_NOOB_LOGADDR_00] = (unsigned char)((us & 0x00ff) >> 0);
- oob[NAND_NOOB_LOGADDR_01] = (unsigned char)((us & 0xff00) >> 8);
- oob[NAND_NOOB_LOGADDR_10] = oob[NAND_NOOB_LOGADDR_00];
- oob[NAND_NOOB_LOGADDR_11] = oob[NAND_NOOB_LOGADDR_01];
- oob[NAND_NOOB_LOGADDR_20] = oob[NAND_NOOB_LOGADDR_00];
- oob[NAND_NOOB_LOGADDR_21] = oob[NAND_NOOB_LOGADDR_01];
-}
-
-void scan_logical(int blocks, int erasesize)
-{
- int i;
- unsigned long offset;
- int ret = 1;
- for (i = 0; i < blocks; i++)
- log2phy[i] = (uint) -1;
- offset = 0;
- for (i = 0; i < blocks; i++) {
- oob.start = offset;
- ret = ioctl(fd, MEMREADOOB, &oob);
-
- //ret = nand_read_raw(nand, oobuf, offset, nand->writesize, nand->oobsize);
- if (!ret) {
- int log_no = nand_get_logical_no(oobbuf);
- if (((int)log_no >= 0) && (log_no < blocks)) {
- log2phy[log_no] = offset;
- //printf("NAND logical - %08X -> %04X\n", offset, log_no * erasesize);
- } else {
- //printf("NAND logical - %08X - skip (%x)\n", offset, log_no);
- }
- } else {
- //printf("NAND logical - offset %x read OOB problem\n", offset);
- }
- offset += erasesize;
- }
-}
-
-unsigned long add_logical(unsigned long ofs, int blocks, int erasesize, int bs)
-{
- erase_info_t erase;
- unsigned long offset = 0;
- int i;
- int ret;
-
- erase.length = erasesize;
-
- for (i = 0; i < blocks; i++) {
- oob.start = offset;
- ret = ioctl(fd, MEMREADOOB, &oob);
-
- if (!ret) {
- int log_no = nand_get_logical_no(oobbuf);
-
-//printf("-- %x\n", log_no);
-
- if ((short)log_no == -1) {
- int j = 0;
- {
- loff_t offs = offset;
- erase.start = offset;
- int ret = ioctl(fd, MEMGETBADBLOCK, &offs);
- if (ret > 0) {
- printf ("\nSkipping bad block at 0x%08x\n", erase.start);
- goto nextblock;
- } else if (ret < 0) {
- perror("ioctl(MEMGETBADBLOCK)");
- exit(1);
- } else {
- printf("%x - no bad block\n", offset);
- }
-
- if (ioctl(fd, MEMERASE, &erase) != 0) {
- perror("ioctl(MEMERASE)");
- goto nextblock;
- }
-
- //printf("%x - erased\n", offset);
-
- }
-
- //printf("NAND logical - found free block %x, mapped as %x\n", offset, ofs);
-
- log2phy[ofs / erasesize] = offset;
-
- return offset;
- } else {
- //fprintf(stderr, "found: %x\n", log_no);
- }
- } else {
- perror ("ioctl(MEMREADOOB)");
- }
-
- nextblock:
- offset += erasesize;
- }
-
- return (unsigned long)-1;
-}
-
-void usage(void)
-{
- fprintf(stderr, "Usage:\nnandlogical <mtd char device> READ|WRITE <start> <length> <file>\n");
- exit(1);
-}
-
-int main(int argc, char *argv[])
-{
- mtd_info_t meminfo;
- char *mtddev;
- int blocks;
- unsigned long start_addr;
- unsigned long end_addr;
- unsigned long length;
- unsigned long ofs;
- int bs;
- int ofd;
- int func_write = 0;
- int oobinfochanged = 0;
- struct nand_oobinfo old_oobinfo;
-
- if (argc < 6)
- usage();
-
- if (strcmp(argv[2], "WRITE") == 0)
- func_write = 1;
- else if (strcmp(argv[2], "READ") != 0)
- usage();
-
- mtddev = argv[1];
- start_addr = strtoul(argv[3], NULL, 0);
- length = strtoul(argv[4], NULL, 0);
-
- if (func_write) {
- if ((ofd = open(argv[5], O_RDONLY)) == -1) {
- perror("open input file");
- exit(1);
- }
- /* Open MTD device */
- if ((fd = open(mtddev, O_RDWR)) == -1) {
- perror("open flash");
- exit (1);
- }
- } else {
- if ((ofd = open(argv[5], O_WRONLY | O_TRUNC | O_CREAT, 0644)) == -1) {
- perror ("open outfile");
- exit(1);
- }
- /* Open MTD device */
- if ((fd = open(mtddev, O_RDONLY)) == -1) {
- perror("open flash");
- exit (1);
- }
- }
-
- /* Fill in MTD device capability structure */
- if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
- perror("MEMGETINFO");
- close(fd);
- exit (1);
- }
-
- /* Make sure device page sizes are valid */
- if (!(meminfo.oobsize == 64 && meminfo.writesize == 2048) &&
- !(meminfo.oobsize == 16 && meminfo.writesize == 512) &&
- !(meminfo.oobsize == 8 && meminfo.writesize == 256)) {
- fprintf(stderr, "Unknown flash (not normal NAND)\n");
- close(fd);
- exit(1);
- }
-
- //printf("erasesize %x\nwritesize %x\noobsize %x\nsize %x\n", meminfo.erasesize, meminfo.writesize, meminfo.oobsize, meminfo.size);
-
- blocks = NAND_LOGICAL_SIZE / meminfo.erasesize;
- log2phy = (unsigned long *) malloc(blocks * sizeof(unsigned long));
- readbuf = (char *)malloc(meminfo.erasesize);
- oobbuf = (char *)malloc(meminfo.writesize);
- oob.ptr = oobbuf;
-
- scan_logical(blocks, meminfo.erasesize);
-
- //printf("Start: %x\nEnd: %x\n", start_addr, length);
-
- end_addr = start_addr + length;
- bs = meminfo.writesize;
-
- for (ofs = start_addr; ofs < end_addr ; ofs+=bs) {
- int new_logical_added = 0;
- int offset = log2phy[ofs / meminfo.erasesize];
-
- if ((int)offset < 0 && func_write) {
- //printf("add logical block...\n");
- offset = add_logical(ofs, blocks, meminfo.erasesize, bs);
- new_logical_added = 1;
- }
-
- if ((int)offset < 0) {
- printf("NAND logical - offset %08X not found\n", ofs);
- goto closeall;
- }
-
- offset += ofs % meminfo.erasesize;
-
- //printf(":%x\n", offset);
-
- if (func_write) {
- int len;
- memset(readbuf, 0xff, bs);
- len = read(ofd, readbuf, bs);
- if (len > 0) {
-#if 1
- if (ofs % meminfo.erasesize == 0) {
- int j;
- erase_info_t erase;
- erase.start = offset;
- erase.length = meminfo.erasesize;
- if (ioctl(fd, MEMERASE, &erase) != 0) {
- printf("ioctl(MEMERASE) %x\n", offset);
- //goto nextblock;
- }
- //printf("Erased\n");
-
- for (j = 0; j < meminfo.erasesize; j+=bs) {
- int log_no;
- oob.start = offset + j;
- oob.length = 16;
-
- memset(oobbuf, 0xff, 16);
- nand_set_logical_no(ofs / meminfo.erasesize, oobbuf);
- if (ioctl(fd, MEMWRITEOOB, &oob) != 0) {
- //perror ("ioctl(MEMWRITEOOB)");
- printf("NAND logical add - MEMWRITEOOB error %x\n", offset + j);
- exit(1);
- }
- memset(oobbuf, 0xff, 16);
- if (ioctl(fd, MEMREADOOB, &oob) != 0) {
- perror ("ioctl(MEMREADOOB)");
- exit(1);
- }
- log_no = nand_get_logical_no(oobbuf);
- //printf("%x:1 write %x, read %x\n", offset + j, ofs / meminfo.erasesize, log_no);
- }
-
- }
-#endif
- if (pwrite(fd, readbuf, bs, offset) != bs) {
- perror ("pwrite");
- goto closeall;
- }
-
- } else
- break;
- } else {
- if (pread(fd, readbuf, bs, offset) != bs) {
- perror("pread");
- goto closeall;
- }
- write(ofd, readbuf, ((end_addr - ofs) < bs)?(end_addr - ofs):bs);
- }
- }
-
- closeall:
-
- free(log2phy);
- free(readbuf);
- free(oobbuf);
- close(fd);
- close(ofd);
-
- return 0;
-}
diff --git a/recipes-bsp/zaurus-utils/nandlogical/oobblock-to-writesize.patch b/recipes-bsp/zaurus-utils/nandlogical/oobblock-to-writesize.patch
new file mode 100644
index 0000000..23d011e
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/nandlogical/oobblock-to-writesize.patch
@@ -0,0 +1,34 @@
+Fix build against 2.6.24 kernel.
+
+* fix courtesy of Stanislav Brabec
+* http://www.oesf.org/forum/index.php?showtopic=23985
+
+Signed off by Stanislav Brabec <utx@penguin.cz>
+Signed off by Andrea Adami <andrea.adami@gmail.com>
+
+--- a/nandlogical.c 2006-06-09 17:06:48.000000000 +0200
++++ b/nandlogical.c 2011-08-05 11:17:28.000000000 +0200
+138c138
+< //ret = nand_read_raw(nand, oobuf, offset, nand->oobblock, nand->oobsize);
+---
+> //ret = nand_read_raw(nand, oobuf, offset, nand->writesize, nand->oobsize);
+279,281c279,281
+< if (!(meminfo.oobsize == 64 && meminfo.oobblock == 2048) &&
+< !(meminfo.oobsize == 16 && meminfo.oobblock == 512) &&
+< !(meminfo.oobsize == 8 && meminfo.oobblock == 256)) {
+---
+> if (!(meminfo.oobsize == 64 && meminfo.writesize == 2048) &&
+> !(meminfo.oobsize == 16 && meminfo.writesize == 512) &&
+> !(meminfo.oobsize == 8 && meminfo.writesize == 256)) {
+287c287
+< //printf("erasesize %x\noobblock %x\noobsize %x\nsize %x\n", meminfo.erasesize, meminfo.oobblock, meminfo.oobsize, meminfo.size);
+---
+> //printf("erasesize %x\nwritesize %x\noobsize %x\nsize %x\n", meminfo.erasesize, meminfo.writesize, meminfo.oobsize, meminfo.size);
+292c292
+< oobbuf = (char *)malloc(meminfo.oobblock);
+---
+> oobbuf = (char *)malloc(meminfo.writesize);
+300c300
+< bs = meminfo.oobblock;
+---
+> bs = meminfo.writesize;
diff --git a/recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb b/recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb
index c7fbce9..07180c5 100644
--- a/recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb
+++ b/recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb
@@ -1,15 +1,20 @@
DESCRIPTION = "Nandlogical for Sharp mtd1"
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://nandlogical.c;md5=a734efd470f4d5be324e5d408a1f38a5"
-PR = "r5"
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://nandlogical.c;endline=15;md5=77804e7fdf625e56869f32d9aec762a2"
+PR = "r6"
-SRC_URI = "file://nandlogical.c"
+SRC_URI = "http://distro.ibiblio.org/pub/linux/distributions/pdaxrom/download/1.1.0beta4/src/survive-1.1.0.tar.bz2 \
+ file://oobblock-to-writesize.patch"
-S = "${WORKDIR}"
+SRC_URI[md5sum] = "b6cb17168a424a5d757309dce4a81841"
+SRC_URI[sha256sum] = "0d02edc12509f6dc98cded37c68238f939c522cbd398fd527785a1e7e3bcfcea"
+
+S = "${WORKDIR}/survive-1.1.0"
do_compile () {
${CC} ${CFLAGS} ${LDFLAGS} nandlogical.c -o nandlogical
}
+
do_install () {
install -d ${D}${bindir}/
install -m 0755 nandlogical ${D}${bindir}/