powerpc如何移植Linux系统,PowerPC平台 linux设备移植

摘 要:由于linux的开放性、适应性以及高度可裁剪性,Linux系统在嵌入式领域得到迅速发展。PowerPC处理器在通信领域和工业控制领域也都有着广泛的使用。所以文中以mpc8313erdb平台新添加网卡芯片为例,讲述如何使linux支持新添加的网卡设备。

关键词:PowerPC;linux;设备树

Bootloader除了引导系统之外,另一个重要的作用就是给内核传递硬件信息。在服务器和桌面系统bootloader与内核之间传递硬件信息,为了达到标准化和兼容性的目的,都各自有标准Firmware(一种嵌入到硬件设备中的程序,用于提供软件和硬件之间的接口)。如x86平台的有BIOS。PowerPC 和Sparc 系统均采用Open-Firmware标准。但是嵌入式PowerPC平台并没有这样标准的Fireware接口,但是在嵌入式领域,早期的uboot使用include/asm-ppc/ppcboot.h中的静态数据结构struct bd_info来保存bootloader给内核传递的信息。但是bd_info并不能为内核提供当前具体是哪个平台的信息。这种没有标准接口所以带来的问题就是,每当我们更换bd_info的布局的时候我们都必须重新定制和烧录bootloader和内核镜像。例如我们可能需要修改kernel,syslib,platforms目录下的很多的内核文件。

目前为了适应内核的发展和嵌入式平台PowerPC平台的变化,ePAPR(embedded Poower Architecture Platform Requirements)吸收Open Firmware中设备树(Device tree)。通过设备树来将硬件信息传递给内核,64位PowerPC平台最先支持OF(Open Firmware)结构。随着内核发展,内核开发人员打算利用合并PPC32(arch/ppc32)和PPC64(arch/ppc64)的内核代码这个机会,将清理PPC32中的firmware接口。让所有的PowerPC平台都统一提供对OF(Open Firmware)结构的支持。

1 Linux内核中PowerPC 软件结构

为了理解PowerPC 内核初始化过程,下面对设备树和机器描述结构(ppc_md 结构)。

1.1 设备树

设备树是一种描述硬件配置的树形数据结构,每一个设备树都包含唯一的根节点/。设备树结构由设备节点组成,这些设备节点又可以由多个子节点组成。这些节点只有包括设备或者总线。每个节点包含属性。设备树的源代码存放在arch/powerpc/boot/dts目录下。这里的每个文件都描述着各自的平台的硬件信息。以mpc8313erdb平台为例,其文件名为mpc8313erdb.dts。一个基本的设备树必须包含一个cpu节点、一个memory节点两个节点信息。对于需要为平台添加新的网卡设备,我们必须修改mpc8313erdb.dts文件。dts文件时文本文件,而linux系统引导的时候,所使用的并不是这样的文本文件,而是二进制文件(dtb)。所以需要使用dtc工具将dts文件编译成dtb的二进制文件。

dtb文件由boot_param_header,device_tree结构和device tree string三大部分组成。dtb组成如图1所示。

(1)boot_param_header结构

头主要描述设备树的基本信息,如设备树魔数标志(0xd00dfeed)、设备树块大小、结构块的偏移地址。这个结构中的值都是以大端模式表示,并且偏移地址是相对设备树头的起始地址计算。boot_param_header结构定义在arch/powerpc/boot/flatdevtree.h文件中,用来保存设备树的头部信息。

(2)Device tree结构

设备树结构块是线性化的树形结构,和字符块一起组成了设备树的主体,以节点形式保存目标板的设备信息。在结构块中,节点起始标示为常量宏OF_DT_BEGIN_NODE,节点结束标志位宏OF_DT_END_NODE;子节点在节点结束标志前。一个节点可以概括以OF_DT_BEGIN_NODE开始,包括节点路径、属性列表、子节点列表,最后以OF_DT_END_NODE结束的序列,每个子节点自身也是类似的结构。

(3)Device tree string结构

为了节约空间,将一些属性名,尤其是那些重复冗余出现的属性名,提取出来单独存放到字符块。这个块中包含了很多有结束标志的属性名字符串。在设备树的结构块中存储了这些字符串的偏移地址,这样可以很容易地查找到属性名字符串。字符串块的引入节省了嵌入式的存储空间。

1.2 ppc_md 结构

全局变量ppc_md定义在arch/powerpc/kernel/setup-common.c。数据结构定义在include/asm-powerpc/machdep.h中。其中主要包括像setup_arch,init,init_IRQ,probe等。Linux PowerPC中probe_machine函数从machine.desc段中读取数据来填充ppc_md数据结构。Linux PowerPC首先通过宏define_machine,将各类PowerPC内核的ppc_md结构加入到machine.desc段中。图2描述了ppc_md的结构。

2 PowerPC linux初始化过程

即从BootLoader加载内核到执行/sbin/init程序之间的代码。

U-boot传递linux两个参数:r3指向OF Tree 结构的物理地址 r4指向Linux内核所在的物理地址。

2.1 跳入内核入口地址_start出,此处arch/powerpc/kernel/head_32.S

* bl machine_int

> early_init_devtree()解析dtb获取当前处理器系统的硬件信息。

> probe_machine()读取machine_desc段,调用其中.probe()钩子函数。每个.probe钩子函数回去检查设备树中描述平台信息是否被平台代码支持。通常,probe函数回去查看root节点的compatile属性。如mpc8313erdb平台判断root属性是否是MPC8313ERDB字符串。

2.2 调用start_kernel。

* setup_arch(&command_line)。对内存系统进行基本初始化,调用ppc_md->setup_arch对当前处理器进行一些基本的初始化。以mpc8313erdb为例,调用mpc8313_probe函数

* init_IRQ。调用ppc_md->init_IRQ。即mpc8313_rdb_init_IRQ()

* time_init。其中调用ppc_md->time_init。即mpc83xx_time_init。使能e300 time base unit。

* reset_init 将创建init线程。调用do_basic_setup完成linux系统其他模块初始化

* do_initcalls。执行.initcall.init段中注册的初始化函数。

3 添加网卡芯片

下面以为了使linux支持mpc8313erdb新添加ks8851网卡芯片为例,说明需要修改相关部分。

(1)由于bootloader传递给内核所需要的硬件信息是dtb文件,而dtb文件时通过dts文 件编译生成的。所以为给内核传递新添加的网卡硬件信息,所以需要修改过mpc8313erdb平台对应的dts文件。该文件为arch/powerpc/boot/dts/mpc8313erdb.dts,添加网卡硬件信息到dts文件中,网卡节点作为根节点的子节点,具体硬件属性信息如下:

ethernet0@17c00000 {

device_type = "network";

compatible = "ks8851";

model = "micrel";

reg = ;

local-mac-address = [ 00 00 00 00 00 00 ];

interrupts = ;

interrupt-parent = ;

};

注:具体修改含义值参见[2]

(2)添加初始化函数ks8851_of_init。

* 通过设备树中网卡属性of_find_compatible_node找到ks8851的硬件信息的设备节点。

* 获取网卡寄存器地址以及中断号。使用内核提供相关接口of_address_to_resource和of_irq_to_resource。

* 注册平台设备。

* 使用宏arch_initcall(ks8851_of_init)。将初始化函数放入.initcall.init段。

4 结束语

本文介绍了PowerPC linux的发展过程,并且讲述了PowerPC linux启动流程,最后以为mpc8313erdb平台添加网卡设备为例,介绍了powerpc linux为例支持新添加的硬件设备,所需要添加的相关代码。

参考文献

[1] 刘邦运. PowerPC Linux 设备树 DTS移植,2009.

[2] Benjamin Herrenschmidt,Becky Bruce,MontaVista Software. Booting the Linux/ppc kernel without Open Firmware.

[3] 王齐. Linux PowerPC详解 机械工业出版社,2007.9.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值