From 1dd236753c1245be97d305ea8cf38807ac62965b Mon Sep 17 00:00:00 2001 From: F5OEO Date: Fri, 18 Dec 2015 08:43:06 +0000 Subject: [PATCH] Mailbox kernel compatible --- src/mailbox.c | 35 +++++++++++++++++++++++------------ src/mailbox.h | 8 +++++--- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/mailbox.c b/src/mailbox.c index a6efe07..a1d0ad7 100644 --- a/src/mailbox.c +++ b/src/mailbox.c @@ -34,6 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include "mailbox.h" @@ -246,18 +247,28 @@ unsigned execute_qpu(int file_desc, unsigned num_qpus, unsigned control, unsigne int mbox_open() { int file_desc; - // open a char device file used for communicating with kernel mbox driver - file_desc = open(VCIO_DEVICE_FILE_NAME, 0); - if (file_desc < 0) { - printf("Can't open device file: %s\n", CUSTOM_DEVICE_FILE_NAME); - printf("Try %s\n", CUSTOM_DEVICE_FILE_NAME); - file_desc = open(CUSTOM_DEVICE_FILE_NAME, 0); - if (file_desc < 0) { - printf("Can't open device file: %s\n", CUSTOM_DEVICE_FILE_NAME); - printf("Try creating a device file with: sudo mknod %s c %d 0\n", CUSTOM_DEVICE_FILE_NAME, MAJOR_NUM); - exit(-1); - } - } + // Open a char device file used for communicating with kernel mbox driver. + file_desc = open(VCIO_DEVICE_FILE_NAME, 0); + if(file_desc >= 0) { + printf("Using mbox device " VCIO_DEVICE_FILE_NAME ".\n"); + return file_desc; + } + + // Try to create one + unlink(LOCAL_DEVICE_FILE_NAME); + if(mknod(LOCAL_DEVICE_FILE_NAME, S_IFCHR|0600, makedev(MAJOR_NUM_A, 0)) >= 0 && + (file_desc = open(LOCAL_DEVICE_FILE_NAME, 0)) >= 0) { + printf("Using local mbox device file with major %d.\n", MAJOR_NUM_A); + return file_desc; + } + + unlink(LOCAL_DEVICE_FILE_NAME); + if(mknod(LOCAL_DEVICE_FILE_NAME, S_IFCHR|0600, makedev(MAJOR_NUM_B, 0)) >= 0 && + (file_desc = open(LOCAL_DEVICE_FILE_NAME, 0)) >= 0) { + printf("Using local mbox device file with major %d.\n", MAJOR_NUM_B); + return file_desc; + } + return file_desc; } diff --git a/src/mailbox.h b/src/mailbox.h index 20437f3..e76371a 100644 --- a/src/mailbox.h +++ b/src/mailbox.h @@ -26,10 +26,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include +// Newer kernels (>= 4.1) use major 249, older ones major 100. +#define MAJOR_NUM_A 249 +#define MAJOR_NUM_B 100 +#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM_B, 0, char *) -#define MAJOR_NUM 100 -#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *) -#define CUSTOM_DEVICE_FILE_NAME "/dev/rpidatv-mb" +#define LOCAL_DEVICE_FILE_NAME "/dev/rpidatv-mb" #define VCIO_DEVICE_FILE_NAME "/dev/vcio" int mbox_open();