335x裸机开发1

来源:互联网 发布:淘宝童装进货渠道 编辑:程序博客网 时间:2024/06/06 13:03
AM335x 裸机开发笔记(1)——启动流程与启动卡分区 2016-04-22 21:51:24
      <div class="Blog_con2">        <div class="Blog_con3">          <p>分类: <span>嵌入式</span></p>                        <p>原文地址:<span><a href="/uid-30031530-id-5031392.html">AM335x 裸机开发笔记(1)——启动流程与启动卡分区</a></span> 作者:<span><a href="/uid/30031530.html">edaplayer</a></span></p>                        <p></p>        </div>       <div class="Blog_wz1" style="word-wrap: break-word;">                    根据芯片手册,AM335x上电后首先执行固化在芯片内部ROM中的代码,我们称之为BL0,BL0的功能很强大,能读取SD卡中第一个分区(必须是FAT格式)的MLO文件,复制到ram中运行,复制的起始地址为<span style="white-space:normal;">0x402F0400,所以编译MLO时,链接地址必须设置为<span style="white-space:normal;">0x402F0400</span></span>。一般的,MLO的作用是:禁用中断,关看门狗,设置栈,初始化时钟,初始化DDR3,初始化串口,复制u-boot.img到DDR3的<span style="white-space:normal;">0x80800000处运行。</span>MLO的最大体积可以达到109K,对于简单的裸机程序绰绰有余了。<br>

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 CYLINDERSDRIVE << 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










            <!-- JiaThis Button END -->          </div>          阅读(1456) | 评论(0) | 转发(0) |                        <div class="HT_line3"></div>        </div>        <div class="Blog_con3_3">          <div><span id="digg_num">0</span><a href="javascript:void(0)" id="digg" bid="5707383" url="/blog/digg.html"></a></div>          <p>上一篇:<a href="/uid-26968969-id-5707382.html">AM335x 裸机开发笔记(2)之LED</a></p>          <p>下一篇:没有了</p>        </div>      </div>      <div class="Blog_con3_4">        <div class="Blog_tit2 Blog_tit6">相关热门文章</div>                    <ul class="Blog_ul7">                      <li><span class="Blog_span7"></span><a href="/uid-22670933-id-1771603.html" title="SHTML是什么_SSI有什么用" target="blank">SHTML是什么_SSI有什么用...</a></li>                      <li><span class="Blog_span7"></span><a href="/uid-28458801-id-4072605.html" title="查看linux中某个端口(port)是否被占用(netstat,lsof)" target="blank">查看linux中某个端口(port)...</a></li>                      <li><span class="Blog_span7"></span><a href="/uid-26694208-id-3184442.html" title="卡尔曼滤波的原理说明" target="blank">卡尔曼滤波的原理说明...</a></li>                      <li><span class="Blog_span7"></span><a href="/uid-22002627-id-3455122.html" title="关于java中的“错误:找不到或无法加载主类”的解决办法" target="blank">关于java中的“错误:找不到或...</a></li>                      <li><span class="Blog_span7"></span><a href="/uid-29091195-id-3974751.html" title="shell中字符串操作" target="blank">shell中字符串操作</a></li>                    </ul>        <ul class="Blog_ul7">                    </ul>        <div class="clear"></div>      </div>      <!--      <div class="Blog_con3_4 Blog_con3_5">        <div class="Blog_tit2 Blog_tit7">热门推荐</div>        <ul>                      <li><a href="" title="" target='blank' ></a></li>                    </ul>      </div>      -->    </div>
原创粉丝点击