Chinaunix首页 | 论坛 | 博客
  • 博客访问: 646704
  • 博文数量: 329
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 693
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-05 23:37
个人简介

Do not panic!

文章存档

2021年(1)

2018年(3)

2017年(7)

2016年(98)

2015年(220)

我的朋友

分类: 嵌入式

2016-08-11 10:58:33

根据芯片手册,AM335x上电后首先执行固化在芯片内部ROM中的代码,我们称之为BL0,BL0的功能很强大,能读取SD卡中第一个分区(必须是FAT格式)的MLO文件,复制到ram中运行,复制的起始地址为0x402F0400,所以编译MLO时,链接地址必须设置为0x402F0400。一般的,MLO的作用是:禁用中断,关看门狗,设置栈,初始化时钟,初始化DDR3,初始化串口,复制u-boot.img到DDR3的0x80800000处运行。MLO的最大体积可以达到109K,对于简单的裸机程序绰绰有余了。
MLO其实是TI给u-boot的SPL起了个别名而已,我们称之为BL1,MLO其实是mkimage工具给u-boot-spl.bin添加了头信息后得到的(就行uImage和zImage的关系)。BL2自然就是U-boot.bin了,但是MLO不是直接加载U-boot.bin文件,而是加载u-boot.img文件,img文件其实是用mkimage工具给u-boot.bin添加头信息后得到的,mkimage可以通过编译u-boot得到,位于tools目录内,注意用较新版本的,2014或者2015的u-boot都可以。u-boot.img的头信息具体内容格式参见芯片手册。

mkimage制作MLO的命令是如下格式:
mkimage -T omapimage -a 0x402F0400 -d 'u-boot-spl.bin' MLO
我们可以制作成脚本:
#!/bin/bash
mkimage -T omapimage -a 0x402F0400 -d $1 MLO
保存为mkmlo,复制到/usr/local/bin目录,就可以敲mkmlo xxxx命令将编译后的裸机程序生成MLO了。

同理,制作生成u-boot.img的脚本:
#!/bin/bash
mkimage  -A arm -T firmware -C none -O u-boot -a 0x80800000 -e 0 -d $1 u-boot.img
保存为mkbl2,复制到/usr/local/bin目录,就可以敲mkbl2 xxxx命令将编译后的裸机程序生成BL2了,BL2可以使用DDR3的全部空间,这样我们可以加载更大的裸机程序,跑ucos都没问题。

SD卡必须按特殊的方式进行分区,否则是BL0是无法识别并加载MLO的。制作SD卡启动盘时,记得是255 heads(磁头数,也就是盘面数量),63 sector/track(每个磁道(柱面)所含扇区数)参数,把磁盘看做一个3D长方体,heads磁头就是高度(层数),sector/track就是宽度(一个磁道内的扇区数,磁道就是一圈),剩下的cyliner(柱面数)就是长度(多少圈),所以分区时,所以一般的,一个分区逻辑上的容量必定是柱面容量(255 * 63 * 512bystes )的整数倍,通常比物理容量大一点,因为SD卡毕竟不是磁盘结构,无法刚好与柱面容量对齐。
关于启动盘制作,百度文库有篇 EVB335X EMMC Linux烧录手册讲得很详细,推荐使用TI提供的create-sdcard.sh脚本文件(可以到我网盘下载)进行分区,自己手动分区比较麻烦。

总结一下,BL0(rom)-> MLO(SD卡或emmc、nand等) -> u-boot.img -> kernel
MLO、u-boot.img需要用mkimage添加头信息才能运行
,kernel如果uImage格式也需要。

制作AM335x的SD启动卡可以利用脚本实现。
我们来看分区脚本的内容:
#!/bin/sh
#mk3PartSDCard.sh v0.3
# Licensed under terms of GPLv2
DRIVE=$1
dd if=/dev/zero of=$DRIVE bs=1024 count=1024
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
echo DISK SIZE - $SIZE bytes
CYLINDERS=`echo $SIZE/255/63/512 | bc`
#sdfdisk device
sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF
,9,0x0C,*
10,115,,-
126,,,-
EOF
mkfs.vfat -F 32 -n "boot" ${DRIVE}1
umount ${DRIVE}1
mkfs.ext3 -L "rootfs" ${DRIVE}2
umount ${DRIVE}2
mkfs.ext3 -L "START_HERE" ${DRIVE}3


sfdisk输入格式如下:
start size id bootable c,h,s c,h,s

其中start size参数都是以柱面(cyliner)为单位的,id是分区类型,如0xc表示fat32,
bootable表示卷标,只对dos分区有意义。每行参数表示一个分区,MBR支持4个主分区。
如上面的脚本有3行参数,表示:
划分柱面0~8为分区1,fat32格式(0xC),
划分柱面10~125为分区2,
划分柱面126~为分区3。

工具下载地址:
阅读(1642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~