#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <asm/current.h>
// from arch/arm/mach-bcm2708/include/mach/platform.h
#include "platform.h"
MODULE_LICENSE("GPL");
int sigtest_open(struct inode *inode,struct file *filep);
int sigtest_release(struct inode *inode,struct file *filep);
struct file_operations sigtest_fops =
{
open: sigtest_open,
release: sigtest_release
};
struct task_struct *t = NULL;
struct siginfo info;
static int sigtest_init(void)
{
if(register_chrdev(666, "sigtest", &sigtest_fops))
{
printk("<1>failed to register");
}
memset(&info
, 0, sizeof(struct siginfo
)); info.si_signo = SIGUSR1;
info.si_code = SI_QUEUE;
info.si_int = 0;
return 0;
}
static void sigtest_exit(void)
{
unregister_chrdev(666, "sigtest");
}
static irqreturn_t sigtest_interrupt(int irq, void *dev_id)
{
/*if(t != NULL)
{
send_sig_info(SIGUSR1, &info, t);
}*/
return IRQ_HANDLED;
}
int sigtest_open(struct inode *inode,struct file *filep)
{
printk("<1>sigtest signaled process changed to %d\n", current->pid);
t = current;
if(request_irq(INTERRUPT_GPIO3, sigtest_interrupt, IRQF_SHARED, "sigtest", (void *)&info) != 0)
{
printk("<1>Error Requesting IRQ\n");
}
return 0;
}
int sigtest_release(struct inode *inode,struct file *filep)
{
t = NULL;
free_irq(INTERRUPT_GPIO3, (void *)&info);
return 0;
}
module_init(sigtest_init);
module_exit(sigtest_exit);
I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L2lycS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KCi8vIGZyb20gYXJjaC9hcm0vbWFjaC1iY20yNzA4L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oCiNpbmNsdWRlICJwbGF0Zm9ybS5oIgoKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKaW50IHNpZ3Rlc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLHN0cnVjdCBmaWxlICpmaWxlcCk7CmludCBzaWd0ZXN0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSxzdHJ1Y3QgZmlsZSAqZmlsZXApOwoKc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaWd0ZXN0X2ZvcHMgPQp7CiAgICBvcGVuOiBzaWd0ZXN0X29wZW4sCiAgICByZWxlYXNlOiBzaWd0ZXN0X3JlbGVhc2UKfTsKCnN0cnVjdCB0YXNrX3N0cnVjdCAqdCA9IE5VTEw7CnN0cnVjdCBzaWdpbmZvIGluZm87CgpzdGF0aWMgaW50IHNpZ3Rlc3RfaW5pdCh2b2lkKQp7CiAgICBpZihyZWdpc3Rlcl9jaHJkZXYoNjY2LCAic2lndGVzdCIsICZzaWd0ZXN0X2ZvcHMpKQogICAgewogICAgICAgIHByaW50aygiPDE+ZmFpbGVkIHRvIHJlZ2lzdGVyIik7CiAgICB9CgogICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHNpZ2luZm8pKTsKICAgIGluZm8uc2lfc2lnbm8gPSBTSUdVU1IxOwogICAgaW5mby5zaV9jb2RlID0gU0lfUVVFVUU7CiAgICBpbmZvLnNpX2ludCA9IDA7CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHNpZ3Rlc3RfZXhpdCh2b2lkKQp7CiAgICB1bnJlZ2lzdGVyX2NocmRldig2NjYsICJzaWd0ZXN0Iik7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdCBzaWd0ZXN0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKICAgIC8qaWYodCAhPSBOVUxMKQogICAgewogICAgICAgIHNlbmRfc2lnX2luZm8oU0lHVVNSMSwgJmluZm8sIHQpOwogICAgfSovCgogICAgcmV0dXJuIElSUV9IQU5ETEVEOwp9CgppbnQgc2lndGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsc3RydWN0IGZpbGUgKmZpbGVwKQp7CiAgICBwcmludGsoIjwxPnNpZ3Rlc3Qgc2lnbmFsZWQgcHJvY2VzcyBjaGFuZ2VkIHRvICVkXG4iLCBjdXJyZW50LT5waWQpOwoKICAgIHQgPSBjdXJyZW50OwoKICAgIGlmKHJlcXVlc3RfaXJxKElOVEVSUlVQVF9HUElPMywgc2lndGVzdF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAic2lndGVzdCIsICh2b2lkICopJmluZm8pICE9IDApCiAgICB7CiAgICAgICAgcHJpbnRrKCI8MT5FcnJvciBSZXF1ZXN0aW5nIElSUVxuIik7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmludCBzaWd0ZXN0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSxzdHJ1Y3QgZmlsZSAqZmlsZXApCnsKICAgIHQgPSBOVUxMOwoKICAgIGZyZWVfaXJxKElOVEVSUlVQVF9HUElPMywgKHZvaWQgKikmaW5mbyk7CgogICAgcmV0dXJuIDA7Cn0KCm1vZHVsZV9pbml0KHNpZ3Rlc3RfaW5pdCk7Cm1vZHVsZV9leGl0KHNpZ3Rlc3RfZXhpdCk7