如何将openwrt移植到Intel Galileo

来源:互联网 发布:vb.net实例教程 编辑:程序博客网 时间:2024/05/22 06:27

背景知识

先介绍一下基本概念和背景。

  1. Intel Galileo是Intel推出的兼容arduino的单板,详细介绍参见:http://www.ifanr.com/388835,非常详细的介绍。
  2. openwrt就不说了,不了解这个的,看这篇博客也没啥意思。
  3. Yocto,这个也不说了。很出名的一个linux发行版编译环境。
  4. Galileo官方发布的镜像,以及推荐的开发环境都是yocto。包括galieo使用的kernel,和其他的package都是用yocto编译出来的。


移植方案和步骤

kernel

kernel移植是第一步也是最重要的步骤。首先,我们先来看看Galileo的kernel在Yocto里面是如何表示的。

先来看一下galileo的开发环境中关于kernel的目录结构:

meta-clanton-bsp/recipes-kernel/linux$ tree.├── files│   ├── clanton.cfg│   ├── clanton.patch│   └── clanton-standard.scc└── linux-yocto-clanton_3.8.bb

其中,.bb文件是yocto专有的文件,主要用于指定包名、源码地址、版本、编译方法、安装方法等。.bb文件对应这openwrt的包管理的Makefile,其功能是相同的。

files/clanton.cfg是kernel配置文件;files/clanton.patch,是基于.bb文件指定kernel版本的补丁文件。


我们再来看看linux-yocto-clanton_3.8.bb的内容,关键内容如下:

SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git;branch=linux-3.8.y"SRC_URI += "file://clanton.patch"SRC_URI += "file://clanton.cfg"SRC_URI += "file://clanton-standard.scc"LINUX_VERSION ?= "3.8"LINUX_VERSION_EXTENSION ?= "-clanton"# Override SRCREV to point to a different commit in a bbappend file to# build a different release of the Linux kernel.SRCREV = "531ec28f9f26f78797124b9efcf2138b89794a1e"

其中,SRC_URI关键字指定kernel源代码地址,这里是通过git方式下载3.8分支;SRCREV指定在3.8分支下的commitid。有这两个信息,我们就能获取kernel的基线版本了。


ok,到这里,我们知道galileo当前运行的kernel版本是什么了。那么怎么在OpenWrt中体现呢。现在回到OpenWrt的开发目录中(我用的是openwrt-truch版本commit为980317f3e56f8491b07418ab99dd56bfe65368cd,后面的版本去掉了x86 linux 3.8版本的支持)。

首先,我们需要增加一块新的单板,基于x86的。在target/linxu/x86目录下,创建一个新的subtarget目录,并命名为galileo。修改target/linxu/x86/Makefile,在SUBTARGETS字段的最后,添加上刚才创建的目录名galileo。目录名和SUBTARGETS字段里的名字必须一样。


然后,创建target/linxu/x86/galileo/target.mk文件,填写kernel版本信息和其他专有驱动信息。文件内容如下:

BOARDNAME:=GalileoFEATURES:=ext4 pci usbLINUX_VERSION:=3.8.13
这里kernel版本选择的是3.8.13,而不是Galileo在Yocto里的3.8.7。原因可以参见下文[总结1]。由于kernel版本的不同,那么就意味着原来给3.8.7版本的补丁文件clanton.patch可能就会有问题。这个先不过,等打补丁的时候看看哪些有问题,再修改。


之后,我们看要创建一个kernel配置文件,这里直接使用Galileo在Yocto中的配置文件,就是上文说的clanton.cfg。同样,放在target/linxu/x86/galileo目录下,改名为config-3.8。需要说明的是,这个配置文件可能会有一些改动,改动方法见[总结2]。


最后,就是patch了,把上文提到的clanton.patch拷贝到target/linxu/x86/patch-3.8目录下,改名为200-galileo-clanton.patch。当然,你也可以取其他的名字,但是建议文件名前面的数字大一点,确保我们的这个patch是最后打上去的。

前边说了,Galileo当前官方发布的的kernel是3.8.7版本,而openwrt的kernel在3.8分支使用的是3.8.13版本,所以,这个patch可能会有问题。不过,幸运的是改动非常小,只要去掉对于drivers/tty/tty_ldisc.c这个文件的修改即可。因为3.8.13已经打了这个patch,再打肯定会出错的。


好了,到这里,Galieo的kernel已经移植好了。我们看看都有哪些文件变化

#modified:   target/linux/x86/Makefile#new file:   target/linux/x86/galileo/config-3.8#new file:   target/linux/x86/galileo/target.mk#new file:   target/linux/x86/patches-3.8/200-galileo-clanton.patch



驱动

这部分内容主要是修改target.mk文件,增加一些Galileo单板必须的硬件驱动,包括网卡、USB、PCIE等。由于OpenWrt的特性,这是个细致活,因为要保证openwrt需要的ko在kernel配置中为模块而不是built-in。同时,也要确保openwrt没有的kmod(openwrt kernel module的封装形式),而Galileo又必需的驱动能built-in到kernel中。比如:

CONFIG_STMMAC_ETH=y

这个模块在openwrt没有现成的kmod可用,而这个网卡驱动又是galileo板子上的必须的驱动。所以不能编译为模块,只能编译到kernel里。



总结

  1. OpenWrt本身的编译系统不支持,或者说强烈不建议使用自定义的kernel基线版本。这个可以从include/kernel-version.mk中看到,毕竟openwrt专有的kernel代码patch不可能兼容所有kernel版本。如果一定要使用,可以使用一个不存在的kernel分支,但是后面和openwrt的移植配套就很麻烦了。
  2. OpenWrt中,修改kernel配置,使用命令:make kernel_menuconfig。修改完成后,需要将kernel编译目录下的.config拷贝回subtarget目录下,替换原来的config文件。然后,下一次执行OpenWrt的make动作是,一般会提示一些kernel的配置信息,需要手动确定。确定完成后,再执行一次.config的拷贝操作,确保新的config文件是完整的。
  3. OpenWrt中,make menuconfig中的kernel modules里大部分的配置需要确保kernel能编译出ko文件,否则就会出现某个ko丢失的错误。简单说,make menuconfig是用来配置最终镜像的,make kernel_menuconfig是用来配置kernel的。这两个里面关于module的配置最好保持一直。kernel可以配置多一点,但不能少。




0 0
原创粉丝点击