335x裸机开发1
来源:互联网 发布:淘宝童装进货渠道 编辑:程序博客网 时间:2024/06/06 13:03
<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
同理,制作生成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=
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
,9,0x0C,*
10,115,,-
126,,,-
EOF
mkfs.vfat -F 32 -n “boot”
mkfs.ext3 -L “rootfs”
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>
- 335x裸机开发1
- ARM裸机开发笔记1(指令简介)
- OK6410裸机开发环境搭建1
- [1]ARM裸机程序开发环境搭建
- s3c6410裸机开发介绍
- 裸机开发学习心得
- 裸机开发经验
- 6410裸机开发环境
- arm裸机开发
- 2440裸机开发
- 裸机开发前准备
- ARM裸机开发学习方法
- 4412裸机开发
- arm处理器裸机开发实战——学习笔记1
- arm处理器裸机开发实战——学习笔记1
- S3C2416裸机开发系列十八_音频驱动实现(1)
- 专题1:裸机开发快速体验+交叉工具链
- [学习日志][2-2-1][裸机开发快速体验]
- Fidder—Fidde设置过滤域名
- docker之容器操作
- 使用Jquery实现带搜索框的下拉框
- Linux的基本命令及用法
- Java lambda groupby 备忘
- 335x裸机开发1
- 站在顶层分析简单工厂模式
- Oracle数据库中的instr函数的用法
- docker 笔记
- 人体姿态估计综述(Human Pose Estimation Overview)
- express get请求 demo
- npm更新和node更新
- https://www.zhihu.com/question/20377285
- Gson教程四(译):Maps的映射