All pastes #567851 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-06-15 04:17 UTC
rendered paste body
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 <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);
}