关于linux nand 驱动调试的一些注意点

 

关于linux nand 驱动调试的一些注意点

作者: zjujoe 转载请注明出处

Emailzjujoe@yahoo.com

BLOGhttp://blog.csdn.net/zjujoe

 

最近在开发 nand 驱动, 不可避免的, 用到了 nand tools. 这里将一些细节记录下来。网上google 的内容好像也不是很多。Nand tools (mtdutils1.2)似乎也有些难用。

注意我目前使用的是linux2.6.25内核, mtdutils 1.2

 

烧录普通image(没有使用到oob数据)

flash_eraseall  /dev/mtd1

nandwrite /dev/mtd1 ./zImage

注意这里的 image 必须 block 对齐, 否则, nandwrite 会抱怨:

Input file is not page aligned

Data was only partially written due to error

 

烧录 jffs2 image

先制作好 jffs2 image, 比如:(这里暂不使用 sumtool

sudo ./mkjffs2    -n -s 2048 -p 2048 -e 0x20000 -r rootfs_initramfs  -o rootfs_initramfs.jffs2

 

然后通过某种方式, 比如卡或者 cifs, 放入嵌入式环境。目标板上执行:

flash_eraseall  -j /dev/mtd3

nandwrite  /dev/mtd3 ./rootfs_initramfs.jffs2

 

注意这里 nandwrite 不要使用 –j 参数,从help 上看, 该参数已经过时。(至于为什么不需要了, 还没有研究。)

 

另外,就是 flash_eraseall 要求第一个 free oob 数据区其大小要超过8 jffs2 cleanmarker 大小为8), 像我原来的驱动里:

static struct nand_ecclayout comip_lb_nand_oob = {

        .eccbytes = 12,

        .eccpos = {

                   8, 9, 10, 24, 25, 26,

                   40, 41, 42, 56, 57, 58},

        .oobfree = {{1, 7}{11, 13}, {27, 13}, {43, 13}, {59, 5} }

};

 

nanddump 抓出数据,会发现 BIT 8 cleanmarker 最后一个字节 overwrite 了。

需要改为:

static struct nand_ecclayout comip_lb_nand_oob = {

        .eccbytes = 12,

        .eccpos = {

                   8, 9, 10, 24, 25, 26,

                   40, 41, 42, 56, 57, 58},

        .oobfree = {{11, 13}, {27, 13}, {43, 13}, {59, 5}, {1, 7}}

};

 

当然, 如果修改 flash_eraseall.c 也可以解决问题。

 

烧录 yaffs2 image

 

PC 上先制作一个 yaffs2 image:

./mkyaffs2image ./rootfs_initramfs rootfs_initramfs.yaffs2

 

然后烧录到目标板上:

flash_eraseall  /dev/mtd3

nandwrite   -a -o /dev/mtd3 rootfs_initramfs.yaffs2

 

mount 不能成功!

而如果只是擦除,然后直接mount, 读写文件时没有问题的。

使用 nanddump 取出二进制数据, 发现 oob 数据有问题!

分析nandwrite 的代码, 原来写oob数据的代码不正确:(或

许是因为开发nandwrite后底层代码发生了变动。)

#if 0

for (i = 0; old_oobinfo.oobfree[i][1]; i++) {

        /* Set the reserved bytes to 0xff */

        start = old_oobinfo.oobfree[i][0];

        len = old_oobinfo.oobfree[i][1];

        memcpy(oobbuf + start, oobreadbuf + start, len);

}

#else

{

        int totallen = 28;

        int offset = 0;

        memset(oobbuf, 0xFF, 64);

        for (i = 0; old_oobinfo.oobfree[i][1]; i++) {

                /* Set the reserved bytes to 0xff */

                start = old_oobinfo.oobfree[i][0];

                len = old_oobinfo.oobfree[i][1];

 

                if (len >= totallen)

                        len = totallen;

                totallen -= len;

                memcpy(oobbuf + start, oobreadbuf + offset, len);

                if (totallen == 0)

                        break;

                offset += len;

        }

}

#endif

 

修改以后, nandwrite 写入 yaffs2 image, 就可以正常mount了!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 设备驱动开发详解 linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值