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;
Поделиться:
Популярные книги
Где властвует любовь
4. Бриджертоны
Любовные романы:
исторические любовные романы
8.94
рейтинг книги
Собрание сочинений Том 10
10. Собрание сочинений в одиннадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Свидетель
Детективы:
триллеры
8.17
рейтинг книги
День вампира (сборник)
Фантастика:
социально-философская фантастика
боевая фантастика
ужасы и мистика
6.80
рейтинг книги
Гримуар темного лорда IV
4. Гримуар темного лорда
Фантастика:
фэнтези
боевая фантастика
попаданцы
аниме
6.00
рейтинг книги
Секс в кино и литературе
Научно-образовательная:
психология
6.00
рейтинг книги
Когда физики в цене
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Как это было… К истории Компартии РСФСР – КПРФ
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Газлайтер. Том 9
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Лондон
The Big Book
Проза:
историческая проза
6.67
рейтинг книги
Апокалипсис
Антология
Фантастика:
социально-философская фантастика
героическая фантастика
боевая фантастика
киберпанк
6.00
рейтинг книги
Вечный. Книга II
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Требуется волшебница. (Трилогия)
Волшебница-самозванка
Фантастика:
фэнтези
юмористическая фантастика
7.63
рейтинг книги
Выбор завоевателя
3. Завоеватели
Фантастика:
боевая фантастика
6.25