文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>开发板实务(3)——下载 & 烧写镜像

开发板实务(3)——下载 & 烧写镜像

时间:2006-05-31  来源:zzzppp

这里讨论如何修改ramdisk文件系统, 如何将内核镜像, 文件系统镜像下载到ram中以及如何将它们下载到flash中. 本文不讨论内核镜像, 文件系统镜像的制作. 只是假设手头有现成了镜像文件(华恒提供的光盘里有). 关于制作ramdisk, 编译内核, 制作内核镜像,

准备工作
前提
手头板子的bootloder是ppcboot. 这里针对ppcboot介绍如何下载, 烧写.
1, 板子的ppcboot可用.
2, 有可用的内核镜像文件zImage, 文件系统镜像文件ramdisk.image.gz. 最好将它们备份, 若修改有误, 将它们重烧至flash.
3,  宿主机是Linux, 虚拟终端采用minicom, 宿主机能够提供tftp服务.
4,  连机线, 串口连接线.
不需使用jtag!

基本概念
所谓文件系统就是用户程序和文件的集合. 在宿主机(Linux系统)中将它们放到某个统一的目录. 然后通过一个工具打包成一个image文件(这通常是个压缩的过程). 然后将镜像烧制到板子上的flash中.

Linux内核启动完成后, 会逐 个挂载这些文件系统映象文件并做解包的工作. 当然第一个被挂载的就是rootfs了. 有了rootfs并提供了SHELL之后. 就可以通过mount这个SHELL命令来挂载其它FS了.

所以, 若用户要添加自己的程序到文件系统的image里面去, 首先要把自己的程序或文件复制到这个FS在宿主机中对应的目录里面去, 然后重新打包生成image. 这样就完成了对文件系统镜像的修改, 随后就是下载和烧写的问题了.


修改ramdisk文件系统
1, 在host上解压, 挂载ramdisk镜像文件.
将ramdisk.image.gz解压:
$ gunzip ramdisk.image.gz
得到ramdisk.image, 它就是Linux文件系统映像文件.

既然是文件系统映像文件, 那么可以在本地主机上将它挂载:
$ sudo mount -o loop ramdisk.image /mnt
运行$ mount命令, 可以看到ramdisk.image被挂载上了:

/home/zp/project/hh-2410/ramdisk.image on /mnt type ext2 (rw,loop=/dev/loop0)

可以把ramdisk.image挂载到任意目录. 比较方便的一种方法是: 在~/project/hh-2410中新建一ramdisk目录, 将ramdisk.image挂载到ramdisk目录.

2, 向目标文件系统添加应程序
此时用户可以加入自己的应用程序(以可执行文件hello为例):
$ cd /ramdisk
$ mkdir app  (新建目录名可以自己定义)
$ cd app
$ cp /hello .
$ cd              (位于ramdisk目录中时, 是不能卸载ramdisk目录的)
$ sudo umount /ramdisk

3, 压缩新生成的ramdisk.image文件系统映像文件
$ gzip ramdisk.image
$ sudo cp /ramdisk.image.gz /tftpboot/

下载烧写新的ramdisk.image.gz完毕后重启目标板,可以看到文件系统中出现了application目录,在hello目录中出现了可执行文件hello,就可以运行文件了。

修改其他类型的文件系统
JFFS2
不需解压原有的jffs2.img,而是直接往原来的目录里面添加即可.
注意:下面的这个jffs2_dir是你的软件包里面原来就有的,例如HHARM9-EDU就是
/HHARM9-EDU/Images/backup/jffs2目录, 这个目录里面原来就有我们默认添加的一些文件和目录,你只要把自己的程序复制进去即可.
   
当然了,若你的软件包里面没有提供我们原来的这个目录,那也没关系,您完全可以自己重新 mkdir  /jffs2_dir  这样做就是你新做的jffs2.img里面除了你刚刚添加的hello外没有任何目录和文件,而这完全可以工作,启动后自己添加即可.

$ mkfs.jffs2 -d  /jffs2_dir  -o  jffs2.img

Debian/Ubuntu中安装mkfs.jffs2工具: $ sudo apt-get install mtd-tools

CRAMFS
 和JFFS2完全相同的做法, 你也完全可以自己
 $ mkdir /cramfs_dir
 $ mkcramfs /cramfs_dir cramfs.img

和JFFS2不同的是, 它是只读的! 你在宿主机上添加了什么, 到板子上就只能有什么. 不能再动态创建目录和复制进去文件了, 要添加必须重做cramfs.img烧写到FLASH上才行.

Debian/Ubuntu中安装mkcramfs: $ sudo apt-get install mkcramfs

uClinux上用的ROMF
$ genromfs -v -V "ROMdisk" –f romfs.img –d romfs_dir

当然了, 这个romfs目录是任何一个uClinux-dist包里面都会默认带有的目录.


添加内核镜像和文件系统到RAM中
为了不至于频繁的烧写内核和文件系统, 可以把内核和文件系统先下载至RAM中直接启动(而不是从flash读到SDRAM中运行), 测试一下新的内核和文件系统是否可以正常使用, 如果确定最终需要烧写的文件, 再进行烧写也不迟. 这一功能可以极大的方便内核调试. 内核和ramdisk映象下载到内存中后, 可以使用go命令直接启动刚下载的内核.

首先要保证宿主机上设置好了tftp服务. 可参考开发板实务(2)——建立宿主机开发环境

/tftpboot目录中的权限必须都改为777, 否则会有TFTP error: 'Permission denied'

开发板启动后, 会出现"start linux now(y/n)" 这样一句提示, 此时按下enter或space键盘. 进入ppcboot.出现"SMDK2410:"提示.

1,  设置TFTP服务器地址.
ppcboot中默认服务器地址为192.168.2.111. 而我的宿主机IP为192.168.2.1, 通过下面的方法设置:
SMDK2410 # setenv serverip 192.168.2.1
SMDK2410 # saveenv                           
设置并保存了环境变量, 下次运行tftp时, ppcboot会知道服务器地址为192.168.2.1

2, 将内核和文件系统下载到ram中:
SMDK2410 # tftp 30008000 zImage
SMDK2410 # tftp 30800000 ramdisk.image.gz

3, 启动刚才下载的内核:
SMDK2410 # go 30008000
不出什么意外的话, 系统就能启动了. 现在进入根目录, 是不是看到了app目录?

注意: 这里是向ram中添加了镜像, 系统掉点之后新加的目录将不复存在! 先在ram中测试一下, 如果没有问题, 再烧写到flash中不迟!

问题: 我只是更新了文件系统, 并没有重新编译内核. 是不是只需将ramdisk.image.gz下载到30800000, 随后运行go 30008000重启即可?
但是如果我不下载内核, pppcboot会在出现如下显示后停顿, 只好复位
# starting application at 0x30008000...
start linux...
setup linux parameters at 0x30000100

不知道是什么原因, 难道下载文件系统的同时, 非得下载内核么?

将ram中的内容烧写进flash
将镜像下载到ram中后, 可以进一步将它们烧写到flash中. ppcboot烧写镜像到flash中的命令为:

SMDK2410 # fl flash起始地址(hex) Ram起始地址(hex) 镜像大小(hex)

其中的参数都为十六进制,  前面不需要0x. ram起始地址就是下载镜像到ram中指定的地址. flash的起始地址要注意,  详见下文:

关于烧写flash地址
kernel, ramdisk, jffs2, cramfs都可以被重新烧写. 要注意, 它们烧写到flash中的位置是不同的. 在内核目录: /kernel/drivers/mtd/maps/s3c2410_llg.c中有下述内容:

static struct mtd_partition s3c2410_partitions[] = {
    {
            name: "reserved for bootloader",
            size: 0x040000,
            offset: 0x0,
                        mask_flags: MTD_WRITEABLE,
    },
    {
            name: "reserved for kernel",
            size: 0x0100000,
            offset: 0x040000,
                        mask_flags: MTD_WRITEABLE,
    },
    {
            name: "reserved for ramdisk",
            size: 0x400000,
            offset: 0x140000,
                        mask_flags: MTD_WRITEABLE,

    },
    {
                name: "jffs2(0.75MB)",
                size: 0xc0000,
                offset: 0x740000,
     },
    {
        name: "cramfs(2MB)",
        size:0x200000,
        offset:0x540000,
    }

};

这样, 我们就知道针对特定的镜像, 应该将它们下载到flash的哪个位置了. 以下载内核镜像为例:
1, ppcboot的启动信息中有这样一句: Flash Memory Start 0x1000000, 可知道flash的起始地址为0x1000000.
2, 由上述s3c2410_llg.c中可知, 内核镜像的偏移量为0x040000.
所以, 内核镜像应被烧到:  0x1000000 + 0x040000 = 0x1040000

起初我是按照华恒提供的用户手册来进行的, 但实际上我所用的板子和手册中针对的板子有所不同: 我的板子的flash为8M, sdram为32M, 而手册中的板子分别为16M和64M. 镜像在flash中的地址是不同的! 刚开始犯的傻X错误:

SMDK2410 # fl 140000 30800000 270000
Erasing Flash locations, Please Wait ...
Error: start and/or end address not on sectro boundary
Error to erase flash!

进入ppcboot后执行base, 查看基址,再用基址加上偏移量就可以了

关于要烧写的镜像大小
烧写镜像的大小通过ppcboot的反馈信息来获得, 比如, 将zImage下载到ram中后, 最后一句ppcboot的显示:
Bytes transferred = 917368 (dff78 hex)

要注意烧写到flash中镜像大小的选择, 不能直接指定为dff78, 这样写到flash中的镜像可能不完整. 一般而言, 将十六进制大小的后4位入为0就行了, 所以针对dff78, 我们可以指定烧写镜像大小为e0000.

完成上述工作后, 输入reset或者按下板子的复位键, 就可以重启到拥有新的内核, 文件系统的板子中去了.


附: 实例
1, 进入ppcboot后的显示画面:
PPCBoot 2.0.0 (May 16 2005 - 11:39:33)

PPCBoot code: 33F00000 -> 33F15428  BSS: -> 33F188AC
DRAM Configuration:
Bank #0: 30000000 32 MB
Flash Memory Start 0x1000000
Device ID of the Flash is 18
Flash:  8 MB
Write 18 to Watchdog and it is ff now
start linux now(y/n):                                    /*  3秒内按回车/空格, 进入ppcboot */

2, 下载,烧写内核镜像
SMDK2410 # tftp 30008000 zImage
<DM9000> I/O: 8000300, VID: 90000a46
NetOurIP =c0a80278
NetServerIP = c0a80201
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
TFTP from server 192.168.2.1; our IP address is 192.168.2.120
Filename 'zImage'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         ##################################################
done
Bytes transferred = 917368 (dff78 hex)
SMDK2410 # fl 1040000 30008000 e0000
Erasing Flash locations, Please Wait ...
        [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX]
        [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX]
Erased 14 sectors
Programming flash, Please Wait ...
        ****************************************************************
        ************************************************#

3. 下载, 烧写ramdisk映像.
SMDK2410 # tftp 30800000 ramdisk.image.gz
<DM9000> I/O: 8000300, VID: 90000a46
NetOurIP =c0a80278
NetServerIP = c0a80201
NetOurGatewayIP = c0a80201
NetOurSubnetMask = ffffff00
ARP broadcast 1
ARP broadcast 2
TFTP from server 192.168.2.1; our IP address is 192.168.2.120
Filename 'ramdisk.image.gz'.
Load address: 0x30800000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ##########################################
done
Bytes transferred = 2540516 (26c3e4 hex)
SMDK2410 # fl 1140000 30800000 270000
Erasing Flash locations, Please Wait ...
        [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX]
        [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX]
        [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX]
        [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX]
        [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX] [XXXXX]
Erased 39 sectors
Programming flash, Please Wait ...
        ****************************************************************
        ****************************************************************
        ****************************************************************
        ****************************************************************
        ********************************************************#

Reference

相关阅读 更多 +
排行榜 更多 +
单挑幸存者安卓版

单挑幸存者安卓版

飞行射击 下载
决战战地指挥官

决战战地指挥官

飞行射击 下载
鸡仔幸存者最新版

鸡仔幸存者最新版

飞行射击 下载