NAND FLASH驅動程序
#include "linux/module.h"
#include "linux/types.h"
#include "linux/init.h"
#include "linux/kernel.h"
#include "linux/string.h"
#include "linux/ioport.h"
#include "linux/platform_device.h
#include "linux/delay.h"
#include "linux/err.h"
#include "linux/slab.h"
#include "linux/clk.h"
#include "linux/mtd/mtd.h"
#include "linux/mtd/nand.h"
#include "linux/mtd/nand_ecc.h"
#include "linux/mtd/partitions.h"
#include "asm/io.h"
#include "asm/arch/regs-nand.h"
#include "asm/arch/nand.h"
struct s3c_nand_regs {
};
static struct nand_chip *s3c_nand;
static struct mtd_info *s3c_mtd;
static struct s3c_nand_regs *s3c_nand_regs;
static struct mtd_partition s3c_nand_parts[] = {
};
static void s3c2440_select_chip(struct mtd_info *mtd, int chipnr)
{
}
static void s3c2440_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl)
{
}
static int s3c2440_dev_ready(struct mtd_info *mtd)
{
}
static int s3c_nand_init(void)
{
/ 設置nand_chip是給nand_scan函數使用的, 如果不知道怎么設置, 先看nand_scan怎么使用
/ 它應該提供:選中,發命令,發地址,發數據,讀數據,判斷狀態的功能
// 使能NAND FLASH控制器的時鐘
* TACLS: 發出CLE/ALE之后多長時間才發出nWE信號, 從NAND手冊可知CLE/ALE與nWE可以同時發出,所以TACLS=0
* TWRPH0: nWE的脈沖寬度, HCLK x ( TWRPH0 + 1 ), 從NAND手冊可知它要>=12ns, 所以TWRPH0>=1
* TWRPH1: nWE變為高電平后多長時間CLE/ALE才能變為低電平, 從NAND手冊可知它要>=5ns, 所以TWRPH1>=0
//
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0
* BIT1-設為1, 取消片選
* BIT0-設為1, 使能NAND FLASH控制器
//
}
static void s3c_nand_exit(void)
{
}
module_init(s3c_nand_init);
module_exit(s3c_nand_exit);
MODULE_LICENSE("GPL");
=================================================================
NAND FLASH是一個存儲芯片
那么: 這樣的操作很合理"讀地址A的數據,把數據B寫到地址A"
問1. 原理圖上NAND FLASH和S3C2440之間只有數據線,
答1.在DATA0~DATA7上既傳輸數據,又傳輸地址
問2. 從NAND FLASH芯片手冊可知,要操作NAND FLASH需要先發出命令
答2.在DATA0~DATA7上既傳輸數據,又傳輸地址,也傳輸命令
問3. 數據線既接到NAND FLASH,也接到NOR FLASH,還接到SDRAM、DM9000等等
答3. 這些設備,要訪問之必須"選中",
問4. 假設燒寫NAND FLASH,把命令、地址、數據發給它之后,
答4. 通過狀態引腳RnB來判斷:它為高電平表示就緒,它為低電平表示正忙
問5. 怎么操作NAND FLASH呢?
答5. 根據NAND FLASH的芯片手冊,一般的過程是:
發命令 選中芯片
發地址 選中芯片 NFADDR=地址值
發數據 選中芯片 NFDATA=數據值
讀數據 選中芯片 val=NFDATA
用UBOOT來體驗NAND FLASH的操作:
1. 讀ID
選中 NFCONT的bit1設為0 md.l 0x4E000004 1; mw.l 0x4E000004 1
發出命令0x90 NFCMMD=0x90 mw.b 0x4E000008 0x90
發出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
讀數據得到0xEC val=NFDATA md.b 0x4E000010 1
讀數據得到device code val=NFDATA md.b 0x4E000010 1
退出讀ID的狀態 NFCMMD=0xff mw.b 0x4E000008 0xff
2. 讀內容: 讀0地址的數據
使用UBOOT命令:
nand dump 0
Page 00000000 dump:
選中 NFCONT的bit1設為0 md.l 0x4E000004 1; mw.l 0x4E000004 1
發出命令0x00 NFCMMD=0x00 mw.b 0x4E000008 0x00
發出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
發出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
發出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
發出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
發出地址0x00 NFADDR=0x00 mw.b 0x4E00000C 0x00
發出命令0x30 NFCMMD=0x30 mw.b 0x4E000008 0x30
讀數據得到0x17 val=NFDATA md.b 0x4E000010 1
讀數據得到0x00 val=NFDATA md.b 0x4E000010 1
讀數據得到0x00 val=NFDATA md.b 0x4E000010 1
讀數據得到0xea val=NFDATA md.b 0x4E000010 1
退出讀狀態 NFCMMD=0xff mw.b 0x4E000008 0xff
NAND FLASH驅動程序層次
看內核啟動信息
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2440-nand s3c2440-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 256 at 0x02000000
Bad eraseblock 257 at 0x02020000
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 (driversmtdnand)
s3c2410_nand_inithw
s3c2410_nand_init_chip
nand_scan // drivers/mtd/nand/nand_base.c 根據nand_chip的底層操作函數識別NAND FLASH,構造mtd_info
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
s3c2410_nand_add_partition
測試4th:
1. make menuconfig去掉內核自帶的NAND FLASH驅動
-> Device Drivers
2. make uImage
3. insmod s3c_nand.ko
4. 格式化 (參考下面編譯工具)
5. 掛接
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/


評論