290 likes | 586 Views
Bootloader( 下 ). 课程目标. Bootloader 下载 VIVI 的编译 VIVI 源码分析 Bootloader 的开发 Bootloader 的调试 Bootloader 的移植 Bootloader 的功能增强. sbc2410 Bootloader 下载. 在 sbc2410 开发板上有四种下载方法 当开发板 vivi 工作正常时 1) 用串口 XModem 协议下载 2) 用 USB 下载 这两个方法不具通用性,只在 VIVI 中有效,其它 BL 有其它命令。 当 VIVI 被破坏或其 flash 为空时
E N D
课程目标 • Bootloader 下载 • VIVI的编译 • VIVI源码分析 • Bootloader的开发 • Bootloader的调试 • Bootloader的移植 • Bootloader的功能增强
sbc2410 Bootloader下载 • 在sbc2410开发板上有四种下载方法 • 当开发板vivi工作正常时 • 1)用串口XModem协议下载 • 2)用USB 下载 这两个方法不具通用性,只在VIVI中有效,其它BL有其它命令。 • 当VIVI被破坏或其flash为空时 • 3)用sjf2410通过并口下载 • 4)用H-jtag的H-Flasher下载 这两个方法是完全不需要其它软件支持的通用性方法。 • 如果升级VIVI以支持网络功能或移植了U-boot,则还可通过网络下载。
用串口XModem协议下载 • 启动时长按空格键进入VIVI控制台; • 在VIVI控制台中运行load flash vivi x,此时VIVI提示等待下载; • 在超级终端上选择文件传输->选择Xmodem协议->选择sbc_vivi后进行下载; • 如果提示成功表示下载成功。 注意:这一下载过程比较慢,所以优先选择USB下载。
用USB下载 • 用USB下载的前提是HOST机器上安装了USB下载驱动secbulk.sys,并且安装了dnw.exe。 • 启动时长按空格键进入VIVI控制台; • 注意:串口是独占的,因此超级终端和DNW不能同时使用一个串口,否则有一个必然联接不上。 • 用dnw连接开发板的串口,如果dnw窗口栏出现[USB:OK]表示USB正常工作; • 在控制台下输入命令load flash vivi u,此时VIVI提示等待下载; • 在DNW菜单中选择USB Port->Transmit选择下载文件即可。
USB下载过程 • 一个下载过程
用并口sjf2410下载 • 并口下载要求安装好giveio.sys并口驱动 • 把需要下载的image和sjf2410拷贝在一个目录内 • 运行sjf2410 • 命令行格式为 sjf2410 /f:<image file name> • 如果sjf2410检测到开发板,会显示CPU型号和CPU ID • SBC2410使用两种Flash • Sumsung的K91208,64M的Nand Flash; • AMD的29LV1600,Nor Flash; SBC2410目前采用Nand Flash作为启动Flash,bootloader程序要求一定要放在Flash的起始块,所以要求选择K91208的0号块进行烧录。
一个实例下载过程 • 如图:进入sjf2410后, • 首先选择Flash型 号,这里选择K921208,因此输入0; • 接着选择操作,输入 0选择K921208 program; • 再下来选择烧录的 块,bootloader程 序一定是在第0块, 所以这里输入0; • 再次出现选择操作表 示烧录成功,按2退出; • 切断电源开关重启即 可成功。
H-jtag的烧录 • 要求安装H-jtag并能通过并口线连接上开发板。 • 目前H-jtag的版本并未包含Nand Flash的驱动,因此只能对Nor Flash进行烧录。 • 步骤同SJF2410类似,但为图形界面。
H-jtag的烧录(2) • 选择菜单栏SETTINGS/JTAG SETTINGS,如下图设置:
H-jtag的烧录(3) • 选择菜单栏OPERATIONS/DETECT TARGET。 • 看到蓝色CPU内核型号和CPU ID号,表示已经联接上。
H-jtag的烧录(4) • 选择菜单栏FLASHER/START H-FLASHER或用桌面图标启动H-Flasher。
H-jtag的烧录(4) • 缺省的H-Flasher并没有AMD 29FV160DB的Flash定义,需要手工加入这一型号定义。
H-jtag的烧录(5) • 选择programming,并按Check以检测Flash。
vivi的简介 • vivi是韩国mizi公司开发的bootloader,最早是用于SMDK2410开发板的配置软件,国内S324X0系列大多采用这个bootloader。 • vivi独特之处是支持NAND启动功能,U-boot并未内置这个功能,但U-boot的总体功能较全。 • 下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,可在vivi控制台下使用help查看命令帮助。
vivi配置与编译 • 解压源码并修改Makefile以便适应开发环境: • LINUX_INCLUDE_DIR=/kernel/include/ 改为本机ARM内核目录。 • CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux- 开发工具前缀最好带上全路径。 • 在/vivi目录下执行make distclean。目的是确保编译的有效性,在编译之前将vivi里所有的“*.o”和“*.o.flag”文件删掉。 • 进入/vivi目录,输入“make menuconfig”,开始选择配置。可以Load一个写好的配置文件也可以自己修改试试,注意Exit时一定要选“Yes”保存配置。 • 再输入“make”正式开始编译,如果不报错,在/vivi里面就有编译成功的“vivi”了。
vivi配置机制分析 • vivi的配置机制是模仿Linux内核的配置机制,提供了字符配置的makefile、字符界面下的图形界面、X-Windows图形界面三种配置。 • make config字符方式配置 • 调用实际上是scripts/configure、arch/config.in。 • Make menuconfig • 提供一个字符界面下的图形库,可运行在shell、putty和telnet终端上。 • 采用ncurses界面库,即有图形界面的方便,又能进行远程配置。 • 这种机制是很多大型软件的常用的配置机制,如Linux内核、busybox、vivi和u-boot都采用这种机制进行软件配置。 • 配置完成后,会在Makefile目录下生成一个.config文件,这就是配置的结果。
vivi配置机制分析(2) • 运行menuconfig的效果图:
vivi代码分析(1) • 目标结构:vivi的代码包括arch、init、lib、drivers和include 等几个目录,共200多个文件。 • arch:此目录包括了所有vivi所支持的目标板的子目录,例如s3c2410目录。这 是vivi bootloader stage1的实现部分。 • drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录 下分map、nand和nor三个目录。 • init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从 main函数开始执行。这是vivi bootloader stage2的实现部分。 • scripts:shell脚本。vivi提供了一种交互式配置机制,实现部分是利用shell脚本 来完成的。 • lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。 • include:头文件的公共目录。其中的s3c2410.h定义了这块处理器的一些寄存 器,platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只 需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映 射等。 • documentation:帮助文档。关于对vivi的简单介绍、如何进行编译、如何 booting ARM都有简要的描述。
vivi代码分析(2) • 按照理论,一般bootloader分为两阶段代码:stage1和stage2。 • vivi的stage1代码是arch/s3c2410/head.S • 这个是由gnu as来编译的ARM汇编代码,大写后缀名S表示包含汇编伪指令。 • ADS不能直接编译这个文件,必须要作手工改写。
stage1流程(1) • 1、关WATCH DOG (disable watch dog timer) • 上电后,WATCH DOG默认是开着的。 • 2、禁止所有中断 (disable all interrupts) • vivi中不会用到中断,中断是系统的事,bootloader可不能去干这事的(不过这段 话实在多余,上电后中断默认是关闭的)。 • 3、初始化系统时钟(initialise system clocks) • 启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。 • 4、初始化内存控制寄存器(memsetup) • s3c2410共有15个寄存器,在此开始初始化13个寄存器。 • 5、检查是否从掉电模式唤醒(check if this is a wake-up from sleep) • 若是,则调用WakeupStart函数进行处理。 • 6、点亮所有LED (All LED on) • 7、初始化UART0 (set GPIO for UART & InitUART) • a.设置GPIO,选择UART0使用的引脚 • b.初始化UART0,设置工作方式(使用FIFO)、波特率115200 8N1、无流控 等。这是使用串口与s3c2410通信的条件,在终端上也要如此设置。
stage1流程(2) • 8、跳到内存测试函数(simple memory test to find some DRAM flaults) 当然只有定义了CONFIG_BOOTUP_MEMTEST这个参数才会跳到内存测试。 • 9、如果定义了以Nand flash方式启动(#ifdef CONFIG_S3C2410_NAND_BOOT),则此时要将vivi所有代码(包 括阶段1和阶段2)从Nand flash复制到SDRAM中(因为Nand flash 是不能执行程序的,它只能做为程序和数据的存储器,而Nor flash可就 不同了,Nor flash可以执行程序,但贵是它发展得瓶颈) • a.设置nand flash控制寄存器 • b.设置堆栈指针 • c.设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地 址),r1=源地址(nand flash的地址),r2=复制的长度(以字节为单位) • d.调用nand_read_ll进行复制 • 10、跳到bootloader的阶段2运行,亦即调用init/main.c中的main函 数(get read to call C functions) • a.重新设置堆栈 • b.设置main函数的参数 • c.调用main函数
stage2流程分析 • vivi的第二阶段从main()函数开始,同一般的C语言程序一 样,该函数在/init/main.c文件中,总共可以分为8个步骤: 1.函数开始,通过putstr(vivi_banner())打印出vivi的版本。 vivi_banner在/init/version.c文件中定义。 2. 对开发板进行初始化(board_init()函数) board_init()是与开发板紧密相关的,这个函数在/arch/s3c2410/smdk.c文件 中。开发板初始化主要完成两个功能,时钟初始化(init_time())和通用IO口设置 (set_gpios())。其中,GPIO口在smdk2410.h(\vivi\include\platform\目录 下)文件中定义。 3.内存映射初始化和内存管理单元的初始化工作: • mem_map_init(); • mmu_init(); 这两个函数都在/arch/s3c2410/mmu.c文件中。 • 如果配置vivi时使用了NAND作为启动设备,则执行 mem_map_nand_boot(),否则执行mem_map_nor()。这里要注意的是, 如果使用NOR启动,则必须先把vivi代码复制到RAM中。这个过程是由 copy_vivi_to_ram()函数来完成的。 mmu_init()函数中执行了 arm920_setup函数,这段代码用汇编语言实现,针对arm920t核的处理器。
stage2流程分析(2) 4.初始化堆栈(heap_init()函数)。 heap_init()定义在\vivi\lib\heap.c文件中。 5.初始化mtd设备(mtd_dev_init()、 int mtd_init() 函数)。 这两个函数可以在 /drivers/mtd/maps/s3c2410_flash.c里找到。 6.初始化私有数据(init_priv_data()函数)。 init_priv_data()定义在\vivi\lib\priv_data\rw.c文 件中) 7.初始化内置命令(init_builtin_cmds()函数)。 通过add_command函数,加载vivi内置的几个命 令。 8.启动(boot_or_vivi()函数)。 启动成功后,将通过vivi_shell()启动一个shell(如果 配置了CONFIG_SERIAL_TERM),此时vivi的任务 完成。
Bootloader的调试 • Bootloader一般调试都比较原始,通过反复烧录、观察LEDS和串口输出来进行调试。 这一方法效率较低,适合改动不大的移植。 • 如果Bootloader一开始就针对ADS进行设计,则可通过调试代理进行在线调试。 • 参见s3c2410bootloader_ads.rar • vivi需要改写head.S方可进行调试 这一方法效率较高,但需对ADS有较深入了解。
Bootloader开发 • Bootloader的开发模式主要分为两大类 • 把常用的Bootloader移植到新硬件target上 这移植主要是针对新配置进行参数调整 • 增强Bootloader本身功能 如vivi本身功能较弱,则网络下载和USB下载功能均需自已添 加。U-boot缺省不支持Nand Flash的启动,也需手动添加此 功能。
课堂练习 • 配置和编译vivi 已配置并编译。 • 试验用多个方法下载vivi 已用sjf2410通过并口下载。
扩展训练 • 针对SBC2410的实用版本在s3240bootloader_ads内调整Flash分区表,使之与开发板实际参数一致。 • 将vivi的功能增强 • 参考vivi_tftp,加入网络支持和TFTP下载支持 • 将其改写为一个可供调试的ADS版本
谢谢,请提问 在疯狂的时代把握未来