zoukankan      html  css  js  c++  java
  • Tiny4412 Uboot

    主题:   1.bootloader的介绍  2.uboot的编译和烧写  3.minicom的使用  4.uboot的代码结构  5.用dnw将程序加载到uboot中执行

    1. bootloader的介绍 ========================= 开发板或PC上电启动后,运行的第一个软件称为bootloader,PC的bootloader一般称为BIOS;

    Bootloader类似于PC上的BIOS,其核心作用有3个: -->初始化硬件 包括EXY4412处理器,DDR内存,SD卡,eMMC等 -->提供一系列交互命令 用户可以通过串口和bootloader通信,并利用bootloader执行一些命令,比如用dnw下载应用程序执行等 -->引导linux内核

    Bootloader有很多种,也可以自己写。其中最著名的一种叫uboot,是一个开源的代码项目,支持非常多的处理器和开发板。我们使用的开发板也移植了uboot。

    Superboot也是bootloader的一种,是友善自行设计的,并没有开源;

    2. uboot的编译和烧写 =========================== (1)uboot的解压缩 --------------------- uboot的压缩包在uboot子目录下: $>cd /home/zhang/01embed/uboot/

    root@localhost tiny4412]# mkdir uboot-tiny4412 [root@localhost tiny4412]# cd uboot-tiny4412/ [root@localhost uboot-tiny4412]# ls [root@localhost uboot-tiny4412]# pwd /opt/FriendlyARM/tiny4412/uboot-tiny4412

    [root@localhost uboot-tiny4412]# cp -f /opt/install/zht-01embed/uboot/uboot_tiny4412_0929.tar.gz . [root@localhost uboot-tiny4412]# ls uboot_tiny4412_0929.tar.gz

    $>tar xzvf uboot_tiny4412_0929.tar.gz

    (2)配置uboot并编译 -------------------- $>cd uboot_tiny4412/

    如果编译0929版的uboot,需要为两个文件增加可执行权限: $>chmod 755 mkconfig $>chmod 755 tools/scripts/make-asm-offsets

    $>make tiny4412_config $>make

    ....... /4.5.1 -lgcc -Map u-boot.map -o u-boot arm-linux-ld: warning: creating a DT_TEXTREL in object. arm-linux-objcopy -O srec u-boot u-boot.srec arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin

    如果编译0929版的uboot,需要为两个文件增加可执行权限: $>chmod 755 mkconfig $>chmod 755 tools/scripts/make-asm-offsets

    (3)编译用于生成bl2的工具 --------------------- 进入uboot目录,编译两个和烧写sd卡相关的工具: $>cd uboot_tiny4412_0929/sd_fuse/ $>make 生成工具mkbl2和sd_fdisk

    [root@localhost sd_fuse]# make gcc -o mkbl2 V310-EVT1-mkbl2.c gcc -o sd_fdisk sd_fdisk.c

    (4)将uboot烧写到SD卡中 ---------------------- 首先准备一张2G或以上的SD卡; 注意!烧写uboot会破坏卡中已有的数据,因此请先对SD卡上的数据进行备份(有必要的话);

    假设SD卡被Linux识别为/dev/sdb,以root权限运行以下命令: $>umount /media/xxx/ umount /media/27FB-0A91/

    root@localhost sd_fuse]# ls /dev/sd* -ll brw-rw----. 1 root disk 8,  0 4月  27 08:28 /dev/sda brw-rw----. 1 root disk 8,  1 4月  27 08:28 /dev/sda1 brw-rw----. 1 root disk 8,  2 4月  27 08:28 /dev/sda2 brw-rw----. 1 root disk 8, 16 4月  27 08:34 /dev/sdb brw-rw----. 1 root disk 8, 32 4月  27 10:17 /dev/sdc brw-rw----. 1 root disk 8, 33 4月  27 10:17 /dev/sdc1

    $>cd uboot_tiny4412_0929/sd_fuse/tiny4412/

    root@localhost tiny4412]# pwd /opt/FriendlyARM/tiny4412/uboot-tiny4412/uboot_tiny4412_0929/sd_fuse/tiny4412

    [root@localhost tiny4412]# ls sd* -ll -rw-rw-rw-. 1 xguest xguest 2174 10月 31 13:08 sd_fusing.sh [root@localhost tiny4412]# ls sd* -ll -rwxrwxrwx. 1 xguest xguest 2174 10月 31 13:08 sd_fusing.sh

    $>./sd_fusing.sh /dev/sdb U-boot image is fused successfully. Eject SD card and insert it again.

    //该脚本首先用上面的工具mkbl2生成bl2.bin //然后用dd将E4412_bl1.bin,bl2.bin,,u-boot.bin,E4412_tzsw.bin等4个部分分别写入/dev/sdb的指定位置

    退出sd 卡

    如果只想向SD卡烧写bl2.bin和u-boot.bin,可以用另一个脚本: $>cd sd_fuse/tiny4412/ $>./fast_fuse.sh /dev/sdb

    插SD卡到板子,打开minicom ,开机

    Checking Boot Mode ... SDMMC                                                    REVISION: 1.1                                                                   MMC Device 0: 14804 MB                                                          MMC Device 1: 3728 MB                                                           MMC Device 2: N/A                                                               *** Warning - using default environment                                                                                                                         Net:    No ethernet found.                                                      Hit any key to stop autoboot:  0                                                TINY4412 #

    3. minicom的使用 ========================= (1)基于串口进行通讯 ------------------------ 将uboot烧写到开发板后,uboot会通过串口来收发信息,如果要和uboot交互,首先需要连接串口;

    用串口线将开发板的串口和PC的串口相连,如果是台式机,则可以使用机器后面的普通串口;如果是笔记本,则可以使用开发板中配套提供的USB转串口设备;

    注意!如果使用台式机后面的普通串口,在插拔串口线时,务必提前关闭开发板的电源!

    连好串口线后,就可以利用串口通讯工具和uboot交流了,在windows中的串口通讯工具为超级终端,而linux中为minicom;

    (2)minicom的安装和配置 ------------------------- 如果没有安装minicom,请首先配置好yum,然后按如下方法安装和配置: 安装: $>yum install minicom

    第一次运行minicom时要先配置一下: $>minicom -s

    进入配置界面,配置过程如下: --> 将光标定位到第三项(Serial port setup)敲Enter键进入; --> 按A键,设定串口对应的设备     如果开发板连接到PC后面的串口,则设备文件名为/dev/ttyS0;     如果使用USB转串口线连接开发板,则设备文件名为/dev/ttyUSB0     输入完成后按enter键 --> 按E键,设置串口通信的波特率为115200,8N1 --> 按F键,关闭硬件流控 --> 修改完后,选择Save setup as dfl

    (3)minicom的使用 ------------------------ 再次启动minicom时,如果串口对应的设备文件名没有变化,则可以直接运行minicom; $>minicom 启动开发板后,如果uboot烧写成功,则minicom的界面中会显示uboot输出的文字,按键盘任意键,进入uboot的交互模式; 如果要退出minicom,同时按下Ctrl+A,松开后再按Z,再按X则退出;

    (4)minicom运行出错 ------------------------- 如果没有正确退出,下一次启动minicom时可能会出现如下错误: $>minicom Device /dev/ttyUSB0 lock failed: 不允许的操作.

    此时,可以删除minicom的锁文件: $>rm -f /var/lock/LCK*

    删除后,再次启动minicom: $>minicom

    4. uboot的代码结构 ========================== 作为硬件启动后最先运行的程序,要完成一个bootloader必须熟知特定arm处理器的底层细节以及启动过程; 早期的嵌入式开发中,大多数arm芯片的底层细节都是开放的,此时可以直接从网上下载最新版的uboot并移植到开发板上运行;

    很遗憾,三星并未完全开放EXYNOS4412芯片的底层细节,因此,我们的课程只能使用友善移植的uboot; 下面大体介绍一下uboot的核心代码结构;

    (1)board/samsung/tiny4412/ --------------------------- 目录下的代码主要完成tiny4412开发板的初始化; -->config.mk 在文件config.mk中指定了编译后的uboot的运行地址,即: CONFIG_SYS_TEXT_BASE = 0xc3e00000

    这个地址是虚拟地址,如果要使用物理地址,则需要在编译uboot时关闭MMU,并将uboot的运行地址修改如下: CONFIG_SYS_TEXT_BASE = 0x43e00000

    -->u-boot.lds 文件u-boot.lds指定了整个uboot的链接顺序

    (2)arch/arm/cpu/armv7/ --------------------------- 该目录下的代码针对CortexA9处理器,其中最重要的是整个uboot的初始化文件start.S

    (3)include/configs/tiny4412.h --------------------------- 是tiny4412开发板的配置文件,可以通过修改文件中的常量定义来改变uboot的配置; 比如可以设置uboot输出信息的提示符: #define CONFIG_SYS_PROMPT "zht4412 #"

    还可以关闭对MMU的支持: //#define CONFIG_ENABLE_MMU

    (4)common/ ----------------------------- 该目录下是uboot中各种命令,如dnw,tftp,go,set,save等的实现代码; 如果要实现自己定义的命令,应该把实现代码加入该目录;

    5. 用dnw将程序加载到uboot中执行 =============================== 当开发板上运行uboot以后,可以通过工具dnw从pc获取可执行的bin格式应用程序,加载到开发板上运行;

    (1)dnw工具的安装

    [root@localhost 桌面]# cd /opt/FriendlyARM/tiny4412/ [root@localhost tiny4412]# mkdir dnw-tools [root@localhost tiny4412]# pwd /opt/FriendlyARM/tiny4412 [root@localhost tiny4412]# cd dnw-tools/ [root@localhost dnw-tools]# cp -f /opt/install/zht-01embed/tools/dnw-linux.tar.gz  . [root@localhost dnw-tools]# ls dnw-linux.tar.gz [root@localhost dnw-tools]# pwd /opt/FriendlyARM/tiny4412/dnw-tools

    ----------------------- dnw工具在tools目录下,解压缩并安装(要有root权限): $>cd tools/ $>tar xzvf dnw-linux.tar.gz $>cd dnw-linux/ $>make $>make install

    (2)利用dnw加载(load)程序 ----------------------- dnw利用usb接口加载程序,找到光盘中的usb线,一端接pc,小扁口一端则连接到板子上的mini-usb口;

    minicom 中 -----

    Net:    No ethernet found.                                                      Hit any key to stop autoboot:  0                                                TINY4412 # dnw 70003000

    OTG cable Connected!                                                            Now, Waiting for DNW to transmit data  

    首先要在uboot中运行dnw命令: zht4412 #dnw 70003000 //指定应用程序的加载位置为地址0x70003000 //当前的uboot为不支持MMU的版本

    接下来在pc中运行dnw工具,将bin程序加载到板子上:

    cp -rf /opt/install/zht-01embed/work/code-uboot /opt/FriendlyARM/tiny4412/. cd /opt/FriendlyARM/tiny4412/code-uboot/00cpsr/ [root@localhost 00cpsr]# make arm-linux-as start.s -o start.o arm-linux-gcc -c main.c -o main.o arm-linux-ld start.o main.o -Ttext 0x70003000 -o mycpsr arm-linux-objcopy -O binary mycpsr mycpsr.bin

    [root@localhost 00cpsr]# dnw mycpsr.bin load address: 0x57E00000 Writing data... 100% 0x000001A2 bytes (0 K) speed: infM/S

    $>cd code-uboot/00cpsr/ $>make $>dnw mycpsr.bin

    ///////minicom 窗口 出现

    TINY4412 # dnw 70003000                                                         OTG cable Connected!                                                            Now, Waiting for DNW to transmit data                                           Download Done!! Download Address: 0x70003000, Download Filesize:0x198           Checksum is being calculated.                                                   Checksum Value => MEM:b5f5 DNW:b654                                             Checksum failed.                     

    表示传输成功,自动退出等待。 如果不退出, 继续在 dnw 窗口, [root@localhost 00cpsr]# dnw mycpsr.bin 直到minicom 自动退出

    (3)运行程序 ------------------------ uboot只能支持bin格式的应用程序,如果已经通过dnw加载,则可以用go命令运行应用程序: zht4412 #go 70003000 //执行地址70003000处的代码

    出现问题, printf 打印不出

    问题。

    cd /opt/FriendlyARM/tiny4412/uboot-tiny4412/uboot_tiny4412_0929

    root@localhost uboot_tiny4412_0929]# find . -name "System.map" ./System.map

    gedit System.map

    找到 printf地址 .... c3e11ad0 T printf ....

    找到使用 printf 的程序

    [root@localhost 00cpsr]# pwd /opt/FriendlyARM/tiny4412/code-uboot/00cpsr [root@localhost 00cpsr]# ls common.h  main.c  main.o  Makefile  mycpsr  mycpsr.bin  start.o  start.s

    int my_main(void) {  printf("CPSR = 0x%x ", get_cpsr());

     printf("===Execute cmp 4,3=== ");  set_flags(4, 3);  printf("CPSR = 0x%x ", get_cpsr());

     printf("===Execute cmp 4,4=== ");  set_flags(4, 4);  printf("CPSR = 0x%x ", get_cpsr());

     printf("===Execute cmp 3,4=== ");  set_flags(3, 4);  printf("CPSR = 0x%x ", get_cpsr()); 修改

    [root@localhost 00cpsr]# gedit common.h

    #ifndef _COMMON_H #define _COMMON_H

    #define NULL ((void *)0) #define printf(...) (((int (*)(const char *, ...))0xc3e11ad0)(__VA_ARGS__))

    #endif //_COMMON_H

    重新编译

    make

    [root@localhost 00cpsr]# make arm-linux-ld start.o main.o -Ttext 0x70003000 -o mycpsr arm-linux-objcopy -O binary mycpsr mycpsr.bin

    传到板子。 minicom窗口 dnw 70003000 回车

    代码窗口 dnw mycpsr.bin 回车(可以多次)

    等到 minicom窗口 退出等待

    TINY4412 # go 70003000                                                          ## Starting application at 0x70003000 ...                                       CPSR = 0x60000113                                                               ===Execute cmp 4,3===                                                           CPSR = 0x20000113                                                               ===Execute cmp 4,4===                                                           CPSR = 0x60000113                                                               ===Execute cmp 3,4===                                                           CPSR = 0x80000113                                                               ===Unmask IRQ & FIQ===                                                          CPSR = 0x60000113                                                               ## Application terminated, rc = 0x1  

    问题 :

    [root@localhost 04led]# dnw arm.bin load address: 0x57E00000 Can not open /dev/secbulk0: No such file or directory

    应该是你的驱动没有安装好 解决方法: 串口USB 和小usb 口 在安装是的顺序,和以后运行是的顺序不能变

  • 相关阅读:
    集大软件工程15级结对编程week1
    集大软件工程15级个人作业Week2
    集大软件工程15级个人作业Week1
    Java 课程设计 "Give it up"小游戏(团队)
    Java 课程设计 "Give it up"小游戏设计(个人) 201521123077
    201521123077 《Java程序设计》第14周学习总结
    201521123077 《Java程序设计》第13周学习总结
    2019-助教总结
    软工的总分
    第四次团队作业
  • 原文地址:https://www.cnblogs.com/xl9313/p/6670205.html
Copyright © 2011-2022 走看看