2008年11月17日星期一

Intel CE3100(Canmore)多种方式启动

作者: Sam(甄峰) sam_code@hotmail.com

Intel Canmore嵌入式平台可以基于多种方式启动。

先介绍背景知识。
Intel CE3110 启动时,首先去执行Non flash上的一个称为CEFDK的程序。CEFDK做最初的初始化动作。然后将执行权交给redboot. redboot则将kernel和rootfs准备好并将执行权交给redboot.

CEFDK, redboot, kernel, rootfs放在不同的位置上,所以Canmore可以有多种启动方式。

方式1:
CEFDK, redboot,kernel,rootfs全部放入Non flash.
这个方式有个前提, 因为Non flash非常小。 所以 kernel,rootfs必须非常基础,非常小的。其实做不了什么事。基本很少使用这种方式。

方式2:
CEFDK,redboot放在Non flash. Kernel放在tftp根目录。rootfs放在nfs目录。
这种方式常用来在开发阶段使用。因为kernel,rootfs可以很容易的修改。

方式3:
CEFDK,redboot放在Non flash中,Kernel, rootfs放在SATA harddisk中。
这种方式是STB最终产品模式。

现在具体介绍不同方式的做法:

CEFDK在Canmore出厂时,就已经烧入到Non Flash中。所以需要做的就是把redboot, kernel,rootfs放到相应的位置。

方式2:
CEFDK,redboot放在Non flash. Kernel放在tftp根目录。rootfs放在nfs目录。
1.首先烧入redboot.
重新启动Canmore时,按住空格键,则进入CEFDK界面:
shell>
shell> ymodem 0x200000 0
在Transfer->send File 中选择ymodem. 并把redboot_flashboot.bin选中。
传输完成后,只是将image放到内存.还需要烧到Non flash中去。
shell>expflash burnFlash 0x200000 0x100000 0x20000
注:redboot_flashboot.bin表示是:这个版本的redboot是放在Non flash中的。
重新启动Canmore,按ctrl+c.则进入redboot界面:
RedBoot>

2.将kernel放到tftpboot中,将rootfs放到NFS目录中。
将kernel文件,bzImage放到server的/tftpboot中。(tftp要安装好)
将rootfs目录--fsroot放到NFS允许使用的目录中。(nfs服务要安装好 /etc/exports要允许Canmore IP地址使用这个目录)

3.在redboot中,设置kernel,rootfs的放置地点。
RedBoot> fconfig

>> load -v -r -m tftp -h 172.16.1.61 -b 0x200000 bzImage
>> exec -b 0x200000 -l 0x300000 -c "console=ttyS0,115200 root=/dev/nfs rw nfsroot=172.16.1.61:/home/sam/Intel/Canmore/fsroot_canmore_1073_new ip=dhcp mem=exactmap memmap=640k@0 memmap=95M@1M"
>>
Boot script timeout (1000ms resolution): 2Use BOOTP for network configuration: trueDefault server IP address: 172.16.1.70Console baud rate: 115200GDB connection port: 9000Force console for special debug messages: falseNetwork debug at boot time: falseUpdate RedBoot non-volatile configuration - continue (y/n)? y

之后重新启动,则redboot从172.16.1.61的tftpboot中拿kernel.
把172.16.1.61:/home/sam/Intel/Canmore/fsroot_canmore_1073_new 当作rootfs.



方式3: CEFDK,redboot放在Non flash中,Kernel, rootfs放在SATA harddisk中。
3.1.准备SATA harddisk.
3.1.1分区:
将SATA硬盘连接到开发机Linux上 ,而不是Canmore Linux上。
#fdisk -l

注意:/dev/sdb是4G固态硬盘。/dev/sda是Sam插入的40G SATA硬盘。
Sam想把SATA硬盘分2个区。第一个区用来放置redboot.第二个分区用来放kernel+rootfs.
注意:
#fdisk /dev/sda

Command (m for help): n
Command action e extended p primary partition (1-4)p
Partition number (1-4): 1
First cylinder (1-1022, default 1): Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1022, default 1022): 1

Command (m for help): n
Command action e extended p primary partition (1-4)p
Partition number (1-4): 2
First cylinder (2-1022, default 2): Using default value 2
Last cylinder or +size or +sizeM or +sizeK (2-1022, default 1022): +1024M

Command (m for help): a
Partition number (1-4): 1
Command (m for help): w
The partition table has been altered!

n:新建partition.
p:逻辑分区
1,2:分区号。
First cylinder :第一个扇区号
Last cylinder or +size or +sizeM or +sizeK :最后一个扇区号.或者用+xxxM.

a: 制定boot flag.
w:执行以上动作。

3.1.2格式化/dev/sda2
#mkfs.ext3 /dev/sda2


3.2:放置redboot.bin到第一个分区。
首先使用tftpboot+nfs方式启动。
# dd conv=sync if=redboot.bin of=/dev/sda1 [注1]
224+1 records in
225+0 records out

3.3:放置kernel+rootfs到第二个分区。
# mkdir disk
# mount /dev/sda2 /disk/
#cp bzImage /disk
#cd fsroot
# cp * -rf /disk/

3.4:设置redboot:(Sam认为应该是Non Flash中的redboot)
先查看当前Redboot设置。
Redboot> fconfig -l

写Redboot:
Redboot> fconfig
>> load -v -r -m disk -b 0x200000 hda2:bzImage
>> exec -b 0x200000 -l 0x300000 -c "console=ttyS0,115200 root=/dev/sda2 rw mem=exactmap memmap=640K@0 memmap=95M@1M"
>>

重新启动。OK



大Memory设置:
在PR7之后的版本中,Canmore可以通过一系列设置,将用户空间大小提升到194M。
可以如下操作:
1.修改config文件:
#emacs /etc/platform_config/platform_config.hcfg
修改以下句子
media_base_address = 0x0C300000 /*0x10000000 sam Modify it*/
2. boot时修改redboot传入的参数:
load -v -r -m tftp -h 172.16.1.61 -b 0x200000 bzImage_canmore_1087exec -b 0x200000 -l 0x300000 -c "console=ttyS0,115200 root=/dev/nfs rw nfsroot=172.16.1.61:/home/sam/Intel/Canmore/TEST_TEAM_FSROOT/image4/fsroot_canmore_1087 ip=172.16.1.41 mem=exactmap memmap=640k@0 memmap=194M@1M"
之前是:memmap=95M@1M 表明从1M处到95M处。新写法表明从1M处到194M处。

注1:
Linux命令dd:
dd: convert and copy a file.转换和copy 文件。
conv= : convert the file as per the comma separated symbol list. 将文件转化为指定的格式
其中:conv = sync:把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
if=:read from FILE instead of stdin。输入
of=:write to FILE instead of stdout。输出
# dd conv=sync if=redboot.bin of=/dev/sda1
所以,这句话:将redboot.bin放入/dev/sda1

没有评论: