历史上的今天
今天是: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
史海拾趣
|
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 ...… 查看全部问答> |
|
如题 本人脱产大专会计毕业,但对电子工程感兴趣,准备跨专业自学。报的自考本科。无奈看不懂。想从基础的学起。不知入门方向。请前辈们帮忙介绍下电子工程专业的入门书籍。 万分感谢! … 查看全部问答> |
|
[转自] 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 ...… 查看全部问答> |
|
我按照mini2240的eboot先进行分区。。前面25个block是NBOOT.eboot.TOc,后面就是分区MBR,我将根据NK的大小分出那么大的BINFS的分区,后面的都是分成FAT的分区。从打印的信息来看我的分区是正确的,但是我没有去读分区表的信息来确认。下面我给出我的 ...… 查看全部问答> |
|
本人初学Linux .请问这样的一个问题。从windows下如何复制一个文件到Linux系统? 这个可以实现的吗?要是可以实现的话.请赐教.谢谢. … 查看全部问答> |
|
由于我修改了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下一个开 ...… 查看全部问答> |
|
请问在matlab的simulink中进行DSPbuilder设计时,仿真的时候要调用modelsim仿真,但出现这个错误:# could not read \"d:\\softsetup\\quartusii\\quartus/libraries/vhdl/altera//alt_cusp80_package.vhd\": no such file or directory,请问大家 ...… 查看全部问答> |




