注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

nandflash驱动源代码  

2012-09-24 05:59:47|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#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/cpufreq.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 <plat/regs-nand.h>
#include <plat/nand.h>

struct s3c_nand_reg {
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  ;  
};
static struct nand_chip *s3c_nand_chip;
static struct mtd_info *s3c_mtd_info;
static struct s3c_nand_reg *nand_regs;
static struct clk *nand_clk;

//这是分区表
static struct mtd_partition s3c_part_table[] = {
[0] = {
.name = "bootloader",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = 0x00020000,
},
[2] = {
.name = "kernel",
.offset =MTDPART_OFS_APPEND ,
.size = 0x00200000,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
  };


static void nand_cmd_ctrl(struct mtd_info *mtd, int cmd,unsigned int ctrl)
{

if (ctrl & NAND_CLE)
{
nand_regs->nfcmd = cmd;
}
else
{
nand_regs->nfaddr = cmd;
}
}

static void nand_select_chip(struct mtd_info *mtd, int chipnr)
{
if(chipnr == -1)
{
nand_regs->nfcont |= (1<<1);
}
else
{
nand_regs->nfcont &= ~(1<<1);
}
}

static int nand_dev_ready(struct mtd_info *mtd)
{
return (nand_regs->nfstat & (1<<0));
}


static int s3c_nand_init(void)
{
//第一步:nand使能时钟
nand_clk = clk_get(NULL , "nand");
clk_enable(nand_clk);
//第二步:映射nand寄存器
nand_regs = ioremap(0x4e000000 , sizeof(struct s3c_nand_reg));
//第三步:我们们根据nand_scan下的nand_scan_ident下的nand_set_defaults来设置s3c_nand_chip 
s3c_nand_chip = kzalloc(sizeof(struct nand_chip) ,GFP_KERNEL);
s3c_nand_chip->select_chip = nand_select_chip;
s3c_nand_chip->cmd_ctrl = nand_cmd_ctrl;
s3c_nand_chip->IO_ADDR_R = &nand_regs->nfdata;
s3c_nand_chip->IO_ADDR_W = &nand_regs->nfdata;
s3c_nand_chip->dev_ready = nand_dev_ready;
s3c_nand_chip->ecc.mode = NAND_ECC_SOFT;//?§???í??ecc
//第四步:硬件相关设置
nand_regs->nfconf = (1<<8);
nand_regs->nfcont = (1<<1)|(1<<0);

//第五步:调用nand_scan来设置操作函数
s3c_mtd_info = kzalloc(sizeof(struct mtd_info) ,GFP_KERNEL);
s3c_mtd_info->priv    = s3c_nand_chip;
s3c_mtd_info->owner   = THIS_MODULE;
nand_scan(s3c_mtd_info , 1);

//第六步:添加分区,调用mtd_device_register
mtd_device_register(s3c_mtd_info , s3c_part_table ,4);
return 0;
}

static void s3c_nand_exit(void)
{
mtd_device_unregister(s3c_mtd_info);
kfree(s3c_mtd_info);
kfree(s3c_nand_chip);
iounmap(nand_regs);
}

module_init(s3c_nand_init);
module_exit(s3c_nand_exit);
MODULE_LICENSE("GPL");

  评论这张
 
阅读(1735)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017