Support for RPI-RF-MOD/HM-MOD-RPI-PCB for HomeMatic/homematicIP communication (#1266)

* add eq3_char_loop package (eQ-3 char loopback kernel module)

* add generic_raw_uart package (low-latency raw UART kernel driver)

* add rpi-rf-mod package 

* add device tree overlay support for RPI-RF-MOD/HM-MOD-RPI-PCB on Raspberry Pi

* enable GPIOLIB and GPIO_SYSFS required for RPI-RF-MOD/HM-MOD-RPI-PCB support.

* add basic RPI-RF-MOD/HM-MOD-RPI-PCB support for ASUS Tinker Board

* add device tree overlay support for ASUS Tinker Board and add
haos-config.txt loading support to U-Boot boot script
This commit is contained in:
Jens Maus 2021-04-07 15:17:41 +02:00 committed by GitHub
parent 9c6cb6e1f0
commit 0eef6473ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 343 additions and 2 deletions

View File

@ -8,3 +8,6 @@ source "$BR2_EXTERNAL_HASSOS_PATH/package/rpi-eeprom/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/rtl8812au/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/os-agent/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/udisks2/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/eq3_char_loop/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/generic_raw_uart/Config.in"
source "$BR2_EXTERNAL_HASSOS_PATH/package/rpi-rf-mod/Config.in"

View File

@ -10,6 +10,10 @@ function hassos_pre_image() {
"${BINARIES_DIR}/rk3288-tinker.dtb" \
"${BINARIES_DIR}/rk3288-tinker-s.dtb"
mkdir -p "${BOOT_DATA}/overlays"
cp "${BINARIES_DIR}"/*.dtbo "${BOOT_DATA}/overlays/"
cp "${BOARD_DIR}/boot-env.txt" "${BOOT_DATA}/haos-config.txt"
echo "console=tty1" > "${BOOT_DATA}/cmdline.txt"
# SPL

View File

@ -0,0 +1,2 @@
# Uncomment this to enable GPIO support for RPI-RF-MOD/HM-MOD-RPI-PCB
#overlays=rpi-rf-mod

View File

@ -23,14 +23,37 @@ setenv bootargs_hassos "zram.enabled=1 zram.num_devices=3 apparmor=1 security=ap
setenv bootargs_a "root=PARTUUID=8d3d53e3-6d49-4c38-8349-aff6859e82fd rootfstype=squashfs ro rootwait"
setenv bootargs_b "root=PARTUUID=a3ec664e-32ce-4665-95ea-7ae90ce9aa20 rootfstype=squashfs ro rootwait"
# Load environment from haos-config.txt
if test -e mmc ${devnum}:1 haos-config.txt; then
fatload mmc ${devnum}:1 ${ramdisk_addr_r} haos-config.txt
env import -t ${ramdisk_addr_r} ${filesize}
fi
# Load extraargs
fileenv mmc ${devnum}:1 ${ramdisk_addr_r} cmdline.txt cmdline
# Load device tree
if test "$devnum" = "0"; then
fatload mmc ${devnum}:1 ${fdt_addr_r} rk3288-tinker-s.dtb
setenv fdtfile "rk3288-tinker-s.dtb"
else
fatload mmc ${devnum}:1 ${fdt_addr_r} rk3288-tinker.dtb
setenv fdtfile "rk3288-tinker.dtb"
fi
echo "Loading standard device tree ${fdtfile}"
fatload mmc ${devnum}:1 ${fdt_addr_r} ${fdtfile}
fdt addr ${fdt_addr_r}
# load dt overlays
fdt resize 65536
for overlay_file in ${overlays}; do
if fatload mmc ${devnum}:1 ${ramdisk_addr_r} overlays/${overlay_file}.dtbo; then
echo "Applying kernel provided DT overlay ${overlay_file}.dtbo"
fdt apply ${ramdisk_addr_r} || setenv overlay_error "true"
fi
done
if test "${overlay_error}" = "true"; then
echo "Error applying DT overlays, restoring original DT"
fatload mmc ${devnum}:1 ${fdt_addr_r} ${fdtfile}
fi
setenv bootargs

View File

@ -1,2 +1,3 @@
# CONFIG_USB_STORAGE is not set
# CONFIG_DOS_PARTITION is not set
CONFIG_OF_LIBFDT_OVERLAY=y

View File

@ -60,6 +60,12 @@ kernel=u-boot.bin
# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi
# Uncomment this to enable GPIO support for RPI-RF-MOD/HM-MOD-RPI-PCB
#enable_uart=1
#dtparam=i2c_arm=on
#dtoverlay=miniuart-bt
#dtoverlay=rpi-rf-mod
# Additional overlays and parameters are documented /boot/overlays/README
# Enable audio (loads snd_bcm2835)

View File

@ -10,6 +10,7 @@ function hassos_pre_image() {
cp "${BINARIES_DIR}"/*.dtb "${BOOT_DATA}/"
cp -r "${BINARIES_DIR}/rpi-firmware/"* "${BOOT_DATA}/"
cp "${BOARD_DIR}/../boot-env.txt" "${BOOT_DATA}/config.txt"
cp "${BINARIES_DIR}"/*.dtbo "${BOOT_DATA}/overlays/"
# EEPROM update for Raspberry Pi 4/Compute Module 4
if grep -Eq "^BR2_PACKAGE_RPI_EEPROM=y$" "${BR2_CONFIG}"; then

View File

@ -114,3 +114,4 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_INTEL_E1000E=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y

View File

@ -111,3 +111,4 @@ BR2_PACKAGE_HARDKERNEL_BOOT_ODROID_C2=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RTL8812AU=y
BR2_PACKAGE_RPI_RF_MOD=y

View File

@ -109,3 +109,4 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_HARDKERNEL_BOOT=y
BR2_PACKAGE_HARDKERNEL_BOOT_ODROID_C4=y
BR2_PACKAGE_RTL8812AU=y
BR2_PACKAGE_RPI_RF_MOD=y

View File

@ -111,3 +111,4 @@ BR2_PACKAGE_HARDKERNEL_BOOT_ODROID_N2=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RTL8812AU=y
BR2_PACKAGE_RPI_RF_MOD=y

View File

@ -114,3 +114,4 @@ BR2_PACKAGE_HARDKERNEL_BOOT_ODROID_XU4=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RTL8812AU=y
BR2_PACKAGE_RPI_RF_MOD=y

View File

@ -115,3 +115,4 @@ BR2_PACKAGE_APPARMOR_PROFILES=y
BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y

View File

@ -108,3 +108,5 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_BLUETOOTH_BCM43XX=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y

View File

@ -109,3 +109,5 @@ BR2_PACKAGE_APPARMOR_PROFILES=y
BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y

View File

@ -108,3 +108,5 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_BLUETOOTH_BCM43XX=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y

View File

@ -108,3 +108,5 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_BLUETOOTH_BCM43XX=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y

View File

@ -111,3 +111,5 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_BLUETOOTH_BCM43XX=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y

View File

@ -109,3 +109,5 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_BLUETOOTH_BCM43XX=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y

View File

@ -109,3 +109,5 @@ BR2_PACKAGE_APPARMOR_PROFILES=y
BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y

View File

@ -31,6 +31,7 @@ BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_HASSOS_PATH)/kernel/hasso
BR2_LINUX_KERNEL_LZ4=y
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="rk3288-tinker rk3288-tinker-s"
BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT=y
BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
BR2_LINUX_KERNEL_NEEDS_HOST_LIBELF=y
BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL_HASSOS_PATH)/busybox.config"
@ -113,3 +114,6 @@ BR2_PACKAGE_LIBCURL_CURL=y
BR2_PACKAGE_BLUETOOTH_RTL8723=y
BR2_PACKAGE_DOSFSTOOLS=y
BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
BR2_PACKAGE_RPI_RF_MOD=y
BR2_PACKAGE_RPI_RF_MOD_DTS=y
BR2_PACKAGE_RPI_RF_MOD_DTS_TINKER=y

View File

@ -156,6 +156,10 @@ CONFIG_SND_HDA_CODEC_ANALOG=m
CONFIG_SND_HDA_CODEC_VIA=m
CONFIG_SND_HDA_CODEC_HDMI=m
# GPIO support
CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y
# Can Bus support
CONFIG_CAN=m
CONFIG_CAN_RAW=m

View File

@ -0,0 +1,4 @@
--- ./KernelDrivers/Makefile.orig 2021-04-02 17:01:07.029932165 +0200
+++ ./KernelDrivers/Makefile 2020-06-04 14:36:10.188174788 +0200
@@ -0,0 +1 @@
+obj-m += eq3_char_loop.o

View File

@ -0,0 +1,109 @@
--- ./KernelDrivers/eq3_char_loop.c.orig 2017-05-14 22:57:19.109181928 +0200
+++ ./KernelDrivers/eq3_char_loop.c 2020-06-04 14:36:10.188174788 +0200
@@ -48,8 +48,8 @@
/* Use 'L' as magic number */
#define EQ3LOOP_IOC_MAGIC 'L'
-#define EQ3LOOP_IOCSCREATESLAVE _IOW(EQ3LOOP_IOC_MAGIC, 1, unsigned long)
-#define EQ3LOOP_IOCGEVENTS _IOR(EQ3LOOP_IOC_MAGIC, 2, unsigned long)
+#define EQ3LOOP_IOCSCREATESLAVE _IOW(EQ3LOOP_IOC_MAGIC, 1, uint32_t)
+#define EQ3LOOP_IOCGEVENTS _IOR(EQ3LOOP_IOC_MAGIC, 2, uint32_t)
#define EVENT_BIT_SLAVE_OPENED 0
#define EVENT_BIT_SLAVE_CLOSED 1
@@ -62,6 +62,12 @@
#define DUMP_READWRITE 0
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0))
+ #define _access_ok(__type, __addr, __size) access_ok(__addr, __size)
+#else
+ #define _access_ok(__type, __addr, __size) access_ok(__type, __addr, __size)
+#endif
+
struct eq3loop_channel_data
{
struct circ_buf master2slave_buf;
@@ -353,7 +359,7 @@
{
ret=-EFAULT;
count_to_end = CIRC_SPACE( head, channel->master2slave_buf.tail, BUFSIZE);
- printk( KERN_ERR EQ3LOOP_DRIVER_NAME ": eq3loop_write_master() %s: not enought space in the buffers. free space = %i, required space = %i", channel->name,count_to_end,count );
+ printk( KERN_ERR EQ3LOOP_DRIVER_NAME ": eq3loop_write_master() %s: not enough space in buffers. free space = %zu, required space = %zu", channel->name,count_to_end,count );
goto out;
}
/* ok, space is free, write something */
@@ -389,7 +395,7 @@
up (&channel->sem);
if(ret < 0)
{
- printk( KERN_INFO EQ3LOOP_DRIVER_NAME ": eq3loop_write_master() retrun error:");
+ printk( KERN_INFO EQ3LOOP_DRIVER_NAME ": eq3loop_write_master() return error: %d", ret);
}
if( ret > 0 || CIRC_CNT(channel->master2slave_buf.head,channel->master2slave_buf.tail,BUFSIZE) )
{
@@ -456,9 +462,9 @@
* "write" is reversed
*/
if (_IOC_DIR(cmd) & _IOC_READ)
- ret = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));
+ ret = !_access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));
else if (_IOC_DIR(cmd) & _IOC_WRITE)
- ret = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));
+ ret = !_access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));
if (ret) return -EFAULT;
switch(cmd) {
@@ -500,7 +506,7 @@
switch(cmd) {
case TCGETS:
- if( access_ok(VERIFY_READ, (void *)arg, sizeof(struct termios) ) )
+ if( _access_ok(VERIFY_READ, (void *)arg, sizeof(struct termios) ) )
{
ret = copy_to_user( (void*)arg, &channel->termios, sizeof(struct termios) );
} else {
@@ -508,7 +514,7 @@
}
break;
case TCSETS:
- if( access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct termios) ) )
+ if( _access_ok(VERIFY_WRITE, (void *)arg, sizeof(struct termios) ) )
{
ret = copy_from_user( &channel->termios, (void*)arg, sizeof(struct termios) );
} else {
@@ -533,6 +539,12 @@
break;
case TIOCMSET:
break;
+ case TIOCSERGETLSR:
+ ret = -ENOIOCTLCMD;
+ break;
+ case TIOCGICOUNT:
+ ret = -ENOIOCTLCMD;
+ break;
default:
ret = -ENOTTY;
break;
@@ -541,6 +553,7 @@
if( ret == -ENOTTY )
{
printk( KERN_NOTICE EQ3LOOP_DRIVER_NAME ": eq3loop_ioctl_slave() %s: unhandled ioctl 0x%04X\n", channel->name, cmd );
+ ret = -ENOIOCTLCMD;
}
return ret;
}
@@ -908,6 +921,7 @@
.ioctl = eq3loop_ioctl,
#else
.unlocked_ioctl = eq3loop_ioctl,
+ .compat_ioctl = eq3loop_ioctl,
#endif
};
@@ -979,4 +993,4 @@
module_exit(eq3loop_exit);
MODULE_DESCRIPTION("eQ-3 IPC loopback char driver");
MODULE_LICENSE("GPL");
-
+MODULE_VERSION("1.1");

View File

@ -0,0 +1,2 @@
config BR2_PACKAGE_EQ3_CHAR_LOOP
bool "Support for eq3 char loop kernel module"

View File

@ -0,0 +1,18 @@
#############################################################
#
# eQ-3 char loopback kernel module for HomeMatic/homematicIP
# dual stack implementations for the RPI-RF-MOD/HM-MOD-RPI-PCB
#
# Copyright (c) 2015 by eQ-3 Entwicklung GmbH
# https://github.com/eq-3/occu/tree/master/KernelDrivers
#
#############################################################
EQ3_CHAR_LOOP_VERSION = 8cb51174c2bc8c4b33df50a96b82c90e8092f79c
EQ3_CHAR_LOOP_SITE = $(call github,eq-3,occu,$(EQ3_CHAR_LOOP_VERSION))
EQ3_CHAR_LOOP_LICENSE = GPL2
#EQ3_CHAR_LOOP_LICENSE_FILES = LICENSE
EQ3_CHAR_LOOP_MODULE_SUBDIRS = KernelDrivers
$(eval $(kernel-module))
$(eval $(generic-package))

View File

@ -0,0 +1,39 @@
--- ./kernel/Makefile.orig 2020-12-14 13:09:44.406823210 +0100
+++ ./kernel/Makefile 2021-01-14 11:37:37.524474444 +0100
@@ -1,17 +1,26 @@
-obj-m += eq3_char_loop.o
-obj-m += plat_eq3ccu2.o
+#obj-m += eq3_char_loop.o
+#obj-m += plat_eq3ccu2.o
obj-m += generic_raw_uart.o
+ifeq ($(CONFIG_ARCH_BCM2835),y)
obj-m += pl011_raw_uart.o
+endif
+ifeq ($(CONFIG_ARCH_ROCKCHIP),y)
obj-m += dw_apb_raw_uart.o
+endif
+ifeq ($(CONFIG_ARCH_MESON64_ODROIDC2),y)
obj-m += meson_raw_uart.o
-obj-m += fake_hmrf.o
+endif
+#obj-m += fake_hmrf.o
obj-m += rpi_rf_mod_led.o
obj-m += dummy_rx8130.o
-obj-m += led_trigger_timer.o
+#obj-m += led_trigger_timer.o
obj-m += hb_rf_usb.o
obj-m += hb_rf_usb-2.o
obj-m += hb_rf_eth.o
-obj-m += rtc-rx8130.o
+#obj-m += rtc-rx8130.o
+
+# disable
+ifeq (0,1)
ifeq ($(KERNELRELEASE),)
KERNELRELEASE := $(shell uname -r)
@@ -32,3 +41,4 @@
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean
+endif

View File

@ -0,0 +1,7 @@
config BR2_PACKAGE_GENERIC_RAW_UART
bool "Support for Generic RAW UART kernel module"
help
Adds support for generic-raw-uart kernel module
Alexander Reinert <alex@areinert.de>
https://github.com/alexreinert/piVCCU/tree/master/kernel

View File

@ -0,0 +1,23 @@
#############################################################
#
# Generic raw uart kernel module for low-latency uart
# communication with a RPI-RF-MOD/HM-MOD-RPI-PCB
#
# Copyright (c) 2021 Alexander Reinert
# https://github.com/alexreinert/piVCCU/tree/master/kernel
#
# Uses parts of bcm2835_raw_uart.c
# Copyright (c) 2015 eQ-3 Entwicklung GmbH
# https://github.com/eq-3/occu/tree/master/KernelDrivers
# https://github.com/jens-maus/RaspberryMatic/tree/master/buildroot-external/package/bcm2835_raw_uart
#
#############################################################
GENERIC_RAW_UART_VERSION = dab76ddd1d568cc4925dc778e43d70fccffdc0e8
GENERIC_RAW_UART_SITE = $(call github,alexreinert,piVCCU,$(GENERIC_RAW_UART_VERSION))
GENERIC_RAW_UART_LICENSE = GPL2
#GENERIC_RAW_UART_LICENSE_FILES = LICENSE
GENERIC_RAW_UART_MODULE_SUBDIRS = kernel
$(eval $(kernel-module))
$(eval $(generic-package))

View File

@ -0,0 +1,31 @@
config BR2_PACKAGE_RPI_RF_MOD
select BR2_PACKAGE_EQ3_CHAR_LOOP
select BR2_PACKAGE_GENERIC_RAW_UART
bool "Support for RPI-RF-MOD/HM-MOD-RPI-PCB GPIO HAT"
if BR2_PACKAGE_RPI_RF_MOD
config BR2_PACKAGE_RPI_RF_MOD_DTS
bool "Compile Device Tree Overlay"
if BR2_PACKAGE_RPI_RF_MOD_DTS
choice
prompt "For Target"
default BR2_PACKAGE_RPI_RF_MOD_DTS_RPI
config BR2_PACKAGE_RPI_RF_MOD_DTS_RPI
bool "RaspberryPi"
help
For the RaspberryPi
config BR2_PACKAGE_RPI_RF_MOD_DTS_TINKER
bool "ASUS Tinkerboard"
help
For the ASUS Tinkerboard
endchoice
endif
endif

View File

@ -0,0 +1,40 @@
#############################################################
#
# Meta package for RPI-RF-MOD/HM-MOD-RPI-PCB device support
# for HomeMatic/homematicIP connectivity.
#
# This includes compiling of required device tree overlays for
# selected platforms
#
# Copyright (c) 2018-2021 Jens Maus <mail@jens-maus.de>
# https://github.com/jens-maus/RaspberryMatic/tree/master/buildroot-external/package/rpi-rf-mod
#
#############################################################
RPI_RF_MOD_VERSION = 97bd31203445d14e3d97e1d6e7a0bcf93b400c2e
RPI_RF_MOD_SITE = $(call github,jens-maus,RaspberryMatic,$(RPI_RF_MOD_VERSION))
RPI_RF_MOD_LICENSE = Apache-2.0
RPI_RF_MOD_DEPENDENCIES = host-dtc
#RPI_RF_MOD_LICENSE_FILES = LICENSE
ifeq ($(BR2_PACKAGE_RPI_RF_MOD_DTS_RPI),y)
# RaspberryPi DTS file
RPI_RF_MOD_DTS_FILE = rpi-rf-mod
else ifeq ($(BR2_PACKAGE_RPI_RF_MOD_DTS_TINKER),y)
# ASUS Tinkerboard DTS file
RPI_RF_MOD_DTS_FILE = rpi-rf-mod-tinker
endif
define RPI_RF_MOD_BUILD_CMDS
if [[ -n "$(RPI_RF_MOD_DTS_FILE)" ]]; then \
$(HOST_DIR)/bin/dtc -@ -I dts -O dtb -W no-unit_address_vs_reg -o $(@D)/buildroot-external/package/rpi-rf-mod/dts/rpi-rf-mod.dtbo $(@D)/buildroot-external/package/rpi-rf-mod/dts/$(RPI_RF_MOD_DTS_FILE).dts; \
fi
endef
define RPI_RF_MOD_INSTALL_TARGET_CMDS
if [[ -n "$(RPI_RF_MOD_DTS_FILE)" ]]; then \
$(INSTALL) -D -m 0644 $(@D)/buildroot-external/package/rpi-rf-mod/dts/rpi-rf-mod.dtbo $(BINARIES_DIR)/; \
fi
endef
$(eval $(generic-package))