tag 标签: nandflash

相关帖子
相关博文
  • 热度 2
    2024-1-11 17:55
    309 次阅读|
    0 个评论
    本文基于HD6UL-IOT评估板进行验证。HD6UL-IOT基于HD6UL-CORE工业级核心板设计(双网口、双CAN、7路串口),接口丰富,采用3.5寸工控板标准尺寸,适用于工业现场应用需求,亦方便用户评估核心板及CPU的性能。 1.查看dtb文件分区 使用cat/proc/mtd命令查看dtb设备树文件在nand中存储的分区。 2.提取dtb设备树文件 输入ddif=/dev/mtd1of=/home/xxx.dtb在mtd1分区中提取dtb设备树文件到home目录下。 3.反编译dtb设备树文件 提取出dtb文件后,将dtb文件拷贝到linux虚拟机内,进入到linux内核目录scripts/dtc下找到dtc工具使用一下目录对dtb设备树文件进行反编译: ./dtc-Idtb-Odts-oxxx.dtsxxx.dtb
  • 热度 16
    2014-12-10 10:54
    786 次阅读|
    0 个评论
      大家好,又到了天嵌【嵌入式分享】的时间,相对于前几期【嵌入式分享】做的主要是TQ335X开发板的技术分享,本期决定做同是cortex-a8系列的TQ210开发板的技术分享。本期是关于TQ210开发板的Nand flash驱动编写,可能源码部分会比较多,本文由博主girlkoo编写,感谢他的分享。   跟裸机程序一样,S5PV210(TQ210)的Nand flash模块跟S3C2440(TQ2440)的Nand flash模块非常相似,如果不引入ECC,驱动程序的编写也非常简单,我是使用的Linux-3.8.6(Linux-3.8.3也一样)内核,驱动的API函数有些变化,不过原理是相通的,稍微看一下内核源码并参考下其他平台的相关代码就可以自己写出Nand flash驱动了,下面是Nand flash驱动的源码,没有启用ECC,当然,你也可以改成软件ECC,但是我的觉得既然软件ECC不如HWECC快,我就采用硬件ECC吧。   #include   #include   #include   #include   #include   #include   #include   #include   struct s5p_nand_regs{   unsigned long nfconf;   unsigned long nfcont;   unsigned long nfcmmd;   unsigned long nfaddr;   unsigned long nfdata;   unsigned long nfmeccd0;   unsigned long nfmeccd1;   unsigned long nfseccd;   unsigned long nfsblk;   unsigned long nfeblk;   unsigned long nfstat;   unsigned long nfeccerr0;   unsigned long nfeccerr1;   unsigned long nfmecc0;   unsigned long nfmecc1;   unsigned long nfsecc;   unsigned long nfmlcbitpt;   };   struct s5p_nand_ecc{   unsigned long nfeccconf;   unsigned long nfecccont;   unsigned long nfeccstat;   unsigned long nfeccsecstat;   unsigned long nfeccprgecc0;   unsigned long nfeccprgecc1;   unsigned long nfeccprgecc2;   unsigned long nfeccprgecc3;   unsigned long nfeccprgecc4;   unsigned long nfeccprgecc5;   unsigned long nfeccprgecc6;   unsigned long nfeccerl0;   unsigned long nfeccerl1;   unsigned long nfeccerl2;   unsigned long nfeccerl3;   unsigned long nfeccerl4;   unsigned long nfeccerl5;   unsigned long nfeccerl6;   unsigned long nfeccerl7;   unsigned long nfeccerp0;   unsigned long nfeccerp1;   unsigned long nfeccerp2;   unsigned long nfeccerp3;   unsigned long nfeccconecc0;   unsigned long nfeccconecc1;   unsigned long nfeccconecc2;   unsigned long nfeccconecc3;   unsigned long nfeccconecc4;   unsigned long nfeccconecc5;   unsigned long nfeccconecc6;   };   static struct nand_chip *nand_chip;   static struct mtd_info *s5p_mtd_info;   static struct s5p_nand_regs *s5p_nand_regs;   static struct s5p_nand_ecc *s5p_nand_ecc;   static struct clk *s5p_nand_clk;   static struct mtd_partition s5p_nand_partions = {   .name = "bootloader",   .offset = 0,   .size = SZ_1M,   },    = {   .name = "kernel",   .offset = MTDPART_OFS_APPEND,   .size = 5*SZ_1M,   },    = {   .name = "rootfs",   .offset = MTDPART_OFS_APPEND,   .size = MTDPART_SIZ_FULL,   },   };   static void s5p_nand_select_chip(struct mtd_info *mtd, int chipnr){   if(chipnr == -1){   s5p_nand_regs-nfcont |= (11);   }   else{   s5p_nand_regs-nfcont = ~(11);   }   }   static void s5p_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)   {   if (ctrl NAND_CLE){   s5p_nand_regs-nfcmmd = cmd;   }   else{   s5p_nand_regs-nfaddr = cmd;   }   }   static int s5p_nand_ready(struct mtd_info *mtd){   return (s5p_nand_regs-nfstat 0x1);   }   static int s5p_nand_probe(struct platform_device *pdev){   int ret = 0;   struct resource *mem;   //硬件部分初始化   mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);   if (!mem) {   dev_err(pdev-dev, "can't get I/O resource mem\n");   return -ENXIO;   }   s5p_nand_regs = (struct s5p_nand_regs *)ioremap(mem-start, resource_size(mem));   if (s5p_nand_regs == NULL) {   dev_err(pdev-dev, "ioremap failed\n");   ret = -EIO;   goto err_exit;   }   s5p_nand_ecc = (struct s5p_nand_ecc *)ioremap(0xB0E20000, sizeof(struct s5p_nand_ecc));   if(s5p_nand_ecc == NULL){   dev_err(pdev-dev, "ioremap failed\n");   ret = -EIO;   goto err_iounmap;   }   s5p_nand_clk = clk_get(pdev-dev, "nand");   if(s5p_nand_clk == NULL){   dev_dbg(pdev-dev, "get clk failed\n");   ret = -ENODEV;   goto err_iounmap;   }   clk_enable(s5p_nand_clk);   s5p_nand_regs-nfconf = (312)|(58)|(34)|(11);   s5p_nand_regs-nfcont |= 3;   //分配驱动相关结构体   nand_chip = (struct nand_chip *)kzalloc(sizeof(struct nand_chip), GFP_KERNEL);   if(nand_chip == NULL){   dev_err(pdev-dev, "failed to allocate nand_chip structure\n");   ret = -ENOMEM;   goto err_clk_put;   }   s5p_mtd_info = (struct mtd_info *)kzalloc(sizeof(struct mtd_info), GFP_KERNEL);   if(s5p_mtd_info == NULL){   dev_err(pdev-dev, "failed to allocate mtd_info structure\n");   ret = -ENOMEM;   goto err_free_chip;   }   //设置驱动相关结构体   nand_chip-select_chip = s5p_nand_select_chip;   nand_chip-cmd_ctrl = s5p_nand_cmd_ctrl;   nand_chip-IO_ADDR_R = s5p_nand_regs-nfdata;   nand_chip-IO_ADDR_W = s5p_nand_regs-nfdata;   nand_chip-dev_ready = s5p_nand_ready;   nand_chip-ecc.mode = NAND_ECC_SOFT;   s5p_mtd_info-priv = nand_chip;   s5p_mtd_info-owner = THIS_MODULE;   //扫描Nand flash 设备   if(nand_scan(s5p_mtd_info, 1)){   dev_dbg(pdev-dev, "nand scan error\n");   goto err_free_info;   }   //添加分区信息   ret = mtd_device_parse_register(s5p_mtd_info, NULL, NULL, s5p_nand_partions, ARRAY_SIZE(s5p_nand_partions));   if(!ret)   return 0;   err_free_info:   kfree(s5p_mtd_info);   err_free_chip:   kfree(nand_chip);   err_clk_put:   clk_disable(s5p_nand_clk);   clk_put(s5p_nand_clk);   err_iounmap:   //if(s5p_nand_ecc == NULL)   // iounmap(s5p_nand_ecc);   if(s5p_nand_regs == NULL)   iounmap(s5p_nand_regs);   err_exit:   return ret;   }   static int s5p_nand_remove(struct platform_device *pdev){   nand_release(s5p_mtd_info);   kfree(s5p_mtd_info);   kfree(nand_chip);   clk_disable(s5p_nand_clk);   clk_put(s5p_nand_clk);   if(s5p_nand_regs == NULL)   iounmap(s5p_nand_regs);   return 0;   }   static struct platform_driver s5p_nand_drv = {   .driver = {   .owner = THIS_MODULE,   .name = "s5p-nand",   },   .probe = s5p_nand_probe,   .remove = s5p_nand_remove,   };   module_platform_driver(s5p_nand_drv);   MODULE_LICENSE("GPL");   上述源码为嵌入式爱好者分享,如有更新,请咨询相关客服与销售人员,以便更新与开发。   操作所使用的硬件:   TQ210V6开发板
  • 热度 13
    2013-10-20 22:15
    1044 次阅读|
    0 个评论
      国际大厂商如三星(samsung),现代(hynix),镁光(Micron)等厂商的小容量nand flash 都已逐步停产,市场也呈现缺货涨价势头。下面给大家介绍最近2年风头正劲的韩国ATO公司的小容量nand flash,由于供货稳定,性价比好,开始受到各大生产厂商的热捧。       ATO的nand flash 目前主要以256Mb,512Mb,1Gb为主,相较于高容量产品例如32GB  64GB,ATO公司低容量NAND flash主要是用来取代Nor-Flash,主要产品应用于相机、对讲机,手机、LED电视,机顶盒等领域,占总NAND Flash市场约10%。ATO Solution自有技术开发设计的SLC 256Mb快闪记忆体(NAND Flash)产品,同时在去年国际积体电路研讨会暨展览会(IIC China)中参展,并将于今年的82届中国电子展上海展会再次跟大家见面。        相对NOR Flash, NAND Flash通常只有在具有技术优越性的国际记忆体大厂才有能力生产。ATO Solution借由独特性设计技术让产品微型化,大幅提高了ATO产品成本上的竞争力,ATO 256Mb ,512Mb ,1Gb 的NAND Flash SLC以扩大现有低容量产品线阵容。凭藉着高品质与价格竞争优势,ATO毫无疑问的脱颖而出,ATO的看好市场的空缺,生产的产品不仅可以替代市场上大厂Samsung、Hynix、ST Micron等停产的容量的NAND,同时为工程师们提供了更多的新思路,可以替代之前使用nor flash的产品。 Nand flash的系列产品如下图片,大家可以参考下。
  • 热度 33
    2013-10-10 10:50
    3679 次阅读|
    1 个评论
      FPGA读取NandFlash的ID   最近在工作上碰到NandFlash烧录器,自己又在学习FPGA,就打算自己做个简易的烧录器。 为了确保可行性,偷偷把公司的烧录器拆开看了一下(放心,早就过了保修期),Altera的FPGA加单片机。果然不出所料,可行。又在淘宝上找找有没有带NandFlash的FPGA开发板,毕竟只是想做软件而已,没必要自己焊线。也顺便看看,有没有附带NandFlash的FPGA程序。可惜找了好久没发现,有一家做了带NandFlash扩展板,不过没有程序。最后想来想去,还是在原本的FPGA开发板上跳线吧,因为手头上有个NandFlash烧录座子,所以跳线还是很好跳的,就电源地还有十几根控制数据线而已。以现在FPGA的基础,能把NandFlash几个常用操作搞掂就算不错了。说干就干,先从读取ID开始。 NandFlash的硬件连接,我就接了3.3V和GND,其他信号线全部连接到FPGA的IO口,所有都没有上拉。因为ReadID不需要,等以后其他操作需要在考虑。NandFlash的信号线什么意思我就不多说了,百度谷歌多的是。 FPGA NandFlash控制器网上发表的文档也很多,可惜verilog编写的程序少之又少,可能都当宝吧。难得找到一些,可惜看不懂,对于菜鸟的我,甚是伤心。无奈之下,决定自己重头开始写,慢慢下吧。慢慢写都花了两天时间,伤不起啊。为此,分享一下,就当铺路吧。 我用的是HY27UF(08_16)2G2B 这款NandFlash,命令ReadID时序图如下   reg   Cnt; reg   FID; reg   DID; reg   ID_detail_1; reg   ID_detail_2; reg   ID_detail_3; output CE_n; output WE_n; output RE_n; output ALE; output CLE; output WP_n; inout   DATA; input R_B_n; always @ (negedge reset or posedge clkin)//clkin尝试达到24MHZ都可以,可能这和跳线有关系吧 if (!reset)  begin Led = 3'b001; Cnt=0; WP_n=1; CE_n=1; CLE=0; ALE=0; WE_n=1; RE_n=1; end else begin Cnt=Cnt+1; test=~test; case(Cnt)  1://初始化 begin  Led = 3'b011; CE_n=0;  en=1; end 2://发送readid命令 begin  CLE=1; ALE=0; WE_n=0;//low RE_n=1; data_reg=8'h90;  end 3: begin  CLE=1; ALE=0; WE_n=1;//high RE_n=1; end 4://发送地址 begin  CLE=0; ALE=1; WE_n=0;//low RE_n=1; data_reg=8'h00;  end 5: begin  CLE=0; ALE=1; WE_n=1;//high RE_n=1; end 6:;//delay 1 time 7://读取FID begin  CLE=0; ALE=0; WE_n=1; RE_n=0;//low en=0; end 8: begin  CLE=0; ALE=0; WE_n=1; RE_n=1;//high end 9: begin  FID=DATA; end 10://读取DID begin  CLE=0; ALE=0; WE_n=1; RE_n=0;//low end 11: begin  CLE=0; ALE=0; WE_n=1; RE_n=1;//high end 12: begin  DID=DATA; end 13://读取ID_detail_1 begin  CLE=0; ALE=0; WE_n=1; RE_n=0;//low end 14: begin  CLE=0; ALE=0; WE_n=1; RE_n=1;//high end 15: begin  ID_detail_1=DATA; end 16://读取ID_detail_2 begin  CLE=0; ALE=0; WE_n=1; RE_n=0;//low end 17: begin  CLE=0; ALE=0; WE_n=1; RE_n=1;//high end 18: begin  ID_detail_2=DATA; end 19://ID_detail_3 begin  CLE=0; ALE=0; WE_n=1; RE_n=0;//low end 20: begin  CLE=0; ALE=0; WE_n=1; RE_n=1;//high end 21: begin  ID_detail_3=DATA; end   22://结束 begin  WP_n=1; CE_n=1; CLE=0; ALE=0; WE_n=1; RE_n=1; Cnt=22; Led = 3'b111; end default:; endcase end   assign DATA=en?data_reg:8'bzzzz_zzzz;   写都花了两天时间,伤不起。所以ID都能正确读取,我用的是数码管显示,有图为证。事实证明,焊接功夫必须够硬,而且焊接的线路要分明,最起码让人看得舒服,最好就是把它当成艺术品去做,这样才会赏心悦目。臭美啦,哈哈!     转载记得留点痕迹。 QQ交流方式:350352197
相关资源