PowerPC平台 linux设备移植

来源 :电子元器件应用 | 被引量 : 0次 | 上传用户:tobay1
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:由于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 = <17c00000 2 17c00002 2>;
   local-mac-address = [ 00 00 00 00 00 00 ];
   interrupts = <30 8>;
   interrupt-parent = <&ipic>;
   };
  注:具体修改含义值参见[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.
其他文献
给出了一种可替代传统蓄电池电源的地铁应急起动开关电源的设计方法。该开关电源系统采用重叠拓扑结构,输出电压为24V,功率为200W。用PSIM软件对主电路进行仿真表明,这种采用重
本文从农药发展历史的角度阐述了农药对人类社会发展的贡献,以及对生态环境产生的影响.从唯物辩证法的角度论述了发展现代农药技术,正确处理农药与生态环境之间的关系.
选择三江源地区22 个高寒草甸样地进行土壤分层(0-10,10-20,20-30 cm)取样,测定土壤的pH 值、有机碳(Totalorganic carbon,TOC)、全氮(Total nitrogen,TN)、速效氮(Available N)、全
当前思想政治教育效果不够理想的一个重要原因,是人们只从"教育者"的角度而不是从"接受者"的角度来考虑问题,对受教育者的"接受"态度和过程缺少研究.接受理论加深了我们对思
文章简单介绍了我国目前频遭反倾销的现状,从世界贸易组织法律制度分析了加入wTO以来应对反倾销指控的两大难点问题:非市场经济地位国家和替代国问题,并分别从政府、企业和行