1.首先和前面的幾個驅動程序類似,須要分配一個nand_chip結構體函數
s3c_nand = kzalloc(sizeof(struct nand_chip), GFP_KERNEL);spa
而後填充該結構體code
/* 2. 設置nand_chip */
/* 設置nand_chip是給nand_scan函數使用的, 若是不知道怎麼設置, 先看nand_scan怎麼使用
* 它應該提供:選中,發命令,發地址,發數據,讀數據,判斷狀態的功能
*/blog
s3c_nand->select_chip = s3c2440_select_chip;//片選函數 s3c_nand->cmd_ctrl = s3c2440_cmd_ctrl;//發送指令函數 s3c_nand->IO_ADDR_R = &s3c_nand_regs->nfdata;//讀 s3c_nand->IO_ADDR_W = &s3c_nand_regs->nfdata;//寫 s3c_nand->dev_ready = s3c2440_dev_ready;//狀態識別 s3c_nand->ecc.mode = NAND_ECC_SOFT;//使用ecc校驗
2.在設置硬件以前先使能nandflash時鐘:ip
struct clk *clk;rem
clk = clkget(NULL, "nand");get
clk_enable(clk);cmd
3.接着進行硬件寄存器的配置,nandflash寄存器較多且是連續的,這裏能夠用一個nand_regs結構體實現ioremap flash
struct s3c_nand_regs { unsigned long nfconf ; unsigned long nfcont ; unsigned long nfcmd ; unsigned long nfaddr ; unsigned long nfdata ; unsigned long nfeccd0 ; unsigned long nfeccd1 ; unsigned long nfeccd ; unsigned long nfstat ; unsigned long nfestat0; unsigned long nfestat1; unsigned long nfmecc0 ; unsigned long nfmecc1 ; unsigned long nfsecc ; unsigned long nfsblk ; unsigned long nfeblk ; };
4.使用nand_scan it
s3c_mtd = kzalloc(sizeof(struct mtd_info), GFP_KERNEL);
s3c_mtd->owner = THIS_MODULE;
s3c_mtd->priv = s3c_nand;
nand_scan(s3c_mtd, 1);//識別NANDFLASH,構造mtd_info
5.增長mtd分區
add_mtd_partitions(s3c_mtd, s3c_nand_parts, 4);