今天主要学习了vivi,当然,这是个入门级别的bootloader,但通过分析vivi来学习uboot是一个非常好的选择,vivi的配置仿照 kernel的配置,所以也可以作为配置kernel的入门材料,至于vivi的一些启动过程这里就不做详细的解释了,这里只对vivi的配置中的一些选项做一下解析。
make menuconfig
出现的菜单主要有以下一些选项:
System Type ---> 【系统配置:主要设置芯片、平台类型 底层启动选项等】
General setup---> 【通用设置:vivi基地址、系统缓存、电源管理等 】
Private Data ---> 【私有数据设置:vivi的私有数据 启动的一些用户私有数据】
Serial Port ---> 【串口:是否支持串口(vivi只支持串口,怎么敢不选),串口传输协议】
Memory Technology Devices(MTD)--> 【存储设备相关选项】
Add Built-in Commands ----> 【vivi支持命令】
System hacking ----> 【系统调试相关选项】
Debugging messages ---> 【调试信息相关】
----
Load and Alternate Configuration File 【载入配置文件,vivi自带一个sdmk的配置文件】
Save Configuration to an Alternate File 【保存自己的配置信息】
下边一一详解。
system type:
这里有连个选项,非常的简单,就是选择我们的arm芯片的类型,我这里使用的是s3c2410,
所以在arm system type 中选择 s3c2410-based.
这里还有一个implementation选项,这个选项主要选择一些平台的其他信息,这里需要知道一个简单smdk
Symbol Mobility Developer Kit (SMDK) ,通用移动设备开发套件,现在很多的s3c2410的板子都属于这个,所以要选择这个,如果不是的话,可能vivi就不能满足你的bootloader的要求了,可以选择uboot,这里有一些关于启动的选项,我这里是只有一块nand flash,所以选择nand boot.
(S3C2440-based) ARM System type
( ) SA1100 – based
( ) PXA250/210 – based //英特尔Xscale arm芯片
( ) S3C2400 – based //三星公司arm芯片
( ) S3C2410 – based //三星公司arm芯片
( ) S3C2440 – based //三星公司arm芯片
Implementations //启动位置
(SMDK) Platform
(x)SMDK
( )MPORT3
( )MPORT1
[ ]Support NAND //Boot 支持NAND启动
[ ]Support AMD //Boot 支持AMD启动
– Low Level Hardware Debugging //底层调试(硬件级)
[ ]Enable simple memory test //简单的存储器测试
关于通用配置,不知道是什么问题,在我的机器上如果加入support reset handler,会编译出错,只能取消这个选项了,关于缓存,这里不太明白,需要请下昊昱,
General Setup //通用设置
[ ] Define TEXT Address //定义text段地址
(0) vivi base address //vivi基地址
[ ] support reset handler //支持复位处理,可以不选,一般平台都有硬件复位。
– CACHE Enable //缓存
[ ] I – Cache on //指令缓存
[ ] D – Cach on //数据缓存
– Power Management //电源管理
[ ] Support power management //支持电源管理
– Others
– [ ] Display progress bar //显示进度
– [ ] Support MD5 //支持MD5
私有数据选项中,具体的现象含义还不知道,等研究完vivi的源码在补充吧,但这里需要支持的是,这里的选项是和用户有关的,那么这些数据是非必须的,推荐全选。
Private Data //专用数据
[ ] Support VIVI private data //支持vivi专用数据
[ ] Parse vivi private data from MTD //从MTD上解析vivi专用数据
[ ] Use user–define parameter block //使用用户设定参数块
[ ] Enable debugging messages //打开调试信息
现在到了vivi最为中要的地方了,串口相关的设计,我们知道原版的vivi只能通过串口进行数据的传输,当然不包括现在网上流传的一些改进版的vivi了,由于vivi只支持串口进行数据的传输,所以速度非常的慢,你可以想象下,如果你的跟文件系统有10M,而串口的速度一般不会超过 10K/s,算算要多长时间才能传完你的根文件系统,但让,vivi也自动了一个很方便的工具那就是imagewrite,但前提是你有一个已经可以运作的linux才能使用imagewrite,至少你第一次少文件系统的时候需要半个多小时的等待吧。
Serial Port //串口
[ ] Serial Port (UART) //support 串口支持
[ ] Support serial terminal //支持串口终端
( EXTENDED)User interface //用户界面
( )STANDARD //标准
( )EXTENDED //扩展
Default prompt “vivi” //默认的提示信息:"vivi",
– Ports //端口
– [ ] Support UART 0 //支持UART0
– [ ] Support UART 1 //支持UART1
– [ ] Support UART 2 //支持UART2
– [ ] Support UART 3 //支持UART3
– – Transfer Protocol //传输协议
– [ ] Support X – Modem //支持 X Modem 传输
– [ ] Support Y – Modem //支持 Y Modem 传输
– [ ] Support Z – Modem //支持 Z Modem 传输
下边,我们开始存储器管理部分,这部分是比较麻烦一些的。
Memory Technology Devices (MTD) //存储器设备种类
[ ] Memory Technology Devices (MTD) // support 支持存储器
[ ] Debugging //调试
NOR Flash chip drivers //Nor Flash 芯片驱动
[ ] NOR Device Support 支持 Nor Flash 设备
[ ] Detect flash chips by Common Flash Interface (CFI) //probe 检测 CF 接口
[ ] Flash chip driver advanced configuration options (NEW)
//高级的闪存设置选项
( ) Flash cmd/query data swapping //设置查看FLASH上的数据的字节序
( ) NO
( ) BIG_ENDIAN_BYTE
( ) LITTLE_ ENDIAN_BYTE
[ ] Specific CFI Flash geometry selection (NEW) //特殊的CF选择
[ ] Support 8-bit buswidth (NEW) //支持8位总线宽度
[ ] Support 16-bit buswidth (NEW) //支持16线宽度
[ ] Support 32-bit buswidth (NEW) //支持32线宽度
[ ] Support 64-bit buswidth (NEW) //支持64线宽度
[ ] Support 1-chip flash interleave (NEW) //支持1片闪存
[ ] Support 2-chip flash interleave (NEW) //支持2片闪存
[ ] Support 4-chip flash interleave (NEW) //支持4片闪存
[ ] Support 8-chip flash interleave (NEW) //支持8片闪存
[ ] Support for Intel/Sharp flash chips //支持Intel或harp 的闪存
[ ] Older (theoretically obsoleted now) deivers for non-CFI chips //不支持CFI芯片的旧设备。
[ ] AMD compatible flash chip support (non-CFI) //支持AMD兼容闪存(无cfi)
Mapping drivers for chip access
[ ] Flash device mapped on S3C2410 //S3C2410上的
NAND Flash Device Drivers NAND闪存设备驱动
[ ] Enable ECC correction algorithm //ECC修正算法
[ ] Verify NAND page writes //NAND页写入校验
[ ] SMC Device Support //支持SMC设备
[ ] bonfs support //支持bonfs
这里是选择vivi支持的命令,part是flash分区相关的命令,可以show save del 等
param 是设置一些启动参数。amd这条命令在我的实验板上编译不通过,只能取消它。
Add Built – in Command //内部命令
[ ] men command //存储器指令
[ ] mem test command //存储器测试指令
[ ] param command //参数指令
[ ] part command //退出指令
[ ] bon command //分区指令
[ ] sleep command //停顿指令
[ ] prompt command //提示指令
[ ] built-in command //内部指令
在配置完vivi后,生成Makefile后,还不能正常的编译,这里需要做一些修改。下边是一个Makefile文件需要修改的地方:
LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include/ CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
|
需要注意的是,vivi-20030629.tar.bz2这般的vivi只支持编译器为2.95.3,这是在嵌入式开发当中经常遇到的问题,如果 Makefile没有问题,而编译又不能正常进行,首先需要想到的就是编译器的版本问题,这个版本的vivi使用3.4.1的编译器是不能正常编译的,应为我们要把vivi放到arm平台上运行,所以需要把arm相关的库文件,这就需要在Makefile中制定这些库文件存储的地方。做完这些,基本上就可以了。
我们在看看vivi中关于flash的分区,在vivi中受用part show,可以看到有一下几个分区: vivi param kernel root usr ,这些分区信息定义在下边的结构体当中:
vivi/arch/s3c2410/smdk.c
#ifdef CONFIG_S3C2410_NAND_BOOT mtd_partition_t default_mtd_partitions[] = { { name: "vivi", offset: 0, size: 0x00020000, flag: 0 }, { name: "param", offset: 0x00020000, size: 0x00010000, flag: 0 }, { name: "kernel", offset: 0x00030000, size: 0x000C0000, flag: 0 }, { name: "root", offset: 0x00100000, size: 0x00140000, flag: MF_BONFS } }; #endif #ifdef CONFIG_S3C2410_AMD_BOOT mtd_partition_t default_mtd_partitions[] = { { name: "vivi", offset: 0, size: 0x00020000, flag: 0 }, { name: "param", offset: 0x00020000, size: 0x00010000, flag: 0 }, { name: "kernel", offset: 0x00030000, size: 0x000C0000, flag: 0 }, { name: "root", offset: 0x00100000, size: 0x00140000, flag: MF_BONFS } };
|
在上边的分区表可以看出,这些分区在flash中成线性排列的。这样,这里的这些数据是mizi公司推荐使用smdk开发板的用户的数据,当然可以根据自己的需要来修改各个分区的大小了。这里的offset是相对于flash起始地址0而言,自己的相对地址,其实就是实际地址,而size就是这个分区实际占据的大小了。
vivi的使用在这里就告一段落了,更多的细节就需要看vivi的源码了。