=====DEY嵌入式Linux系统开发环境搭建===== 嵌入式linux系统通常需要根据目标设备所需的接口和软件包做适当的裁减和定制,来生成可运行在目标设备上的稳定而小巧的Linux系统固件。这主要是因为不同的设备会有不同的接口需求,没有必要做一套大而全的系统和预装不必要的软件和驱动。就像网关设备没必要集成音视频接口和多媒体播放器,而对于需要人机交互的仪器仪表来说图形化的显示界面是必不可少的,因此系统开发的目的是通过为不同设备定制不同的内核和文件系统镜像,减少不必要的软件包和驱动支持,以便让目标系统能更加稳定可靠地运行。 要进行DEY系统开发,首先您需要有一台安装有Linux的操作系统的电脑,我们推荐您安装64bit的[[http://www.yoctoproject.org/docs/4.0/ref-manual/ref-manual.html#intro-requirements|Ubuntu22.04等Yocto支持的系统]]。通常并不建议在Windows下安装个Linux虚拟机这样的方式来搭建DEY系统开发环境,这是因为以Yocto的方式编译定制的Linux比较耗资源和时间。进行DEY开发编译时在Linux环境下进行,最好是使用一台专用的Linux系统开发服务器,通过远程ssh登陆的方式来进行相关的系统开发。 为了确保Yocto开发环境能正常工作,用于开发的电脑配置需要至少需要16G以上的内存,500G以上的硬盘空间。通常建议选配四核以上的CPU以加快编译速度。 ====制作Ubuntu启动盘并安装==== 有许多磁盘工具都可以用来制作U盘启动的安装盘,包括一些开源免费的软件,比如Rufus和UNetbootin,LinuxLive USB Creator等等。 以Rufus为例,为了更快完成启动盘制作,能常采用DD的模式来把镜像写入到U盘中。 制作好U盘启动的Ubuntu安装盘,您还需要配置你的电脑BIOS使其支持从U盘启动。现在比较新的电脑一般都默认支持,并且开机时,都有一个启动选项按钮,比如HP的电脑是F9,如果您不清楚,可以进入BIOS查询或是网上搜索一下你的笔记本品牌的开机启动方式按钮。 在开机时选择从U盘启动,就可以按界面提示一步一步完成Ubuntu操作系统的安装。 安装完成后,您还可以选择安装一些常用的软件包,比如中文支持和tftp服务器等,如果您有兴趣,请参考:[[digi:arm-embedded:linux:ubuntu常用软件安装配置|ubuntu常用软件安装配置]] ====安装前准备工作==== 由于Yocto4.0后,必须用python3,因此如果您需要同时开发DEY3.2或以前的版本,建议早期的DEY开发环境用docker的方式来安装,这样同一台电脑可以同时维护不同版本的DEY,请参考[[https://github.com/peyoot/dey-aio-manifest/blob/main/README-cn.md|DEY-AIO项目]]来搭建系统开发环境。 安装软件前,请先进入root模式,安装所需的依赖包,如果您是 $ sudo apt update $ sudo apt install gawk wget file git diffstat file unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint xterm python3-subunit mesa-common-dev zstd liblz4-tool 确保是用python3,还需要安装这个包 $ sudo apt install python-is-python3 原则上,采用全新安装的ubuntu系统,按上面方式操作,后续编译系统固件就不会有任何问题。如果您只需要编译早期的DEY时,您可以用更早的Ubuntu发行版本。 原则上,需要采用Ubuntu 18.04及其以上的版本来从事开发,对于DEY 3.2之前的版本,使用旧版本的Ubuntu仍可以正常编译,使用Ubuntu编译DEY3.2之前的版本,可以用 $ sudo apt install curl gawk wget git-core diffstat unzip texinfo gcc-multilib g++-multilib build-essential chrpath socat cpio python python3 python3-pip python3-pexpect libsdl1.2-dev xterm libncurses5-dev libncursesw5-dev lzop 更早的版本需要要加装一些硬件增强包。 Ubuntu 16.04和14.04的包名有所不同,请根据你的系统版本操作: Ubuntu 14.04: \\ $ sudo apt install linux-hwe-generic-trusty Ubuntu 16.04 (一般默认自带): \\ $ sudo apt install linux-generic-hwe-16.04 Yocto开发方式依赖于通过网络下载所需的开源软件包源码,由于Linux中许多上游的开源软件包托管在被GFW和谐掉的服务器上,首次编译时需要科学上网环境。由于国家政策的原因已经不太好购买翻墙路由器。有条件的用户,也可以用境外的云服务器来自己搭建VPN来实现科学上网。如果您有境外的云服务器,需要安装VPN,可以使用[[https://github.com/peyoot/pvpn|peyoot/pvpn]]这个开源的脚本来实现自动化科学上网环境部署。 如果没有条件科学上网,目前中国区也提供了国内安装和编译的方法,请继续阅读按下面的方法来安装或编译DEY。 ====使用repo工具安装DEY==== 接下来首先要安装repo,DEY项目托管在github上,采用repo工具来管理软件包的升级和更新。而repo是谷歌开发的git管理工具,因此repo的官方安装方法需要先科学上网。此外,Ubuntu 22.04等发行版已经提供repo包,您也可以直接用apt的方式安装。Repo的官方下载地址经常变动,但总可以到Google的android开发下载页面找到对的地址,如果Repo下载地址有变,请到http://source.android.com/source/downloading.html查找正确的URL。 我们将直接下载到/usr/local/bin,在普通用户终端窗口执行下面命令,以便在有root权限 $ sudo -H tmux 下载repo,使用下面命令前请确保已经可科学上网,如未设置科学上网,请用参考后面国内源或用apt的方式安装。 $ curl -o /usr/local/bin/repo http://commondatastorage.googleapis.com/git-repo-downloads/repo $ chmod a+x /usr/local/bin/repo 如果无法翻墙,也可以用国内源或系统发行版官方源的方式安装, Ubuntu 22.04 或其它提供官方repo下载的发行版,可以直接使用官方源安装,如: $ sudo apt install repo 如果发行版不带repo,又无法科学上网,可使用清华源的方式安装repo $ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo $ chmod +x repo $ sudo mv repo /usr/local/bin/ 指定REPO_URL为国内源 $ nano ~/.bashrc 在该文件末尾加上一行 export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/' 然后CTRL+O保存后,按CTRL+X退出,执行下面命令使之生效 $ source ~/.bashrc 这样,以后在登录用户下,就可以直接使用repo了 接下来就可以去下载DEY,请在普通用户权限下操作,将来DEY只需用登录用户的权限,可把命令中的$USER换成您电脑的用户名: 新建一个DEY源码目录 进一步操作前,需要退出root,因为yocto的项目编译不推荐用root,而是用你的用户名,在上面创建dey安装目录时我们已经把该目录提定给自己登录系统时的用户。 如果您还是root的终端,请先执行退出root权限的tmux会话终端,切换到普通用户的会话窗口。 $ exit 安装前,先根据所需的DEY版本准备一个安装目录 $ sudo install -o $USER -g $USER -d /usr/local/dey-4.0 上面命令中,我们新建了一个dey-4.0的目录,DEY有不同的版本支持不同的内核版本和硬件平台,您可以到 https://github.com/digi-embedded/dey-manifest/ 查看当前所支持的分支和tags列出的版本号,最新的DEY 4.0版本代号kirkstone。 {{:digi:arm-embedded:linux:dey:dey-version.png?600|}} $ git config --global user.email "you@xxx.com" (用您常用的邮箱或是您在github上帐号所用的邮箱替代) $ git config --global user.name "youname" (取一个自己的用户名) $ cd /usr/local/dey-4.0 $ repo init -u https://github.com/digi-embedded/dey-manifest.git -b kirkstone $ repo sync --no-repo-verify 或是 repo sync -j4 --no-repo-verify 上述命令每次官方有更新时,repo sync能保持和官方同步。大部分场景,您是用这种方法和官方保持一致。在一些深度定制的特殊情况,您不再参考Digi的开发板主要器件和用料,而要在某一版本号上继续开发BSP额外的分支,不和官方一致的情况下,您也可以用指定的版本号,以便回溯,比如DEY2.6的代号是thud,它最后一次更新后版本号是DEY2.6-r3.1,下面这个命令将只同步您到DEY2.6-r3.1版本 $ repo init -u https://github.com/digi-embedded/dey-manifest.git -b refs/tags/2.6-r3.1 $ repo sync -j4 --no-repo-verify 注意,官方的版本代号永远都指向DEY-m.n的最新版本,您如果在后续使用中,用repo sync更新DEY安装目录,在DEY的安装目录下的source/meta-digi/README.md里,可以查到最后更新对应的版本信息,从而您可以知道当前使用的DEY版本号。我们建议您在做系统开发时,可以在项目文件夹前使用该版本号,或是在备份镜像时,备份到对应的版本号文件夹下,这样您就不需要从启动信息中了解所用镜像的版本号。 \\ Digi会维护每个已经发行的版本(包括小版本号和大版本号),所以如果您在已经在某个版本上成熟开发应用,也无需使用最新的大版本。如果要在同一电脑上使用不同的DEY版本,建议使用DEY-AIO项目。 CC28平台只支持早期的DEY1.6版本,如果需要安装该版本,则对应的安装URL有所不同,请参考下述命令。 $ sudo install -o robin -g robin -d /usr/local/dey1.6 $ repo init -u https://github.com/digidotcom/dey-manifest.git -b refs/tags/1.6.9 $ repo sync -j4 --no-repo-verify ====其它安装DEY的方法==== **docker安装** DIGI中国区维护一个[[https://github.com/peyoot/dey-aio-manifest/blob/main/README-cn.md|DEY-AIO项目]],同时支持容器化和官方原生两种开发方式,并提供一个定制文件系统的参考,也方便用git管理变更,并提供卡刷包生成发布工具,建议中国区用户使用DEY-AIO来安装DEY系统开发环境。 **带预编译项目的虚拟机镜像** 我们推荐您使用repo工具来安装DEY,这样您能比较方便地获取最新的DEY版本。如果访问国内repo源不便时,又不能通过翻墙下载repo的时候,您也可以参照下面方法安装指定的DEY版本。 虚拟机镜像往往非常大,这不是推荐的方式,为了取得更新版本和更好的管理维护,建议用repo的方式来安装。但如果您系统开发中遇到科学上网等问题,可以向Digi中国区索取您所需的版本。 ====创建建DEY内核和文件系统项目==== 安装好 DEY的开发平台,就可以创建项目了 在meta-digi-arm中定义的可用平台包括:\\ * ConnectCore 6 SBC, ccimx6sbc (支持DEY1.6,2.0,2.2以上的版本)\\ * ConnectCore 6UL SBC, ccim6ulsbc (支持DEY2.2以上的版本)\\ * ConnectCard for i.MX28, ccardimx28js (支持DEY1.6)\\ 初始化项目和环境变量配置,可以用 mkproject.sh脚本,另外bitbake 不能用root编译,所以如果你是 root,还需要切换用户。 确保从root状态退出,然后 #mkdir -p /home/robin/dey-workspace/ccimx6ulsbc (请把robin改成你的Linux系统的用户名) #cd /home/robin/dey-workspace/ccimx6ulsbc #source /usr/local/dey2.6/mkproject.sh -l (列出该版本支持的平台) #source /usr/local/dey2.6/mkproject.sh -p ccimx6ulsbc (如果你的安装目录有多级,比如是/usr/local/dey/dey-morty时,相应地是source这个dey-morty路径的mkproject.sh) 上面命令会跳出license agreement,用任意键阅读完,按y接受license agreement,相关脚本就开始初始化项目,并生成conf目录和配置文件 \\ bblayers.conf:可用的配置层在这里配置 \\ local.conf:仅对本项目有用的本地可配置的变量在这里定义 \\ mkproject.sh脚本会在当前的终端窗口中配置好编译环境。它也在项目根目录中创建一个 dey-setup-environment脚本,重启动或是关闭session后可以通过source它来在新窗口中为已经存在的项目设置编译环境。 新建好项目或是在终端中source已有项目的dey-setup-environment脚本后,就会提示您可以直接编译项目的镜像了。 注意,当DEY版本有更新,如果你要用新版本,则在更新完sync后,需要擦除 tmp和 sstate-cache目录,以便用新版本重新编译。 ====配置项目(编译选项和文件系统定制)==== DEY默认的配置就足以编译生成适合开发套件上运行的镜像,首次试用,您也可以跳过本步骤,直接参考下一小节[[digi:arm-embedded:linux:dey:dey开发环境搭建#编译项目并生成镜像|编译项目并生成镜像]]来编译生成可烧入cc6ul的固件。不过建议还是要更改一下local.conf的默认下载目录和指定一下国内源码镜像源,以便不同项目在编译时可以用之前bitbake编译时已经下载的源。 要进行编译选项设置和文件系统定制,可以通过修改conf/local.conf来配置项目,包括: * **指定编译时的下载目录** DEY在编译时会从互联网下载所需对应版本的软件包,主要是linux和bsp的源码包,默认是下载到项目文件夹下的downloads目录。当你有多个项目时,重复下载相同的软件包会占用太多的硬盘空间,建议更改默认的下载位置。默认是#DL_DIR ?= "${TOPDIR}/downloads",这里需要去掉注释,指向项目文件夹的上级目录的downloads。这样不同的项目都可以用之前下载的软件包,减少编译时间和硬盘占用的空间。 DL_DIR ?= "${TOPDIR}/../downloads" * **指定编译时的源码镜像** 由于编译时会从互联网下载软件包,一些上游软件源托管在谷歌服务器等国内被墙的站点,当源码无法获取时,会导致编译失败。如果没有翻墙的条件,那么为项目指定一个软件包的镜像下载站点是个不错的选择。你可以指定为本机的目录,也可以是网络的镜像源。Digi中国为客户提供一个国内镜像网址:dey-mirror.eccee.com,可以配置在local.conf中直接使用。 您也可以下载整个源码压缩包,解压到上面到默认下载位置,对于DL_DIR指定目录中已经存在的软件包,编译器会自动略过而无需下载。 通常地,首次编译,您需要通过镜像源来在编译过程中生成downloads内的软件包。我们在后面也会提供另一种无需编译的方法,那就是直接下载打包好的downloads压缩包。 要指定软件包镜像源,在conf/local.conf中指定下面这些参数,以DEY 2.6为例: SOURCE_MIRROR_URL ?= "http://dey-mirror.eccee.com:1080/bitbake-downloads" INHERIT += "own-mirrors" * **默认的网络参数定制(etc/network/interfaces)** DEY允许您通过conf/local.conf文件为目标镜像配置默认的网络参数,也就是定制目标系统中的/etc/network/interfaces文件。 默认的配置如下: ETH0_STATIC_IP ?= "192.168.42.30” ETH1_STATIC_IP ?= "192.168.44.30" (if applicable) WLAN0_STATIC_IP ?= "192.168.43.30" (if applicable) 对于有线网络,指定静态IP相关配置如下: ETHn_STATIC_IP = "" ETHn_STATIC_NETMASK = "" ETHn_STATIC_GATEWAY = "" ETHn_STATIC_DNS = "" 其中,n为0或1,取决于您的平台支持的网口个数。 同样地,对于无线网络指定静态IP: WLAN0_STATIC_IP = "" WLAN0_STATIC_NETMASK = "" WLAN0_STATIC_GATEWAY = "" WLAN0_STATIC_DNS = "" 如果是启用DHCP,则用下面配置 ETHn_MODE = "dhcp" WLAN0_MODE = "dhcp" * **向目标镜像添加软件包** 比如要添加strace,注意下面软件包名称前有空格 IMAGE_INSTALL_append = " strace" * **向目标镜像添加特性** DEY引入一些特性来简化系统定制,可以启用或关闭相关的特性来实现特定的功能组,这会批量添加所需功能的软件包。 EXTRA_IMAGE_FEATURES = "" 相关特性列表:   * dey-audio: Adds audio support to a platform. * dey-gstreamer: Adds the gstreamer framework to a platform. * dey-network: Adds network applications and tools. You can configure some of the network applications in your conf/local.conf by doing: * dey-wireless: Includes wireless applications and drivers. * dey-bluetooth: Adds Bluetooth support. * dey-debug: Adds DEY debugging applications as memwatch and fbtest. * dey-examples: Adds DEY example applications. * dey-qt: Adds QT support. This feature is added by default in dey-image-graphical images. * **高级定制** 文件系统定制进阶,可以参考[[digi:arm-embedded:linux:dey:deycustomrootfs|DEY文件系统定制]] 当需要进一步定制系统时,建议创建一个新的layer, DEY中包含一个meta-custom的layer作为例子。您的meta-custom可以: *包含新的recipes,比如添加新的应用程序或新文件到文件系统中 \\ *修改其它layer中现有的recipes,这可以通过添加一个.bbappend的recipe.也可以用来修改现有文件系统中的文件。 \\ *创建新的目标镜像 \\ *创建新的设备配置 \\ *为您平台提供默认的内核配置或配置片段 \\ **参考资料** Yocto项目组有很好的系统开发相关文档供参考: * [[http://www.yoctoproject.org/docs/2.0/bsp-guide/bsp-guide.html|Yocto Project Board Support Package (BSP) Developer's Guide]] * [[http://www.yoctoproject.org/docs/2.0/kernel-dev/kernel-dev.html|Yocto Project Linux Kernel Development Manual]] * [[http://www.yoctoproject.org/docs/2.0/dev-manual/dev-manual.html|Yocto Project Development Manual]] * [[http://www.yoctoproject.org/docs/2.0/ref-manual/ref-manual.html|Yocto Project Reference Manual]] ====编译项目并生成镜像==== 要编译DEY镜像,在您的项目文件夹内使用下面bitbake命令 CC6或CC6UL用下面命令编译 bitbake 镜像名 镜像名可以是core-image-base, dey-image-qt, dey-image-webkit等 而CC28在DEY1.6中的编译镜像命令是 bitbake dey-image-graphical 编译时间根据电脑配置不同而略有不同,使用较新的高配置电脑,编译时间仍可能长达6个小时以上。因此,建议您在执行这个命令时做好让电脑整夜编译的准备。 如果连LCD液晶屏显示都不需要,可以编译一个不带屏显支持的固件镜像: bitbake core-image-base 编译好的镜像可以在项目文件夹下/tmp/deploy/images/<平台>中找到,NXP系的这个目录包括编译生成以下这些文件: * 启动镜像,扩展名为vfat,实际上它是一个FAT格式的分区镜像,包含了Linux内核和驱动设备树文件。 * 不同格式后缀的根文件系统镜像,包括: * ext4,一个ext4格式的分区镜像,可以烧到eMMC和SD卡中 * sdcard,用于创建从SD卡启动的完整SD卡镜像 * tar.bz2,一个根文件系统压缩包,可用于设置远程NFS启动 * manifest,一个文本文件列出所有编译的包 * UBoot镜像,.imx后缀,可以烧入eMMC或SD卡 * Linux内核镜像,.bin后缀,可以烧入到已有的FAT启动分区 * Linux内核设备树镜像,.dtb后缀,可以烧入到已有的FAT启动分区 对于ST系的固件名称略有不同,可以[[https://www.eccee.com/embedded/som/1198.html|参考这里]]了解相关信息 您可以用Uboot命令把镜像写入eMMC或SD卡,从内置的flash或是外置的SD卡启动,请参考Uboot使用手册或[[digi:arm-embedded:linux:dey:固件更新|DEY固件更新-核心板刷写新固件的操作指南]]。 编译过程中,DEY会根据配置文件去网上自动下载所需的软件包,在项目文件夹下有一个downloads目录,里面是编译过程自动下载的一些软件和库。 如果编译不成功,通常是因为网速原因或是因为不能翻墙导至下载不到一些软件包,可以从下面不翻墙编译方法中提供的网盘上下载downloads目录的压缩文件dey24r1downloads.tgz解压到项目文件夹中,重新执行bitbake命令即可。 ===直接下载downloads压缩包=== 通过指定DEY所需软件包国内镜像源,客户无需翻墙就能编译DEY镜像。\\ 碰到国内镜像源下在维护无法访问时,而所需一些软件包托管在被GFW封杀的境外服务器上,则会导致编译不成功。这时,如果您无法翻墙,可以从网盘上下载downloads目录的压缩文件并解压到项目文件夹中,再进行编译即可。 DEY 3.0编译后生成的downloads目录的压缩包可从下面地址下载: http://dey-mirror.eccee.com:1080/bitbake-downloads/dey3-with-tc/ 如果您使用peyoot/PVPN进行翻墙后编译,那么事先用这个downloads放置在配置文件指定的目录下,可以省去许多包的下载过程,节约时间和速度。 ===不联网编译DEY=== DEY编译时需要联网,以便下载所需的源码包,甚至有脚本会检则是否连网,把它作为能正常编译的前提条件。 为了在不联网时也能进行编译,需要一些技巧。 我们在本机建立一个源码下载的镜像源,然后在项目中配置好,以便无需互联网接入也可以编译镜像。在local.conf中配置好本地源镜像, SOURCE_MIRROR_URL ?= "file:///home/you/dey-workspace/your-download-dir/" (请填实际的下载目录名)     INHERIT += "own-mirrors" BB_GENERATE_MIRROR_TARBALLS = "1" 先编译一次,然后在local.conf中加上 BB_NO_NETWORK = "1" 这样,这个项目无需联网也能正常编译了。 由于许多开源上游软件的版本号是自动检测的,因此在编译过程还会有联网动作检查版本,不联网编译需要一些技巧来避免这个过程的联网动作失败导致编译不能通过。 ====文件系统定制==== 如果您还没阅读[[http://digiwiki.eccee.com/digi/arm-embedded/linux/dey/deycustomrootfs|如何定制文件系统]],请先阅读本章节,它会指导您如何添加软件包,移除软件包,甚至查询当前配置中可添加的软件包有哪些,以及如何添加第三方Layer来扩展更多可集成到文件系统中的软件包等。 ====U-Boot启动器==== 我们在快速上手指南或是固件升级的文档中会用到一些U-Boot的操作命令和参数,有关flash分区和U-Boot更详细的说明,请参考:[[digi:arm-embedded:linux:dey:uboot|DEY中的U-Boot命令和系统启动过程]] ====DEY外设和接口==== 请进一步阅读[[digi:arm-embedded:linux:dey:deykerneldevelopment|DEY内核开发定制和BSP驱动指南]] ====DEY ALL IN ONE==== [[http://digiwiki.eccee.com/digi/arm-embedded/linux/dey/deyallinone|dey-all-in-one]]是Digi中国区推出的开源项目,它是一个集成式的DEY系统开发环境,将DEY源码和DEY客户项目集成在一起,可以支持DEY2.6,DEY3.0,支持在本地同步开发多个DEY项目,并用git的方式有效地进行版本控制和管理,极大简化编译结果的发布过程。 建议在初步了解DEY系统开发过程和方法后,利用dey-all-in-one来作为统一的开发平台。 =====DEY应用程序开发===== 请进一步阅读[[digi:arm-embedded:linux:dey:dey_app_development|DEY应用程序开发]]