#include <linux/fs.h>
#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/workqueue.h>
+#include <linux/interrupt.h>
+
#include "kproc.h"
-static struct work_struct job;
+#define IRQ_1 1
+#define IRQ_1_DEV "irq_1_dev"
+#define IRQ_1_ID "0001"
static int dev_major;
static int device_open_counter = 0;
-static int work_done = 0;
static void show_proc_context(char* buf){
unsigned int uid;
static ssize_t device_read(struct file *filp, char *buffer, size_t len, loff_t *offset){
char tmp_msg_buffer[KPROC_BUFF_LEN] = {0};
show_proc_context(tmp_msg_buffer);
- ssize_t n = copy_to_user(buffer, tmp_msg_buffer, len);
- (*offset) += len;
+ ssize_t n = copy_to_user(buffer, tmp_msg_buffer, KPROC_BUFF_LEN);
+ (*offset) += KPROC_BUFF_LEN;
return KPROC_BUFF_LEN - n;
}
return -EINVAL;
}
-static void job_handler(struct work_struct* work){
- printk("kproc: job scheduled\n");
- char tmp_msg_buffer[KPROC_BUFF_LEN] = {0};
- while(!work_done){
- show_proc_context(tmp_msg_buffer);
- printk("kproc: job: %s\n", tmp_msg_buffer);
- memset(tmp_msg_buffer, 0, KPROC_BUFF_LEN);
- msleep(3000);
- }
- printk("kproc: job done\n");
+
+char tmp_msg_buffer[KPROC_BUFF_LEN] = {0};
+
+static irq_handler_t irq_1_handler(unsigned int irq, void* dev_id, struct pt_regs *regs){
+ show_proc_context(tmp_msg_buffer);
+ printk("kproc: isr: %s\n", tmp_msg_buffer);
+ memset(tmp_msg_buffer, 0, KPROC_BUFF_LEN);
+ return (irq_handler_t)IRQ_HANDLED;
}
+
static struct file_operations fops = {
.read = device_read,
.write = device_write,
};
static int __init kproc_init(void){
+ if (request_irq(IRQ_1, (irq_handler_t)irq_1_handler, IRQF_SHARED, IRQ_1_DEV, IRQ_1_ID) != 0){
+ printk("can't request interrupt number %d\n", IRQ_1);
+ }
dev_major = register_chrdev(0, DEVICE_NAME, &fops);
if (dev_major < 0) {
+ free_irq(IRQ_1, IRQ_1_ID);
printk(KERN_ALERT "registering char device failed with %d\n", dev_major);
return dev_major;
}
- INIT_WORK(&job, job_handler);
- schedule_work(&job);
printk("kproc: hello\n");
return 0;
}
static void __exit kproc_exit(void){
- work_done = 1;
- printk("kproc: exit: waiting 5 seconds\n");
- msleep(5000);
+ free_irq(IRQ_1, IRQ_1_ID);
unregister_chrdev(dev_major, DEVICE_NAME);
printk("kproc: bye\n");
}
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/sysmacros.h>
#include "kproc.h"
}
void* another_thread(void* varg){
+ char fbuf[1024] = {0};
+ int n = 0;
while(keepalive){
pthread_mutex_lock(&mut);
-
+ n = fread(fbuf, sizeof(char), 1024, fp);
+ printf("thread: %s\n", fbuf);
+ memset(fbuf, 0, 1024);
pthread_mutex_unlock(&mut);
sleep(1);
}
printf("devices:\n");
while(fgets(fbuf, 1024, fp)){
printf("%s", fbuf);
- if((tbuf = strstr(fbuf, "loop")) != NULL){
+ if((tbuf = strstr(fbuf, DEVICE_NAME)) != NULL){
tbuf -= 1;
*tbuf = 0;
tbuf -= 3;
- printf("target major: %s\n", tbuf);
+ sscanf(tbuf, "%d", &major);
+ printf("target major: %d\n", major);
break;
}
memset(fbuf, 0, 1024 * sizeof(char));
}
fclose(fp);
- if(result < 0){
+ if(major < 0){
printf("target not found\n");
return -1;
}
- result = -1;
+ result = mknodat(AT_FDCWD, DEVICE_NODNAME, 0666 | S_IFCHR, makedev(major, 0));
+ if(result != 0){
+ printf("mknod failed\n");
+ return -1;
+ }
signal(SIGINT, sig_hdl);
fp = fopen(DEVICE_NODNAME, "r+");
if(fp == NULL){
printf("failed to create thread\n");
return -1;
}
+ memset(fbuf, 0, 1024);
while(keepalive){
pthread_mutex_lock(&mut);
-
-
+ int n = fread(fbuf, sizeof(char), 1024, fp);
+ printf("main: %s\n", fbuf);
+ memset(fbuf, 0, 1024);
pthread_mutex_unlock(&mut);
sleep(1);
}
+ remove(DEVICE_NODNAME);
fclose(fp);
return 0;