zoukankan      html  css  js  c++  java
  • 玩转pandaboard之rootfs制作及启动

    updated(2012/05/02): mainline的u-boot已经包含对pandaboard的支持, 其中x-loader已经被spl所取代. 相关介绍请参照我的另一篇博文<>

    本篇文章是参考了pandaboard官方wiki, TI的官方文档及linaro的相关image制作的工具总结而来.

    首先,来做些准备工作, 了解一下pandaboard启动所要用到的各种boot loader.

    按如下顺序启动

    1. Boot ROM
      这是固化到硬件中的boot程序, 它的作用是用来引导板子上电之后到哪里去找x-loader. 具体到pandaboard, 参照board manual的'2.6 SYSBOOT Configuration'节可以看到, 更详细的就需要下载巨无霸OMAP4430的TRM来看了(在27.2.4.2 Booting Device Order Selection). 这里默认是首先从USB找, 第二选择是MMC1. 大家拿到板子可以先确认下, 自己的板子是不是默认设置哦. 不然搞了半天启动不起来,就郁闷了:)
      具体的引脚位置:


    2. X-Loader
      TI把对应的x-loader的文件一般叫做MLO, (这在Boot ROM的逻辑中是写死的, 必须要叫MLO, 否则找不到该x-loader)
      这里我们来看一下什么是MLO,可以参照<Writing an MLO for a Beagleboard XM>.它也是一种u-boot, 不过是加上了一个头部(告诉u-boot从哪里开始加载), TI称之为签名.它主要用来做一些硬件的初始化工作及引导第二bootloader.
      按照TI的文档,后续会有SPL来代替x-loader(比如,linaro已经为pandaboard这么做了).
      大家也可以参照:http://elinux.org/Panda_How_to_MLO_&_u-boot,及http://lists.denx.de/pipermail/u-boot/2011-October/105079.html相关的描述

    3. U-boot
      这里首先说明下, beagleboard的时候, TI还是用自己fork的u-boot来进行引导,但是现在最新的mainline上的u-boot已经支持pandaboard和beagleboard了.
      linaro所提供的编译环境中,u-boot就是从mainline上获得加入了一些patch.
      具体U-boot的功能及组织结构,这里也不多罗嗦了,只要你会用google就能得到你想要的.

      说到底,上述的'2','3'就是模拟了PC上bios的事情, 配置各种硬件信息(内存,时钟信号,nand等等嵌入式设备上的总线和模块). 各个不同的厂商,都有一些自己特有的东西, 就我的经验TI/Qualcomm/Samsung各有个的一套配置及设置方式. 这就是arm的世界,嵌入式的战国世界!

    4. Linux kernel
      这里有必要看一下,linaro是如何设定对应的kernel config的
      linaro把u-boot和kernel的代码与AOSP的代码放在一起,通过修改device/linaro/下的相关板卡配置文件,引入了对于kernel及u-boot的编译过程
      详见device/linaro/common/tasks/
             ├── bootfiles.mk
             ├── bootloader.mk
             ├── kernel.mk
             ├── mktarball.sh
             ├── tarballs.mk
             └── uboot.mk
      而对应的u-boot及内核的启动命令都是由下面提到的linaro-media-create工具来完成。

    5. linux rootfs

    另外, 2-4按照TI的硬件说明都是需要vfat的文件系统, 而5则是extX(TI官方wiki上使用的是ext3, linaro上的image脚本制作的是ext4).

    还有就是boot.src, 它是由u-boot加载之后,由它来指定具体的启动参数及启动环境. 它是由一个指定的xxxx.txt, 并由mkimage工具来生成.如下:

    1. File Excerpt: /files/beagle/bootScript  
    2. mmc init  
    3. setenv console tty0 console=ttyS2,115200n8  
    4. setenv ramroot /dev/ram0 rw ramdisk_size=131072 initrd=0x88000000,512M  
    5. setenv optargs mem=80M@0x80000000 mem=384M@0x88000000  
    6. setenv bootargs console=${console} ${optargs} mpurate=800 root=${ramroot} rootfstype=ext4  
    7. fatload mmc 0 0x82000000 uImage  
    8. fatload mmc 0 0x88000000 rootfs.ext4  
    9. bootm 0x82000000  
    File Excerpt: /files/beagle/bootScript
    mmc init
    setenv console tty0 console=ttyS2,115200n8
    setenv ramroot /dev/ram0 rw ramdisk_size=131072 initrd=0x88000000,512M
    setenv optargs mem=80M@0x80000000 mem=384M@0x88000000
    setenv bootargs console=${console} ${optargs} mpurate=800 root=${ramroot} rootfstype=ext4
    fatload mmc 0 0x82000000 uImage
    fatload mmc 0 0x88000000 rootfs.ext4
    bootm 0x82000000
    用mkimage生成, 并copy到启动的sdcard的目录下
    1. > mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n 'Boot script' -d bootScript boot.scr  
    2. > cp /files/panda/boot.scr /mnt/panda  
    > mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n 'Boot script' -d bootScript boot.scr
    > cp /files/panda/boot.scr /mnt/panda
    在linaro中, 该文件是由下面提到的linaro_image_tool生成, 具体的启动选项(即xxxx.txt)在media_create\boards.py中生成.

    最后, 还是来看看linaro为我们准备的image制作工具(也可以使用TI提供的脚本来完成, 不过比较麻烦, 但是对其中细节感兴趣的, 倒是可以参考)

    该工具使用的相关文档:
        https://wiki.linaro.org/Platform/Android/ImageInstallation?action=show&redirect=Platform%2FAndroid%2FInstallImages
        按照文中说明, 很方便的就可以使用自己编译的u-boot, kernel, rootfs来烧制出可以启动pandaboard的sdcard了.
        同时,可以参照<玩转pandaboard之初体验>

    相关文件介绍:

    根目录是一些总控命令

    |-- COPYING
    |-- COPYING.GPL-2
    |-- COPYING.GPL-3
    |-- do-release -- 用来发布新版本的脚本
    |-- initrd-do -- 生成合适的initrd文件
    |-- linaro-android-media-create -- 制作android rootfs sdcard的命令
    |-- linaro-fetch-image -- 从release server获得编译好的image
    |-- linaro-fetch-image-ui -- 同上
    |-- linaro-hwpack-create -- 设置用来编译rootfs的hardware pack
    |-- linaro-hwpack-install -- 同上
    |-- linaro-hwpack-replace -- 同上
    |-- linaro-image-indexer -- 建立与release server对应的image信息的database
    |-- linaro_image_tools\
    |-- linaro-media-create -- 制作其它系统(ubuntu)的rootfs sdcard命令
    |-- org.linaro.linaro-image-tools.policy
    |-- README
    `-- setup.py

    linaro_image_tools\

    |-- cmd_runner.py -- 调用各种辅助命令的python封装
    |-- cmd_runner.pyc
    |-- fetch_image.py -- 从release server上获得image的工具
    |-- fetch_image_settings.yaml -- 从release server上获得image的配置文件
    |-- hwpack\
    |-- __init__.py
    |-- __init__.pyc
    |-- media_create\
    |-- testing.py
    |-- tests\
    |-- utils.py
    |-- utils.pyc
    |-- __version__.py
    `-- __version__.pyc

    ------------------------------------------------------------

    media_create\ rootfs文件系统及各board对应的配置文件制作及应用

    |-- android_boards.py --为各种开发板上定制适合android的sdcard格式信息及kernel启动命令行, 与linaro-android-media-create相匹配
    |-- android_boards.pyc
    |-- boards.py -- 用来对不同的开发板进行所需要的sdcard进行初始化, 里面有各个开发板的一些section信息,kernel cmd等, 依赖于hwpack的一些工具函数
    |-- boards.pyc
    |-- check_device.py -- 检查连入系统的mmc是什么设备及对应dev/xxxx名称
    |-- check_device.pyc
    |-- chroot_utils.py -- chroot的工具封装, 用来在编译机上配合hardware pack建立独立的target文件系统(类似redhat的mock机制的一部粉)
    |-- __init__.py
    |-- __init__.pyc
    |-- partitions.py -- 提供各种分区功能
    |-- partitions.pyc
    |-- rootfs.py -- 提供从独立的target 文件系统copy到sdcard上的工具
    |-- rootfs.pyc
    |-- tests
    |-- unpack_binary_tarball.py -- 提供解包工具
    `-- unpack_binary_tarball.pyc

    hwpack\ 辅助target目标文件系统相关配置及制作,类似fedora下的mock机制

    |-- better_tarfile.py
    |-- builder.py
    |-- config.py
    |-- hardwarepack_format.py
    |-- hardwarepack.py
    |-- __init__.py
    |-- packages.py
    |-- tarfile_matchers.py
    |-- testing.py
    `-- tests
        |-- ...
      

    其它,

            什么是.pyc文件, 它用来帮组加载py时加速. 参见http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html

  • 相关阅读:
    常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
    常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
    在服务器上用Fiddler抓取HTTPS流量
    org.apache.commons.lang下的工具类
    Spring-bean作用域scope详解
    Tomcat性能调优方案
    JavaScript 闭包究竟是什么
    JavaScript跨域总结与解决办法
    《JAVA与模式》之简单工厂模式
    hibernate缓存机制详细分析
  • 原文地址:https://www.cnblogs.com/spinsoft/p/2597709.html
Copyright © 2011-2022 走看看