После регистрации драйвера устройства происходит поиск устройств данного типа. Причем этот поиск должен произвести сам модуль. Для простоты будем считать, что у нас всего два устройства. Нам нужно создать эти два устройства, предварительно вычислив старший номер устройства. Напишем модуль, который помимо регистрации устройства выводил бы его старший номер — потом мы его будем использовать при создании устройства.
Листинг 28.6. Драйвер устройства /dev/device (без структуры file_operations)
#define MODULE
#define __KERNEL__
#include
#include
#include
#include
#include
#include
// Имя нашего устройства
#define DEV_NAME "device"
// Порты ввода-вывода нашего устройства
#define PORT_START 0x2000 #define PORT_QTY 10
// Память нашего устройства
#define MEM_START 0x20000000
#define MEM_QTY 0x20
// Номер прерывания для нашего устройства
#define IRQ_NUM 9
MODULE_AUTHOR("Denis Kolisnichenko [email protected]");
MODULE_DESCRIPTION("Linux kernel module");
// Старший номер файла устройства
static int Major;
// Структура file_operations - пока пустая,
//но вскоре мы ее напишем
struct file_operations FO;
// Обработчик прерывания
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, PORT_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, PQRT_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");
// Отменяем регистрацию устройства
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии