Yocto: how to add out-of-tree Device driver? - compilation

First of all I should say I am a complete newbie to the Yocto world.
I have a working environment that produces my uboot+kernel+rootfs.
I need to add a (complex) driver I have as a subdirectory.
This driver can be compiled natively in the standard way:
here=$(pwd)
make -C /lib/modules/$(uname -r)/build M=$here/bcmdhd modules CONFIG_BCMDHD_PCIE=y CONFIG_BCMDHD=m CONFIG_BCM4359=y
I have seen Integrate out-of-tree driver in kernel and rebuild yocto project image and I have read Yocto Kernel Development Manual.
I tried to follow directions:
Created a directory in .../recipes-kernel beside linux dir.
Copied the source directory in it.
Created a .bb file.
The resulting source tree is:
recipes-kernel/
├── kernel-modules
│   ├── kernel-module-bcmdhd
│   │   └── bcmdhd
│   │   ├── include
│   │   │   ├── include files
│   │   ├── Kconfig
│   │   ├── Makefile
│   │   └── other source files
│   └── kernel-module-bcmdhd_0.1.bb
└── linux
├── linux-imx-4.1.15
│   └── imx
│   └── defconfig
└── linux-imx_4.1.15.bbappend
My BCM89359-mod_0.1.bb contains:
SUMMARY = "Integration of Cypress BCMDHD external Linux kernel module"
LICENSE = "Proprietary"
inherit module
SRC_URI = "file://bcmdhd"
S = "${WORKDIR}"
Unfortunately this doesn't seem to be enough as running bitbake results in no compilation attempted.
I am quite plainly missing something, but I'm unable to understand what.
Any help welcome.

You should have the following source tree:
recipes-kernel/
├── kernel-modules
│   ├── kernel-module-bcm89359_0.1.bb
│ └── kernel-module-bcm89359
│ └ bcmdhd
│ ├ Kconfig
└── linux
├── ...
(For the record)
You can add your module to MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "kernel-module-bcm89359" to local.conf or machine configuration. Also, you can add KERNEL_MODULE_AUTOLOAD = "bcm89359" to load your module automatically.

Related

Correct directory structure for Puppet RSpec testing

I'm having some issues creating unit tests for my Puppet control repository.
I mostly work with roles and profiles with the following directory structure:
[root#puppet]# tree site
site
├── profile
│   ├── files
│   │   └── demo-website
│   │   └── index.html
│   └── manifests
│   ├── base.pp
│   ├── ci_runner.pp
│   ├── docker.pp
│   ├── gitlab.pp
│   ├── logrotate.pp
│   └── website.pp
├── role
│   └── manifests
│   ├── gitlab_server.pp
│   └── nginx_webserver.pp
Where do I need to place my spec files and what are the correct filenames?
I tried placing them here:
[root#puppet]# cat spec/classes/profile_ci_runner_spec.rb
require 'spec_helper'
describe 'profile::ci_runner' do
...
But I get an error:
Could not find class ::profile::ci_runner
The conventional place for a module's spec tests is in the module, with the spec/ directory in the module root. So site/profile/spec/classes/ci_runner_spec.rb, for example.
You could consider installing PDK, which can help you set up the structure and run tests, among other things.

Kubernetes client code generator: Can the code exist only locally and not on a repository for the core-generator to work?

I am trying to generate client code using k8s.io/code-generator.
These are the instructions that I am following: https://itnext.io/how-to-generate-client-codes-for-kubernetes-custom-resource-definitions-crd-b4b9907769ba
My question is, does my go module need to be present on a repository or can I simply run the generate-groups.sh script on a go module that is ONLY present on my local system and not on any repository?
I have already tried running it and from what I understand, there needs to be a repository having ALL the contents of my local go module. Is my understanding correct?
You CAN run kubernetes/code-generator's generate-groups.sh on a go module that is only present on your local system. Neither code-generator nor your module needs to be in your GOPATH.
Verification
Cloned kubernetes/code-generator into a new directory.
$HOME/somedir
├── code-generator
Created a project called myrepo and mocked it with content to resemble sample-controller. Did this in the same directory to keep it simple.
somedir
├── code-generator
└── myorg.com
└── myrepo # mock of sample-controller
├── go.mod
├── go.sum
└── pkg
└── apis
└── myorg
├── register.go
└── v1alpha1
├── doc.go
├── register.go
└── types.go
My go.mod looked like
module myorg.com/myrepo
go 1.14
require k8s.io/apimachinery v0.17.4
Ran generate-group.sh. The -h flag specifies which header file to use. The -o flag specifies the output base which is necessary here because we're not in GOPATH.
$HOME/somedir/code-generator/generate-groups.sh all myorg.com/myrepo/pkg/client myorg.com/myrepo/pkg/apis "myorg:v1alpha1" \
-h $HOME/somedir/code-generator/hack/boilerplate.go.txt \
-o $HOME/somedir
Confirmed code generated in correct locations
myrepo
├── go.mod
├── go.sum
└── pkg
├── apis
│   └── myorg
│   ├── register.go
│   └── v1alpha1
│   ├── doc.go
│   ├── register.go
│   ├── types.go
│   └── zz_generated.deepcopy.go
└── client
├── clientset
│   └── versioned
│   ├── clientset.go
│   ├── doc.go
│   ├── fake
│   ├── scheme
│   └── typed
├── informers
│   └── externalversions
│   ├── factory.go
│   ├── generic.go
│   ├── internalinterfaces
│   └── myorg
└── listers
└── myorg
└── v1alpha1
Sources
Go modules support https://github.com/kubernetes/code-generator/issues/57
Documentation or support for Go modules https://github.com/kubernetes/sample-controller/issues/47

Configure Intellij Idea to import generated files

I'm having trouble to import a generated package with Intellij, however without any changes to the default settings it works on Eclipse.
Here is my architechture:
├── build.properties
├── pom.xml
├── README.md
├── src
│   ├── main
│   │   ├── java
│   │      └── mypackage
│   └── test
└── target
├── classes
│ └── mypackage
| └── generated
├── generated-sources
├── generated-test-sources
├── APP.jar
└── test-classes
I have most of my classes in com.mypackage however some of them are generated in
└── target
├── classes
└── mypackage
named as com.mypackage.generated and i have to use these classes in com.mypackage:
├── src
├── main
├── java
└── mypackage
However intellij cannot resolve symbol generated when I'm doing
import com.mypackage.generated
I tried to make it work by looking at the project structure/modules/dependencies menu but it seems to be for external modules. How can I do this ?
Actually it was very simple, I only was about marking classes as sources root. I don't know why marking generated as sources root did not work.

Yocto device tree overlay

I am working on a Beaglebone Black, using Yocto.
Using this implementation of a PWM driver as a guide, I am unable to add my PWMs to the device tree.
The best solution would be to create a device tree overlay as Mr. Saad Ahmad is doing, but I don't understand how to do this using Yocto.
I am not using capemgr, but I am using meta-bbb. I also have custom layer meta-tfe which currently holds the pwm-driver and some examples. This layer also defines a new bitbake image recipe:
include recipes-core/images/core-image-base.bb
IMAGE_INSTALL += "\
helloworld \
hellokernel \
bbb-pwm \
"
KERNEL_MODULE_AUTOLOAD += "\
hellokernel \
bbb-pwm \
"
export IMAGE_BASENAME = "tfe-image-base"
Following is the .bb file of the pwm-driver:
DESCRIPTION = "PWM kernel module"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=d41d8cd98f00b204e9800998ecf8427e"
PR = "r0"
inherit module
SRC_URI = "file://bbb-pwm.c \
file://Makefile \
file://COPYING \
"
S = "${WORKDIR}"
Does anyone know how to do this?
Edit:
A colleague hinted that I could use a .bbappend file, appending to the kernel build-rules in meta-bbb. Hence this is what I did, and now my recipes-kernel directory now looks like this:
.
├── bbb-pwm
│   ├── bbb-pwm.bb
│   └── files
│   ├── bbb-pwm.c
│   ├── COPYING
│   └── Makefile
├── hellokernel
│   └── {...}
└── linux
   ├── linux-stable_4.1
│ └── {...}
   ├── linux-stable_4.1.bbappend
   ├── linux-stable_4.4
│ └── {...}
   ├── linux-stable_4.4.bbappend
   ├── linux-stable_4.5
   │   └── dts
   │   ├── bbb-pwm.dts
   │   └── sc_pwm_P8_13-00A0.dtsi
   └── linux-stable_4.5.bbappend
The directories linux-stable_4.*/ all have the same structure, to reflect the mirrored structure in meta-bbb.
My .bbappend files look like this:
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}/dts:"
KERNEL_DEVICETREE_beaglebone += " \
bbb-pwm.dtb \
"
However, when bitbaking, an error occurs saying there are no build rules for bbb-pwm.dtb:
| make[3]: *** No rule to make target 'arch/arm/boot/dts/bbb-pwm.dtb'. Stop.
| arch/arm/Makefile:333: recipe for target 'bbb-pwm.dtb' failed
Edit: Here is sc_pwm_P8_13-00A0.dtsi
When you want to use a custom device tree and edit the KERNEL_DEVICETREE variable, the device tree sources (*.dts files and *.dtsi files) are searched in arch/arm/boot/dts (according to your architecture).
In your example your files are placed in a separate folder and not fetched by the bbappend file. The correct layer structure would be following:
└── linux
├── linux-stable_4.5
│ └── git
│ └── arch
│ └── arm
│ └── boot
│ └── dts
│ ├── bbb-pwm.dts
│ └── sc_pwm_P8_13-00A0.dtsi
└── linux-stable_4.5.bbappend
To make bitbake sensible for those new files they have to be added via the SRC_URI variable in the bbappend file:
SRC_URI += "file://git/arch/arm/boot/dts/bbb-pwm.dts"
SRC_URI += "file://git/arch/arm/boot/dts/sc_pwm_P8_13-00A0.dtsi"

Gradle plugin packaging - Why is plugin unexpectedly applied?

So I have:
buildSrc/
├── build.gradle
└── src
├── main
│   ├── groovy
│   │   └── build
│   │   ├── ExamplePlugin.groovy
│   │   └── ExampleTask.groovy
│   └── resources
│   └── META-INF
│   └── gradle-plugins
│   └── build.ExamplePlugin.properties
└── test
└── groovy
└── build
├── ExamplePluginTest.groovy
└── ExampleTaskTest.groovy
Question:
It seems like build.ExamplePlugin.properties maps directly to the build.ExamplePlugin.groovy. Is this the case? Seems terribly inefficient to have only one property in the file. Does it have to be fully qualified, i.e. does the name have to exactly match the full qualification of the class?
Now in the example, I see:
project.pluginManager.apply 'build.ExamplePlugin'
...however if I have that in my test, I get an error to the effect that the simple task the plugin defines, is already defined.
Why bother with test examples that require 'apply' when that is inappropriate for packaging?

Resources