Linaro开源社区、Snowball(ICS)开发板及其Andorid烧写过程介绍

 一.  Linaro 
       在国内几乎很少人会知道Linaro(http://www.linaro.org)这样一个非营利性开源软件组织,它集合了超过120位嵌入式行业工程师,是由ARM、飞思卡尔、IBM、三星、ST-Ericsson和德州仪器这几家公司共同宣布成立,目的是帮助开发人员和制造商为消费者提供更多选择、反应更快的设备,并提供更多样化的基于Linux系统的应用。

二. Snowball(ICS) board开发板

      Snowball开发板是Linaro组织主推的几款用于开发Andorid的开发板,由ST-Ericsson公司设计。另外几款分别是三星的origen以及TI的panda开发板等等。与其他开发相比,Snowball在其通信方面具有相当大的优势,主要详细介绍可以参考Snowball专门的开发社区http://www.igloocommunity.org/。

硬件结构 

  • ARM® Dual Cortex A9 @ 1GHz,
  • 4 / 8GB e-MMC,
  • 1GB LP-DDR2,
  • 1x Micro-SD,
  • 1x RTC Battery Backup,
  • 1x HDMI Full HD,
  • 1x Ethernet 10/100Mbits,
  • 1x CVBS Video OUT,
  • 1x Audio OUT,
  • 1x Audio IN,
  • 1x USB OTG HS (480Mbits),
  • 1x DC IN +5V,
  • 1x Li-Ion Battery Charger,
  • 1x Serial Port (RS232 / Over USB
  • 1x JTAG Connector,
  • 1x MiPi34 Debug Connector,
  • 1x IEEE 802.11 b/g/n Wireless LA
  • 1 x Bluetooth 4.0/LEB(Ex. Antenna)
  • 1 x GPS (Ex. Antenna),
  • 1x 3 Axis Accelerometer,
  • 1x 3 Axis Magnetometer,
  • 1x 3 Axis Gyrometer,
  • 1x Pressure sensor (300-1100 mb)
  • 3x Expansion Connectors (FSMC HSI, Audio, MiPi CSI / Camera, LC MiPi DSI, UART, SPI, I2C, GPIO).

       Snowball的通信模块可谓强大,集合了Wifi、Bluetooth以及GPS模块;

      开发板上直接有USB转串口模块,所以只要一根USB线就可以查看串口输出信息;

      一个USB OTG既可以作为host,又可以作为device,不过作为开发板作为host的时候需要配备一根Mini USB A公转母头,作为USB扩展。

三. 在Snowball上烧写Android流程

         snowball提供了两种不同的烧写方式,emmc烧写以及sd卡烧写方式。

emmc烧写步骤:
 (1)  准备工作
        从Linaro或igloocommunity官网上下载得到最新的Andorid源码编译形成三个文件boot.tar.bz2、system.tar.bz2、userdata.tar.bz2。其中system.tar.bz2加载系统数据,userdata.tar.bz2加载用户数据,而boot.tar.bz2加载启动项信息。同时需要安装emmc启动镜像的烧写工具riff(http://www.igloocommunity.org/support/Riff)

 (2) 创建一个临时的工作目录存放三个文件

     $ mkdir snowball-image
     $ cd snowball-image
     $ ls
     boot.tar.bz2 system.tar.bz2  userdata.tar.bz2

(3) 下载并解压制作镜像需要的启动文件包(http://www.igloocommunity.org/download/linaro/startupfiles/latest/)

     $ pwd
      snowball-image
   (fetch the tarball)
    $ tar xf startupfiles_xyz.tar.gz
    $ ls startupfiles/
   boot_image_issw.bin  boot_image_x-loader.bin  debian  license.txt  mem_init.bin
   power_management.bin  startfiles.cfg  u-boot-env.bin

(4) 因为默认的linaro-android build是在init.rc文件中指明从mmc卡启动,需要修改以支持从emmc卡启动。解压缩boot.tar.bz2

    $ ls
   boot.tar.bz2 startupfiles  system.tar.bz2  userdata.tar.bz2
   $ tar xjf boot.tar.bz2
   $ ls  
     boot boot.tar.bz2 startupfiles  system.tar.bz2  userdata.tar.bz2 

    $ ls boot/
   cmdline  u-boot.bin  uImage  uInitrd

(5) 由于init.rc嵌入在boot/uInitrd这样一个cpio归档文件中,因此使用dd命令去抽取相关信息

 $ ls
   boot  boot.tar.bz2 startupfiles  system.tar.bz2  userdata.tar.bz2
 $ dd if=boot/uInitrd of=initrd.cpio.gz bs=1 skip=64
 $ ls
   boot  boot.tar.bz2 initrd.cpio.gz startupfiles  system.tar.bz2  userdata.tar.bz2
 $ mkdir rootfs
 $ cd rootfs
 $ sudo gunzip -c ../initrd.cpio.gz | cpio -i
   data          init              init.st-ericssonsnowballplatform.rc  sys ueventd.rc
   default.prop  init.goldfish.rc  proc                                 system   
   ueventd.st-ericssonsnowballplatform.rc
   dev           init.rc           sbin                                 ueventd.goldfish.rc

(6) 这一步需要去init.rc文件中去修改相关的挂载分区信息以支持从emmc卡启动

    on fs
    # mount mmc partitions
       mount ext4 /dev/block/mmcblk1p2 /system ro
       mount ext4 /dev/block/mmcblk1p3 /cache
        mount ext4 /dev/block/mmcblk1p5 /data

    # comment out the above and uncomment these to run from emmc.
    #   mount ext4 /dev/block/mmcblk0p3 /system ro
    #   mount ext4 /dev/block/mmcblk0p5 /cache
    #   mount ext4 /dev/block/mmcblk0p6 /data

(7) 重新建立cpio归档以及uInitrd

     $ pwd
       rootfs
     $ sudo find . | cpio -o -H newc | gzip > ../newinitrd.cpio.gz
       516 blocks
     $ cd ../
     $ pwd
          snowball-image
     $ ls
          boot newinitrd.cpio.gz system.tar.bz2 boot.tar.bz2  initrd.cpio.gz  rootfs   
           startupfiles userdata.tar.bz2
      $ mkimage -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n initramfs -d ./newinitrd.cpio.gz ./uInitrd.new

(8) 创建的uInitrd.new替换原来老的uInitrd,然后创建新的boot.tar.bz2

     $ ls boot/
        cmdline  u-boot.bin  uImage  uInitrd
     $ cp uInitrd.new boot/uInitrd
     $  rm boot.tar.bz2
     $  tar cjf boot.tar.bz2 boot

(9) 在当前目录下下载镜像制作工具linaro-android-media-create

   $ pwd
   snowball-image
   $ bzr branch lp:linaro-image-tools
   $ ls
      boot newinitrd.cpio.gz  startupfiles  system.tar.bz2  userdata.tar.bz2
      boot.tar.bz2  initrd.cpio.gz  rootfs startupfiles uInitrd.new

(10) 使用linaro-android-media-create创建镜像

    $ sudo ./linaro-image-tools/linaro-android-media-create --image-file snowball-image --image-size 1500M --dev snowball_emmc --system system.tar.bz2 --userdata userdata.tar.bz2 --boot boot.tar.bz2
    等镜像制作完毕,就可以使用riff -f命令烧写镜像了

 

sd卡烧写步骤:

(1) 编辑out目录下的init.rc文件,使从sd卡加载系统和数据分区

    $ sed -i s/mmcblk0/mmcblk1/ out/target/product/snowball/root/init.rc

(2) 编译linaro-android-media-create需要的target

   $ make systemtarball-nodeps userdatatarball-nodeps boottarball-nodeps

(3) 烧写到SD卡上
    $ cd out/target/product/snowball/
    $ linaro-android-media-create --mmc /dev/sdX --dev snowball_sd --boot boot.tar.bz2 --system system.tar.bz2 --userdata userdata.tar.bz2

(4) 烧写完加载boot分区,创建uInitrd

   $ mkimage -A arm -O linux -T ramdisk -n "Android Ramdisk Image" -d ramdisk.img uInitrd拷贝到boot分区

(5) 在Android系统启动时中断uboot的执行,输入以下命令设置启动变量:

  $ setenv sdboot "setenv bootargs 'cachepolicy=writealloc noinitrd init=init board_id=1 crashkernel=crashkernel=1M@0x5600000 logo.nologo startup_graphics=1 mpcore_wdt.mpcore_margin=359 loglevel=8 root=/dev/ram rw rootwait console=ttyAMA2,115200n8 mem=128M@0 mali.mali_mem=64M@128M mem=24M@192M hwmem=167M@216M mem_issw=1M@383M mem=640M@384M vmalloc=256M'; mmc rescan 1; fat load mmc 1:1 0x100000 /uImage; fat load mmc 1:1 0x5000000 /uInitrd; bootm 0x100000 0x5000000"

   $ run sdboot    


 


你可能感兴趣的:(嵌入式开发)