Читаем Linux: Полное руководство полностью

void irq_handler(int irq, void *dev_id, struct pt_regs

 *regs) {

 return;

}

int init_module() {

 // Регистрируем устройство

 printk("My module: starting...\n") ;

 Major = register_chrdev(0, DEV_NAME, &F0);

 if (Major < 0) {

  // Устройство не зарегистрировано

  printk("My module: registration failed\n");

  return Major;

 }

 printk("My module: device registered, major number = %d\n",

  Major);

 // Резервирование портов ввода-вывода

 printk("My module: allocating io ports\n");

 if (check_region(PORT_START, PORT_QTY)) {

  printk("My module: allocation io ports failed\n");

  return -EBUSY;

 }

 request_region(PORT_START, PORT_QTY, DEV_NAME);

 printk("My module: io ports allocated\n");

 // Резервирование памяти

 if (check_mem_region(MEM_START, MEM_QTY)) {

  printk(My module: memory allocation failed\n");

  release_region(PORT_START, PQRT_QTY);

  return -EBUSY;

 }

 request_mem_region(MEM_START, MEM_QTY, DEV_NAME);

 printk("My module: memory allocated\n");

 // Резервирование прерывания

 if (request_irq(IRQ_NUM, irq_handler, 0, DEV_NAME, NULL)) {

  printk("My module: IRQ allocation failed\n");

  release_mem_region(MEM_START, MEM_QTY);

  release_region(PORT_START, PORT_QTY);

  return -EBUSY;

 }

 printk("My module: IRQ allocated\n");

 return 0;

}

void cleanup_module() {

 // Освобождаем порты ввода-вывода

 release_region(PORT_START, PORT_QTY);

 printk("My module: release io ports\n");

 // Освобождаем память

 release_mem_region(MEM_START, MEM_QTY);

 printk("My module: release memory\n");

 // Освобождаем прерывание

 free_irq(IRQ_NUM, NULL);

 printk("My module: release irq\n");

 // Отменяем регистрацию устройства

 if (unregister_chrdev(Major, DEV_NAME) < 0) {

  printk("My module: cannot to unregister device\n");

 }

 printk("My module: device unregistered\n");

 return;

}

static int device_open(struct inode *inode,

 struct file *fp) {

 struct device_state *dev_state;

 printk("My module: try to open device with minor number %d\n",

  MINOR(inode->i_rdev));

 dev_state = &state[MINOR(inode->i_rdev)];

 if (dev__state->dev_open) {

  printk("Devise is busy\n");

  return -EBUSY;

 }

 dev_state->dev_open = 1;

 dev_state->byte_read = 0;

 dev_state->byte_write = 0;

 MOD_INC_USE_COUNT;

 return 0;

}

static int device_close(struct inode *inode, struct file

 *fp) {

 struct device_state *dev_state;

 printk("My module: try to close device with minor number %d\n",

  MINOR(inode->i_rdev));

 dev_state = &state[MINOR(inode->i_rdev)];

 if (!dev_state->dev_open) {

  printk("Device is not open\n");

  return 0;

 }

 dev_state->dev_open = 0;

 MOD_DEC_USE_COUNT;

 return 0;

}

Перейти на страницу:

Все книги серии Полное руководство

Похожие книги