Yocto添加drive recipe
前提条件已经了解Yocto编译
一.Yocto部署驱动到开发板
1.初始化构建环境,会自动跳转到构建目录
DISTRO=openstlinux-weston MACHINE= source layers/meta-custom-leyers/scripts/envsetup.sh
2.创建内核模块例子
PC $> mkdir kernel_module_example
PC $> cd kernel_module_example
3.为内核模块编写驱动源码例子:kernel_module_example.c
1 // SPDX-identifier: GPL-2.0 2 /*3 * Copyright (C) STMicroelectronics SA 20184 *5 * Authors: Jean-Christophe Trotin 6 *7 */89 #include /* for all kernel modules */10 #include /* for KERN_INFO */11 #include /* for __init and __exit macros */12 13 static int __init kernel_module_example_init(void)14 {15 printk(KERN_INFO "Kernel module example: hello world from STMicroelectro16 return 0;17 }18 19 static void __exit kernel_module_example_exit(void)20 {21 printk(KERN_INFO "Kernel module example: goodbye from STMicroelectroni22 }23 24 module_init(kernel_module_example_init);25 module_exit(kernel_module_example_exit);26 27 MODULE_DESCRIPTION("STMicroelectronics simple external out-of-tree Linux ker28 MODULE_AUTHOR("Jean-Christophe Trotin ");29 MODULE_LICENSE("GPL v2");
4.为内核模块编写Makefile
# Makefile for simple external out-of-tree Linux kernel module example# Object file(s) to be built
obj-m := kernel_module_example.o# Path to the directory that contains the Linux kernel source code
# and the configuration file (.config)
#KERNEL_DIR ?= # Path to the directory that contains the source file(s) to compile
PWD := $(shell pwd) default:$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modulesclean:$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean
5.这里要写内核源码目录,在Yocto根本不知道在哪里,可以用以下命令进行查找,在
PC $ bitbake -s | grep linux
. .........
...........
linux- :4.19+AUTOINC+76f632af0a-r0
......
6.输入如下命令,就会找到对应得内核路径,然后代替Makefile得
bitbake -e linux- | grep ^S=
7.添加新得recipe到workspace
PC $> cd
PC $> devtool add mymodule kernel_module_example/
8.将recipe应用于内核模块构建
PC $> devtool edit-recipe mymodule
然后修改ricipe如下:
1 # Recipe created by recipetool 2 # This is the basis of a recipe and may need further editing in order to be fully functional.3 # (Feel free to remove these comments when editing.)4 5 # Unable to find any files that looked like license statements. Check the accompanying6 # documentation and source headers and set LICENSE and LIC_FILES_CHKSUM accordingly.7 #8 # NOTE: LICENSE is being set to "CLOSED" to allow you to at least start building - if9 # this is not accurate with respect to the licensing of the software being built (it10 # will not be in most cases) you must specify the correct value before using this11 # recipe for anything other than initial testing/development!12 LICENSE = "CLOSED"13 LIC_FILES_CHKSUM = "" 14 15 # No information for SRC_URI yet (only an external source tree was specified)16 SRC_URI = ""17 18 19 # NOTE: this is a Makefile-only piece of software, so we cannot generate much of the20 # recipe automatically - you will need to examine the Makefile yourself and ensure21 # that the appropriate arguments are passed in.22 DEPENDS = "virtual/kernel" 23 inherit module24 25 EXTRA_OEMAKE = "ARCH=arm" 26 EXTRA_OEMAKE += "KERNEL_DIR=${STAGING_KERNEL_BUILDDIR}"29 S = "${WORKDIR}"30 31 do_configure () {32 # Specify any needed configure commands here33 :34 }35 36 do_compile () {37 # You will almost certainly need to add additional arguments here38 oe_runmake39 }40 41 do_install () {42 # NOTE: unable to determine what to put here - there is a Makefile but no43 # target named "install", so you will need to define this yourself44 install -d ${D}/lib/modules/${KERNEL_VERSION}45 46 install -m 0755 ${B}/kernel_module_example.ko ${D}/lib/modules/${KERNEL_VERSION}/47 48 }49
9.进入构建目录,并生成内核模块例子:
PC $> cd
PC $> devtool build mymodule
注意:这一步可能会出现驱动编译错误 /bin/sh: scripts/mod/modpost,提示信息:
/bin/sh: scripts/mod/modpost: No such file or directory
出现这样的错误,说明scripts下没有生成相应的文件,两种解决办法:a.cd到kernel所在目录,执行: make scripts
b.先用Yocto把镜像编译好,因为就像我们平时写驱动的时候,linux内核要写编译完才能编译驱动
10.把内核模块部署到板子上
PC $> devtool deploy-target -Ss mymodule root@
11.更新可加载内核模块的依赖项描述,并将磁盘上的数据与内存同步
Board $> /sbin/depmod -a
Board $> sync
12.将内核模块示例插入Linux内核
Board $> modprobe kernel_module_example
[18167.821725] Kernel module example: hello world from STMicroelectronics
二.整合驱动到Yocto用户层(用于测试)
1.在客户层新建recipe
PC $> mkdir ../layers/meta-my-custo-layer/recipes-custom/mymodule
PC $> cp workspace/recipes/mymodule/mymodule.bb ../layers/meta-my-custo-layer/recipes-custom/mymodule
2.拷贝源码和Makefile到用户层
PC $> mkdir ../layers/meta-my-custo-layer/recipes-custom/mymodule/mymodule
PC $> cp kernel_module_example/Makefile ../layers/meta-my-custom-layer/recipes-custom/mymodule/mymodule
PC $> cp kernel_module_example/kernel_module_example.c ../layers/meta-my-custom-layer/recipes-custom/mymodule/mymodule
PC $> devtool reset mymodule
3.还必须完成新菜谱的一些字段,至少包括LICENSE、LIC_FILES_CHKSUM和SRC_URI,配方更新现在必须直接在..lsyers/meta-my-custo-layer/recipes-custom/mymodule/mymodule.bb中完成
对于Linux 内核模块:
1 LICENSE = "GPLv2"
2 LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.GPLv2;md5=751419260aa954499f7abaabaa882bbe"
4 SRC_URI = "file://Makefile \
5 file://kernel_module_example.c \
6 "
对于Linux应用程序:
1 LICENSE = "MIT"
2 LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
3 SRC_URI = "file://hello_world_example.c \
4 "
4.检查新配方更新没有破坏编译,用bitbake命令编译它:
PC $> bitbake mymodule
5.快速添加recipe到镜像中(image),进入到镜像recipe中
PC $> cd ../leyers/meta-st-openstlinux/recipes-st/images/
6.打开 st-image-weston.bb 并添加这一行 : CORE_IMAGE_EXTRA_INSTALL += " mymodule ",然后编译:
PC $> bitbake st-image-weston
7.在烧写镜像和启动该板之后,将内核模块示例插入/移除
Board $> modprobe kernel_module_example
[18167.821725] Kernel module example: hello world from STMicroelectronicsBoard $> rmmod kernel_module_example
[18180.086722] Kernel module example: goodbye from STMicroelectronics
三.构造定制系统
1.一旦这个快速检查完成,请在st-image-weston删除插件:
- 定制客户需求系统
- 必须在编译的自定义镜像中添加这个新配方(mymodule.bb)
PC $> cd ..layers/meta-my-custom-layer/recipes-samples/images/
2.打开 my-custom-image.bb 并添加这一行 : IMAGE_INSTALL += "mymodule"
PC $> bitbake
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
