PXA270嵌入式学习ABCBA历程之一:跟硬件打个招呼!

[复制链接]
4086|1
 楼主| ABCBA 发表于 2009-3-19 09:56 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;一直比较热衷于嵌入式学习,可以说目前的状态就像我们学英语时的学习ABC的状态,所以肯定好多地方存在说的不当的地方,还望坛子里的前辈们多多指点啊!小弟先谢过了啊!好下面我开始胡说了啊,呵呵<br />&nbsp;&nbsp;&nbsp;弄了块板子,话说应该叫裸板,赤裸裸的~~不管你怎么叫它都不带理你的啊,呵呵,得搞一个叫做uboot的东东才能跟他通个话儿啥的,好吧,先来看看那个是干啥子的嘛:<br />&nbsp;&nbsp;&nbsp;&nbsp;*玩过Linux的人都知道LILO或GRUB,两个非常有名的引导程序,用来引导操作系统。和这里介绍的bootloader非常类似。所做的工作基本上就是进行一些简单的初始化工作,然后将控制权转交给要运行的IMAGE(操作系统或应用程序).一个较好的bootloader会提供一个比较好的交互式界面,并提供一些对于嵌入式开发相当有用的工具。如查看、修改RAM中的内容,通过多种方式从HOST下载IMAGE到RAM中,能够将配置信息保存到FLASH中。为了提供这些功能,bootloader要实现相关设备的驱动。如果要支持从网络接口下载IM&nbsp;<br />AGE,它要实现网卡的驱动、IP协议、ARP协议、tftp协议等等。串口、FLASH的读写也是如此。U-Boot是常见的FREE的bootloader,目前版本是1.3.4,在sourceforge.net上可以下载源程序。<br />目前Rease版本的u-boot已经被移植到arm720t,arm920t,at91rm9200,i386,mips,mpc5xx,mpc824x,mpc8260,mpc8xx,ppc4xx,pxa,sa1100平台上,支持的开发板更多。其他的如支持哪些monitor命令,支持哪些文件系统等等,参看README。<br />U-Boot代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。U-Boot代码与CPU芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。由于U-Boot和CPU及电路板的配置情况有关,因此不可能有通用的U-Boot,开发时需要用户根据具体情况进行移植。<br />&nbsp;&nbsp;&nbsp;*U-Boot环境变量的解释说明<br />环&nbsp;境&nbsp;变&nbsp;量&nbsp;&nbsp;&nbsp;&nbsp;解&nbsp;释&nbsp;说&nbsp;明<br />bootdelay&nbsp;&nbsp;&nbsp;&nbsp;定义执行自动启动的等候秒数<br />baudrate&nbsp;&nbsp;&nbsp;&nbsp;定义串口控制台的波特率<br />netmask&nbsp;&nbsp;&nbsp;&nbsp;定义以太网接口的掩码<br />ethaddr&nbsp;&nbsp;&nbsp;&nbsp;定义以太网接口的MAC地址<br />bootfile&nbsp;&nbsp;&nbsp;&nbsp;定义缺省的下载文件<br />bootargs&nbsp;&nbsp;&nbsp;&nbsp;定义传递给Linux内核的命令行参数<br />bootcmd&nbsp;&nbsp;&nbsp;&nbsp;定义自动启动时执行的几条命令<br />serverip&nbsp;&nbsp;&nbsp;&nbsp;定义tftp服务器端的IP地址<br />ipaddr&nbsp;&nbsp;&nbsp;&nbsp;定义本地的IP地址<br />stdin&nbsp;&nbsp;&nbsp;&nbsp;定义标准输入设备,一般是串口<br />stdout&nbsp;&nbsp;&nbsp;&nbsp;定义标准输出设备,一般是串口<br />stderr&nbsp;&nbsp;&nbsp;&nbsp;定义标准出错信息输出设备,一般是串口<br />&nbsp;&nbsp;*编译和配置<br />U-Boot的源码是通过GCC和Makefile组织编译的。顶层目录下的Makefile首先可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成U-Boot映像。<br />1.顶层目录下的Makefile<br />它负责U-Boot整体配置编译。按照配置的顺序阅读其中关键的几行。每一种开发板在Makefile都需要有板子配置的定义。例如XSCALE开发板的定义如下。<br />ruiva270_config&nbsp;:&nbsp;&nbsp;&nbsp;unconfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@./mkconfig&nbsp;$(@:_config=)&nbsp;arm&nbsp;pxa&nbsp;ruiva270&nbsp;<br />执行配置U-Boot的命令make&nbsp;ruiva270_config,通过./mkconfig脚本生成include/config.mk的配置文件。文件内容正是根据Makefile对开发板的配置生成的。&nbsp;<br />ARCH&nbsp;&nbsp;&nbsp;=&nbsp;arm<br />CPU&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;pxa<br />BOARD&nbsp;&nbsp;=&nbsp;ruiva270<br />上面的include/config.mk文件定义了ARCH、CPU、BOARD这些变量。这样硬件平台依赖的目录文件可以根据这些定义来确定。cayman平台相关目录如下。<br />board/ruiva270/<br />cpu/pxa/<br />lib_arm/<br />include/asm-arm/<br />include/configs/ruiva270.h<br />再回到顶层目录的Makefile文件开始的部分,其中下列几行包含了这些变量的定义。&nbsp;<br />#&nbsp;load&nbsp;ARCH,&nbsp;BOARD,&nbsp;and&nbsp;CPU&nbsp;configuration<br />Makefile的编译选项和规则在顶层目录的config.mk文件中定义。各种体系结构通用的规则直接在这个文件中定义。通过ARCH、CPU、BOARD、SOC等变量为不同硬件平台定义不同选项。不同体系结构的规则分别包含在ppc_config.mk、arm_config.mk、mips_config.mk等文件中。<br />顶层目录的Makefile中还要定义交叉编译器,以及编译U-Boot所依赖的目标文件。&nbsp;<br />ifeq&nbsp;($(ARCH),arm)<br />CROSS_COMPILE&nbsp;=&nbsp;arm-linux-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//交叉编译器的前缀<br />Endif<br />…<br />export&nbsp;&nbsp;CROSS_COMPILE<br />OBJS&nbsp;&nbsp;=&nbsp;cpu/$(CPU)/start.o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理器相关的目标文件<br />…<br />/*定义依赖的目录,每个目录下先把目标文件连接成*.a文件。*/<br />LIBS&nbsp;&nbsp;=&nbsp;lib_generic/libgeneric.a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />LIBS&nbsp;+=&nbsp;lib_$(ARCH)/lib$(ARCH).a<br />…&nbsp;<br />然后还有U-Boot映像编译的依赖关系。&nbsp;<br />ALL&nbsp;=&nbsp;u-boot.srec&nbsp;u-boot.bin&nbsp;System.map<br />all:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(ALL)<br />u-boot.srec:&nbsp;&nbsp;&nbsp;&nbsp;u-boot<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(OBJCOPY)&nbsp;${OBJCFLAGS}&nbsp;-O&nbsp;srec&nbsp;$&lt&nbsp;$@<br />u-boot.bin:&nbsp;u-boot<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(OBJCOPY)&nbsp;${OBJCFLAGS}&nbsp;-O&nbsp;binary&nbsp;$&lt&nbsp;$@<br />……<br />u-boot:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;depend&nbsp;$(SUBDIRS)&nbsp;$(OBJS)&nbsp;$(LIBS)&nbsp;$(PLATFORM_LIBS)&nbsp;--end-group&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Map&nbsp;u-boot.map&nbsp;-o&nbsp;u-boot&nbsp;<br />Makefile缺省的编译目标为all,包括u-boot.srec、u-boot.bin、System.map。u-boot.srec和u-boot.bin又依赖于U-Boot。U-Boot就是通过ld命令按照u-boot.map地址表把目标文件组装成u-boot。<br />其他Makefile内容就不再详细分析了,上述代码分析应该可以为阅读代码提供了一个线索。<br />2.开发板配置头文件<br />除了编译过程Makefile以外,还要在程序中为开发板定义配置选项或者参数。这个头文件是include/configs/&ltboard_name&gt.h。&ltboard_name&gt用相应的BOARD定义代替。<br />这个头文件中主要定义了两类变量。<br />一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等。例如:&nbsp;<br />#define&nbsp;&nbsp;&nbsp;CONFIG_PXA27X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />#define&nbsp;&nbsp;&nbsp;CONFIG_FFUART&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;<br />另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。例如:<br />#define&nbsp;&nbsp;&nbsp;&nbsp;CFG_FLASH_BASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PHYS_FLASH_1<br />3.编译结果<br />根据对Makefile的分析,编译分为2步。第1步配置,例如:make&nbsp;ruiva270_config;第2步编译,执行make就可以了。如果执行完第一步后有错,可以执行make&nbsp;distclean命令后再重新执行第一步配置即可。编译完成后,可以得到U-Boot各种格式的映像文件和符号表,如表5.1所示。<br />表5.1&nbsp;&nbsp;U-Boot编译生成的映像文件<br />文&nbsp;件&nbsp;名&nbsp;称&nbsp;&nbsp;&nbsp;&nbsp;说&nbsp;&nbsp;&nbsp;&nbsp;明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文&nbsp;件&nbsp;名&nbsp;称&nbsp;&nbsp;&nbsp;&nbsp;说&nbsp;&nbsp;&nbsp;&nbsp;明<br />System.map&nbsp;&nbsp;&nbsp;U-Boot映像的符号表&nbsp;u-boot.bin&nbsp;U-Boot映像原始的二进制格式<br />u-boot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U-Boot映像的ELF格式&nbsp;u-boot.srec&nbsp;&nbsp;&nbsp;&nbsp;U-Boot映像的S-Record格式<br />&nbsp;<br />U-Boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中就可以了。U-Boot和u-boot.srec格式映像都自带定位信息。<br />&nbsp;&nbsp;*烧写<br />&nbsp;这个嘛好多好多的相关J-tag工具,不过我用的是Jflash了,因为是软件的东西嘛,比较穷啊,买不起硬件啦,装个这个东东,直接按他的命令就可以烧的啊。。。。。<br />
starwx 发表于 2009-3-19 10:12 | 显示全部楼层

沙发

慢慢看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部