聯詠IPCAM/DVR/NVR產品的儲存裝置除了少數採用eMMC外,大多數都選用NAND或NOR flash。不論是NAND或NOR flash,在Linux系統驅動程式皆採用通用儲存裝置介面為基礎的Linux MTD (Memory Technologies Device)架構。開發階段可以透過USB/SD/ethernet更新flash,出貨後不一定會能保留上述方式,其中一套工具mtd-utils是基於Linux MTD開發出來的一套opensource工具,附有實用的更新工具,提供彈性運用或搭配OTA更新,首先確認聯詠的實際partition分割狀態。
root@NVTEVM:~$ cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "loader"
mtd1: 00040000 00020000 "fdt"
mtd2: 00040000 00020000 "fdt.restore"
mtd3: 00200000 00020000 "uboot"
mtd4: 00040000 00020000 "uenv"
mtd5: 00460000 00020000 "kernel"
mtd6: 03200000 00020000 "rootfs"
mtd7: 02500000 00020000 "rootfs1"
mtd8: 021a0000 00020000 "app"
mtd9: 08000000 00020000 "all"
上述資訊即為每個partition對應的mtd編號,另外可以透過/dev/mtd* 來檢視mtd的區塊,可能會注意到mtd裝置分成/dev/mtd與/dev/mtdblock
/dev/mtdblock並非是eraseblock,不能對其做read/write操作,而/dev/mtd是Linux的mtdcore驅動實作mtd partition的裝置,mtdcore驅動內部支援ioctl並可以對實體位址進行操作,因此下面表格的工具皆透過此ioctl來完成對flash的寫入。
工具 |
命令 |
範例 |
$ flash_eraseall |
$ flash_eraseall [-jNq] MTD_DEVICE |
$ flash_eraseall /dev/mtd6 |
$ nandwrite |
$ nandwrite [-p] [-s ADDR] MTD_DEVICE [FILE] |
$nandwrite -p /dev/mtd6 rootfs.ramdisk.bin.raw |
更新rootfs的方法為
$ flash_eraseall /dev/mtd6
$nandwrite -p /dev/mtd6 rootfs.ramdisk.bin.raw
這樣的操作並不會影響當前的檔案系統,重開機後就可以看到更新後的內容,同理其他的mtd partition也同樣可以更新。
mtd-utils其他實用的工具如下
- flashcp可以將image寫入mtd裝置
- nanddump可以檢查mtd裝置資訊,一般常用於檢查mtd寫入是否有問題
工具 |
命令 |
範例 |
$ flashcp |
$ flashcp -v FILE MTD_DEVICE |
$ flashcp -v rootfs.ramdisk.bin.raw /dev/mtd6 |
$ nanddump |
$nanddump [-o] [--bb=padbad|skipbad] [-s ADDR] [-l LEN] [-f FILE] MTD_DEVICE |
$nanddump -f nandinfo.txt /dev/mtd6 |