Linux - статьи


Chardev.c


Следующий пример создает устройство с именем chardev. Вы можете читать содержимое файла устройства с помощью команды cat или открывать его на чтение из программы (функцией open()). Посредством этого файла драйвер будет извещать о количестве попыток обращения к нему. Модуль не поддерживает операцию записи (типа: echo "hi" > /dev/chardev), но определяет такую попытку и сообщает пользователю о том, что операция записи не поддерживается.

Пример 4-1. chardev.c

/* * chardev.c: Создает символьное устройство, * доступное только для чтения * возвращает сообщение, с указанием количества произведенных * попыток чтения из файла устройства */

#include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <asm/uaccess.h> /* определение функции put_user */

/* * Прототипы функций, обычно их выносят в заголовочный файл (.h) */ int init_module(void); void cleanup_module(void); static int device_open(struct inode *, struct file *); static int device_release(struct inode *, struct file *); static ssize_t device_read(struct file *, char *, size_t, loff_t *); static ssize_t device_write(struct file *, const char *, size_t, loff_t *);

#define SUCCESS 0 /* Имя устройства, будет отображаться в /proc/devices */ #define DEVICE_NAME "chardev" #define BUF_LEN 80 /* Максимальная длина сообщения */

/* * Глобальные переменные, объявлены как static, * воизбежание конфликтов имен. */

/* Старший номер устройства нашего драйвера */ static int Major; /* Устройство открыто? static int Device_Open = 0; * используется для предотвращения одновременного * обращения из нескольких процессов */ /* Здесь будет собираться текст сообщения */ static char msg[BUF_LEN]; static char *msg_Ptr;

static struct file_operations fops = { .read = device_read, .write = device_write, .open = device_open, .release = device_release };

/* * Функции */

int init_module(void) { Major = register_chrdev(0, DEVICE_NAME, &fops);

if (Major < 0) { printk("Registering the character device failed with %d\n", Major); return Major; }




Начало  Назад  Вперед