falls jemand von euch Homematic-IP Geräte hat und ein bisschen über Zeit zum experimentieren übrig hat....
Ich habe es endlich eine mehr oder weniger funktionierende Lösung entwickelt:
1. Passende Linux Source runterladen und installieren
Code: Alles auswählen
https://www.niksula.hut.fi/~mhiienka/Rpi/linux-headers-rpi/
a) Loop Device
Code: Alles auswählen
https://raw.githubusercontent.com/eq-3/occu/master/KernelDrivers/eq3_char_loop.c
Code: Alles auswählen
obj-m += eq3_char_loop.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Code: Alles auswählen
https://raw.githubusercontent.com/eq-3/RaspberryMatic/master/linux-4.1/drivers/char/broadcom/bcm2835_raw_uart.c
suche:
Code: Alles auswählen
m_bcm2835_raw_uart_port = NULL;
printk( KERN_ERR "bcm2835_raw_uart: Unable to remove platform device\n" );
return -EFAULT;
}
Code: Alles auswählen
#include <../arch/arm/mach-bcm2709/include/mach/platform.h>
#define IRQ_ARMCTRL_START 0
#define ARM_IRQ0_BASE 64
#define INTERRUPT_UART (ARM_IRQ0_BASE + 19)
#define IRQ_UART (IRQ_ARMCTRL_START + INTERRUPT_UART)
static struct resource bcm2835_raw_uart_resources[] = {
{
.start = UART0_BASE,
.end = UART0_BASE + 0x100 - 1, /*HT: ??*/
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_UART, /*TODO: Check*/
.end = IRQ_UART,
.flags = IORESOURCE_IRQ,
}
};
static struct platform_device bcm2709_raw_uart_device = {
.name = "bcm2835-raw-uart",
.id = 0,
.resource = bcm2835_raw_uart_resources,
.num_resources = ARRAY_SIZE(bcm2835_raw_uart_resources),
};
/*!
******************************************************************************
* @brief Init function of the driver
*
* @return 0 or error
**/
static int __init bcm2835_raw_uart_init(void)
{
int ret;
ret = platform_device_register( &bcm2709_raw_uart_device );
if( ret )
{
printk(KERN_ERR "bcm2835_raw_uart: Failed to register platform driver (%i)\n", ret );
goto out;
}
ret = platform_driver_register( &m_bcm2835_raw_uart_driver );
if( ret )
{
printk(KERN_ERR "bcm2835_raw_uart: Failed to register platform driver (%i)\n", ret );
goto out;
}
return 0;
out:
return ret;
}
/*!
******************************************************************************
* @brief Exit function of the driver
*
**/
static void __exit bcm2835_raw_uart_exit(void)
{
platform_driver_unregister( &m_bcm2835_raw_uart_driver );
platform_device_unregister( &bcm2709_raw_uart_device );
}
module_init( bcm2835_raw_uart_init );
module_exit( bcm2835_raw_uart_exit );
MODULE_DESCRIPTION( "eQ-3 raw BCM2835 uart driver" );
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "eQ-3 Entwicklung GmbH" );
Code: Alles auswählen
obj-m += bcm2835_raw_uart.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Du muss die richtige Firmware hochladen auf den chip das ist nicht ccu/firmware/HM-MOD-UART/coprocessor_update.eq3 die ist nur homematic sondern occu/firmware/HM-MOD-UART/dualcopro_si1002_update_blhm.eq3
einfach die Kommentare in der fwmap ändern.
Angabe des seriellen drivers in:
occu/arm-gnueabihf/packages-eQ-3/RFD/etc/crRFD.conf
muss ich wiederhole muss Adapter.1.Port=/dev/ttyS0
und in:
occu/arm-gnueabihf/packages-eQ-3/RFD/etc/config_templates/multimacd.conf
Coprocessor Device Path = /dev/bcm2835-raw-uart nicht bcm2835-raw-uart.0
Loop Slave Device HmIP = ttyS0