版主: wanchong , wangyu , eepwwp , firedom

分享到:
共2条 1/1 1   

如何将openwrt移植到Intel Galileo

    [您是本帖的第6571位阅读者]
wanchong
我是GG
版主

最后登陆时间:2014-06-17 08:56:07

直达楼层
1# 发表于 2014-06-27 13:40:27

本帖节选自自jt6562的博客,原帖地址:http://blog.csdn.net/jt6562/article/details/23831735


移植方案和步骤

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:=Galileo  
FEATURES:=ext4 pci usb  
  
LINUX_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可以配置多一点,但不能少。





关键词:openwrt    Galileo    移植    
此帖由wanchong于2014-06-27 13:43:43最后编辑

RE: 如何将openwrt移植到Intel Galileo

Snake0301
我是GG
高级会员

最后登陆时间:2014-06-27 16:38:30

2# 发表于 2014-06-28 00:13:37

可没这么简单吧

openwrt听说好挑CPU的

共2条 1/1 1   
快速回复主题
  • 匿名不能发帖!请先 [ 登陆 注册 ]