NandFlash驅動框架

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);

相關文章
相關標籤/搜索