• Linux之uboot分析与移植20160601


    说一下uboot分析与移植:

    1、下载、建立source insight工程、编译、烧写、如果无运行分析原因

    tar xjf u-boot-2012.04.01.tar.bz2

    cd u-boot-2012.04.01

    make smdk2410_config

    make

    2. 分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程

    a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH

    b. 如果bootloader比较大,要把它重定位到SDRAM

    c. 把内核从NAND FLASH读到SDRAM

    d. 设置"要传给内核的参数"

    e. 跳转执行内核

    2.1 set the cpu to SVC32 mode

    2.2 turn off the watchdog

    2.3 mask all IRQs by setting all bits in the INTMR

    2.4 设置时钟比例

    2.5 设置内存控制器

    2.6 设置栈,调用C函数board_init_f

    2.7 调用函数数组init_sequence里的各个函数

    2.7.1 board_early_init_f : 设置系统时钟、设置GPIO

    ......

    2.8 重定位代码:

    2.8.1 NOR FLASH把代码复制到SDRAM

    2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"

          现在把程序复制到了SDRAM

          需要修改代码,把"基于0地址编译得到的地址"改为新地址

    2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs

    2.9 clear_bss

    2.10 调用C函数board_init_r:第2阶段的代码

    可以修改配置定义CONFIG_S3C2440

    3. 修改U-BOOT代码

    3.1 建一个单板

    cd board/samsung/

    cp smdk2410 smdk2440 -rf

    cd ../../include/configs/

    cp smdk2410.h smdk2440.h

    修改boards.cfg:

    仿照

    smdk2410                     arm         arm920t     -                   samsung        s3c24x0

    添加:

    smdk2440                     arm         arm920t     -                   samsung        s3c24x0

    3.2 烧写看结果

    3.3 调试:

    a. 阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置

       处理措施: MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置

       

       编译出来的uboot非常大,可以先烧写主光盘里的u-boot.binnor,然后用这个uboot来烧写新的uboot

    3.4 乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440

        处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410

                                              #define CONFIG_S3C2440

                                              //#define CONFIG_CMD_NAND

    3.5 修改UBOOT支持NAND启动

        原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"

        使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)

    3.5.1 去掉 "-pie"选项

          arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行

          

    3.5.2 参考"毕业班第1"start.S, init.c来修改代码

          把init.c放入board/samsung/smdk2440目录, 修改Makefile

          修改CONFIG_SYS_TEXT_BASE0x33f80000

          修改start.S

    3.5.3 修改board_init_f, relocate_code去掉

    3.5.4 修改链接脚本: start.S, init.c, lowlevel.S等文件放在最前面

          ./arch/arm/cpu/u-boot.lds

          

          board/samsung/smdk2440/libsmdk2440.o

    3.6 修改UBOOT支持NOR FLASH

      driversmtdjedec_flash.c 加上新的型号

      #define CONFIG_SYS_MAX_FLASH_SECT (128)

      修复了重定时留下来的BUGSP要重新设置

    3.7 修改UBOOT支持NAND FLASH

        修改:include/configs/smdk2440.h: #define CONFIG_CMD_NAND

        

        把driversmtd ands3c2410_nand.c复制为s3c2440_nand.c

                                              

    分析过程:

    nand_init

    nand_init_chip

    board_nand_init

    设置nand_chip结构体, 提供底层的操作函数

    nand_scan

    nand_scan_ident

    nand_set_defaults

    chip->select_chip = nand_select_chip;

    chip->cmdfunc = nand_command;

    chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;

    nand_get_flash_type

    chip->select_chip

    chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);

    nand_command()  // 即可以用来发命令,也可以用来发列地址(页内地址)、行地址(哪一页)

    chip->cmd_ctrl

    s3c2440_hwcontrol

    chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

    *maf_id = chip->read_byte(mtd);

    *dev_id = chip->read_byte(mtd);

    3.8 修改UBOOT支持DM9000网卡

    eth_initialize

    board_eth_init

    cs8900_initialize

    *** ERROR: `ethaddr' not set

    set ipaddr 192.168.1.17

    set ethaddr 00:0c:29:4d:e4:f4

    set serverip 192.168.1.3

    4. 易用性修裁剪及制作补丁

    内核打印出来的分区信息

    0x00000000-0x00040000 : "bootloader"

    0x00040000-0x00060000 : "params"

    0x00060000-0x00260000 : "kernel"

    0x00260000-0x10000000 : "root"

    nand erase 60000 200000

    nand write 30000000 60000 200000

    tftp 30000000 uImage

    nand erase.part kernel

    nand write 30000000 kernel

    附笔者的学习笔记,字写的不好勿怪,将就看吧:

    1).uboot介绍以及最终目的:

    2).分析makefile找到第一个执行的文件:

    3).源码分析:

    4)uboot中命令实现:

    5)uboot启动内核:

  • 相关阅读:
    Redis常用配置说明
    Redis入门知识
    分布式理论基石CAP理论
    MySQL之视图
    MySQL之事务控制总结
    MySQL之标识列(自增长列)设置起始值与步长
    LeetCode 543. Diameter of Binary Tree(两节点最长路径)
    LeetCode 110. Balanced Binary Tree(平衡树)
    LeetCode 104. Maximum Depth of Binary Tree(求树的高度)
    LeetCode 328. Odd Even Linked List(链表元素按奇偶聚集)
  • 原文地址:https://www.cnblogs.com/yuweifeng/p/5551591.html
Copyright © 2020-2023  润新知