Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

// Имя нашего устройства

#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 dhsilabs@mail.ru");

MODULE_DESCRIPTION("Linux kernel module");

// Старший номер файла устройства

static int Major;

// Структура file_operations - пока пустая,

// но вскоре мы ее напишем

struct file_operations FO {

 open: device_open,

 release: device_close

};

// Структура для хранения состояния устройства

struct device_state {

 int dev_open; // 1 - устройство открыто, 0 — закрыто

 ssize_t byte_read; // Количество прочитанных байтов

// из устройства

 ssize_t byte_write; // Количество записанных байтов

};

// Массив для хранения информации о состоянии устройств

static struct device_state state[2];

// Обработчик прерывания

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;

Поделиться:
Популярные книги

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Первый среди равных. Книга XIII

Бор Жорж
13. Первый среди Равных
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга XIII

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Особый агент

Кулаков Сергей Федорович
Спецназ. Группа Антитеррор
Детективы:
боевики
7.00
рейтинг книги
Особый агент

Наследник

Старый Денис
1. Внук Петра
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Наследник

Помещик

Беличенко Константин
1. Помещик
Фантастика:
боевая фантастика
попаданцы
5.56
рейтинг книги
Помещик

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Лекарь Империи 8

Лиманский Александр
8. Лекарь Империи
Фантастика:
попаданцы
городское фэнтези
аниме
5.00
рейтинг книги
Лекарь Империи 8

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Гранит науки. Том 2

Зот Бакалавр
2. Героями не становятся, ими умирают
Фантастика:
фэнтези
5.00
рейтинг книги
Гранит науки. Том 2

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Двойник Короля 6

Скабер Артемий
6. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 6

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7