Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 1 / 1
Регистрация: 22.12.2019
Сообщений: 93

Не компилируется простой драйвер устройства

03.12.2020, 13:06. Показов 1466. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня есть задание

Требуется реализовать драйвер, поддерживающий функции открытия,
закрытия, записи, чтения и имеющий документацию. При записи в драйвер
могут передаваться команды. Для этого нужно проводить общий анализ
передаваемых в него строк, чтобы определять какие команды передаются.
Одна из них direction [forward/back] – направление дальнейшего чтения из
драйвера. Например последовательность команд с драйвером
echo “direction back” > /dev/chardev
cp /dev/chardev text
приведёт к чтению строки или буфера драйвера в обратном порядке, если
драйвер поддерживает работу со строками. То же для файлов.

Драйвер поддерживает чтение и запись файла в него через
пользовательский процесс: ioctl_write_file(file_desc, file_write_desc).
Поддерживает функцию удаления сообщения: ioctl_file_delete.

Ругается именно на ioctl. С Ним знаком день, поэтому не могу понять, что не так. Прошу помощи
Соответственно вот код

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#ifndef DOCUMENTATION_H
#define  DOCUMENTATION_H
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/ioctl.h>
 
#define SUCCESS 0
#define DEVICE_NAME "chardev"
#define BUF_LEN 10000
 
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 *);
int device_ioctl(struct inode *inode, struct file *file, 
    unsigned int ioctl_num, unsigned long ioctl_param);
 
 
static int Major;
static int Device_Open = 0;
static bool is_dev_opened = false;
 
#define IOCTL_SET_MSG _IOR(Major, 0, char *)
#define IOCTL_GET_MSG _IOR(Major, 1, char *)
#define IOCTL_WRITE_FILE _IOR(Major, 2, int)
#define IOCTL_DELETE _IOR(Major, 3, int)
 
static char msg[BUF_LEN];
static char *buff_Ptr;
static bool deleted = false;
static bool is_fwd_dir = true;
 
static struct file_operations fops = {
        .read = device_read,
        .write = device_write,
    .ioctl = device_ioctl,
        .open = device_open,
        .release = device_release 
};
 
 
#endif
 
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include "documentation.h"
#include "Analyse.h"
#include "Read.h"
#include "Write.h"
 
int init_module(void)
 {
    Major = register_chrdev(0, DEVICE_NAME, &fops);
    if (Major < 0)
    {
        printk(KERN_ALERT "Registering device failed with %d\n", Major);
        return Major;
    }
    printk(KERN_INFO "Major number - %d\n", Major);
    printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major);
    printk(KERN_INFO "Available commands:\n");
    printk(KERN_INFO "delete, dir back\n");
    printk(KERN_INFO "use 'rm /dev/%s'.\n\n", DEVICE_NAME);
    return SUCCESS;
}
 
void cleanup_module(void)
{
    unregister_chrdev(Major, DEVICE_NAME);
    printk(KERN_ALERT "Closing.\n\n");
}
 
static int device_open(struct inode *inode, struct file *file) 
{
    printk(KERN_INFO "device-open- %d\n", Major);
    if (is_dev_opened)
    {
        return -EBUSY;
    }
    ++Device_Open;
    is_dev_opened = true;
    buff_Ptr = msg;
    try_module_get(THIS_MODULE);
    return SUCCESS;
}
 
static  int device_release(struct inode *inode, struct file *file) 
{
    printk(KERN_INFO "device-release - %d\n", Major);
    --Device_Open;
    is_dev_opened = false;
    module_put(THIS_MODULE);
    return 0;
}
 
int device_ioctl(struct inode *inode, struct file *file, 
    unsigned int ioctl_num, unsigned long ioctl_param)
{
    int i;
    char *temp;
    char ch;
 
    switch (ioctl_num) {
case IOCTL_SET_MSG:
 
    temp = (char *)ioctl_param;
    get_user(ch, temp);
    for (i = 0; ch && i < BUF_LEN; i++, temp++)
        get_user(ch, temp);
    device_write(file, (char *)ioctl_param, i, 0);
    break;
case IOCTL_GET_MSG:
    char bufer[BUF_LEN];
    i = device_read(file, (char *)ioctl_param, 99, 0);
    put_user('\0', (char *)ioctl_param + i);
    break;
case IOCTL_WRITE_FILE:
    char tempbuf[BUF_LEN];
    i = device_read(file, tempbuf, BUF_LEN, 0);
    device_write(file, tempbuf, i, 0);
    break;
case IOCTL_DELETE:
    char buf[BUF_LEN];
    for (i = 0; i < BUF_LEN; i++)
        buf[i] = ' ';
    
    device_write(file, buf, i, 0);
    delete_content();
    }
    return 0;
}
 
//ioctl.c 
 
#include "documentation.h"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
 
ioctl_set_msg(int file_desc, char *message)
{
    int ret_val;
    ret_val = ioctl(file_desc, IOCTL_SET_MSG, message);
    if (ret_val < 0) {
        printf("ioctl_set_msg failed:%d\n", ret_val);
        exit(-1);
    }
}
 
ioctl_get_msg(int file_desc)
{
    int ret_val;
    char message[1000];
 
    ret_val = ioctl(file_desc, IOCTL_GET_MSG, message);
    if (ret_val < 0) {
        printf("ioctl_get_msg failed:%d\n", ret_val);
        exit(-1);
    }
}
 
ioctl_write_file(int file_desc, int file_write_desc)
{
    int ret_val;
    ret_val = ioctl(file_desc, IOCTL_WRITE_FILE, file_write_desc);
    if (ret_val < 0) {
        printf("ioctl_set_msg failed:%d\n", ret_val);
        exit(-1);
    }
 
}
 
ioctl_file_delete(int file_desc)
{
    int ret_val;
    ret_val = ioctl(file_desc, IOCTL_DELETE, 0);
    if (ret_val < 0) {
        printf("ioctl_set_msg failed:%d\n", ret_val);
        exit(-1);
    }
}
 
main()
{
    int file_desc1, file_desc2, ret_val;
    char *msg = "Message passed by ioctl\n";
    file_desc1= open("FIRST_FILE", 0);
    if (file_desc1 < 0) {
    printf("Can't open device file: %s\n", "FIRST_FILE");
    exit(-1);
    }
    file_desc2= open("SECOND_FILE", 0);
    if (file_desc2 < 0) {
    printf("Can't open device file: %s\n", "SECOND_FILE");
    exit(-1);
    }
    ioctl_set_msg(file_desc1, msg);
    iocle_write_file(file_desc1, file_desc2)
    iocle_file_delete(file_desc1);
    ioctl_get_msg(file_desc1);
    
    close(file_desc1);
    close(file_desc2);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2020, 13:06
Ответы с готовыми решениями:

Как разместить драйвер устройства в Диспетчере устройств в разделе Системные устройства?
Здравствуйте! Можно ли ( если да, то как ? ) отредактировать имеющийся .inf файл от драйвера некого устройства, чтобы в Диспетчере...

Нету устройства звуковые видео и игровые устройства драйвер
Здравствуйте помогите 2 день мучаюсь, у меня планшет KREXTM1004B32 3G GPS, я переустановил виндус 10, и все полетело сенсор не работает,...

Не компилируется простой код
Я понимаю, вопрос на этом форуме многократно задавался, но из всех ничто мне не помогло. Суть проблемы такова, что Visual Studio не...

1
 Аватар для peter_irich
369 / 225 / 53
Регистрация: 18.10.2017
Сообщений: 2,394
03.12.2020, 21:05
Так вы бы сообщения об ошибках привели.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2020, 21:05
Помогаю со студенческими работами здесь

Драйвер для устройства
Нужен срочно драйвер для этого устройства PCI\VEN_10EC&amp;DEV_8168&amp;SUBSYS_E0001458&amp;REV_02\4&amp;3A0400F3&amp;0&amp;00E1 помотрел понету немнго выяснил...

драйвер аудио устройства
Всем привет. Что и где мне нужно указать при разработке драйвера для того, что бы новое устройство распознавалось системой не толко как...

Драйвер USB устройства
Задача состоит в написании драйвера для флешки или USB мыши. Перечитал массу статей, начал читать книгу Уолтера Они. Пытаюсь собирать и...

Не принимается драйвер устройства
Не принимается драйвер устройства подключенного через USB. Устройство - адаптер через который параметрируется частотник от Lenze. Проблема...

не ставится драйвер звукового устройства
ос: windows 7 sp 1 motherboard: GigaBite 8I915 Duo аудиоустройство: intel...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru