LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: laowang_buaa

在写一个嵌入式Linux构建的初级教程,先放上两篇,请大家拍拍转。

[复制链接]
 楼主| 发表于 2009-12-29 23:21:37 | 显示全部楼层
构建嵌入式Linux系统初级实践教程(四)

6、试验MTD设备
QEMU的ARM VersatlilePB虚拟机没有实现FLASH的模拟,所以我们使用硬盘模拟MTD设备,即内核的block2mtd驱动。
(1)内核配置之硬盘支持:
Bus support --> PCI Support;
Device Drivers --> SCSI device support --> SCSI disk support, Probe all LUN on each SCSI device, SCSI low-level drivers --> SYM53C8XX Version 2 SCSI support

--> use memory mapped IO

(2)内核配置之MTD支持:
Device Drivers --> Memory Technology Device (MTD) support --> Direct char device access to MTD devices, Cache block device access to MTD device, self-
contained MTD device drivers --> MTD using block device

(3)创建模拟MTD的硬盘映像:
qemu-img create -f raw ~/test/block2mtd.img 64M

(4)启动QEMU,增加MTD命令行参数:
qemu-system-arm -M versatilepb -kernel ~/linux-2.6.29.4/arch/arm/boot/zImage -initrd ~/arm-busybox.cpio.gz -nographic -append "console=ttyAMA0
block2mtd.block2mtd=/dev/sda,131072" -hda ~/test/block2mtd.img
上面命令行中的
block2mtd.block2mtd=/dev/sda,131072
就是block2mtd驱动的命令行参数,它以/dev/sda来模拟MTD设备(FLASH),FLASH设备的擦除块的大小是131072字节(128k)

(5)虚拟机系统启动后,在 /dev 目录下出现了 mtd0, mtd0ro, mtdblock0 等设备文件名。查看 /proc/mtd 文件,可以看到MTD设备信息。我们可以在 /dev/mtd0 设备上运行前
面编译好的mtd-utilis软件包中的命令,如 flash_info 命令,试验对MTD设备的操作。

7、NAND FLASH的模拟
内核中有 nandsim 驱动,可以用内存模拟NAND FLASH设备,我们就用它试验NAND FLASH设备的操作。我们采用内核模块方式编译 nandsim 驱动,以方便试验。
(1)内核配置
Enable loadable module support --> Module unloading
Device Drivers --> Memory Technology Device (MTD) support -->
  • MTD partitioning support --> [M] NAND Device Support --> [M] Support for NAND FLASH
    Simulator
    下面的配置用于设置热插拔功能:
    Networking support
    Device Drivers --> Generic Driver Options --> path to uevent helper: /sbin/mdev

    (2)编译内核后,安装内核模块:
    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- INSTALL_MOD_PATH=~/rootfs modules_install
    注意:因为在 rootfs 安装了内核模块,所以还要重新生成 initramfs ,具体命令参照前面的内容,此处略。

    (3)启动虚拟机后,加载nandsim驱动:
    modprobe nandsim
    根据输出信息,可以看到有一个NAND Device出现了:Toshiba NAND 128Mib 1,8V 8-bit。我们再看看 /proc/mtd,也可以看到出现了一个mtd1。由于我们在前面的内核配置时已设好了热插拔功能,所以在 /dev 目录下也同时生成了对应的设备文件。

    (4)我们试验试验对NAND FLASH的读写
    准备一个试验文件,其内容就是/proc/mtd的内容:
    dd if=/dev/zero of=wyk.raw bs=512 count=1
    dd if=/proc/mtd of=/proc/mtd of=wyk.raw conv=notrunc
    说明:之所以用两个dd命令,是因为用nandwrite命令把文件写入NAND FLASH时,要求输入文件必须是与FLASH页对齐的,即是FLASH页大小的整数倍。对于nandsim驱动的缺省设备
    ,它的页大小是512字节。

    将试验文件的内容写入NAND FLASH:
    nandwrite /dev/mtd1 wyk.raw
    再将NAND FLASH中的内容读出来:
    nanddump -f wyk.dump -l 512 /dev/mtd1
    可以比较一下 wyk.raw 和wyk.dump两个文件的内容。

    (5)nandsim可以通过ID参数指定所模拟的NAND FLASH的型号,详细说明见:
    http://www.linux-mtd.infradead.org/faq/nand.html#L_nand_nandsim
    例如,我们可以对16M的NAND FLASH 执行nandtest命令进行测试。因为nandsim的缺省设备是128M,而虚拟机的内存也只有128M,所以不能对缺省的nandsim模拟设备执行 nandtest
    命令。

    (6)nandsim的分区
    nandsim驱动有一个参数parts,可以用来指定它的分区划分。parts参数值是各分区的容量值(以块为单位),用逗号分隔;未指定的剩余容量则划分为最后一个分区。例如:
    modprobe nandsim parts=16,16
    则在FLASH中划分了3个分区,容量分别是256k,256k,其他剩余容量(nandsim缺省的FLASH设备的块大小是16k字节)。

    (7)关于内核热插拔配置的补充说明:
    hotplug helper 也可以在系统运行时设置和改变:
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    或者
    sysctl -w kernel.hotplug=/sbin/mdev
    需要注意的是:如果Networking support配置项不选中,则系统不会在/proc/sys/kernel下创建hotplug文件,同样也不会有kernel.hotplug项。


    (原文在:  http://linuxman.blog.ccidnet.com ... itemid-5716690.html
  • 回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表