ä»å¤©åå级æ¹æ¡ç¨å°äºmtd-utilsä¸çflash_eraseallåflash_cpä¸¤ä¸ªå·¥å ·ï¼å¨è¿è¡æ¹æ¡éªè¯çæ¶åï¼ééå°åç§ä¸è§£åçæï¼å 对MTDçåçä¸çæï¼æ以åªè½å¤æ¬¡å°è¯ï¼è½ç¶æåææ¹æ¡æå®äºï¼ä¸è¿è§å¾MTDä¸çmtdåmtdblockåºå«è¿åè¿æ¯å¼å¾æ»ç»å¦ä¹ ä¸ä¸ãè¿éå 说æä¸ä¸é®é¢ç°è±¡ï¼ç¶åå¨è¿è¡å ·ä½çåºå«åç解éãÂ
MTD设å¤(Nor Flash)使ç¨ä¸çé®é¢ç°è±¡è¡¨ç°Â
- mtd-utilså·¥å ·å¯¹mtdåmtdblockååºè®¾å¤çåºå«å¤çÂ
-
/ $ flash_eraseall /dev/mtdblock/2
flash_eraseall: /dev/mtdblock/2: unable to get MTD device info
/ $ flash_eraseall /dev/mtdblock/2
flash_eraseall: /dev/mtdblock/2: unable to get MTD device info
/ $ flash_eraseall /dev/mtd/2
Erasing 128 Kibyte @ 8e0000 -- 98 % complete.
/ $ ls
-
/ $ flashcp rootfs_version /dev/mtdblock2
This doesn't seem to be a valid MTD flash device!
/ $ flashcp rootfs_version /dev/mtdblock/2
This doesn't seem to be a valid MTD flash device!
/ $ flashcp rootfs_version /dev/mtd2
/ $ ls
- mtdåmtdblockååºè®¾å¤mountæ¶çåºå«Â
-
/ $ mount -t jffs2 /dev/mtd/2 qqzm/
mount: Mounting /dev/mtd/2 on qqzm/ failed: Invalid argument
/ $ mount -t jffs2 /dev/mtd2 qqzm/
mount: Mounting /dev/mtd2 on qqzm/ failed: Invalid argument
/ $ mount -t jffs2 /dev/mtdblock/2 qqzm/
/ $ ls
- mtdblockæè½½æåï¼åæ¦é¤åå¸è½½å¤±è´¥Â
-
/ $ flash_eraseall /dev/mtd/2 <span></span> Erasing 128 Kibyte @ 8e0000 -- 98 % complete.
/qqzm $ mount
/dev/root on / type jffs2 (rw,noatime)
proc on /proc type proc (rw,nodiratime)
sysfs on /sys type sysfs (rw)
devfs on /dev type devfs (rw)
devpts on /dev/pts type devpts (rw)
/dev/mmcblk0p1 on /mnt/sd type vfat (rw,nodiratime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)
/dev/mtdblock/2 on /qqzm type jffs2 (rw,noatime)
none on /qqzm/www/cgi-bin/tmp type ramfs (rw)
/qqzm $ cd ..
/ $ umount /qqzm
umount: Couldn't umount /qqzm: Inappropriate ioctl for device
/ $ umount /dev/mtdblock/2
umount: Couldn't umount /dev/mtdblock/2: Inappropriate ioctl for device
/ $
éè¿ä¸é¢çä¸æå°è¯åé误åé¦ï¼æææ¹æ¡åºæ¬éªè¯éè¿äºï¼åªæ¯å¯¹å ¶ä¸çåçä¸æ¸ æ¥ï¼Â
- 为ä»ä¹mtdåmtdblockæææ¯åä¸ä¸ªè®¾å¤ååºå´æä¸åçæä½ï¼Â
- mountå½ä»¤åªè½æè½½å设å¤åï¼Â
- å¸è½½mtdblock设å¤æ¶ï¼Inappropriate ioctl for deviceæ¯ä»ä¹ææï¼Â
- unable to get MTD device infoï¼åæ¯ä»ä¹ææï¼Â
MTDææ¯çåºæ¬åçÂ
MTD(memory technology deviceå åææ¯è®¾å¤)æ¯ç¨äºè®¿é®memory设å¤ï¼ROMãflashï¼çLinuxçåç³»ç»ãMTDç主è¦ç®çæ¯ä¸ºäºä½¿æ°çmemory设å¤ç驱å¨æ´å ç®åï¼ä¸ºæ¤å®å¨ç¡¬ä»¶åä¸å±ä¹é´æä¾äºä¸ä¸ªæ½è±¡çæ¥å£ï¼å¹¶è¿è¡äºä¸ä¸ªå±æ¬¡ååï¼å±æ¬¡ä»ä¸å°ä¸å¤§è´ä¸ºï¼è®¾å¤æ件ãMTD设å¤å±ãMTDåå§è®¾å¤å±ã硬件驱å¨å±ãMTDçæææºä»£ç å¨/drivers/mtdåç®å½ä¸ãÂ
ç³»ç»ä¸çMTD设å¤æ件Â
~ $ ls /dev/mtd* -l
crw-rw----  1 root   root   90,  0 Jan 1 00:00 /dev/mtd0
crw-rw----  1 root   root   90,  1 Jan 1 00:00 /dev/mtd0ro
crw-rw----  1 root   root   90,  2 Jan 1 00:00 /dev/mtd1
crw-rw----  1 root   root   90,  3 Jan 1 00:00 /dev/mtd1ro
crw-rw----  1 root   root   90,  4 Jan 1 00:00 /dev/mtd2
crw-rw----  1 root   root   90,  5 Jan 1 00:00 /dev/mtd2ro
crw-rw----  1 root   root   90,  6 Jan 1 00:00 /dev/mtd3
crw-rw----  1 root   root   90,  7 Jan 1 00:00 /dev/mtd3ro
brw-rw----  1 root   root   31,  0 Jan 1 00:00 /dev/mtdblock0
brw-rw----  1 root   root   31,  1 Jan 1 00:00 /dev/mtdblock1
brw-rw----  1 root   root   31,  2 Jan 1 00:00 /dev/mtdblock2
brw-rw----  1 root   root   31,  3 Jan 1 00:00 /dev/mtdblock3
Â
/dev/mtd:
crw-rw-rw-  1 root   root   90,  0 Jan 1 00:00 0
cr--r--r--  1 root   root   90,  1 Jan 1 00:00 0ro
crw-rw-rw-  1 root   root   90,  2 Jan 1 00:00 1
cr--r--r--  1 root   root   90,  3 Jan 1 00:00 1ro
crw-rw-rw-  1 root   root   90,  4 Jan 1 00:00 2
cr--r--r--  1 root   root   90,  5 Jan 1 00:00 2ro
crw-rw-rw-  1 root   root   90,  6 Jan 1 00:00 3
cr--r--r--  1 root   root   90,  7 Jan 1 00:00 3ro
Â
/dev/mtdblock:
brw-------  1 root   root   31,  0 Jan 1 00:00 0
brw-------  1 root   root   31,  1 Jan 1 00:00 1
brw-------  1 root   root   31,  2 Jan 1 00:00 2
brw-------  1 root   root   31,  3 Jan 1 00:00 3
~ $
å¯ä»¥çå°æmtdNå对åºç/dev/mtd/NãmtdblockNå对åºç/dev/mtdblock/N两类MTD设å¤ï¼åå«æ¯å符设å¤ï¼ä¸»è®¾å¤å·90åå设å¤ï¼ä¸»è®¾å¤å·31ãå ¶ä¸/dev/mtd0å/dev/mtd/0æ¯å®å ¨çä»·çï¼/dev/mtdblock0å/dev/mtdblock/0æ¯å®å ¨çä»·çï¼è/dev/mtd0å/dev/mtdblock0åæ¯åä¸ä¸ªMTDååºç两ç§ä¸ååºç¨æè¿°ï¼æä½ä¸æ¯æåºå«çãÂ
/dev/mtdN设å¤Â
/dev/mtdN æ¯MTDæ¶æä¸å®ç°çmtdååºæ对åºçå符设å¤(å°mtd设å¤åæå¤ä¸ªåºï¼æ¯ä¸ªåºå°±ä¸ºä¸ä¸ªå符设å¤)ï¼å ¶éé¢æ·»å äºä¸äºioctlï¼æ¯æå¾å¤å½ä»¤ï¼å¦MEMGETINFOï¼MEMERASEçãÂ
mtd-utilsä¸çflash_eraseallçå·¥å ·ï¼å°±æ¯ä»¥è¿äºioctl为åºç¡èå®ç°çå·¥å ·ï¼å®ç°ä¸äºå ³äºFlashçæä½ãæ¯å¦ï¼mtd å·¥å ·ä¸ flash_eraseallä¸ï¼Â
if (ioctl(fd, MEMGETINFO, &meminfo) != 0)Â
{
  fprintf(stderr, "%s: %s: unable to get MTD device info\n",exe_name, mtd_device);
  return 1;
}
MEMGETINFOæ¯Linux MTDä¸çdrivers/mtd/mtdchar.cä¸çioctlå½ä»¤ï¼ä½¿ç¨mtdå符设å¤éè¦å è½½mtdcharå æ ¸æ¨¡åã该代ç 解éäºä¸é¢ç第ä¸ä¸ªç°è±¡ãÂ
/dev/mtdblockN设å¤Â
/dev/mtdblockNï¼æ¯Flash驱å¨ä¸ç¨add_mtd_partitions()æ·»å MTD设å¤ååºï¼èçæç对åºçå设å¤ãMTDå设å¤é©±å¨ç¨åºå¯ä»¥è®©flashå¨ä»¶ä¼ªè£ æå设å¤ï¼å®é ä¸å®éè¿ææ´åçerase blockæ¾å°raméé¢è¿è¡è®¿é®ï¼ç¶ååæ´æ°å°flashï¼ç¨æ·å¯ä»¥å¨è¿ä¸ªå设å¤ä¸å建é常çæ件系ç»ãÂ
è对äºMTDå设å¤ï¼MTD设å¤å±æ¯ä¸æä¾ioctlçå®ç°æ¹æ³çï¼ä¹å°±ä¸ä¼æ对åºçMEMGETINFOå½ä»¤ä¹ç±»ï¼å æ¤ä¸è½ä½¿ç¨nandwrite,flash_eraseall,flash_eraseçå·¥å ·å»å¯¹/dev/mtdblockNå»è¿è¡æä½ï¼å¦åå°±ä¼åºç°ä¸é¢çç°è±¡ä¸ï¼åæ¶ä¹è§£éäºç°è±¡3ââç¨mtd2æ¦é¤ååºåï¼å¨ç¨mtdblock2è¿è¡umountå°±ä¼é ææ··ä¹±ãÂ
mtdå设å¤ç大å°å¯ä»¥éè¿procæ件系ç»è¿è¡æ¥çï¼Â
~ $ cat /proc/partitions
major minor #blocks name
Â
 31   0    512 mtdblock0
 31   1    1024 mtdblock1
 31   2    5632 mtdblock2
 31   3    9216 mtdblock3
 254   0  30760960 mmcblk0  Â
 254   1  30756864 mmcblk0p1
~ $
åé¢ç两个æ¯SDå设å¤çååºå¤§å°ãæ¯ä¸ªblockç大å°æ¯1KBãÂ
MTD设å¤ååºåæ»ç»
éè¿procæ件系ç»æ¥çmtd设å¤çååºæ åµï¼Â
~ $ cat /proc/mtd
dev:  size  erasesize name
mtd0: 00080000 00020000 "boot"
mtd1: 00100000 00020000 "kernel"
mtd2: 00580000 00020000 "roofs70"
mtd3: 00900000 00020000 "app"
~ $
å¯ä»¥åç°ï¼å®é ä¸mtdNåmtdblockNæè¿°çæ¯åä¸ä¸ªMTDååºï¼å¯¹åºåä¸ä¸ªç¡¬ä»¶ååºï¼ä¸¤è ç大å°æ¯ä¸æ ·çï¼åªä¸è¿æ¯MTD设å¤å±æä¾ç»ä¸å±çè§å¾ä¸ä¸æ ·ï¼ç»ä¸å±æä¾äºå符åå设å¤ä¸¤ç§æä½è§å¾ââ为äºä¸å±ä½¿ç¨ç便å©åéè¦ï¼æ¯å¦mountå½ä»¤çéæ±ï¼ä½ åªè½æè½½å设å¤(ææ件系ç»)ï¼èä¸è½å¯¹å符设å¤è¿è¡æè½½ï¼å¦åä¼åºç°ä¸é¢çç°è±¡2:æ æåæ°ãÂ
è¿é对äºmtdåmtdblock设å¤ç使ç¨åºæ¯è¿è¡ç®åæ»ç»ï¼Â
- mtd-utilså·¥å ·åªè½åºç¨ä¸/dev/mtdNçMTDå符设å¤Â
- mountãumountå½ä»¤åªå¯¹/dev/mtdblockNçMTDå设å¤ææÂ
- /dev/mtdNå/dev/mtdblockNæ¯åä¸ä¸ªMTD设å¤çåä¸ä¸ªååºï¼Nä¸æ ·ï¼
Linuxç³»ç»ä¸/dev/mtdä¸/dev/mtdblockçåºå«
MTD(memory technology deviceå åææ¯è®¾å¤)æ¯ç¨äºè®¿é®memory设å¤ï¼ROMãflashï¼çLinuxçåç³»ç»ãMTDç主è¦ç®çæ¯ä¸ºäºä½¿æ°çmemory设å¤ç驱 å¨æ´å ç®åï¼ä¸ºæ¤å®å¨ç¡¬ä»¶åä¸å±ä¹é´æä¾äºä¸ä¸ªæ½è±¡çæ¥å£ãMTDçæææºä»£ç å¨/drivers/mtdåç®å½ä¸ãæå°CFIæ¥å£çMTD设å¤å为åå± ï¼ä»è®¾å¤èç¹ç´å°åºå±ç¡¬ä»¶é©±å¨ï¼ï¼è¿åå±ä»ä¸å°ä¸ä¾æ¬¡æ¯ï¼è®¾å¤èç¹ãMTD设å¤å±ãMTDåå§è®¾å¤å±å硬件驱å¨å±ã
MTDå符驱å¨ç¨åºå 许ç´æ¥è®¿é®flashå¨ä»¶ï¼é常ç¨æ¥å¨flashä¸å建æ件系ç»ï¼ä¹å¯ä»¥ç¨æ¥ç´æ¥è®¿é®ä¸é¢ç¹ä¿®æ¹çæ°æ®ã
MTDå设å¤é©±å¨ç¨åºå¯ä»¥è®©flashå¨ä»¶ä¼ªè£ æå设å¤ï¼å®é ä¸å®éè¿ææ´åçerase blockæ¾å°raméé¢è¿è¡è®¿é®ï¼ç¶ååæ´æ°å°flashï¼ç¨æ·å¯ä»¥å¨è¿ä¸ªå设å¤ä¸å建é常çæ件系ç»ã
Â
1. /dev/mtdN æ¯Linux ä¸çMTDæ¶æä¸ï¼ç³»ç»èªå·±å®ç°çmtdååºæ对åºçå符设å¤(å°mtd设å¤åæå¤ä¸ªåºï¼æ¯ä¸ªåºå°±ä¸ºä¸ä¸ªå符设å¤)ï¼å ¶éé¢æ·»å äºä¸äºioctlï¼æ¯æå¾å¤å½ä»¤ï¼å¦MEMGETINFOï¼MEMERASEçã
èmtd-utilä¸çflash_eraseallçå·¥å ·ï¼å°±æ¯ä»¥è¿äºioctl为åºç¡èå®ç°çå·¥å ·ï¼å®ç°ä¸äºå ³äºFlashçæä½ãæ¯å¦ï¼mtd å·¥å ·ä¸ç flash_eraseallä¸çï¼
if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
  fprintf(stderr, "%s: %s: unable to get MTD device info\n", exe_name, mtd_device);
  return 1;
}
å ¶ä¸ï¼MEMGETINFOï¼å°±æ¯Linux MTDä¸çdrivers/mtd/mtdchar.cä¸çï¼
static int mtd_ioctl(struct inode *inode, struct file *file,
    u_int cmd, u_long arg)
{
ããããã
case MEMGETINFO:
  info.type = mtd->type;
  info.flags = mtd->flags;
  info.size = mtd->size;
  info.erasesize = mtd->erasesize;
  info.writesize = mtd->writesize;
  info.oobsize = mtd->oobsize;
 Â
  info.ecctype = -1;
  info.eccsize = 0;
  if (copy_to_user(argp, &info, sizeof(struct mtd_info_user)))
  return -EFAULT;
  break;
ããã
}
è/dev/mtdblockNï¼æ¯Nand Flash驱å¨ä¸ï¼é©±å¨ç¨add_mtd_partitions()æ·»å MTD设å¤ååºï¼å ¶å®å°±æ¯å°mtd设å¤è¿è¡ä¸åçååºï¼å½mtd设å¤è¿æ¯ä¸æ ·çï¼æ以mtdblockååºä¸mtdååºè¯å®æ¯å¯¹åºçï¼ï¼èçæç对åºçå设å¤ã
æ ¹æ®ä»¥ä¸å 容ï¼ä¹å°±æ´å æç½ï¼ä¸ºä»ä¹ä¸è½ç¨nandwrite,flash_eraseall,flash_eraseçå·¥å ·å»å¯¹/dev/mtdblockNå»æä½äºãå 为/dev/mtdblockä¸ä¸å å«å¯¹åºçioctlï¼ä¹å°±æ²¡æå®ä¹å¯¹åºçå½ä»¤ï¼ä¸æ¯æä½ è¿ä¹æä½ã
2. mtd char 设å¤ç主设å¤å·æ¯90ï¼èmtd block设å¤ç主设å¤å·æ¯31ï¼
# ls /dev/mtd* -l
crw-r-----  1 root   root   90,  0 May 30 2007 /dev/mtd0
crw-r-----  1 root   root   90,  2 May 30 2007 /dev/mtd1
crw-r-----  1 root   root   90,  4 Jul 17 2009 /dev/mtd2
crw-r-----  1 root   root   90,  6 May 30 2007 /dev/mtd3
crwxrwxrwx  1 root   root   90,  8 May 30 2007 /dev/mtd4
crwxrwxrwx  1 root   root   90, 10 May 30 2007 /dev/mtd5
crwxrwxrwx  1 root   root   90, 12 May 30 2007 /dev/mtd6
crwxrwxrwx  1 root   root   90, 14 May 30 2007 /dev/mtd7
crwxrwxrwx  1 root   root   90, 16 May 30 2007 /dev/mtd8
crwxrwxrwx  1 root   root   90, 18 May 30 2007 /dev/mtd9
# ls /dev/mtdblock* -l
brw-r-----  1 root   root   31,  0 May 30 2007 /dev/mtdblock0
brw-r-----  1 root   root   31,  1 May 30 2007 /dev/mtdblock1
brw-r-----  1 root   root   31,  2 May 30 2007 /dev/mtdblock2
brw-r-----  1 root   root   31,  3 May 30 2007 /dev/mtdblock3
brwxrwxrwx  1 root   root   31,  4 May 30 2007 /dev/mtdblock4
brwxrwxrwx  1 root   root   31,  5 May 30 2007 /dev/mtdblock5
brwxrwxrwx  1 root   root   31,  6 May 30 2007 /dev/mtdblock6
brwxrwxrwx  1 root   root   31,  7 May 30 2007 /dev/mtdblock7
brwxrwxrwx  1 root   root   31,  8 May 30 2007 /dev/mtdblock8
brwxrwxrwx  1 root   root   31,  9 May 30 2007 /dev/mtdblock9
æ¤è®¾å¤å·ï¼å®ä¹å¨/include/linux/mtd/mtd.hä¸ ï¼
#define MTD_CHAR_MAJOR Â 90
#define MTD_BLOCK_MAJOR 31
3. å ¶ä¸ï¼mtdçå设å¤ç大å°ï¼å¯ä»¥éè¿æ¥çååºä¿¡æ¯è·å¾ï¼
# cat /proc/partitions
major minor #blocks name
31 Â Â 0 Â Â Â 1024 mtdblock0
31 Â Â 1 Â Â Â 8192 mtdblock1
31 Â Â 2 Â Â 204800 mtdblock2
31 Â Â 3Â Â Â 65536 mtdblock3
31 Â Â 4 Â Â 225280 mtdblock4
ä¸é¢ä¸æ¾ç¤ºçå设å¤å¤§å°ï¼æ¯blockçæ°ç®ï¼æ¯ä¸ªblockæ¯1KBã
èæ¯ä¸ªå符设å¤ï¼å ¶å®å°±æ¯å¯¹åºçä¸é¢çæ¯ä¸ªå设å¤ãå³/dev/mtd0对åº/dev/mtdblock0ï¼å ¶ä»ä»¥æ¤ç±»æ¨ãæ¢å¥è¯è¯´ï¼mtdblockNçä¸äºå±æ§ï¼ä¹å°±æ¯mtdNçå±æ§ï¼æ¯å¦å¤§å°ã
4ã对æ¯ä¸ªmtdå符设å¤çæä½ï¼æ¯å¦å©ç¨nandwriteå»å¯¹/dev/mtd0åæ°æ®ï¼å®é å°±æ¯æä½/dev/mtdblock0ã
èè¿äºæä½éé¢æ¶åå°çå移éoffsetï¼é½æçæ¯æ¤mtd ååºå çå移ãæ¯å¦å/dev/mtd1çoffset为0çä½ç½®åå ¥æ°æ®ï¼å®é æä½çæ¯ç©çå移offset=/dev/mtd0ç大å°=1MB=0x100000ã
5.mtdçå符设å¤åå设å¤çå½åè§åï¼å¯ä»¥åèä¸è¡¨ï¼
Table 7-1. MTD /dev entries, corresponding MTD user modules, and relevant device major numbers
/dev entry Accessible MTD user module Device type Major number
mtdN char device char 90
mtdrN char device char 90
mtdblockN block device, read-only block device, JFFS, and JFFS2 block 31
nftlLN NFTL block 93
ftlLN FTL block 44
Table 7-2. MTD /dev entries, minor numbers, and naming schemes
/dev entry Minor number range Naming scheme
mtdN 0 to 32 per increments of 2 N = minor / 2
mtdrN 1 to 33 per increments of 2 N = (minor - 1) / 2
mtdblockN 0 to 16 per increments of 1 N = minor
nftlLN 0 to 255 per sets of 16 L = set;[2] N = minor - (set - 1) x 16; N is not appended to entry name if its value is zero.
ftlLN 0 to 255 per sets of 16 Same as NFTL.
The Linux MTD,YAFFS Howtoä¸é¢è¿æ ·åéï¼
Erase the mtdblock0
/>eraseall /dev/mtd0
Create the mount directory and mount
/>mkdir -p /mnt/flash0
/>mount -t yaffs /dev/mtdblock0 /mnt/flash0
为ä»ä¹eraseall对mtd0æä½ï¼èä¸å¯¹mtdblock0æä½ï¼nandä¸æ¯å设å¤åï¼mtdblockå°±æ¯å设å¤åãmtd0,mtd1ä¸mtdblock0,mtdblock1æ¯ä¸æ¯ä¸ä¸å¯¹åºçï¼
mtd-utils å·¥å ·ç使ç¨Â
ä¸.ä¸è½½æºç å ã
äº.ç¼è¯
1.ä¿®æ¹Makefile Â
CROSS=mipsel-linux-
2.make
3.å°ç¼è¯çæçå¯æ§è¡æ件COPYå°å¼åæ¿ä¸
ä¸.å½ä»¤ç使ç¨
使ç¨å½ä»¤åç¨cat /proc/mtd æ¥çä¸ä¸mtdcharå符设å¤ï¼æè ç¨ls -l /dev/mtd*
#cat /proc/mtd
dev:  size  erasesize name
mtd0: 00c00000 00020000 "ROOTFS"
mtd1: 00200000 00020000 "BOOTLOADER"
mtd2: 00200000 00020000 "KERNEL"
mtd3: 03200000 00020000 "NAND ROOTFS partition"
mtd4: 04b00000 00020000 "NAND DATAFS partition"
为äºæ´è¯¦ç»äºè§£ååºä¿¡æ¯ç¨mtd_debugå½ä»¤
#mtd_debug info /dev/mtdX (ä¸è½ä½¿ç¨mtdblockX, mtdblockX åªæ¯æä¾ç¨ä¾ mount èå·²)
mtd.type = MTD_NORFLASH
mtd.flags =Â
mtd.size = 12582912 (12M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 1Â
mtd.oobsize = 0Â
mtd.ecctype = (unknown ECC type - new MTD API maybe?)
regions = 0
å½ä»¤ï¼flash_erase
ä½ç¨ï¼æ¦åºæå®èå´å flashçå 容ï¼å¦æä¸æå®ï¼é»è®¤æ¦åºèµ·å§ä½ç½®ç第ä¸åï¼ä½¿ç¸åºflashåä¸ºå ¨1
ç¨æ³ï¼
flash_erase MTD-device [start] [cnt (# erase blocks)] [lock]
MTDï¼device:å¾ æ¦åºçååºï¼å¦/dev/mtd0
start:èµ·å§ä½ç½®è®¾ç½®ï¼è¿éå¿ é¡»è®¾ç½®ä¸º0x20000(128K)çæ´æ°å
cnt: ä»startå¼å§è®¡ç®ï¼è¦æ¦åºçåæ°
lock: åä¿æ¤Â              Â
eg: ./flash_erase /dev/mtd0 0x40000 5  //æ¦åºmtd0ååºä¸ä»0x40000å¼å§ç5åæ°æ® ï¼128K/å
å½ä»¤ï¼flash_eraseall
ä½ç¨ï¼æ¦åºæ´ä¸ªååºçæ°æ®,åæ¶ä¹ä¼ä½ååæ£æµ
ç¨æ³ï¼
flash_eraseall [OPTION] MTD_DEVICE
-q, --quiet  ä¸æ¾ç¤ºæå°ä¿¡æ¯
-j, --jffs2  ä¸jffs2 æ ¼å¼åååº
eg: ./flash_eraseall -j /dev/mtd0Â
å½ä»¤ï¼flashcp
ä½ç¨:copyãæ°æ®å° flash ä¸
ç¨æ³ï¼
usage: flashcp [ -v | --verbose ] <filename> <device>
    flashcp -h | --help
filename:å¾ åå ¥çæ°æ®
device: åå ¥çååºï¼å¦/dev/mtd0
eg: Â
filenameå¶ä½ï¼mkfs.jffs2 -e 0x20000 -d cq8401 -o cq8401.img -n //è¿éç-e 0x20000 å¿ é¡»æ´ä½ è¯ççerasesize ç¸ç
./flashcp cq8401.img /dev/mtd0 // copy cq8401.imgæ件系ç»å°Â /dev/mtd0ååºä¸
å½ç¶è¿ä¸ªå½ä»¤çåè½è· dd if=/tmp/fs.img of=/dev/mtd0å·®ä¸å¤
å½ä»¤ï¼nandwrite
ä½ç¨ï¼ånand flashä¸åæ°æ®
ç¨æ³ï¼
nandwrite [OPTION] MTD_DEVICE INPUTFILE
 -a, --autoplace    Use auto oob layout
 -j, --jffs2      force jffs2 oob layout (legacy support)
 -y, --yaffs      force yaffs oob layout (legacy support)
 -f, --forcelegacy   force legacy support on autoplacement enabled mtd device
 -n, --noecc      write without ecc
 -o, --oob       image contains oob data
 -s addr, --start=addr set start address (default is 0)
 -p, --pad       pad to page size
 -b, --blockalign=1|2|4 set multiple of eraseblocks to align to
 -q, --quiet      don't display progress messages
   --help      display this help and exit
   --version     output version information and exit
  Â
eg: ./nandwrite -p /dev/mtd0Â /tmp/rootfs.jffs2
å½ä»¤ï¼nanddump
ä½ç¨:dumpåºnand flashä¸äºä¿¡æ¯ï¼å¦ï¼block size,erasesize,oobblock 大å°ï¼oob data ,page dataçï¼åæ¶ä¹ä¼ä½ååæ£æµ
ç¨æ³ï¼
nanddump [OPTIONS] MTD-device
      --help        display this help and exit
      --version      output version information and exit
-f file  --file=file     dump to file
-i     --ignoreerrors    ignore errors
-l length --length=length   length
-o     --omitoob      omit oob data
-b     --omitbad      omit bad blocks from the dump
-p     --prettyprint    print nice (hexdump)
-s addr  --startaddress=addr start address
eg:./nanddump -p -f nandinfo.txt /dev/mtd0 //dumpåºnand flash /dev/mtd0æ°æ®å¹¶ä¿åå° nandinfo.txtÂ
å½ä»¤ï¼mtd_debug
ä½ç¨: 对mtd è°è¯ä½ç¨
ç¨æ³ï¼
usage: mtd_debug info <device>
    mtd_debug read <device> <offset> <len> <dest-filename>
    mtd_debug write <device> <offset> <len> <source-filename>
    mtd_debug erase <device> <offset> <len>
eg:
#./mtd_debug info /dev/mtd0 // è¾åº/dev/mtd0ä¸çä¸äºä¿¡æ¯,è¿éå¿ é¡»ç¨mtdx
#./mtd_debug erase /dev/mtd0 0x0 0x40000 // æ¦åº/dev/mtd0 ååºä¸ ä»0x0å¼å§çÂ ï¼ 128Kï¼2 大å°çæ°æ®
#./mtd_debug write /dev/mtdblock0 ox0 0x360810 cq8401.img //åmtdblock0ååºï¼åå ¥ 3.6M 大å°çæ件系ç»cq8401.img,è¿éæ好ç¨mtdblockx
#./mtd_debug read /dev/mtdblock0 ox0 0x360810 read.img //ä»mtdblock0ä¸è¯»åº 3.6M æ°æ®ä¿åå°read.img
# cmp -l cq8401.img read.img // éªè¯write to flash å read from flash ä¸çæ°æ®æ¯å¦ä¸è´;ä¹å¯ä»¥ä½¿ç¨diffå½ä»¤æ¥æ¯è¾
å¦å¤é对nand flash,mtd_debugè¿ä¸ªå·¥å ·æ¥æµè¯mtd驱å¨ä¹ä¸æ¯å¾å¥½ï¼ç¨nandwriteånanddumpè¿ä¸¤ä¸ªå·¥å ·æ许æ´å¥½ç¹ãç¶åå¯ä»¥ç¨cmpè¿ä¸ªå½ä»¤æ¥æ¯è¾ä¸ä¸nanddumpåºæ¥çæ°æ®ånandwriteåå ¥çæ°æ®æ¯å¦ä¸è´ã
å½ä»¤ï¼ftl_format
解éï¼In order to use one of conventional file systems ï¼Ext2, ext3, XFS, JFS, FATï¼ over an MTD device, you need a software layer which emulates a block device over the MTD device. These layers are often called Flash Translation Layers (FTLs).
ä¾ä¸ï¼å¦ä½æµè¯nor flash 驱å¨
step1:
#./mtd_debug info /dev/mtd0 // è¾åº/dev/mtd0ä¸çä¸äºä¿¡æ¯,è¿éå¿ é¡»ç¨mtdx
step2:
#./mtd_debug erase /dev/mtd0 0x0 0x40000 // æ¦åº/dev/mtd0 ååºä¸ ä»0x0å¼å§çÂ ï¼ 128Kï¼2 大å°çæ°æ®
step3:
#./mtd_debug write /dev/mtdblock0 ox0 0x360810 cq8401.img //åmtdblock0ååºï¼åå ¥ 3.6M 大å°çæ件系ç»cq8401.img,è¿éæ好ç¨mtdblockx
step4:
#./mtd_debug read /dev/mtdblock0 ox0 0x360810 read.img //ä»mtdblock0ä¸è¯»åº 3.6M æ°æ®ä¿åå°read.img,å½ç¶è¿éçé¿åº¦åºè¯¥ç¸ç
step5:
# cmp -l cq8401.img read.img // éªè¯write to flash å read from flash ä¸çæ°æ®æ¯å¦ä¸è´;ä¹å¯ä»¥ä½¿ç¨diffå½ä»¤æ¥æ¯è¾
ä¾äºï¼å¦ä½æµè¯nand flash 驱å¨
å ¶å®nand flash 驱å¨åæ ·å¯ä»¥ç¨ä¾ä¸çæ¹æ³æµè¯ï¼ä½æ¢ç¶ænandwrite,nanddumpå½ä»¤ï¼ä¸ºä½ä¸ç¨å¢ï¼
step1:
#./flash_eraseall -j /dev/mtd1    //ç¨jffs2æ ¼å¼å该ååº
step2:
#./nanddump -p /dev/mtd1 //dumpåºnand flash /dev/mtd1æ°æ®,å¯ä»¥çå°ç°å¨çæ°æ®å ¨æ¯ff
step3:
#./nandwrite -p  /dev/mtd1 cq8401.img // å°cq8401.imgæ件系ç»åå ¥mtd0ååº
step4:
#./nanddump -p /dev/mtd1 //dumpåºnand flash /dev/mtd1æ°æ®,å¯ä»¥çå°ç°å¨çæ°æ®ä¸åæ¯å ¨ff
ä¾ä¸ï¼å¦ä½ç¨mtd-util å·¥å ·ånand flashåå ¥æ件系ç»jffs2.img,并修æ¹å¯å¨åæ°ï¼ä½¿æ件系ç»ä»nand flash å¯å¨ï¼å设已å好åºï¼mtd0为æ件系ç»ååº
æ¹å¼ä¸ï¼
step1:
NFSèµ·æ件系ç»
#./flash_eraseall -j /dev/mtd0    //ç¨jffs2æ ¼å¼å该ååº
#./nandwrite -j -f -p -q /dev/mtd0 jffs2.img // å°jffs2.imgæ件系ç»åå ¥mtd0ååº
step2:
ç¶ååççæ们æ°åå ¥çJFFS2æ件系ç»è½ä¸è½mountä¸.
#mount -t jffs2 /dev/mtdblock0 /mnt
#ls /mnt
setp3:
éå¯å¼åæ¿ï¼å¨Uï¼BOOTé 设置å¯å¨åæ°
#setenv bootargs 'mem=64M console=ttyS0,115200n8 ip=192.168.4.201:::::eth0:off root=/dev/mtdblock0 rootfstype=jffs2 rw'
#reset
æ¹å¼äºï¼
NAND èµ·å æ ¸ï¼NANDèµ·æ件系ç»
1. ç½èµ·æ件系ç»
nerase 0 55 && nprog 0 192.168.4.200 n-boot.bin.hg && nprog 128 192.168.4.200 zImage-6pci && reset
2.è¿å ¥ç½èµ·çæ件系ç»
cat /proc/mtd
3. å¶ä½JIFFSçæ件系ç»
mkfs.jffs2 -e 0x20000 -d root-vw -o dvr20000.img -n
4.
cp dvr20000.img /dev/mtdblock1
5.ä¿®æ¹NAND BOOTå¯å¨åæ° include/cq8401_board.h
ä¿®æ¹NAND BOOT
setenv bootargs 'mem=64M console=ttyS0,115200n8 ip=192.168.4.201:::::eth0:off root=/dev/mtdblock1 rootfstype=jffs2 rw'
6. ä»æ°ç§å
nerase 0 55 && nprog 0 192.168.4.200 n-boot.bin.local && nprog 128 192.168.4.200 zImage-6pci && reset
ä¾åï¼
å¦ä½å°ä¸ä¸ª .tar.gzæ件系ç»Â åå° nor æè nand flashä¸
  target$ mkdir /mnt/flash  Â
  target$ mount -t jffs2 /dev/mtdblock0 /mnt/flash (mtdblockxåªæ¯ç¨æ¥æè½½ç)
  target$ cd /mnt/flash
  target$ tar zxvf rootfs.tar.gz
mtdå½ä»¤åå¶ä½ubiéååæ ¹æ件系ç»Â
2013-09-25 17:22 2315人é 读 è¯è®º(0) æ¶è 举æ¥
å¨linux2.6.28åæå å ¥å¯¹ubifsçæ¯æ
1 æ¥çnandååº
[email protected]:~# cat /proc/mtd
dev:  size  erasesize name
mtd0: 00020000 00020000 "U-Boot-min"
mtd1: 00240000 00020000 "U-Boot"
mtd2: 00020000 00020000 "U-Boot Env"
mtd3: 00440000 00020000 "Kernel"
mtd4: 1f400000 00020000 "File System"
mtd5: 00540000 00020000 "Reserved"
[email protected]:~# cat /proc/partitionsÂ
major minor #blocks name
 31    0    128 mtdblock0
 31    1    2304 mtdblock1
 31    2    128 mtdblock2
 31    3    4352 mtdblock3
 31    4   512000 mtdblock4
 31    5    5376 mtdblock5
[email protected]:~#Â
2ãæ¥çmtd4çä¿¡æ¯Â
[email protected]:~# mtdinfo -m 4 -u
mtd4
Name: Â Â Â Â Â Â Â Â Â Â Â Â Â File System
Type: Â Â Â Â Â Â Â Â Â Â Â Â Â nand
Eraseblock size:Â Â Â Â Â Â Â Â 131072 bytes, 128.0 KiB
Amount of eraseblocks:Â Â Â Â Â 4000 (524288000 bytes, 500.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size:Â Â Â Â Â Â Â Â Â 512 bytes
OOB size: Â Â Â Â Â Â Â Â Â Â Â 64 bytes
Character device major/minor: Â 90:8
Bad blocks are allowed: Â Â Â Â true
Device is writable: Â Â Â Â Â Â true
Default UBI VID header offset:Â 512
Default UBI data offset:Â Â Â Â 2048
Default UBI LEB size: Â Â Â Â Â 129024 bytes, 126.0 KiB
Maximum UBI volumes count:Â Â Â 128
[email protected]:~# mtdinfo -m 2 -uÂ
æ
[email protected]:~# mtdinfo /dev/mtd4
mtd2
Name: Â Â Â Â Â Â Â Â Â Â Â Â Â U-Boot Env
Type: Â Â Â Â Â Â Â Â Â Â Â Â Â nand
Eraseblock size:        131072 bytes, 128.0 KiB  // FLASHç©çæ¦é¤å大å°
Amount of eraseblocks:Â Â Â Â Â 1 (131072 bytes, 128.0 KiB)
Minimum input/output unit size: 2048 bytes  1ï¼nor flash:é常æ¯1个åè 2ï¼nand falshï¼ä¸ä¸ªé¡µé¢Â
Sub-page size:         512 bytes //对äºnand flashæ¥è¯´ï¼å页大å°Â
OOB size: Â Â Â Â Â Â Â Â Â Â Â 64 bytes
Character device major/minor: Â 90:4
Bad blocks are allowed: Â Â Â Â true
Device is writable: Â Â Â Â Â Â true
Default UBI VID header offset:Â 512
Default UBI data offset:Â Â Â Â 2048
Default UBI LEB size:      129024 bytes, 126.0 KiB //é»è¾æ¦é¤å大å°
Maximum UBI volumes count:Â Â Â 128
mtd4大å°ä¸º500MiB,æ¦é¤åå 大å°(ä¸è¬å³ä¸ºå大å°)为128KiBï¼ååæ¯"NAND simulator partition 0"ã NandFlash
æ¦é¤æ¯ä»¥å(block)为åä½ï¼è¯»åæ¯ä»¥é¡µ(page)为åä½ã
3 [email protected]:~# ls -lah /dev/mtd*
crw------- 1 root root 90, 0 Jan 1 00:00 /dev/mtd0 //å符设å¤
crw------- 1 root root 90, 1 Jan 1 00:00 /dev/mtd0ro
crw------- 1 root root 90, 2 Jan 1 00:00 /dev/mtd1
crw------- 1 root root 90, 3 Jan 1 00:00 /dev/mtd1ro
crw------- 1 root root 90, 4 Jan 1 00:00 /dev/mtd2
crw------- 1 root root 90, 5 Jan 1 00:00 /dev/mtd2ro
crw------- 1 root root 90, 6 Jan 1 00:00 /dev/mtd3
crw------- 1 root root 90, 7 Jan 1 00:00 /dev/mtd3ro
crw------- 1 root root 90, 8 Jan 1 00:00 /dev/mtd4
crw------- 1 root root 90, 9 Jan 1 00:00 /dev/mtd4ro
crw------- 1 root root 90, 10 Jan 1 00:00 /dev/mtd5
crw------- 1 root root 90, 11 Jan 1 00:00 /dev/mtd5ro
brw-rw---- 1 root disk 31, 0 Jan 1 00:00 /dev/mtdblock0 //å设å¤ï¼ä¸mtd0对åº
brw-rw---- 1 root disk 31, 1 Jan 1 00:00 /dev/mtdblock1
brw-rw---- 1 root disk 31, 2 Jan 1 00:00 /dev/mtdblock2
brw-rw---- 1 root disk 31, 3 Jan 1 00:00 /dev/mtdblock3
brw-rw---- 1 root disk 31, 4 Jan 1 00:00 /dev/mtdblock4
brw-rw---- 1 root disk 31, 5 Jan 1 00:00 /dev/mtdblock5
[email protected]:~#Â
4.Â
å ³äºmtdå·¥å ·éçå®è£
  sudo apt-get install mtd-utils
UBIæ件系ç»éåæ件çå¶ä½
@ubuntu:~$ sudo mkfs.ubifs -r targetfs -m 2048 -e 129024 -c 3900 -o ubifs.img
@ubuntu:~$ sudo ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
å ³äºmkfs.ubifsåæ°çç®æ³
 -m minimum I/O unit size
 -e, --leb-size=SIZE   logical erase block size
 -c maximum logical erase block count
 -x compression type - "lzo", "favor_lzo", "zlib" or "none" (default: "lzo")
 -p size of the physical eraseblock of the flash this UBI image is created for in bytes
wear_level_reserved_blocks is 1% of total blcoks per device
*logical_erase_block_size* is physical erase block size minus 2 pages for UBI
Block size = page_size * pages_per_block
physical blocks on a partition = partition size / block size
Logical blocks on a partition = physical blocks on a partitiion - reserved for wear level
File-system volume = Logical blocks in a partition * Logical erase block size
å ³äºåæ°å¯ä»¥åèattachçå½ä»¤è¾åºï¼
[email protected]:~# ubiattach /dev/ubi_ctrl -m 4 -d 0
UBI device number 0, total 4000 LEBs (516096000 bytes, 492.2 MiB), available 0 LEBs (0 bytes), LEB
size 129024 bytes (126.0 KiB)
[email protected]:~#Â
ubinize.cfgæ件
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=450MiB
vol_type=dynamic
vol_alignment=1
vol_name=rootfs
vol_flags=autoresize
5. UBIæ件系ç»éåå¨Linuxä¸çç§å
flash_eraseall /dev/mtd4
ubiformat /dev/mtd4 -s 512 -f /xxx/ubi.img
6ã UBIæ件系ç»éåå¨U-BOOTä¸çç§å
//load ubi image to RAM
tftp ubi.img
//erase MTD4 nand space
nand erase 0x6c0000 0xc820000
//write image to nand
nand write.i 0x81000000 0x6c0000 0xxxxx(image size)
7. UBIæ件系ç»éåå¨Linuxä¸çæè½½åå¸è½½
æè½½
ubiattach /dev/ubi_ctrl -m 4 -d 0
mount -t ubifs ubi0_0 /mnt/ubi
å¸è½½
umount /mnt/ubi
ubidetach -d 0
8ã使ç¨ubiåæ ¹æ件系ç»
éè¦å¨bootargsä¸è®¾ç½®å¦ä¸ä¿¡æ¯ï¼
 root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
 é ç½®linuxå æ ¸
      é ç½®çæ¶åéä¸
     1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI
     2)File systems --->Miscellaneous filesystems --->UBIFS file system support
     è¿æ ·æ们çå æ ¸å°±æ¯æUBIFSæ件系ç»äº