历史上的今天

今天是:2025年10月13日(星期一)

正在发生

2022年10月13日 | mini2440 简单nandflash驱动代码记录(2.6.32.2内核)

发布者:ShiningSmile 来源: csdn关键字:mini2440  nandflash驱动  6  2内核 手机看文章 扫描二维码
随时随地手机看文章

#include <linux/module.h>

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#include

#include

#include

#include

 

#include

 

#include

#include

 

static struct nand_chip *mini2440_nand;

static struct mtd_info *mini2440_mtd_info;

 

static struct nand_regs_t{

unsigned long NFCONF;

unsigned long NFCONT;

unsigned long NFCMD;

unsigned long NFADDR;

unsigned long NFDATA;

unsigned long NFMECCD0;

unsigned long NFMECCD1;

unsigned long NFSECCD;

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 volatile struct nand_regs_t *nand_regs;

 

 

static void grh_select_chip(struct mtd_info *mtd, int chipnr){

if(-1 == chipnr){ //取消选中nfcont[1] = 1

nand_regs->NFCONT |= (1<<1);

}

else{ //选中芯片 nfcont[1] = 0

nand_regs->NFCONT &= ~(1<<1);

}

}

 

static void grh_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl){

if(ctrl & NAND_CLE){ //发送命令 nfcmmd = dat

nand_regs->NFCMD = dat;

}

else{ //发送地址 nfaddr = dat

nand_regs->NFADDR = dat;

}

}

 

static int grh_dev_ready(struct mtd_info *mdt){

//return nfstat[0]

return nand_regs->NFSTAT &(1<<0);

}

 

//falsh分区表

static struct mtd_partition grh_nand_parts[] = {

[0] = {

.name = "grh_supervivi",

.size = 0x00040000,

.offset = 0,

},

[1] = {

.name = "grh_param",

.offset = 0x00040000,

.size = 0x00020000,

},

[2] = {

.name = "grh_Kernel",

.offset = 0x00060000,

.size = 0x00500000,

},

[3] = {

.name = "grh_root",

.offset = 0x00560000,

.size = 1024 * 1024 * 1024, //

},

[4] = {

.name = "grh_nand",

.offset = 0x00000000,

.size = 1024 * 1024 * 1024, //

}

};

 

 

static int nand_init(void){

struct clk *clk;

/*分配nand_chip结构体

  该结构体里面需要提供对nandflash的硬件操作(发命令,发数据,读数据,复位,选通等)的

  具体实现,mtd_info实现了怎么用命令来操作flash,而nand_chip就得在更低一层对命令进行实现

*/

mini2440_nand = kzalloc(sizeof(struct nand_chip), GFP_KERNEL);

nand_regs = ioremap(0x4e000000, sizeof(struct nand_regs_t));

 

//设置参数

mini2440_nand->select_chip = grh_select_chip; //设置选中芯片的函数

mini2440_nand->cmd_ctrl = grh_cmd_ctrl; //设置发送命令和地址的函数

mini2440_nand->IO_ADDR_R = &(nand_regs->NFDATA); //nfdata虚拟地址

mini2440_nand->IO_ADDR_W = &(nand_regs->NFDATA); //nfdata虚拟地址

mini2440_nand->dev_ready = grh_dev_ready; //判断芯片是否就绪的函数

mini2440_nand->ecc.mode = NAND_ECC_SOFT; //软件生成ECC校验码,存入OOB区

//使能nandflash控制器时钟,才能操作相关的寄存器

clk = clk_get(NULL, "nand");

clk_enable(clk);

 

//设置硬件相关的时间参数

nand_regs->NFCONF = 0<<12; //TACLS=0

nand_regs->NFCONF |= (1<<8); //TWRPH0=1

nand_regs->NFCONF |= (0<<4); //TWRPH1=0

 

nand_regs->NFCONT |= (1<<1); //先不选中芯片

nand_regs->NFCONT |= (1<<0); //使能nandflash控制器

 

//使用nand_chip

mini2440_mtd_info = kzalloc(sizeof(struct mtd_info), GFP_KERNEL);

mini2440_mtd_info->owner = THIS_MODULE;

mini2440_mtd_info->priv = mini2440_nand;

 

//扫描识别芯片构造mtd_info结构体,mtd_info确定了对flash进行读写需要怎么发送命令

nand_scan(mini2440_mtd_info, 1); 

 

//add_mtd_partition划分flash的分区

add_mtd_partitions(mini2440_mtd_info , grh_nand_parts , 5);

return 0;

}

 

static void nand_exit(void){

iounmap(nand_regs);

kfree(mini2440_nand);

kfree(mini2440_mtd_info);

return ;

}

 

module_init(nand_init);

module_exit(nand_exit);

 

MODULE_AUTHOR("GRH");

MODULE_VERSION("1.0");

MODULE_DESCRIPTION("NAND FLASH DRIVER");

MODULE_LICENSE("GPL");

————————————————

版权声明:本文为CSDN博主「皓首不倦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/xiaohaowudi_grh/article/details/38810601


关键字:mini2440  nandflash驱动  6  2内核 引用地址:mini2440 简单nandflash驱动代码记录(2.6.32.2内核)

上一篇:mini2440 入门块设备驱动(用RAM缓存模拟磁盘)代码记录(内核用的是2.6.32.2)
下一篇:mini2440 make menuconfig 找不到Flash CFI支持的解决办法

推荐阅读

都说现在企业融资难,事实上在某些行业,钱太多了也是“病”。2016年开始,工业机器人行业的资本热潮一直烧到现在,危机四伏。 “现在是最黑暗的时候。工业机器人行业本身很枯燥乏味,一直不受资本关注。直到2016年开始,行业集中涌入大量热钱。两年多时间过去了,现在越来越危险。”一位长期关注工业机器人领域的投资人告诉投资界。 在这个圈子里,很...
尽管从2018年开始到现在,SCARA市场增速有所下滑,但是,2014-2018年期间,应用在3C、新能源行业的SCARA工业机器人年均复合增长率41.66%,远超工业机器人整体销量28.81%的年均复合增速。 2019年,入局者的增多,新品的层出不穷以及应用场景的进一步开拓都预示着SCARA领域竞争更加激烈,甚至可以用“贴身肉搏”来形容,有业内人士提出,不用多久,最多1-...
1984年,Ross Freeman与同事共同创立了赛灵思公司,并推出了世界上第一颗真正意义上的FPGA芯片XC2064,一个全新的行业就此诞生。2020年,历经36年发展的赛灵思公司早已成为硅谷中的明星公司,FPGA行业也今非昔比。5G、AI为这个行业带来了难得的机会,广阔的发展空间就在眼前,但是领头者赛灵思公司却突然陷入了收购的传闻中。人们不禁会发问,独立的FPGA...
如果我们不仅能为全球最亟需的地方提供能源,而且是提供经济高效的能源,会怎么样?这是谈到发展中国家时经常会提出的问题,这些国家的电网往往处于初级发展阶段。由于无法储存能源,并在需求高峰时段调节能源的使用,所以不可避免地会出现停电、限电甚至导致能源短缺问题。目前面临的核心问题就是能源存储:市面上没有经济高效的电池可用来补充现有的电网...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved