From: seantywork Date: Thu, 5 Jun 2025 12:06:49 +0000 (+0100) Subject: gpio packets X-Git-Url: https://git.feebdaed.xyz/?a=commitdiff_plain;h=55f18a3f76c1d12c99abf906b970bbaa51ae406f;p=linuxyz.git gpio packets --- diff --git a/kgpio-irqsock/kgpio_irqsk.c b/kgpio-irqsock/kgpio_irqsk.c index 5e3f081..3bea13c 100644 --- a/kgpio-irqsock/kgpio_irqsk.c +++ b/kgpio-irqsock/kgpio_irqsk.c @@ -1,161 +1,143 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define CHECK_BIT(var,pos) ((var) & (1<<(pos))) - -static DECLARE_WAIT_QUEUE_HEAD(this_wq); - -static int condition = 0; - -static struct work_struct job; - -static int gpio_ctl_o; -static int gpio_ctl_i; -static int gpio_data_o; -static int gpio_data_i; +#include "kgpio_irqsk.h" + + +DECLARE_WAIT_QUEUE_HEAD(this_wq); + +int condition = 0; + +struct work_struct job; + +int gpio_ctl_o; +int gpio_ctl_i; +int gpio_data_o; +int gpio_data_i; module_param(gpio_ctl_o, int, 0664); module_param(gpio_ctl_i, int, 0664); module_param(gpio_data_o, int, 0664); module_param(gpio_data_i, int, 0664); -static unsigned int gpio_ctl_i_irq; -static unsigned int gpio_data_i_irq; +unsigned int gpio_ctl_i_irq; +unsigned int gpio_data_i_irq; + +int comms_mode_o = 0; + +int comms_mode_i = 0; +int ctl_bits_count = 0; +int data_bits_count = 0; + +u8 o_value[MAX_PKTLEN] = {0}; +u8 i_value[MAX_PKTLEN] = {0}; + + +void gpio_ctl_on(void){ + + gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_RISING); + + udelay(512); + + gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_NONE); +} + +void gpio_data_on(void){ + + gpio_set_value(gpio_data_o, IRQF_TRIGGER_RISING); -static int comms_mode_o = 0; + udelay(512); -static int comms_mode_i = 0; -static int ctl_bits_count = 0; -static int data_bits_count = 0; + gpio_set_value(gpio_data_o, IRQF_TRIGGER_NONE); -static u8 o_value = 200; -static u8 i_value = 0; +} -static void job_handler(struct work_struct* work){ +void job_handler(struct work_struct* work){ printk(KERN_INFO "waitqueue handler: %s\n", __FUNCTION__); - for (int i = 0 ; i < 50; i++){ + for (int i = 0 ; i < 5; i++){ printk(KERN_INFO "waitqueue handler waiting for: %d...\n", i); - msleep(100); + msleep(1000); } printk(KERN_INFO "sending ctl start preamble\n"); for(int i = 0; i < 3; i++){ - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_RISING); - - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_NONE); - - udelay(512); + gpio_ctl_on(); } - gpio_set_value(gpio_data_o, IRQF_TRIGGER_RISING); + gpio_data_on(); - gpio_set_value(gpio_data_o, IRQF_TRIGGER_NONE); - - udelay(512); - for(int i = 0; i < 8; i++){ + for(int i = 0; i < MAX_PKTLEN; i++) { - if(CHECK_BIT(o_value, i)){ + for(int j = 0; j < 8; j++){ - if(!comms_mode_o){ + if(CHECK_BIT(o_value[i], j)){ - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_RISING); + if(!comms_mode_o){ - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_NONE); + gpio_ctl_on(); - comms_mode_o = 1; - } - - gpio_set_value(gpio_data_o, IRQF_TRIGGER_RISING); + comms_mode_o = 1; + } - gpio_set_value(gpio_data_o, IRQF_TRIGGER_NONE); + gpio_data_on(); + } else { - } else { + if(comms_mode_o){ + + gpio_ctl_on(); - if(comms_mode_o){ - - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_RISING); + comms_mode_o = 0; + } - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_NONE); + gpio_data_on(); - comms_mode_o = 0; } - gpio_set_value(gpio_data_o, IRQF_TRIGGER_RISING); - - gpio_set_value(gpio_data_o, IRQF_TRIGGER_NONE); - } - udelay(512); + } printk(KERN_INFO "sending ctl trailer\n"); for(int i = 0; i < 3; i++){ - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_RISING); - - gpio_set_value(gpio_ctl_o, IRQF_TRIGGER_NONE); - - udelay(512); + gpio_ctl_on(); } - - gpio_set_value(gpio_data_o, IRQF_TRIGGER_RISING); - - gpio_set_value(gpio_data_o, IRQF_TRIGGER_NONE); - - udelay(512); - - printk(KERN_INFO "up\n"); + gpio_data_on(); condition = 1; wake_up_interruptible(&this_wq); - } -static irqreturn_t gpio_ctl_irq_handler(int irq, void *dev_id) { - printk("gpio irqsk: ctl interrupt\n"); +irqreturn_t gpio_ctl_irq_handler(int irq, void *dev_id) { ctl_bits_count += 1; - printk("gpio irqsk: ctl bits count: %d\n", ctl_bits_count); - return IRQ_HANDLED; } -static irqreturn_t gpio_data_irq_handler(int irq, void *dev_id) { - printk("gpio irqsk: data interrupt\n"); +irqreturn_t gpio_data_irq_handler(int irq, void *dev_id) { + + int pktidx = 0; + int bitidx = 0; if(ctl_bits_count == 3){ ctl_bits_count = 0; if(data_bits_count == 0){ - printk("gpio irqsk: data preamble\n"); return IRQ_HANDLED; } else { - printk("gpio irqsk: data trailer\n"); // skb - printk("gpio irqsk: read result: %u\n", i_value); + if(memcmp(o_value, i_value, MAX_PKTLEN) == 0){ + printk("value matched\n"); + } else { + printk("value not matched\n"); + } data_bits_count = 0; return IRQ_HANDLED; } @@ -170,23 +152,25 @@ static irqreturn_t gpio_data_irq_handler(int irq, void *dev_id) { } } + pktidx = data_bits_count / 8; + bitidx = data_bits_count % 8; + if(comms_mode_i){ - i_value = i_value | (1 << data_bits_count); + i_value[pktidx] = i_value[pktidx] | (1 << bitidx); } else { - i_value = i_value | (0 << data_bits_count); + i_value[pktidx] = i_value[pktidx] | (0 << bitidx); } data_bits_count += 1; - printk("gpio irqsk: data bits count: %d\n", data_bits_count); return IRQ_HANDLED; } -static int __init ksock_gpio_init(void) { +int __init ksock_gpio_init(void) { if(gpio_ctl_o == 0 && gpio_ctl_i == 0){ @@ -340,7 +324,7 @@ static int __init ksock_gpio_init(void) { } -static void __exit ksock_gpio_exit(void) { +void __exit ksock_gpio_exit(void) { if(gpio_ctl_o != 0){ diff --git a/kgpio-irqsock/kgpio_irqsk.h b/kgpio-irqsock/kgpio_irqsk.h new file mode 100644 index 0000000..38c32f0 --- /dev/null +++ b/kgpio-irqsock/kgpio_irqsk.h @@ -0,0 +1,64 @@ +#ifndef _GPIO_IRQSK_H_ +#define _GPIO_IRQSK_H_ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#define CHECK_BIT(var,pos) ((var) & (1<<(pos))) + +#define MAX_PKTLEN 1500 + +extern int condition; + +extern struct work_struct job; + +extern int gpio_ctl_o; +extern int gpio_ctl_i; +extern int gpio_data_o; +extern int gpio_data_i; + +extern unsigned int gpio_ctl_i_irq; +extern unsigned int gpio_data_i_irq; + +extern int comms_mode_o; + +extern int comms_mode_i; +extern int ctl_bits_count; +extern int data_bits_count; + +extern u8 o_value[MAX_PKTLEN]; +extern u8 i_value[MAX_PKTLEN]; + + +void gpio_ctl_on(void); + +void gpio_data_on(void); + +#endif \ No newline at end of file