335x裸机开发1

AM335x 裸机开发笔记(1)——启动流程与启动卡分区 2016-04-22 21:51:24
      
根据芯片手册,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= 1ddif=/dev/zeroof= 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” DRIVE1umount {DRIVE}1
mkfs.ext3 -L “rootfs” DRIVE2umount {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。

工具下载地址:http://pan.baidu.com/s/1i3lERv3










            
          
阅读(1456) | 评论(0) | 转发(0) |
0

上一篇:AM335x 裸机开发笔记(2)之LED

下一篇:没有了

你可能感兴趣的:(嵌入式系统)