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:
@@ -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
|
||||
109
buildroot-external/package/eq3_char_loop/0002-version1_1.patch
Normal file
109
buildroot-external/package/eq3_char_loop/0002-version1_1.patch
Normal 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");
|
||||
2
buildroot-external/package/eq3_char_loop/Config.in
Normal file
2
buildroot-external/package/eq3_char_loop/Config.in
Normal file
@@ -0,0 +1,2 @@
|
||||
config BR2_PACKAGE_EQ3_CHAR_LOOP
|
||||
bool "Support for eq3 char loop kernel module"
|
||||
18
buildroot-external/package/eq3_char_loop/eq3_char_loop.mk
Normal file
18
buildroot-external/package/eq3_char_loop/eq3_char_loop.mk
Normal 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))
|
||||
Reference in New Issue
Block a user