Make 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 #include #include #include #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); }