历史上的今天
返回首页

历史上的今天

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

正在发生

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

2022-10-13 来源:csdn

#include

#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


推荐阅读

史海拾趣

Bogen Communications Inc公司的发展小趣事

在电子行业的激烈竞争中,Bogen Communications Inc公司凭借一项革命性的技术创新,迅速崭露头角。该公司研发出一种新型的音频处理芯片,极大地提升了通信设备的音质和性能。这一创新不仅赢得了市场的广泛认可,还为公司带来了大量的订单和合作伙伴。随着技术的不断完善和市场的扩大,Bogen Communications Inc逐渐成为了音频通信领域的领导者。

Communications & Power Industries公司的发展小趣事

随着全球化进程的加速,CPI意识到要想在电子行业中取得更大的发展,必须积极拓展国际市场。公司积极寻求与国际知名企业的合作机会,通过技术共享和市场合作,成功打开了多个海外市场。同时,CPI还加强了与国际研究机构的合作,不断引进先进的技术和管理经验,提升了自身的竞争力。这些国际合作不仅为CPI带来了更多的商业机会,也推动了公司在全球范围内的品牌传播和市场拓展。

Conditioning Semiconductor Devices Corp公司的发展小趣事

随着全球环保意识的提高,半导体行业也面临着环保和可持续发展的挑战。CSDC积极响应这一趋势,将环保理念融入公司的生产和运营中。通过采用环保材料和工艺,减少生产过程中的污染排放,CSDC不仅降低了对环境的影响,还提升了企业的社会形象。同时,公司还积极参与环保公益活动,推动半导体行业的绿色发展。

这些故事展示了半导体设备公司可能经历的一些关键发展阶段和面临的挑战。虽然这些故事是虚构的,但它们基于半导体行业的现实背景和趋势进行构建,具有一定的参考价值。

BSI公司的发展小趣事

随着科技的不断发展,电子行业的技术创新日新月异。在这个过程中,BSI通过提供最新的技术信息和标准,为企业的技术创新提供了有力支持。BSI建立了庞大的标准数据库,涵盖了电子行业的各个领域,为企业提供了丰富的技术资源和参考依据。同时,BSI还积极参与新技术的研发和推广工作,为电子行业的创新发展提供了动力。

FRONTIER公司的发展小趣事

背景:假设FRONTIER公司也涉足绿色能源领域。

发展故事:面对全球气候变化和环境问题的日益严峻,FRONTIER公司积极响应可持续发展号召,开始布局绿色能源产业。公司通过引进先进的光伏技术、储能技术和智能电网技术,成功打造了一系列绿色能源解决方案。这些解决方案不仅有效降低了企业的能耗和碳排放量,还为全球能源转型和环境保护做出了积极贡献。FRONTIER的绿色转型不仅赢得了市场的认可和支持,也为公司未来的可持续发展奠定了坚实基础。

Good-Ark公司的发展小趣事
检查放大器、滤波器等元件是否正常工作,是否存在短路、断路等问题。

问答坊 | AI 解惑

专辑类——电子基础类专辑

21 世纪大学新型参考教材系列 集成电路A、B 荒井 https://bbs.eeworld.com.cn/thread-96367-1-8.html 21 世纪电子电气工程师系列 数字电路 173 页 3.0M https://bbs.eeworld.com.cn/thread-96370-1-8.html @@ 电子技术数字逻辑基础第5 版 533 ...…

查看全部问答>

请前辈帮忙介绍入门学习电子工程的基础书

如题   本人脱产大专会计毕业,但对电子工程感兴趣,准备跨专业自学。报的自考本科。无奈看不懂。想从基础的学起。不知入门方向。请前辈们帮忙介绍下电子工程专业的入门书籍。   万分感谢!  …

查看全部问答>

NK.bin与NK.nb0的区别

[转自] http://www.itxxh.cn  /Article/view.asp?id=102 [引] 在config.bib文件中,有如下三个设置: ROMSTART=xxxx ROMWIDTH=xxxx ROMSIZE=xxxxxx 这3个变量必须被赋值. [/引] nk.bin和nk.nb0都是CE的镜像。然而,我们在下 ...…

查看全部问答>

uclinux jedce_probe探测ID,变成flash的内容

Flash:两片SST39VF3201 ,一片挂CS0:地址0x80000000 一片挂CS1:地址0x81000000 使用jecdec探测 static struct map_info lpc24xx_map[2] = { {     .name =        \"LPC24XX\",     .bankw ...…

查看全部问答>

wince5.0+2440 文件系统加载问题

我按照mini2240的eboot先进行分区。。前面25个block是NBOOT.eboot.TOc,后面就是分区MBR,我将根据NK的大小分出那么大的BINFS的分区,后面的都是分成FAT的分区。从打印的信息来看我的分区是正确的,但是我没有去读分区表的信息来确认。下面我给出我的 ...…

查看全部问答>

从windows下复制一个文件到Linux系统

本人初学Linux .请问这样的一个问题。从windows下如何复制一个文件到Linux系统? 这个可以实现的吗?要是可以实现的话.请赐教.谢谢. …

查看全部问答>

没有修改工程,再次编译PB5.0时候会出现错误,怎么回事?

由于我修改了BSP导致液晶屏不亮了,所以我把原来光盘的BSP覆盖被修改的BSP,结果出现了如下错误,真是悬了。怎么回事?PB5.0也太不稳定了吧。 cannot open program database \'c:\\wince500\\public\\shell\\oak\\lib\\armv4i\\retail…

查看全部问答>

发开发板啦!数十块开发板等你拿!

发开发板啦!数十块开发板等你拿! Qemu 仿mini2440开发板v2.pdf qemu仿integratorcp开发板(arm) .pdf   当然这里只有两块,你要有兴趣,可以仿真更多开发板   我在这里回答下下面提的问题 一、qemu是什么? qemu是Linux下一个开 ...…

查看全部问答>

双T网络的设计问题

我现在在做一个用于测试双T网络,要求中心频率30K,带宽100hz,用的是有源双T,但仿真时发现波特图如下 看各位怎么解决。…

查看全部问答>

关于DSPbuilder仿真的问题

请问在matlab的simulink中进行DSPbuilder设计时,仿真的时候要调用modelsim仿真,但出现这个错误:# could not read \"d:\\softsetup\\quartusii\\quartus/libraries/vhdl/altera//alt_cusp80_package.vhd\": no such file or directory,请问大家 ...…

查看全部问答>