1 / 29

Bootloader( 下 )

Bootloader( 下 ). 课程目标. Bootloader 下载 VIVI 的编译 VIVI 源码分析 Bootloader 的开发 Bootloader 的调试 Bootloader 的移植 Bootloader 的功能增强. sbc2410 Bootloader 下载. 在 sbc2410 开发板上有四种下载方法 当开发板 vivi 工作正常时 1) 用串口 XModem 协议下载 2) 用 USB 下载 这两个方法不具通用性,只在 VIVI 中有效,其它 BL 有其它命令。 当 VIVI 被破坏或其 flash 为空时

verlee
Download Presentation

Bootloader( 下 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bootloader(下)

  2. 课程目标 • Bootloader 下载 • VIVI的编译 • VIVI源码分析 • Bootloader的开发 • Bootloader的调试 • Bootloader的移植 • Bootloader的功能增强

  3. sbc2410 Bootloader下载 • 在sbc2410开发板上有四种下载方法 • 当开发板vivi工作正常时 • 1)用串口XModem协议下载 • 2)用USB 下载 这两个方法不具通用性,只在VIVI中有效,其它BL有其它命令。 • 当VIVI被破坏或其flash为空时 • 3)用sjf2410通过并口下载 • 4)用H-jtag的H-Flasher下载 这两个方法是完全不需要其它软件支持的通用性方法。 • 如果升级VIVI以支持网络功能或移植了U-boot,则还可通过网络下载。

  4. 用串口XModem协议下载 • 启动时长按空格键进入VIVI控制台; • 在VIVI控制台中运行load flash vivi x,此时VIVI提示等待下载; • 在超级终端上选择文件传输->选择Xmodem协议->选择sbc_vivi后进行下载; • 如果提示成功表示下载成功。 注意:这一下载过程比较慢,所以优先选择USB下载。

  5. 用USB下载 • 用USB下载的前提是HOST机器上安装了USB下载驱动secbulk.sys,并且安装了dnw.exe。 • 启动时长按空格键进入VIVI控制台; • 注意:串口是独占的,因此超级终端和DNW不能同时使用一个串口,否则有一个必然联接不上。 • 用dnw连接开发板的串口,如果dnw窗口栏出现[USB:OK]表示USB正常工作; • 在控制台下输入命令load flash vivi u,此时VIVI提示等待下载; • 在DNW菜单中选择USB Port->Transmit选择下载文件即可。

  6. USB下载过程 • 一个下载过程

  7. 用并口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号块进行烧录。

  8. 一个实例下载过程 • 如图:进入sjf2410后, • 首先选择Flash型 号,这里选择K921208,因此输入0; • 接着选择操作,输入 0选择K921208 program; • 再下来选择烧录的 块,bootloader程 序一定是在第0块, 所以这里输入0; • 再次出现选择操作表 示烧录成功,按2退出; • 切断电源开关重启即 可成功。

  9. H-jtag的烧录 • 要求安装H-jtag并能通过并口线连接上开发板。 • 目前H-jtag的版本并未包含Nand Flash的驱动,因此只能对Nor Flash进行烧录。 • 步骤同SJF2410类似,但为图形界面。

  10. H-jtag的烧录(2) • 选择菜单栏SETTINGS/JTAG SETTINGS,如下图设置:

  11. H-jtag的烧录(3) • 选择菜单栏OPERATIONS/DETECT TARGET。 • 看到蓝色CPU内核型号和CPU ID号,表示已经联接上。

  12. H-jtag的烧录(4) • 选择菜单栏FLASHER/START H-FLASHER或用桌面图标启动H-Flasher。

  13. H-jtag的烧录(4) • 缺省的H-Flasher并没有AMD 29FV160DB的Flash定义,需要手工加入这一型号定义。

  14. H-jtag的烧录(5) • 选择programming,并按Check以检测Flash。

  15. vivi的简介 • vivi是韩国mizi公司开发的bootloader,最早是用于SMDK2410开发板的配置软件,国内S324X0系列大多采用这个bootloader。 • vivi独特之处是支持NAND启动功能,U-boot并未内置这个功能,但U-boot的总体功能较全。 • 下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,可在vivi控制台下使用help查看命令帮助。

  16. 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”了。

  17. 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文件,这就是配置的结果。

  18. vivi配置机制分析(2) • 运行menuconfig的效果图:

  19. 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都有简要的描述。

  20. vivi代码分析(2) • 按照理论,一般bootloader分为两阶段代码:stage1和stage2。 • vivi的stage1代码是arch/s3c2410/head.S • 这个是由gnu as来编译的ARM汇编代码,大写后缀名S表示包含汇编伪指令。 • ADS不能直接编译这个文件,必须要作手工改写。

  21. 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通信的条件,在终端上也要如此设置。

  22. 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函数

  23. 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核的处理器。

  24. 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的任务 完成。

  25. Bootloader的调试 • Bootloader一般调试都比较原始,通过反复烧录、观察LEDS和串口输出来进行调试。 这一方法效率较低,适合改动不大的移植。 • 如果Bootloader一开始就针对ADS进行设计,则可通过调试代理进行在线调试。 • 参见s3c2410bootloader_ads.rar • vivi需要改写head.S方可进行调试 这一方法效率较高,但需对ADS有较深入了解。

  26. Bootloader开发 • Bootloader的开发模式主要分为两大类 • 把常用的Bootloader移植到新硬件target上 这移植主要是针对新配置进行参数调整 • 增强Bootloader本身功能 如vivi本身功能较弱,则网络下载和USB下载功能均需自已添 加。U-boot缺省不支持Nand Flash的启动,也需手动添加此 功能。

  27. 课堂练习 • 配置和编译vivi 已配置并编译。 • 试验用多个方法下载vivi 已用sjf2410通过并口下载。

  28. 扩展训练 • 针对SBC2410的实用版本在s3240bootloader_ads内调整Flash分区表,使之与开发板实际参数一致。 • 将vivi的功能增强 • 参考vivi_tftp,加入网络支持和TFTP下载支持 • 将其改写为一个可供调试的ADS版本

  29. 谢谢,请提问 在疯狂的时代把握未来

More Related