NAND Flash普及

目前NAND Flash已经很普及了。我们平时所用的SD、TF、CF、U盘,其实都是一个NAND Flash芯片颗粒加上一个控制器而成。控制器的不同就形成了丰富的接口。 而目前世面上的MP3、MP4、包括速度最快、也是价格最贵的SSD,其实也是一个控制器加上N个NAND Flash颗粒构成。 我们公司在CPU的换代中也渐渐使用了NAND Flash。 下面就介绍了目前的NAND Flash的技术、工艺以及CPU对NAND的控制器。方便以后研发。 背景介绍 NAND Flash相对于NOR Flash来说,容量大,价格低,速度快。但是优点的引入必然会带了缺陷。由于制造工艺的问题,NAND Flash在生产和使用过程中会出现坏块。 坏块指的是擦除后无法变成1的扇区,通常有2钟: 出厂时有厂家标记的坏块 在使用过程中生成的坏块 由于NAND Flash坏块的存在,所以在使用时就需要对读写的数据做校验。通常使用CPU内部的ECC或者Linux MTD的软ECC对Flash做校验。 Linux MTD采用BBT记录坏区,并将这个BBT保存在芯片的最后一个好的扇区中,并且做冗余。并且使用NAND Flash每个Page的apare array,用来存储ECC和其他数据,Linux MTD下称之为OOB。 NAND Flash分类 制造工艺 从制造工艺来说,NAND Flash分为3钟:SLC/MLC/TCL。…

MPC8309 NAND Flash启动

之前我做了MPC8309+K9F5608U0D (16MB)的启动。一直想把移植过程写出来,后来耽搁了也没写。正好这次公司定MPC8309 CPU方案准备采用K9F2G08U0C(256MB)。移植完后就有了下面的文章。 前景提要 之前移植K9F5608U0C的时候可谓复杂。我们最早焊的是64M的K9F1208U0C,但是Freescale的Code Warrior上只有K9F5608U0D的选项。本着Dev的考虑,我认为1208和5608仅仅在与前者比后者多了几个Block,产品ID不一样,于是我试着改了一下Code Warrior的FPDeviceConfig.xml。 结果惊奇的发现在FPDeviceConfig.xml文件中,K9F5608U0D的manufacturerid是35,id是75。这个不合道理啊。如果按照Freescale的CWFLASHPROWP.pdf上所述,SamSung的manufacturerid应该是EC,id应该是75。于是我把manufacturerid和id来回调换,都不成。于是我直接直接换了一片K9F5608U0D,又找FAE要了他机器上面的K9F5608x0D.elf和K9F5608x0D_utility.elf。终于可以用CW烧写NAND Flash了。 移植K9F2G08SU0C 有了上次的经验,我试了一下CW自带的K9F2G08X0A。结果很悲剧,还是无法操作FLASH,我看了看它的manufacturerid和id,分别被设置成23和EC。还是猜不透。 我又翻读了AN3859.pdf文档,AN3859上说:"Samsung uses its own algorithm for flash programming, not compatible with other vendors"。如果本身自带的elf不行的话只有自己编写适合自己所用芯片的algorithem文件了。于是我找到了CW目录下的NAND Flash例程。而他的例程针对的是MPC8360和K9NBG08U5M,NAND Flash和我目前所用差距太大,直接在CPU上仿真发现老是进入取指异常。而查看它的源码有了点新发现。它的getFlashID实现中: [crayon-6823d2a035f65007238979/] 看起来manufacturerid取的是第3个字节,id取的是第二个字节,于是我有来回倒腾manufacturerid和id。最终一无所获。 实在没有办法,我在Freescale的论坛上发了帖子。同时我试图先通过NOR Flash启动,然后在u-boot下将编好的U-boot下载到NAND…

LPC2366 Ethernet CRC error

最近公司用NXP的LPC2366做了一个新板子。很奇怪。我们使用之前现成的程序,发现网络ping不通。但是这个程序在之前的板子上是可以正常工作的。 后来同事使用周立功的程序跑了一下,OK,可以ping通。现在就有一个奇怪的现象: 老程序在老板子能正常工作 老程序在新板子不能正常工作 周立功的程序在新老板子都能正常工作 问题来了,究竟是程序的问题还是硬件的问题呢? 今天终于得空把这个问题整理一下。首先我在老程序的网络中断中增加了打印信息,主要是中断类型和接收报文的状态信息。在新老2个板子上测试。 发现在老板子上多报出AlignmentError和CRCError错误。看来应该是CRC错误导致报文无法被进一步处理。因为老程序的协议栈我还是非常相信的。没办法,google吧。 LPC2000系列的MCU在yahoo上有一个group,于是我在上面搜索了一下。果然发现一个帖子也是遇到了CRC错误的问题,他最后给出的问题原因是PHY芯片的CRS和CRSDV不是同一个管脚,是不是我们的问题原因也是这个呢?于是看了一下原理图,发现果然犯了一样的错误。DM9161的作为RMII使用时,CRSDV应该接到35脚,但是我们的设计接到了37脚。明显接错了。割线飞线,问题解决。 参考 RE: [lpc2000] LPC2368 and KSZ8041NL

DDR设计

AT91SAM9G25 DDR2布线规则 首先,DDR离CPU越近越好。很长的走线会增加信号的上升时间和下降时间。CPU发起的信号建立时间也会因为走线长度的增加而减小 保证DDR的时钟和控制线越短越好 保证DDR的地址和数据线越短越好 对于工作在133MHz的DDR2,线上的阻抗匹配是必须的。10-30Ω的串联电阻可以放置在所有的转换信号以限制过流。这个电阻需要靠近CPU放置。是否需要终端电阻以及它的特性最好使用仿真来决定,使用IBIS模型和特定的PCB layout。在SAM9G25上,采用的是27Ω的串联电阻。 为支持最大速度,必须遵守合理的DDR2负载。对于高速操作,地址线和数据线的最大负载不能超过30pF,SDCK和#SDCK为10pF。用户必须考虑接在不同总线上的所有器件,来计算系统的总负载。 MPC8315 DDR2布线规则 建议的布线顺序:1) DATA, 2) Address/Command, 3) Control, 4) Clocks, 5) Power 阻抗匹配 单端阻抗 = 50 - 60Ω(MDQ, MDM, Address, Command, Control)…

pppd拨号出错

修改dialer文件,通常位于/etc/dialer。在char一行中增加-s参数,如下: [crayon-6823d2a036224915276117/] 其中,-s为使用标准错误。所有由“-v”产生的日志信息和所有的错误信息将发送到标准错误。如果pppd在前台运行则信息输出到stdout和stderr,否则输出到/etc/ppp/connect-errors。 然后查看/etc目录下是否有ppp目录。 调用拨号脚本 查看/etc/ppp/connect-errors文件,此文件包含的拨号的详细过程。下面为成功拨号的信息 # cat /etc/ppp/connect-errors timeout set to 3 seconds abort on (\nBUSY\r) abort on (\nNO ANSWER\r) abort on (\nRINGING\r\n\r\nRINGING\r) send (rAT^M) send (rAT+CGDCONT=1,IP,CMNET^M) expect (OK)…

T430无法正常关机

最近新配了一台电脑。更换了SSD硬盘。性能相当给力。 可惜的是发现有的时候不能正常关机,在最后关机的画面停掉了。 昨天binging了一下。有人说是联想的6.32电池管理工具造成的,看了下我的版本,正好是6.32。于是卸载之。下了最新的电池管理工具。昨天晚上还行。今天中午又挂了。 于是直接卸载之,用1个星期看看如何。 备选方案: 更换为3.6几的管理工具 在BIOS关掉虚拟功能

Cross-compile iptables

今天编译了iptables着实令我郁闷了一下。 我们的kernel用的是linux-2.6.36-rc2。由于历史原因,客户应用层使用的编译器和我们编译kernel的编译器不一样。 结果就很悲摧: iptables v1.4.12.1: can't initialize iptables table `filter': Invalid argument Perhaps iptables or your kernel needs to be upgraded. 查了一下bing,从什么大之前开始google就一直在抽风。 找到了一个更加令人悲摧的地方:http://www.iptables.info/en/iptables-problems.html This is a bit more serious since…

Cross-compile vsftpd

下载vsftp源码 然后修改Makefile,将CC修改为$(CROSS_COMPILE)gcc 编译即可。 默认vsftpd需要PAM支持。如果使用busybox做rootfs的话支持PAM比较麻烦,可以将sysdeputil.c文件中关于“pam_”开头的函数调用全部删除。然后重新编译。 编译最后会出现如下错误: arm-linux-gcc -o vsftpd main.o utility.o prelogin.o ftpcmdio.o postlogin.o privsock.o tunables.o ftpdataio.o secbuf.o ls.o postprivparent.o logging.o str.o netstr.o sysstr.o strlist.o banner.o filestr.o parseconf.o secutil.o ascii.o oneprocess.o…