微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > NAND FLASH驱动程序

NAND FLASH驱动程序

时间:11-21 来源:互联网 点击:

Bad eraseblock 319 at 0x027e0000

Bad eraseblock 606 at 0x04bc0000

Bad eraseblock 608 at 0x04c00000

Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":

0x00000000-0x00040000 : "bootloader"

0x00040000-0x00060000 : "params"

0x00060000-0x00260000 : "kernel"

0x00260000-0x10000000 : "root"

搜"S3C24XX NAND Driver"

S3c2410.c (drivers\mtd\nand)

s3c2410_nand_inithw

s3c2410_nand_init_chip

nand_scan // drivers/mtd/nand/nand_base.c 根据nand_chip的底层操作函数识别NAND FLASH,构造mtd_info

nand_scan_ident

nand_set_defaults

if (!chip->select_chip)

chip->select_chip = nand_select_chip; // 默认值不适用

if (chip->cmdfunc == NULL)

chip->cmdfunc = nand_command;

chip->cmd_ctrl(mtd, command, ctrl);

if (!chip->read_byte)

chip->read_byte = nand_read_byte;

readb(chip->IO_ADDR_R);

if (chip->waitfunc == NULL)

chip->waitfunc = nand_wait;

chip->dev_ready

nand_get_flash_type

chip->select_chip(mtd, 0);

chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

*maf_id = chip->read_byte(mtd);

dev_id = chip->read_byte(mtd);

nand_scan_tail

mtd->erase = nand_erase;

mtd->read = nand_read;

mtd->write = nand_write;

s3c2410_nand_add_partition

add_mtd_partitions

add_mtd_device

list_for_each(this, &mtd_notifiers) { // 问. mtd_notifiers在哪设置

// 答. drivers/mtd/mtdchar.c,mtd_blkdev.c调用register_mtd_user

struct mtd_notifier *not = list_entry(this, struct mtd_notifier, list);

not->add(mtd);

// mtd_notify_add 和 blktrans_notify_add

先看字符设备的mtd_notify_add

class_device_create

class_device_create

再看块设备的blktrans_notify_add

list_for_each(this, &blktrans_majors) { // 问. blktrans_majors在哪设置

// 答. drivers\mtd\mdblock.c或mtdblock_ro.c register_mtd_blktrans

struct mtd_blktrans_ops *tr = list_entry(this, struct mtd_blktrans_ops, list);

tr->add_mtd(tr, mtd);

mtdblock_add_mtd (drivers\mtd\mdblock.c)

add_mtd_blktrans_dev

alloc_disk

gd->queue = tr->blkcore_priv->rq; // tr->blkcore_priv->rq = blk_init_queue(mtd_blktrans_request, &tr->blkcore_priv->queue_lock);

add_disk

测试4th:

1. make menuconfig去掉内核自带的NAND FLASH驱动

-> Device Drivers

-> Memory Technology Device (MTD) support

-> NAND Device Support

< > NAND Flash support for S3C2410/S3C2440 SoC

2. make uImage

使用新内核启动, 并且使用NFS作为根文件系统,因为之前根文件系统在nand flash上面,现在内核去除了nand flash的驱动,内核就无法访问根文件系统了。

3. insmod s3c_nand.ko

4. 格式化 (参考下面编译工具)

flash_eraseall /dev/mtd3 //擦除后本身就格式化成 yaffs文件系统,所以不用再格式化了

5. 挂接

mount -t yaffs /dev/mtdblock3 /mnt

6. 在/mnt目录下建文件

编译工具:

1. tar xjf mtd-utils-05.07.23.tar.bz2

2. cd mtd-utils-05.07.23/util

修改Makefile:

#CROSS=arm-linux-

改为

CROSS=arm-linux-

3. make

4. cp flash_erase flash_eraseall /work/nfs_root/first_fs/bin/

flash_erase:只擦除一个扇区

flash_eraseall:整个分区都擦除掉


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top