Select Git revision
VAAbstractSourceComponent.cpp
kmod.c 8.96 KiB
#include "../common/include/measurement.h"
#include <linux/cdev.h>
#include <linux/crc32.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/gpio.h>
#include <linux/hrtimer.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/uaccess.h>
#include <linux/vmalloc.h>
#define DEVICE_NAME "sibyl"
#define CLASS_NAME "sibyl_class"
#define SLOTS 4
#define SLOT_INTERVAL_NS 100000000
#define MAX_MEASUREMENTS 16
#define BAUD_RATE 9600
#define BIT_TIME_US (1000000 / BAUD_RATE)
#define GPIO_PIN 575
static int major_number;
static struct class *class = NULL;
static struct cdev mycdev;
typedef struct packet {
uint8_t magic;
data_t data;
uint32_t crc;
} packet_t;
static packet_t *packet;
static struct hrtimer timer;
static ktime_t interval;
static struct task_struct *timed_thread;
static DECLARE_WAIT_QUEUE_HEAD(wq);
static atomic_t wake_counter = ATOMIC_INIT(0);
// Send Buffers
#define SEND_BUFFER_SIZE 4096
static struct mutex send_buffer_mutex;
static uint8_t *primary_send_buffer;
static size_t primary_send_buffer_size = 0;
static uint8_t *secondary_send_buffer;
static size_t secondary_send_buffer_size = 0;
static int slot = 0;
static int device_open(struct inode *inode, struct file *file) { return 0; }
static int device_release(struct inode *inode, struct file *file) { return 0; }
static uint32_t calculate_crc32(const packet_t *packet) {
uint32_t crc = crc32(0, (void *)&packet->magic, sizeof(uint8_t));
crc = crc32(crc, (void *)&packet->data.sender_id, sizeof(uint8_t));
crc = crc32(crc, (void *)&packet->data.count, sizeof(uint8_t));
crc = crc32(crc, (void *)&packet->data.measurements,
sizeof(measurement_t) * packet->data.count);
return crc;