历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2020年01月21日 | 【系统移植】uboot详细分析

2020-01-21 来源:eefocus

uboot使用

    uboot控制台,倒计时
    命令: 调试,操作一些硬件

setenv printenv saveenv 
 nand erase 
 nand write 
 tftp 20008000 zImage
 help: uboot可以提供哪些命令
 setenv == set == sete == seten

    环境变量: 为命令提供参数
     serverip : tftp命令提供tftp服务器的地址
     ipaddr : tftp命令提供tftp客户端(开发板)的地址

两个环境变量

    uboot: 下载内核,并启动内核
    bootcmd:  倒计时结束后,uboot应该自动做什么事情

 set bootcmd tftp 20008000 zImage ; bootm 20008000
 set serverip 192.168.7.2
 set ipaddr 192.168.7.6
 set ethaddr 00:22:23:24:25:ee

   倒计时结束的时候,uboot会执行bootcmd中的内容:
   tftp 20008000 zImage ; bootm 20008000

   从tftp服务器(serverip)中将zImage文件(/tftpboot/)下载到开发板(ipaddr)中内存的20008000

   set bootcmd tftp 20008000 zImage ; bootm 20008000

  bootargs: 负责告诉内核文件系统在哪里(uboot传递给内核, 内核要用)

  set bootargs init=/linuxrc console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.7.2:/opt/filesystem ip=192.168.7.6
  root=xxxx : 根文件系统目录在哪里
  /dev/nfs : 根文件系统目录在网络的远端
  
  nfsroot=xxxx: 根文件系统目录在哪台机器的哪个文件路径
  nfsroot=192.168.7.2:/opt/filesystem
  ip=192.168.7.6: 系统登录的时候,静态分配一个ip

  如果root=/dev/nfs
  root=/dev/nfs + nfsroot=xxxx +ip=xx
  
  如果root=/dev/mtdblock2(文件系统制作的时候会讲)
   root=/dev/mtdblock2 + rootfstype=cramfs
  
  console=ttySAC0,115200 : 内核启动过程中,调试信息往哪里输出,printk
  init=/linuxrc : 指定第一个init进程的可执行代码文件
  /opt/filesystem==> host: /etc/exports
  sudo vim /etc/exports
  /opt/filesystem         *(subtree_check,rw,no_root_squash,async)
  /opt/fs100/rootfs               *(subtree_check,rw,no_root_squash,async)

 

启动内核:go/bootm

官方的uboot

zImage
  : go
  set bootcmd tftp 20008000 zImage ; go 20008000
 
 uImage 
  : bootm(下载地址,不能是20008000)
  set bootcmd tftp 20800000 uImage ; bootm 20800000
 
 下载地址的选用:
  go==> 可以是任何地址
  bootm==> 20008000+zImage的大小以上==>20800000 
 综合用法:
  set bootcmd tftp 20800000 zImage ; go 20800000
  set bootcmd tftp 20800000 uImage ; bootm 20800000
uboot1.3.4:
 zImage/uImage ==>bootm
 set bootcmd tftp 20800000 uImage ; bootm 20800000

 

uboot的连接脚本

    所在路径:cpu/arm_cortexa8/u-boot.lds

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start) // 入口函数
SECTIONS
{
        . = 0x00000000;  // 当前的起始位置0x0
        . = ALIGN(4);
        .text(目标文件)   :
        { 
                cpu/arm_cortexa8/start.o        (.text) // 第一个文件的.text
                *(.text)
        }
        . = ALIGN(4); // 当前位置四字节对齐
        .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
        . = ALIGN(4);
        .data : { *(.data) }
        . = ALIGN(4);
        .got : { *(.got) }
        __u_boot_cmd_start = .;  // 用__u_boot_cmd_start记录当前的位置, 代码会用到,全局的
        .u_boot_cmd : { *(.u_boot_cmd) } // 段数据
        __u_boot_cmd_end = .; // 结束位置
        . = ALIGN(4);
        __bss_start = .;
        .bss : { *(.bss) }
        _end = .;
}

连接的基地址:
     -Ttext 0x34800000==>board/samsung/smdkc100/config.mk
     TEXT_BASE = 0x34800000
     1,TEXT_BASE指定uboot的连接的起始位置
     2,指定uboot重定位的位置(可以改成0x2ff00000)

 

uboot配置的详细说明

 

make smdkc100_config
vim Makefile
unconfig:
        @rm -f $(obj)include/config.h $(obj)include/config.mk
                $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
                $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep
MKCONFIG        := $(SRCTREE)/mkconfig == ./mkconfig  shell脚本(可执行程序)

smdkc100_config:        unconfig
        @$(MKCONFIG) $(@:_config=) arm arm_cortexa8 smdkc100 samsung s5pc1xx
 ./mkconfig  smdkc100 arm arm_cortexa8 smdkc100 samsung s5pc1xx
 执行一个脚本: 传递了6个参数(控制源码的编译)
 arm : 架构==> lib_arm
 smdkc100 : include/configs/smdkc100.h  // 开发板所有的宏的配置
 arm_cortexa8 : arm名 ==> cpu/arm_cortexa8
 smdkc100 samsung : 开发板名==> board/samsung/smdkc100
 s5pc1xx :cpu ==>cpu/arm_cortexa8/s5pc1xx

$(@:_config=): $@:_config= ==>smdkc100_config:_config=  // _config替换成空,去掉
  $(@:_config=xxx) ===>smdkc100xxx

 

uboot第一阶段启动流程

 

1,建立异常向量表:
_start: b reset
 ldr pc, _undefined_instruction
 ldr pc, _software_interrupt
 ldr pc, _prefetch_abort
 ldr pc, _data_abort
 ldr pc, _not_used
 ldr pc, _irq
 ldr pc, _fiq

2,
reset:
 /*
  * set the cpu to SVC32 mode, disable F, I
  */
 mrs r0, cpsr
 bic r0, r0, #0x1f
 orr r0, r0, #0xd3
 msr cpsr,r0

 bl cpu_init_crit
   |
   /*
    * Invalidate L1 I/D
    */
   mov r0, #0   @ set up for MCR
   mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
   mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
   /*
    * disable MMU stuff and caches
    */
   mrc p15, 0, r0, c1, c0, 0
   bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
   bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
   orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
   orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB
   mcr p15, 0, r0, c1, c0, 0

   bl lowlevel_init  //lowlevel_init.S (boardsamsungsmdkc100):lowlevel_init:
     |
     /* Disable Watchdog */
     ldr r0, =S5PC100_WATCHDOG_BASE  @0xEA200000
     orr r0, r0, #0x0
     str r5, [r0]
     /* setting SRAM */
     ldr r0, =S5PC100_SROMC_BASE
     ldr r1, =0x9
     str r1, [r0]

     /* S5PC100 has 3 groups of interrupt sources */
     ldr r0, =S5PC100_VIC0_BASE   @0xE4000000
     ldr r1, =S5PC100_VIC1_BASE   @0xE4000000
     ldr r2, =S5PC100_VIC2_BASE   @0xE4000000
     /* Disable all interrupts (VIC0, VIC1 and VIC2) */
     mvn r3, #0x0
     str r3, [r0, #0x14]    @INTENCLEAR
     str r3, [r1, #0x14]    @INTENCLEAR
     str r3, [r2, #0x14]    @INTENCLEAR
     /* Set all interrupts as IRQ */
     str r5, [r0, #0xc]    @INTSELECT
     str r5, [r1, #0xc]    @INTSELECT
     str r5, [r2, #0xc]    @INTSELECT
     /* Pending Interrupt Clear */
     str r5, [r0, #0xf00]   @INTADDRESS
     str r5, [r1, #0xf00]   @INTADDRESS
     str r5, [r2, #0xf00]   @INTADDRESS
     bl uart_asm_init // 只是设置了gpio的功能,波特率的设置在第二阶段
     #if 1  // 改动的部分
     /* init system clock */
     bl system_clock_init // 基本上没太大问题
     bl mem_ctrl_asm_init
     //mem_setup.S boardsamsungSmdkc100 
     // 内存的初始化比较复杂, 原厂会提供(1.3.4)
     // 向FAE要
     // 这部分代码运行有问题
     1,mem_ctrl_asm_init
     2,mem_setup.S需要被编译<===boardsamsungSmdkc100Makefile
     3,内存初始化代码应该在前16k (反汇编)
      修改cpu/arm_cotexa8/u-boot.lds

推荐阅读

史海拾趣

Hsuan Mao Technology Co公司的发展小趣事

Hong Kong X'Tals Ltd在电子行业的发展故事

故事一:精密时间与频率产品的创新之路

Hong Kong X'Tals Ltd(简称HKC)自1991年成立以来,一直致力于精密时间和频率产品的研发与生产。公司最引人注目的成就是其KSTAR系列全球导航卫星系统(GNSS)驯服振荡器(GNSSDO)的推出。这款新产品不仅接收来自北斗、GPS、GLONASS和GALILEO等多卫星系统的信号,还具备高灵敏度和低噪声的特点,长期频率稳定性优于1E-12。KSTAR系列GNSSDO的推出,标志着HKC在通讯、自动驾驶、能源和金融等领域的时间同步解决方案上达到了国际领先水平。这一创新不仅增强了公司在全球市场的竞争力,也为众多行业客户提供了更加精准和可靠的时间同步服务。

故事二:从石英晶体到国际市场的跨越

HKC的母公司Kolinker Industrial Equipments Ltd拥有超过13年的中国晶体行业经验,并在深圳设立了首家中国本地的晶体工厂,该工厂荣获QS9000和ISO/TS16949认证。这一成就不仅体现了HKC在晶体制造领域的专业实力,也为其产品打入国际市场奠定了坚实的基础。HKC凭借其高质量的石英晶体产品,成功进入东欧、日本、韩国、中国大陆、北美、台湾和西欧等市场,成为国际市场上备受瞩目的晶体产品供应商。

故事三:技术研发与产品多元化的并行发展

HKC深知技术研发对于企业发展的重要性,因此不断加大在研发领域的投入。公司不仅专注于晶体、谐振器和振荡器的研发与生产,还积极拓展产品线,推出了一系列满足不同行业需求的电子产品。例如,在工业自动化领域,HKC设计并制造了多款机电一体化设备,赢得了国内外众多知名家电制造商的青睐。此外,公司还涉足新能源行业,通过投资组建益阳晶鑫新能源科技实业有限公司,致力于多晶硅产业链的建设与发展。

故事四:品质管理与国际认证的双重保障

HKC始终将品质管理视为企业发展的生命线。公司早在2000年和2003年就分别通过了ISO9002 1994及ISO9001 2000质量管理体系认证,成为同行业中最具实力的公司之一。这一系列的国际认证不仅证明了HKC在品质管理方面的卓越表现,也为其赢得了国内外客户的广泛信赖。HKC始终坚持以客户为中心,不断提升产品品质和服务水平,努力成为电子行业的佼佼者。

故事五:全球化战略与本土化运营的有机结合

随着全球市场的不断扩大,HKC积极实施全球化战略,在全球多个地区设立分公司和生产基地。同时,公司也注重本土化运营,根据不同地区的市场特点和客户需求,提供定制化的产品和服务。例如,HKC在中国内地市场就设立了多家子公司和生产基地,通过深入了解本地市场需求和客户需求,不断优化产品结构和服务模式,赢得了中国市场的广泛认可。这种全球化战略与本土化运营的有机结合,为HKC的可持续发展提供了强有力的支撑。

CINCH公司的发展小趣事

随着业务的不断发展,CINCH公司开始寻求市场拓展和战略合作的机会。公司积极与国内外知名企业建立合作关系,共同开发新产品、拓展新市场。同时,CINCH公司还加强了对新兴市场的关注,通过参加国际展会、举办技术研讨会等方式,提升品牌知名度和影响力。这些举措有效地推动了公司的市场拓展和业务发展。

General Transistor Corp公司的发展小趣事

面对日益激烈的市场竞争,GTC及时调整市场策略,加强品牌建设。公司注重提升产品质量和服务水平,积极参与国内外各类电子产品展会和论坛,提高品牌知名度和影响力。同时,GTC还建立了完善的销售网络和售后服务体系,为客户提供更加便捷、高效的服务。这些举措有力地推动了公司业务的快速增长和市场份额的扩大。

Exar [Exar Corporation]公司的发展小趣事

进入21世纪后,数字视频应用的兴起为Exar提供了新的发展机遇。为了抓住这一机遇,公司在2000年推出了视频处理器和编解码器产品。这些产品不仅满足了市场对高质量视频处理的需求,也进一步巩固了Exar在通信和视频处理领域的地位。

Advance Tapes公司的发展小趣事

面对日益复杂的市场环境和客户需求,Advance Tapes公司积极寻求与其他企业的合作机会。通过与上游原材料供应商建立长期稳定的合作关系,确保了原材料的稳定供应和质量保障;通过与下游电子制造企业的深度合作,共同开发定制化胶带产品,满足了客户的特殊需求。这些合作不仅提升了Advance Tapes的市场竞争力,也促进了整个电子产业链的健康发展。

Actel公司的发展小趣事

Advance Tapes公司创立于1963年,当时电子工业正处于起步阶段,胶带作为电子元器件生产中的重要辅助材料,市场需求日益增长。然而,初创的Advance Tapes面临着资金短缺、技术落后和市场竞争激烈等挑战。公司创始人凭借对电子行业的敏锐洞察力和对胶带技术的深入研究,带领团队不断研发新产品,提高产品质量,逐渐在市场中站稳脚跟。

问答坊 | AI 解惑

及求单片机烧写软件

谁有,分享以下,谢了…

查看全部问答>

请问谁有程序下载器资料呀

有的发给我好么,谢谢了…

查看全部问答>

系统栈、IRQ栈及任务栈

小弟新人,开发过程中,突然发现对这几个栈作用不明确,相互之间有什么关联,不同的栈压入的都是些什么东西,还请高手解答。…

查看全部问答>

这样的报表用怎么做?

数量    厂家     数量     型号      数量                           n ...…

查看全部问答>

求解:wince6.0下电源管理,中父设备和子设备之间的关系?

求解:wince6.0下电源管理,中父设备和子设备之间的关系?…

查看全部问答>

新板检错【SJF2440 | H-JTAG】

新板 2440+K9F2G08用h-jtag 可以识别到CPU,电压,晶振正常 但在h-jtag里面的H-FLASHER check功能的时候,出现错误: error:can\'t halt target and make it in the debug mode..... 此功能是实现识别flash ID的! 现在不知道是ram 还是nand ...…

查看全部问答>

EVC下面如何给程序添加启动界面

我用EVC开发了一个应用程序,想给它添加一个启动界面,不知如何添加。 我网上搜了搜到的都是为基于对话框的程序添加的启动界面,但不知道基于窗口的应用程序该如何添加,请高手帮帮忙,谢谢!…

查看全部问答>

移动智能家庭介绍

 曾经有一部叫做《神奇遥控器》的电影,影片的主人公迈克尔买了一部全功能遥控器,却发现这部神奇的遥控器不但可以控制家用电器,甚至可以控制时间与空间,随意来往于过去与未来。虽然这部科幻电影中用遥控器控制时间的场面离我们还非常遥远,但在 ...…

查看全部问答>

请教一个STM32F103V8的PD6的FT的问题!

                                 在手册中说PD6的类型是FT的,这是指当它做为IO口时是兼容5V的,那当它作为UART2的RXD时还兼容5V吗?谢谢!…

查看全部问答>