Yocto tips (20): Yocto中qemu模拟器的使用,以zynq Cortex-A9为例

在以前的文章《使用Buildroot与Qemu学习ARM linux IIC驱动》中,写到过使用qemu来模拟使用ARM Linux,那个时候借助的是buildroot,这次我们使用Yocto来做同样的事情。 优点 使用Qemu的好处在于,当我们在开发Userspace的程序时,可以在没有硬件的情况下完成测试。 同时不像以前一样我们需要自己去编译qemu,这次我们使用Yocto编译出来的native qemu来模拟。省去了我们手动编译可能出现的问题。 选择 这里的选择指的是,我们在local.conf中指定MACHINE变量的值。我将其分成两种: 1. 默认的qemuarm 以前我一直使用这个,但是这个模拟的是一个ARM9的处理器,各种外设功能不足,我们希望可以模拟一个更高ARM架构的SoC。 2. Xilinx的zynq-9:xilinx-zynq-a9 在Qemu的模拟中,据个人有限经验对不同的板子的模拟情况的了解,zynq在Qemu中有较好的支持。同时xilinx对此也有不少的文档,同时xilinx的一些板子的支持属于Qemu默认的测试与支持Machine,因此选择Xilinx的板子来模拟比较合适。 同时,我们关注的是ARM相关,因此使用Cortex-A9比较好,对此,我们选择xilinx-zynq-a9。 在我们的Host PC中如果安装了qemu-system-arm,那么我们可以看到其支持的板子里面是有这个板子的:

Continue reading »

Yocto tips (19): Yocto SDK Toolchian的使用

在使用之前需要先source env,导入各种环境变量(注意将路径变更成你自己的):

然后我们可以查看一下bash的env了,下面是多出来的一些env,直接在bash中输入export即可看到:

注意点 其中我们重点需要关注的是与编译相关的变量: CC/LD等编译相关 ARCH/CROSS_COMPILE等croos编译相关 可以看到CC已经被重定义为cross toolchain了,而ARCH和CROSS_COMPILE也悉心的帮我们配置成了对应的。 因此,其实如果我们需要交叉编译一个app,那么很多变量将不再需要自己手动设定了。 同时因为各种tuning的指定,我们必须注意和硬件的匹配。例如这里指定了为cortex-a9而优化。 如何使用 最好的方法就是使用变量来使用Toolchian,例如使用$CC而不是使用arm-poky-XXX-gcc,因为我们可以看到CC其实是对arm-xxx-gcc添加了一些配置:

其中最为核心的是sysroot这个选项,这个选项将告诉toolchian去哪里查找库与头文件,而如果不指定这个,那么就会出现问题,例如,我们直接使用arm-poky-gnueabi-gcc来编译:

可以看到提示说找不到一些标准的头文件,其实这个是因为我们没有添加一些指定的选择来告诉其使用stubs-hard.h,所以默认的去查找stubs-soft.h。 例如我们编译一个helloworld,那么可以按照如下编译:

Continue reading »

Yocto tips (18): Yocto SDK Toolchian中静态库的添加

Toolchian中静态库的添加 没有静态库,是无法静态编译应用程序的,因此,为了方便,还需要在SDK中添加静态库,例如libc。 这个特性在只需要开启即可,在local.conf中添加一行: SDKIMAGE_FEATURES_append = “staticdev-pkgs” Toolchian中静态库的验证 然后重新build SDK,并安装SDK之后,我们可以验证其是否存在。 首先source env,导入各种bash变量: source ../qt5_sdk/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi 然后确认libgcc.a是否exist: $CC -print-file-name=libgcc.a 如果输出的存在,那么就有了,例如:

Continue reading »

Yocto tips (17): Yocto License问题:restricted license not whitelisted in LICENSE_FLAGS_WHITELIST

Yocto中可以配置一个Distrbution的License,然后所有的软件包,都需要符合这个license才可以被shipped到image中,如果我们需要使用违反此license的软件包,那么就需要额外配置。 例如,在bitbake编译vlc的时候出现下面的错误log:

那么就是因为vlc依赖libav,但是libav,的license不符合Distribution的License而无法编译。在libav中的bb文件配置中,可以看到其license flag为commercial: 开启接受所有的commercial license软件包 因此如果我们需要添加一些commercial Lincense的软件包,就需要添加对commercial的支持,只需要在local.conf中添加一行即可:

只接受特定的commercial license软件包 但是如果我们只期望某些特殊的commercial软件包可以被编译放入到rootfs中,那么我们就需要逐个指定,例如指定libav等包可以被编译:

Continue reading »

Yocto tips (16): Yocto 制作SDK分发Toolchain 脱离Yocto环境开发

Yocto中SDK有两种: 只有Toolchain,或者Toolchain+某类GUI特性 有针对某个Distribution的SDK,即含有Toolchian也含有这个Distrbutition特殊的文件 下面分别说明。 第一类 这类的软件包有如下这些: 其实就是两类: meta-toolchain meta-toolchain-qt/qte/qt5 后者包含了qt相关的东西,qte是面向embed的,如果需要做qt相关的application开发,那么包含qt的是合适的选择,否则仅仅开发普通application,那么使用meta-toolchian即可。 第二类 这类SDK才是推荐使用的,这个在distribution的task中有一个特别的任务,专门用来制作这个SDK,叫做populate_sdk,例如对应要制作一个fsl-image-qt5 目标的Distribution(也叫做image),那么可以这样子:

这两类制作完成后,可以在deploy中看到了: 其中xml文件是SDK包含了的文件列表。 SDK的安装 因为SDK文件是sh脚本+压缩的文件内容组成的,所以直接运行即可,例如: 在prompt提示中,输入安装的路径。

Continue reading »

Yocto tips (15): Yocto中的包管理器

使用包管理器 在local.conf中使能即可: 然后编译后就会有rpm包了: 配置文件服务器 可以使用ngix和apache,但是我们也可以只用使用python:

打开浏览器可以看到: 在机器上面查看包的status smart status 在机器上面配置channel 对于rpm使用的smart工具,添加channel:

添加参数之后,就可以update了: smart update 正确的是下面命令的情形: 如果配置参数不对,那么就会出错,如果出错,那么检查IP与格式是否正确,例如下面的http少了两个//: 如果弄错了,那么可以先移除掉:

Continue reading »

Yocto tips (13): Yocto 查看软件包的依赖关系

查看一个文件包的依赖,我们可以使用图形化来查看,下面是一些官方说明:           例如我们要查看weston的依赖:

这个会列出不同的依赖,例如中间的是编译时候需要依赖的东西,结果如下:    

Continue reading »

Yocto tips (12): 使用Yocto帮组我们寻找难找的固件与固件放置路径

有很多的硬件需要firmware才能工作,而这些firmware需要不仅仅需要找到,还需要放置到正确的位置,一般这个位置是/lib/firmware下面,但是很多也不尽然。 手动去查找这些固件,容易出现遗漏或者混淆,也有可能是年久不匹配了的固件,例如在我前面的博客中:Yocto i.MX6 (TQIMX6) (02) : USB Wifi (TP-Link WN821N等设备)AR9170的Linux内核支持与固件使用,就出现了自己按照wiki与help去查找firmware,结果却花了大量时间也没有解决,而使用yocto中的linux-firmware软件包,非法快速的解决了这个问题。 对于firmware放置的path也是类似,例如有些驱动放置的path为非标准的path,例如下面这些都是放在各自的目录中的: 因此,直接将linux-firmware添加到打包rootfs,或者直接查看linux-firmware中的image文件夹就可以知道path了,例如前面的ar9170:

Continue reading »

Yocto tips (11): Yocto如何往最终的rootfs中添加软件

在Yocto中如果我们期望在rootfs中添加一些软件,例如可能是bash,可能是lsusb等,那么,我们可以有两种方法: 手动添加,一个个文件的拷贝 在bb文件中添加安装项目,让Yocto自动帮助我们添加 第一种方法需要手动将软件包的所有文件以及依赖都一个个添加进去,耗时耗力且易错,因此使用第二中方法比较合适。 Yocto中Rootfs中添加软件包的步骤 找到打包rootfs的最终bb 如果我们使用的是下面命令:

那么,我们可以按照如下来搜索fsl-image-qt5这个软件包(任务),使用的是哪个bb文件: 添加需要安装到rootfs的软件包 然后打开,并添加需要添加的包即可,例如下面添加的是linux-firmware: 保存,然后我们再一次使用bitbake构建系统,然后就可以看到rootfs中有对应的文件了:

Continue reading »