本文是针对CC28,CC6时期的产品文档存档,如果您正在开发新项目,建议参考DEY相关的最新文档。

除非您是直接使用SBC产品,大部分的客户会是自己做底板和外围硬件,并把核心板焊到自己做的底板上形成自己的产品的硬件平台。您需要在DEY项目中设置下面所列的项目来实现对自制底板的支持。

  1. 为定制的底板添加一个定制的机器配置(machine configuration )
  2. 为定制的机器配置提供内核配置(kernel & kernel configuration )
  3. 为内核提供一个自定义的设备树 (device tree )

Machine Configuration

我们称为机器配置,实际上是硬件平台的配置,因为我们总是用核心板定制自己的机器或称设备。在DEY中,BSP层提供了机器配置,这类信息定义了特定的硬件目标架构: 使用哪个设备树?
使用哪个内核版本?
是否支持WiFi/BT ?
是否支持图形显示输出?
注:一些相关特性仍需在项目配置local.conf中启用或禁用。

机器配置文件位于meta-digi源码目录下

# cd /usr/local/dey-1.6/sources/meta-digi/meta-digi-arm/conf/machine
# ls -la

Digi硬件平台的机器配置文件也在里面

ccardimx28js.conf
ccimx51js.conf
ccimx53js.conf
ccimx6sbc.conf

以Ccardimx28js.conf为例,用less命令查看该文件,可以看到它指名机器包含核心板CC28,核心板的相关配置通过include这个ccardimx28.inc文件载入。在机器配置文件中指名了设备树文件,以及哪个串口作为console口,波特率等。

我看再来看看ccardimx28.inc这个核心模块的配置文件,它同样进一步包含一个digi所有基于freescale i.MX处理器的基础的共同配置文件mxs-digi-base.inc。而仅把模块相关的项在文件中体现出来。比如uboot的入口地址,模块的不同型号,是否有wifi支持,wifi,声卡,触屏驱动等。

再看一下这个mxs-digi-base.inc,对于freescale芯片的支持主要从这个文件中开始,其中digi的一些默认的或特别的配置在进一步的包含配置digi-defaults.inc中。

来细看最后一个机器配置文件digi-defaults.inc,主要的可配置项大多在这里,像内核和uboot版本,网口默认IP等等,并且这个文件连同上述的配置中也定义了一些可以在local.conf中方便更改的宏。一些机器配置的修改可以通过在local.conf添加参数实现。

并不推荐直接修改这些默认的机器本配置,要更改机器配置,我们可以复制一份dey的安装目录,然后在其下修改,这样就保留有原始安装的副本。
cp -r /usr/local/dey-1.6 /usr/local/dey-1.6-custom
然后用dey-1.6-custom中的创建项目脚本来新建项目,相关配置的修改也只应用回这个目录。

内核及内核配置

DEY通过所提供的recipe来编译Linux内核,相关的recipe在之前的机器平台配置中指定,常用的一些内核配置的recipe位于meta-digi/meta-digi-arm/recipes-kernel/linux下。比如在我们的机器配置中,我们指定使用linux-dey内核,版本是3.10,这个定义告诉bitbake寻找linux-dey_3.10.bb这个recipe来为我们项目编译内核。

我们可以直接使用这个默认的recipe或仅是调整配置,如果要为新的自定义平台创建新的内核recipe,需要以下几步:

  • 需用正确的recipe写法规则,
  • 需继承linux-dey.inc
  • 创建SRC_URI来获取内核源码
  • 创建一个do_configure任务,利用defconfig文件来配置内核

其中defconfig是指默认的内核配置,每个平台都有自己的默认配置。

cd /usr/local/dey-1.6/sources/meta-digi/meta-digi-arm/recipes-kernel/linux/linux-dey-3.10

这个目录下有这个版本内核所支持的设备平台,比如ccardimx28js就是指开发套件所用开发板对应的平台,该目录 下就有一个defconfig目录。

虽然您也可以手动修改配置文件,但正确的做法是用一个图形界面来配置它

# cd ~/workspace/mycc28
# source source dey-setup-environment
# bitbake -c menuconfig virtual/kernel

上面这个命令会调出图形化的内核配置,如下所示:

您可以更改它,比如IPV6如果没有开启,我们可以找到相关项目,并用空格选中它,通过tab来选择save按钮把改动保存到.config中,注意,这里保存的是在虚拟机的文件系统中,并不在/tmp下,我们需要能在项目文件夹中找到它,那么需要:

# bitbake –c savedefconfig virtual/kernel

相应的内核配置就会保存在下面的目录中

# cd tmp/work/ccardimx28js-dey-linux-gnueabi/linux-dey/3.10-r0/git
# ls –la defconfig

我们需要把这个配置拷贝到dey的内核配置文件夹中

cp defconfig /usr/local/dey-1.6/sources/meta-digi/meta-digi-arm/recipes-kernel/linux/linux-dey-3.10/ccardimx28js/

剩下的就一样的,我们可以编译全部的镜像,
# bitbake dey-image-graphical
或是只编译内核
# bitbake -C compile virtual/kernel
生成的内核镜像在
./tmp/deploy/images/ccardimx28js

设备树文件

在介绍设备树的时候,我们已经提到过,在Yocto时代,你一般不需要为支持某个特定硬件接口去编译新的内核。有关硬件的描述和支持在设备树文件里完成。设备树文件(dtb)是由硬件描述文本文件(dts)编译成内核可读的二进制文件来生成的。下面详细介绍如何修改不同平台的设备树来启用相关的硬件接口功能。

要使用修改默认的或者使用自定义的设备树,需要打开devshell来操作。

# bitbake -c devshell virtual/kernel

要注意shell已经打开包含内核源码的本地的git代码库
#~/workspace/mycc28/tmp/work/ccimx6-dey-linux-gnueabi/linux-dey/3.10-r0/git#
# cd arch/arm/boot/dts
您可以修改或是创建自己的设备树文件,如果您新建一个设备树文件,请从原来的文件拷贝一份副本并用相同的前缀,在尾部加上custom来区别开来,比如:
# cp imx28_ccardimx28js.dts imx28_ccardimx28jscustom.dts
注意,如果你使用的是自定义的设备树文件,要编译它,请在Makefile中参考原来的设备树文件位置,添加一行把它包括进去来编译它。

编译设备树文件,如果您想在bitbake镜像时一起编译,就要用到git的操作,将它添加到git库中。 但您可以直接在git根目录下,用make来直接编译

make dtbs

这样会编译出该CPU平台下的所有设备树文件,其中就包括imx28_ccardimx28js.dtb

  • CC28平台设备树

CC28设备树分为两块: 模块硬件接口: arch/arm/boot/dts/digi/ccardimx28/*.dtsi 开发板设备树:rch/arm/boot/dts/imx28-ccardimx28js.dts

  • CC28平台设备树配置

要从开发板设备树中打开或关闭硬件接口功能或特性,编辑arch/arm/boot/dts/imx28_ccardimx28js.dts文件并取消相关注释或是注释掉不用的功能块。注意CC28有许多复用的地方,复用功能不可以同时在设备树文件中开启。请参考接口部份或HRM。

  • 编译设备树

平台设备树源文件可以被DEY编译成二进制的设备树文件(dtb),这个文件需要烧写到fdt分区,在启动时Uboot读取该分区并传递给内核。

  • 创建自定义平台设备树

当客户为自己的板子做硬件设计时,就可以通过拷贝开发板设备树来创建并命名自己的自定义平台设备树并做相应的修改。您需要在arch/arm/boot/dts/Makefile中包含该文件,以便这个文件得到编译。您也可以直接在CC28开发板设备树上做修改,但这样做您最好备份一下原始文件。同样地,您也可以修改硬件接口设备树来满足您的要求。

  • 硬件接口

各接外围接口对应的设备树文件和位置,请参考:http://ftp1.digi.com/support/documentation/90001389_B.pdf 第23页起 有时您还需要参考HRM和开发板原理图来获取更多信息。

以最简单的GPIO为例,在第25页有详述其用法,比如您需要把模块的第9脚UART4_RTS/SP3_MOSI当GPIO使用,我们先看看HRM,这是GPIO3_21或GPIO2_25,用哪个? 按DEL的GPIO帮助文档,把GPIO3_21换算成96+21=117

查得BSP设备树中有关冲突的描述:

因此需要把AURAT4和SSP3以及声音部分的dts给注释掉,默认地其它都注释掉了,只有声音的dts还需要加“\“注掉。 在devshell中进行设备树的重新编译最简单,只需要在git根目录下进行 <code> make dtbs </code> 则会生成对应CPU平台的所有设备树,其中就包括ccard开发板的。您可以在tftp服务器中单独用 update fdt tftp 来单独更新设备树文件。 gpio的通过sysfs调用,用法请参考:Documentation/gpio.txt 在/sys/class/gpio目录下执行 <code> #echo 117 > export 创建gpio117节点 #cd gpio117 #cat direction in 说明当前是输入信号 #cat value 0 当前为低电平 </code> 为了能在开发板上测gpio117电平,就不要接到232芯片,所以SW9要off/open状态,如果SW17的P1是close(合上)状态,就可以在ssp3的2脚测得该信号。如果SW19的P2是on-close状态,就可以用XBEE的DTR引脚测得该信号,这是最方便的,因为有排针孔不容易打滑,即: SW9>P2 off , SW17>p1 off,SW19>p2 on 这样测XBee的第9脚和第10脚(GND)就可以测得电平 <code> echo out > /sys/class/gpio/gpio117/direction echo 1 > /sys/class/gpio/gpio117/value </code>