AM1808是TI(美国德州仪器)公司生产的基于达芬奇架构的一款arm926ej-s内核的芯片,AM1808处理器集成了357/450MHz的ARM9内核及128K-Byte的On-chip momery,并提供了丰富的外设接口。其包括网口、音频输入输出接口、USB OTG(480Mbps)、USB HOST(USB1.1)、SATA接口、SD/MMC接口、UART(0和1为三线TTL电平且可扩展,3为五线串口,RS232电平供调试用)、SPI、IIC、JTAG、CAMERA、TFT屏接口、触摸屏接口、键盘接口和总线接口等。外部存储器包括128M Nand flash和128M DDR。
ARM926EJ-S处理器支持ARM调试架构并提供一套完整的高性能子系统,包括:ARM926EJ-S整数核心,CP15系统控制协处理器,存储器管理单元(MMU),独立指令和数据高速缓存,写缓冲区,内部RAM,AHB总线接口等。
-----------------------------------------------------------
在使用这块板子的时候,先使用套件提供的资源搭建开发环境,装了Virtual Box虚拟机并在上面运行了ubuntu10.04系统,设置共享数据空间以利于windows和ubuntu数据的共享。
虚拟机的安装,大体的虚拟机有两种,一种是VMvareWorkstation
另一种是VirtualBox,两种虚拟机功能大同小异,用户可以根据自己的喜好选择,这里简单地介绍下VirtualBox的使用技巧。
VirtualBox软件可以从这个网站下载到:https://www.virtualbox.org/wiki/Downloads
然后安装,软件的安装纯粹傻瓜化,不做解释。
安装完后创建虚拟机。开始菜单启动,然后new -> next -> 给虚拟机命名,选择操作系统linux -> 给虚拟机分配ram,建议512M -> next -> 选择“creat new hard disk” -> next -> 建议选择Fixed-size storage -> next -> 选择硬盘大小(至少8G)-> finish -> 完成。
至此虚拟机创建完成,你又有一台电脑了。
安装ubuntu系统,安装虚拟机后就可以再在其上安装你需要的操作系统,什么redhat,ubuntu, win xp,win 7,Fedora随你喜欢,只要你的pc内存够大,同时运行多个系统不够卡的话。这里在VirtualBox中安装ubuntu10.04。Ubuntu系统镜像可以在这个网站下载到http://www.ubuntu.com/download/desktop,目前已经更新到12.04版本了。安装步骤:启动虚拟机 -> setting -> storage -> IDE 控制器 选择虚拟CD/DVD光盘文件 打开你下载好的ubuntu.iso镜像文件 -> 点击OK,进入ubuntu安装界面。然后按照相关提示和默认选项进行安装即可。
-----------------------------------------------------------
一套完整的嵌入式软件系统由三部分组成,即uboot,kernel和rootfs,SBC8018在出厂时就已经将他们烧写在了nandflash上的固定位置,下面就让我们看看具体是怎么做的。
安装交叉编译环境,将光盘自带的linux/tools/下的arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2压缩包拷贝到linux下解压,然后将解压目标的路径添加到环境变量中,命令如下
Export PATH=$HOME/tools/arm-2009q1/bin:$HOME/tools:$PATH
也可以直接修改主目录下的.bashrc文件,在其末尾添加export PATH=$PATH:/home/lg/tool/arm-2009q1/bin 即可在开机时自动添加该环境变量。
编译启动代码,生成映像文件u-boot,(注:启动代码是计算机不可或缺的部分,而不同的平台使用不同的启动代码,例如linux磁盘引导程序LILO,GNU的引导程序GRUB,DOS引导linux程序Loadin,还有通用的引导程序U-boot等)命令如下:
make distclean(清除编译的残余文件,功能类似于makefile中的make clean)
make da850evm_config(配置与开发板相关的文件)
Make(此处才是真正的编译uboot中的代码)
这时在该目录下会生成u-boot,拷贝到数据共享目录备用。
编译内核。先进入内核目录linux-03.20.00.14,然后执行类似命令:
make distclean
make da850——omapl138_defconfig
make uImage
执行完以上操作后,arch/arm/boot目录下会生成我们需要的uImage文件。
文件系统的制作。嵌入式的文件系统也有很多,例如:ext2,ext3,NFS,vfat,proc,jfs,minix,在这里,我们使用的是jffs2根文件系统,该系统曾是IBM的AIX使用的日志文件系统。进入tools目录,运行指令sudo mkfs.jffs2 -r rootfs -o jffs2.img
之后,就生成了jffs2.img文件,与上面的uImage一同拷到共享数据目录下备用。
在这里介绍一下在VirtualBox中设置共享数据的技巧。
一、安装增强功能包
首先在VirtualBox的菜单里选择“设备(device)”-> 安装增强功能包。
然后进入CD/DVD驱动器,也就是光驱,运行一个叫VBoxlinuxAdditions-x86.run的文件。具体在终端中输入cd /media/cdrom0 后继续输入sudo sh ./VBoxlinuxAdditions-x86.run
二、设置共享文件夹
重启系统完成后,点击设备 -> 分配数据空间 -> 添加一个windows下的共享文件夹share。
三、挂载共享文件夹
Ubuntu终端下输入
sudo mkdir /mnt/sharefile
sudo mount -t vboxsf share /mnt/sharefile
(将刚才的windows下的共享文件夹的内容挂载到根目录下的mnt/share下)这样你就可以共享这个文件夹的数据了,这个文件夹在windows和ubuntu都有读、写、删除权限。
另外,你如果嫌每次输入挂载命令麻烦,那么教你开机自动挂载的方法。
终端运行 sudo pico /etc/fstab
然后在这个文件中添加一句
Sharedfolder /mnt/sharefile vboxsf defaults 0 0
保存退出。重启系统时就会自动挂载了。
-----------------------------------------------------------
U-boot的烧写,linux系统移植
Uboot的生成,首先请先确保你安装了TI公司开发的配套软件AISgen_d800k006_Install_v1.7.exe,然后从开始菜单中启动AISgen for D800K006,file -> load configuration 打开光盘中tools目录下的AM1808-UART.cfg。
此文件旨在文件中添加配置AM1808启动相关的波特率,PLL锁相环,clock时钟,DDR存储和entrypoint入口地址等信息,具体内容可以打开此文件自行查看。
然后打开共享数据空间中的u-boot到软件中[ARM Application File:]位置。
最后指定文件输出路径在[AIS Output File:]位置。点击Generate AIS生成u-boot-uart-ais.bin。
Uboot的烧写,首先将板子的启动模式拨码开关调制串口启动模式(具体可查看硬件原理图),然后打开UART BOOT HOST软件,在AIS file位置添加刚才生成的u-boot-uart-ais.bin。插上U转串,在Serial Port选择相应COM口(查看我的电脑属性->设备管理器),点击start后快速打开板子的电源,会在此消息框中显示received BOOTME等信息,当出现Closing COMx时,说明下载完成。然后打开windows中的超级终端,就会开到“U-boot->”字符。
下面开始烧写,在超级终端依次输入
->nand erase
->tftp 0xc0700000 u-boot-nand-ais.bin;nand write.i 0xc0700000 0x20000 ${filesize}
->nandecc sw
-> tftp 0xc0700000 uImage;nand write.i 0xc0700000 0x200000 ${filesize}
-> tftp 0xc2000000 jffs2.img;nand write.i 0xc2000000 0x600000 ${filesize}
到这里就将整套的嵌入式linux系统移植到开发板上了,将拨码开关调制nand启动后重启,你就会在超级终端中看到你熟悉的linux的文件系统了。
-----------------------------------------------------------
好了,到这里让我们休息一下,回顾一下上面所述的内容,发现似乎没有什么有实质性技术含量的东西,但是这是每个做嵌入式开发工作的人所必须经历的过程,如果不追究细节,基于arm的应用开发就可以在基础上做了,但是我所要做的是做出基于arm平台的实际产品,单单在这块评估板上的学习远远不够,所以我打算从头再来,一步一个脚印的搞清楚AM1808是如何启动的。
-----------------------------------------------------------
AM1808的启动
基于arm926ejs内核的AM1808芯片支持多种启动方式,其BOOT模式主要有:NOR,NAND, MMC/SD0,I2C EEPROM, I2C SLAVE, SPI FLASH, SPI EEPROM, SPI SLAVE, UART等。
我们在这里选择通过uart2 启动,而先前讲到的就是通过软件配置利用uart 2 下载程序。那么AM1808是如何引导uboot启动的呢?他与我们所熟悉的s3c2440的启动有什么区别呢?
AM1808的NAND启动特性是不支持一次性全部启动,比如像s3c2440这种CPU,不管是从NOR启动还是NAND启动,都是一次性的,只需一级boot就可以引导LINUX/WINCE等,这就是一次性启动。
相反的TI的达芬奇架构的OMAPL系列以及引脚兼容的单核产品均不支持一次启动,而是三级启动,分为RBL(ROM bootloader),UBL(user bootloader),U-boot。
RBL是CPU内部ROM上固件程序,在出厂时就已经烧写进去了,这部分我们不用关心,只需知道,在复位时,CPU会采集BOOT[7:0]引脚状态,从而选择对应的启动方式。
而我们采用串口启动方式把启动代码通过串口下载到DDR里面,RAM再从DDR中的代码段的起始地址将启动代码加载到片上RAM运行,第三步才是运行U-boot的命令。
U-boot的代码是怎么实现的呢?它的作用是什么呢?无疑的我们将目光锁定到第二三级的boot。
所以下载U-boot的源码进行分析。U-Boot软件包下载网站:http://sourceforge.net/project/u-boot
首先介绍u-boot源代码的目录结构
-board 存放板子相关的目录文件(davinci/da8xxevm/da850evm.c)
-common 通用的多功能函数实现
-cpu 存放CPU相关的目录文件(arm925ejs/start.s)
-disk 硬盘接口驱动程序
-doc 开发使用文档
-drivers 通用驱动程序
-examples 例子程序
-include 头文件(configs/da850evm.h)
-lib_arm 存放对ARM体系结构通用的库文件,主要用于实现ARM平台通用的函数 (board.c)
-net 网络相关代码
大致了解了U-boot源码树的结构之后,我们来考虑他是怎么编译的。 先看总目录下的Makefile,打开之后发现里面的内容和我们平时看见的makefile有很大的不同,而且竟然有三千多行,不必担心,我们化繁为简,想想makefile的作用是什么呢?不就是编译.c、.s等文件生成.o,然后链接.o生成可执行文件吗,我们看的时候也只挑自己看得懂的看,它里面的内容按顺序依次为:
A.指定了uboot的版本等相关信息。
B.定义主机操作系统类型
C.定义执行shell脚本的shell
D.设定编译输出目录
在这一步结束后会涉及到mkconfig脚本,顺便我们就把他的作用也说了,在它里面通过传入命令行参数确定了目标板型号,cpu型号等信息,检查了参数的合法性,创建到目标板相关的目录的链接,构建了include/config.mk文件,指定了开发板代码所在的目录,构建了include/config.h文件。
以上这些都是我们刚开始编译时make da850evm_config指令所做的事情,下面我们来看看make指令做了什么工作。
在makefile中自语句“all:”开始就是make的作用范围了,在这里生成的include/config.mk做了如下工作:
1.设置obj与src
2.设置编译选项
3.指定交叉编译工具
4.包含与开发板相关的配置文件
5.指定隐含的编译规则
此时LIBS变量指明了U-Boot需要的库文件,包括平台/开发板相关的目录、通用目录下相应的库,都通过相应的子目录编译得到的。
之后就是编译了,这里只是指定了编译时的各种依赖关系,最终生成u-boot,u-boot.bin等文件。其中有一个依赖是我们所要关心的,就是u-boot.lds,它的作用就是链接.o文件使代码重定向划分为各个数据段存储到内存中,并指定了输出可执行文件的起始代码段,这里是0xc1080000.
再往下500行以后的内容都是与芯片的系统架构相关的配置,uboot为了适应各种芯片,在这里罗列出了很多内核架构,我们只选择相关的就可以,寻找关键字arm926ejs保留这部分其他都可以删除。
以上便是uboot的总的makefile,而其他的子文件夹中的makefile都是为他服务的,各位在修改和裁剪uboot时,可以从这里下手,去其糟粕,取其精华即可。
-----------------------------------------------------------
start.s代码分析。从start.s中我们可以找到uboot程序的入口点 _start,uboot都是从这里开始执行第一条语句,0x0地址开始是ARM异常向量表,一上电的第一条指令是跳转到reset复位处理程序,进入SVC模式,跳入cpu_init_crit,在其中设置时钟源,调用lowlevel_init函数进行底层初始化,随后关闭MMU并使能I-Cache,再返回,然后开始relocate(重定位),并初始化堆栈,之后从这里进入C程序的入口_armboot_start,此处函数的实现在目录lib_arm/board.c中。
既然到了C程序中,那么我们是不是就有了发挥的余地了呢,我们可以在这里通过查AM1808的datasheet写上一个简单的点灯程序,当他下载到板子中运行的时候,会有相应的led被点亮或者闪烁,以增加之后开发的信心。但是,是不是像s3c2440那样直接配置了gpio口的寄存器,再给相应的地址位加上高低电平的变化,点灯就会成功了呢?对于AM1808来讲,答案是否定的,众所周知AM1808功能十分强大,它提供了十分丰富的外设接口以实现各种功能扩展,所以他的引脚是远远不够用的,这就采用了引脚复用的办法,我们要想把灯亮起来,还需加上gpio时钟的使能等初始化过程,具体可以查看数据手册PSC部分,祝好运。
到这里我想我们就算是把AM1808这块芯片启动起来了吧,其他的功能模块以及uboot的命令等都是C程序,你可以自行查看源代码进行增减.
参考文章出自《雨的印记》
http://308584349.blog.163.com/blog/static/206182274201241013436526/