u-boot的通用目录是怎么做到与平台无关的
2011-04-02 10:59
323 查看
--作者:赖玉平(peter lai)aulyp@163.com include/configs/ARMEasy6410.h
这个头文件中主要定义了两类变量。
一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等,主要用来 决定是否编译某些文件或者函数。
另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。这些常数参量主要用来支持通用目录中的代码,定义板子资源参数。
这两类宏定义对u-boot的移植性非常关键,比如drives/ dm9000x.c,对dm9000而言,很多操作都是通用的,但不是所有的板子上面都有这个芯片,即使有它在内存中映射的基地址也是平台相关的。所以对于ARMeasy6410板,在ARMEasy6410.h中定义了
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }CONFIG_DRIVER_DM9000的定义使得dm9000x.c可以被编译(当然还得定义CFG_CMD_NET才行),因为dm9000x.c中在函数定义的前面就有编译条件判断:
#ifdef CONFIG_DRIVER_DM9000
如果这个选项没有定义,整个dm9000x.c和dm9000x.h就不会被编译了。而常数参量CONFIG_DM9000_BASE则用在定义各个功能寄存器的地址。u-boot的DM9000工作在IO模式下,只要给定IO寄存器在内存中映射的基地址,其余代码就与平台无关了。
u-boot的命令也是通过目标板的配置头文件来配置的,比如要添加ping命令,就必须添加CFG_CMD_NET和CFG_CMD_PING才行。不然common/cmd_net.c就不会被编译了。
从这里我可以这么认为,u-boot工程可配置性和移植性可以分为两层:
一是由makefile来实现,配置工程要包含的文件和文件夹上,用什么编译器。
二是由目标板的配置头文件来实现源码级的可配置性,通用性。主要使用的是
#ifdef #else #endif 之类来实现的。
![](http://hi.csdn.net/attachment/201104/14/0_1302766085rb2S.gif)
后语:近来老发现有网站盗用我的博客文章,又不注明出处,很不尊重我的劳动果实,所以设计了以上签名,做成图片,望理解!
这个头文件中主要定义了两类变量。
一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等,主要用来 决定是否编译某些文件或者函数。
另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。这些常数参量主要用来支持通用目录中的代码,定义板子资源参数。
这两类宏定义对u-boot的移植性非常关键,比如drives/ dm9000x.c,对dm9000而言,很多操作都是通用的,但不是所有的板子上面都有这个芯片,即使有它在内存中映射的基地址也是平台相关的。所以对于ARMeasy6410板,在ARMEasy6410.h中定义了
#define CONFIG_DRIVER_DM9000 1 #define CONFIG_DRIVER_DM9000_NO_EEPROM 1 #define CONFIG_DM9000_USE_16BIT 1 #define CONFIG_DM9000_BASE 0x18000300 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4)
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }CONFIG_DRIVER_DM9000的定义使得dm9000x.c可以被编译(当然还得定义CFG_CMD_NET才行),因为dm9000x.c中在函数定义的前面就有编译条件判断:
#ifdef CONFIG_DRIVER_DM9000
如果这个选项没有定义,整个dm9000x.c和dm9000x.h就不会被编译了。而常数参量CONFIG_DM9000_BASE则用在定义各个功能寄存器的地址。u-boot的DM9000工作在IO模式下,只要给定IO寄存器在内存中映射的基地址,其余代码就与平台无关了。
u-boot的命令也是通过目标板的配置头文件来配置的,比如要添加ping命令,就必须添加CFG_CMD_NET和CFG_CMD_PING才行。不然common/cmd_net.c就不会被编译了。
从这里我可以这么认为,u-boot工程可配置性和移植性可以分为两层:
一是由makefile来实现,配置工程要包含的文件和文件夹上,用什么编译器。
二是由目标板的配置头文件来实现源码级的可配置性,通用性。主要使用的是
#ifdef #else #endif 之类来实现的。
![](http://hi.csdn.net/attachment/201104/14/0_1302766085rb2S.gif)
后语:近来老发现有网站盗用我的博客文章,又不注明出处,很不尊重我的劳动果实,所以设计了以上签名,做成图片,望理解!
相关文章推荐
- Java何以做到平台无关性
- Linux之CentOS7.2误删怎么办?/boot目录修复
- JAVA何以做到“平台无关”以及JAVA的集合框架
- 秒级处理海量数据,浙江移动大数据平台是怎么做到的
- Linux系统/boot目录破损无法启动怎么办
- Linux系统/boot目录破损无法启动怎么办
- SVN怎么手动创建目录
- u-boot在nuc972平台上的移植过程(启动篇)
- 基于Nokia平台的游戏通用框架
- SpringBootRESTfulAPI平台项目-演示版01
- 通用权限管理平台权限控制--按钮权限
- Hadoop平台搭建使用系列教程(1)-资源目录
- 初进职场我们该怎么做到最好
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 忘记密码功能改进、手机短信、电子邮件
- 前两天有人问怎么取得一个目录下的文件,下面就是例子
- 跨平台软件开发(C++)系列文章目录
- Java的平台无关性
- Oracle 数据库怎么从 Linux x86平台向 IA64 安腾平台(RH or SUSE)迁移?
- 深入Java虚拟机(2)——Java的平台无关性
- 数据加密与平台无关性示例