Yocto device tree overlay - linux-kernel

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"

Related

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

devtool clones the wrong repository for recipe development

I am using krogoth and recently I have been observing that everytime I do the following:
Add a recipe
devtool add buttonflux https://github.com/shantanoo-desai/buttonflux/archive/v1.0.tar.gz
I get the a previous recipe which I worked up.
here is the recipe-tool generated recipe of the above repository:
# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)
#
# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is
# your responsibility to verify that the values are complete and correct.
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=7e8b8d2e60aca564edd8578b5f1f4951"
HOMEPAGE = "https://github.com/shantanoo-desai/bnoflux"
SUMMARY = "Extract IMU Values from BNO055 and store them in InfluxDB via UDP"
SRC_URI = "https://github.com/shantanoo-desai/buttonflux/archive/v${PV}.tar.gz"
SRC_URI[md5sum] = "1c897adf29ed058315d23d3a79f9c532"
SRC_URI[sha256sum] = "1c5611a579ee169a611fc5b401eb1aa6ad8cb4c168722df0dba7d61bb8fd2d2b"
S = "${WORKDIR}/bnoflux-${PV}"
inherit setuptools
# WARNING: the following rdepends are from setuptools install_requires. These
# upstream names may not correspond exactly to bitbake package names.
RDEPENDS_${PN} += "python-influxdb"
# WARNING: the following rdepends are determined through basic analysis of the
# python sources, and might not be 100% accurate.
RDEPENDS_${PN} += "python-argparse python-core python-logging"
# WARNING: We were unable to map the following python package/module
# dependencies to the bitbake packages which include them:
# influxdb.client
# smbus
It is worth noting the the HOMEPAGE is false and so are the SRC_URI hashes. (I want to use buttonflux and not bnoflux which was my previously worked upon recipe)
I tried reseting the recipes but this problem is still persistent.
my workspace clones also the wrong repository:
workspace/
├── appends
│   └── buttonflux_1.0.bbappend
├── attic
├── conf
│   └── layer.conf
├── README
├── recipes
│   └── buttonflux
│   └── buttonflux_1.0.bb
└── sources
└── buttonflux
├── bin
│   ├── bnoflux
│   └── calibrate
├── bnoflux
│   ├── BNO055.py
│   ├── bnoflux.py
│   ├── calibrate.py
│   └── __init__.py
├── LICENSE
├── MANIFEST.in
├── README.md
└── setup.py
even though the source is called buttonflux the code within it belongs to bnoflux repository.
I do not understand why this is happening.

Use drush-patchfile in DDEV environment

In Drupal 7 I use
drush-patchfile
to automatically implements patches when installing/updating module via drush. But in DDEV I don't know how to extend existing drush with drush-patchfile
As you can see on https://bitbucket.org/davereid/drush-patchfile section Installation, I need to clone the repository into
~/.drush
directory and that will append it to existing drush.
On another project without DDEV, I've already done that with creating new docker image file
FROM wodby/drupal-php:7.1
USER root
RUN mkdir -p /home/www-data/.drush && chown -R www-data:www-data /home/www-data/;
RUN cd /home/www-data/.drush && git clone https://bitbucket.org/davereid/drush-patchfile.git \
&& echo "<?php \$options['patch-file'] = '/home/www-data/patches/patches.make';" \
> /home/www-data/.drush/drushrc.php;
USER wodby
But I'm not sure how to do that in DDEV container.
Do I need to create a new service based on drud/ddev-webserver or something else?
I've read documentation but not sure in what direction to go.
Based on #rfay comment, here solution that works for me (and with little modification can works for other projects).
I've cloned repo outside of docker container; for example, I've cloned into
$PROJECT_ROOT/docker/drush-patchfile
Create custom drushrc.php in the $PROJECT_ROOT/.esenca/patches folder (you can choose different folder)
<?php
# Location to the patch.make file. This should be location within docker container
$options['patch-file'] = '/var/www/html/.esenca/patches/patches.make';
Add following hooks into $PROJECT_ROOT/.ddev/config.yaml
hooks:
post-start:
# Copy drush-patchfile directory into /home/.drush
- exec: "ln -s -t /home/.drush/ /var/www/html/docker/drush-patchfile"
# Copy custom drushrc file.
- exec: "ln -s -t /home/.drush/ /var/www/html/.esenca/patches/drushrc.php"
Final project structure should looks like
.
├── .ddev
│   ├── config.yaml
│   ├── docker-compose.yaml
│   ├── .gitignore
│   └── import-db
├── docker
│   ├── drush-patchfile
│   │   ├── composer.json
│   │   ├── patchfile.drush.inc
│   │   ├── README.md
│   │   └── src
├── .esenca
│   └── patches
│   ├── drushrc.php
│   └── patches.make
├── public_html
│   ├── authorize.php
│   ├── CHANGELOG.txt
│   ├── COPYRIGHT.txt
│   ├── cron.php
│   ├── includes
│   ├── index.html
│   ├── index.php
│   ├── INSTALL.mysql.txt
│   ├── INSTALL.pgsql.txt
│   ├── install.php
│   ├── INSTALL.sqlite.txt
│   ├── INSTALL.txt
│   ├── LICENSE.txt
│   ├── MAINTAINERS.txt
│   ├── misc
│   ├── modules
│   ├── profiles
│   ├── README.txt
│   ├── robots.txt
│   ├── scripts
│   ├── sites
│   │   ├── all
│   │   ├── default
│   │   ├── example.sites.php
│   │   └── README.txt
│   ├── themes
│   ├── Under-Construction.gif
│   ├── update.php
│   ├── UPGRADE.txt
│   ├── web.config
│   └── xmlrpc.php
└── README.md
At the end start ddev envronment
ddev start
and now you can use drush-patchfile commands within web docker container.
You can ddev ssh and then sudo chown -R $(id -u) ~/.drush/ and then do whwatever you want in that directory (~/.drush is /home/.drush).
When you get it going and you want to do it repetitively for every start, you can encode the instructions you need using post-start hooks: https://ddev.readthedocs.io/en/latest/users/extending-commands/
Please follow up with the exact recipe you use, as it may help others. Thanks!

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

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.

Mapping VirtualBox VMs to Vagrantfiles

How can I tell what Vagrantfile/directory is responsible for managing a given VM image in Virtualbox? I think I might have deleted projects without doing a vagrant destroy first.
I am considering you are using a Unix based OS, vagrant 1.9.6 and VirtualBox 5, because there could have some differences in other conditions.
The vagrant up command will generates a .vagrant/ folder inside the current path, there will be created some files with metadata which points to other path on your user $HOME, usually ~/.vagrant.d/.
For instance, if you execute vagrant up inside the ~/example-vm/:
Vagrant will generate the following files inside the following path:
~/example-vm/.vagrant/
├── machines
│   └── default
│   └── virtualbox
│   ├── action_provision
│   ├── action_set_name
│   ├── creator_uid
│   ├── id
│   ├── index_uuid
│   ├── private_key
│   ├── synced_folders
│   └── vagrant_cwd
└── provisioners
└── ansible
└── inventory
└── vagrant_ansible_inventory
Vagrant will generate the following files inside the path:
~/.vagrant.d/boxes/example-vm/
  └── 0
   └── virtualbox
   ├── box-disk1.vmdk
   ├── box-disk2.vmdk
   ├── box.ovf
  ├── include
   │   └── _Vagrantfile
   ├── metadata.json
   └── Vagrantfile
Then vagrant will insert on the file ~/.vagrant.d/data/machine-index/index some metadata of your VM (~/example-vm/.vagrant/machines/default/virtualbox/id and index_uuid) in order to instruct where vagrant and your provider should interact to the VM which in this case would be the .vmdk and .ovf files.
You should just edit the files .vmdk and .ovf files.

Resources