rendered paste bodyMake File content:
TARGET := skripsi
WARN := -W -Wall
INCLUDE:= /usr/src/kernels/2.6.18-1.2798.fc6-i586/include
#INCLUDE:= -isystem /usr/src/`uname -r`/include
CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} -I${INCLUDE}
all : skripsi.o
#${TARGET}.o : ${TARGET}.c
clean:
rm -rf *.o
The file:
#define MODULE
#include <linux/module.h>
#include <asm/uaccess.h>
#include <sys/io.h>
#include <linux/fs.h>
#define LPT_BASE 0x378
#define DEVICE_NAME "skripsi"
static int Major;
static int Device_Open = 0;
static int pattern[4] = {0x1, 0x2, 0x4, 0x8};
static int skripsi_open(struct inode *inode,struct file *filp)
{
static int counter = 0;
if(Device_Open) return -EBUSY;
printk("Opening in WR mode...\n");
Device_Open++;
MOD_INC_USE_COUNT;
return 0;
}
static int skripsi_release(struct inode *inode,struct file *filp)
{
printk("Clossing...\n");
Device_Open --;
MOD_DEC_USE_COUNT;
return 0;
}
static int skripsi_write(struct file *file, const char *buffer, size_t len, loff_t *offset)
{
char *data;
char cmd;
get_user(data,buffer);
switch (cmd=data) {
case 'L1':
printk("%d\n",pattern[1]);
break;
case 'L2':
printk("%d\n",pattern[2]);
break;
case 'L3':
printk("%d\n",pattern[3]);
break;
case 'K1':
printk("%d\n",pattern[4]);
break;
default:
break;
}
return 1;
}
static struct file_operations fops =
{
open:skripsi_open,
write:skripsi_write,
release:skripsi_release,
};
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
if (Major < 0) {
printk("<1>Registering the character device failed with %d \n",Major);
return Major;
}
printk("<1>Registered, got Major no= %d\n",Major);
return 0;
}
void cleanup_module(void)
{
printk("<1>Unregistered\n");
unregister_chrdev(Major,DEVICE_NAME);
}