Мышь
Модератор: Модераторы разделов
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Мышь
Здравствуйте
Помогите с задачей
Нужно определить координаты курсора мыши
Но
Интересует работа с устройством на низком уровне без всяких апи функций.
Делал такое раньше по виндовсом
Было все просто - заносил в регистры проца нужные данные, вызывал прерывание и все...
А тут столкнулся с проблемой
Заранее всем спасибо
Помогите с задачей
Нужно определить координаты курсора мыши
Но
Интересует работа с устройством на низком уровне без всяких апи функций.
Делал такое раньше по виндовсом
Было все просто - заносил в регистры проца нужные данные, вызывал прерывание и все...
А тут столкнулся с проблемой
Заранее всем спасибо
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
Re: Мышь
Здесь вы явно что-то недопонимаете. И в линуксе, и в винде прерывания, кроме int3, доступны _только драйверам_.
Если вы писали досовскую программу, то она в винде запускается не напрямую, а через встроенный в винду эмулятор доса (VDM, кажется, называется). Он эмулирует эти прерывания через всё те же API-функции. Получается не уменьшение, а увеличение количества прослоек: программа -> "фальшивые" прерывания -> API -> драйвера -> настоящие прерывания -> оборудование.
Если такой вариант вам подходит, пишите досовскую программу, как писали, и выполняйте в досбоксе. Будет так же, как было в винде, только вместо эмулятора "VDM" будет использоваться эмулятор "DosBox".
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
Re: Мышь
личное сообщение
На насколько низком уровне?
1) аппаратный уровень: его могут использовать только драйвера. Вы же не пишете свой драйвер? Кроме того, на этом уровне отсутствует понятие координат. Мышь отправляет лишь направление и расстояние её перемещения на коврике, её можно двигать бесконечно в любом направлении.
Драйвера, получая данные от мыши, создают /dev-файл, см. пункт 2.
2) чтение из /dev-файла: использование совершенно разное в зависимости от того, что это за мышь: usb, ps/2, com, тачпэд на ноуте, и т.д. При этом понятие координат также отсутствует.
Из /dev-файла данные обычно читает графическая подсистема: иксы, DirectFB, и т.д., смотря что у вас используется. Будем считать, что иксы - на большинстве компьютеров это так.
3) работа с графической подсистемой. Именно она вводит понятие координат курсора, и понятие курсора вообще. Если у вас запущено сразу несколько графических подсистем, использующих одну и ту же мышь, координаты курсора в них будут разные.
Работа с иксами выполняется через API xlib, через API xcb, либо через функции работы с сетью, для подключения к иксам через сокет.
4) более высокоуровневые API, преобразующие свои вызовы в вызовы xlib.
5) использование эмуляторов. Если вы запустите свою программу в эмуляторе другой операционки, будут имитироваться родные для неё средства работы с мышью, в том числе, казалось бы, низкоуровневые. "Казалось бы" - потому, что они будут прозрачно для вас транслироваться в вызовы xlib.
Всё. Других вариантов нет.
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
Пункты 1 и 2 мне подходят. Меня интересует перемещение мыши.
Мышь ЮСБ.
Есть же готовый уже драйвер) зачем свой писать? просто нужно получить величину перемещения за определенный промежуток времени.
Читать из дев думаю тоже подойдет. подскажите что почитать можно.
спасибо
Мышь ЮСБ.
Есть же готовый уже драйвер) зачем свой писать? просто нужно получить величину перемещения за определенный промежуток времени.
Читать из дев думаю тоже подойдет. подскажите что почитать можно.
спасибо
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Мышь
Посмотрите вывод
Код: Выделить всё
cat /dev/input/mouse0Потом, соответственно, можете в своей программе открыть этот файл на считывание, и, при помощи select'а "выдергивать" при манипуляциях с мышью изменения ее координат/нажатия на кнопки.
Но лучше, все-таки, делать это на более высоком уровне (используя всякие иксовые библиотеки и т.п.).
(посмотрите исходники xev, как там производится работа с мышью и клавиатурой).
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
Re: Мышь
Затем, что иначе вас не пустят к прерываниям. Любая программа, попытавшаяся вызвать прерывание (кроме int3), будет немедленно убита. Это позволяется только ядру и модулям ядра (именно их я для упрощения назвал "драйверами").
Файлы /dev/input/* (либо /dev/psaux для PS/2-мыши). Часть относится к мышам, часть к клавиатурам, часть к несуществующим устройствам. Оттуда нужно читать поток байтов. Файлы, относящиеся к оборудованию напрямую, дают железячно-специфичный вывод. Если хотите что-то единообразное, советую читать из /dev/input/event*, там формат фиксированный, обработанный ядром - последовательность структур:
Код: Выделить всё
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};Здесь time - момент времени, когда произошло событие,
type - тип события, вас интересует только тип EV_REL (все константы определены в этом файле) и EV_KEY (перемещение мыши и нажатие клавиши или кнопки соответственно), остальные события игнорируйте.
code - подтип: перемещение мыши по оси X - константа REL_X, по Y - REL_Y, нажатие/отпускание кнопки - BTN_LEFT, BTN_RIGHT, BTN_MIDDLE.
value - параметр: величина перемещения по оси либо константа 0/1 для отпускания/нажатия кнопки.
Подробный список возможных событий - в файле, ссылку на который я дал; если из названия типа/подтипа непонятно, что он означает, просто посмотрите на практике, в каких случаях оно генерируется.
Если же использовать вместо event* другие файлы, то их формат будет различаться в зависимости от типа мыши и используемого драйвера.
ВАЖНО! когда запущены иксы, доступа к этим файлам может не быть. В этом случае либо работайте в чистой консоли, либо используйте API xlib.
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
Вот если это драйвер. Не измененная версия.
а вот тут скорее всего коордтнаты
И необходимо как бы постоянно опрашивать устройство и читать эти поля. Правильно?
А на более высоком уровне не позволяют работать условия задачи.
Я про то что драйвер с нуля писать то не нужно) просто как бы немного модифицировать, или как то получать из него что то.
Кроме линукс дивайс драйверс не могу ничего найти почитать. А там ответ найти не удается(
Либо добавит в драйвер свою функцию. Но потом как можно использовать ее?
Код: Выделить всё
*
2 * Copyright (c) 1999-2001 Vojtech Pavlik
3 *
4 * USB HIDBP Mouse support
5 */
6
7 /*
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 * Should you need to contact me, the author, you can do so either by
23 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
24 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
25 */
26
27 #include <linux/kernel.h>
28 #include <linux/slab.h>
29 #include <linux/module.h>
30 #include <linux/init.h>
31 #include <linux/usb/input.h>
32 #include <linux/hid.h>
33
34 /* for apple IDs */
35 #ifdef CONFIG_USB_HID_MODULE
36 #include "../hid-ids.h"
37 #endif
38
39 /*
40 * Version Information
41 */
42 #define DRIVER_VERSION "v1.6"
43 #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
44 #define DRIVER_DESC "USB HID Boot Protocol mouse driver"
45 #define DRIVER_LICENSE "GPL"
46
47 MODULE_AUTHOR(DRIVER_AUTHOR);
48 MODULE_DESCRIPTION(DRIVER_DESC);
49 MODULE_LICENSE(DRIVER_LICENSE);
50
51 struct usb_mouse {
52 char name[128];
53 char phys[64];
54 struct usb_device *usbdev;
55 struct input_dev *dev;
56 struct urb *irq;
57
58 signed char *data;
59 dma_addr_t data_dma;
60 };
61
62 static void usb_mouse_irq(struct urb *urb)
63 {
64 struct usb_mouse *mouse = urb->context;
65 signed char *data = mouse->data;
66 struct input_dev *dev = mouse->dev;
67 int status;
68
69 switch (urb->status) {
70 case 0: /* success */
71 break;
72 case -ECONNRESET: /* unlink */
73 case -ENOENT:
74 case -ESHUTDOWN:
75 return;
76 /* -EPIPE: should clear the halt */
77 default: /* error */
78 goto resubmit;
79 }
80
81 input_report_key(dev, BTN_LEFT, data[0] & 0x01);
82 input_report_key(dev, BTN_RIGHT, data[0] & 0x02);
83 input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);
84 input_report_key(dev, BTN_SIDE, data[0] & 0x08);
85 input_report_key(dev, BTN_EXTRA, data[0] & 0x10);
86
87 input_report_rel(dev, REL_X, data[1]);
88 input_report_rel(dev, REL_Y, data[2]);
89 input_report_rel(dev, REL_WHEEL, data[3]);
90
91 input_sync(dev);
92 resubmit:
93 status = usb_submit_urb (urb, GFP_ATOMIC);
94 if (status)
95 err ("can't resubmit intr, %s-%s/input0, status %d",
96 mouse->usbdev->bus->bus_name,
97 mouse->usbdev->devpath, status);
98 }
99
100 static int usb_mouse_open(struct input_dev *dev)
101 {
102 struct usb_mouse *mouse = input_get_drvdata(dev);
103
104 mouse->irq->dev = mouse->usbdev;
105 if (usb_submit_urb(mouse->irq, GFP_KERNEL))
106 return -EIO;
107
108 return 0;
109 }
110
111 static void usb_mouse_close(struct input_dev *dev)
112 {
113 struct usb_mouse *mouse = input_get_drvdata(dev);
114
115 usb_kill_urb(mouse->irq);
116 }
117
118 static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)
119 {
120 struct usb_device *dev = interface_to_usbdev(intf);
121 struct usb_host_interface *interface;
122 struct usb_endpoint_descriptor *endpoint;
123 struct usb_mouse *mouse;
124 struct input_dev *input_dev;
125 int pipe, maxp;
126 int error = -ENOMEM;
127
128 interface = intf->cur_altsetting;
129
130 if (interface->desc.bNumEndpoints != 1)
131 return -ENODEV;
132
133 endpoint = &interface->endpoint[0].desc;
134 if (!usb_endpoint_is_int_in(endpoint))
135 return -ENODEV;
136
137 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
138 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
139
140 mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);
141 input_dev = input_allocate_device();
142 if (!mouse || !input_dev)
143 goto fail1;
144
145 mouse->data = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &mouse->data_dma);
146 if (!mouse->data)
147 goto fail1;
148
149 mouse->irq = usb_alloc_urb(0, GFP_KERNEL);
150 if (!mouse->irq)
151 goto fail2;
152
153 mouse->usbdev = dev;
154 mouse->dev = input_dev;
155
156 if (dev->manufacturer)
157 strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name));
158
159 if (dev->product) {
160 if (dev->manufacturer)
161 strlcat(mouse->name, " ", sizeof(mouse->name));
162 strlcat(mouse->name, dev->product, sizeof(mouse->name));
163 }
164
165 if (!strlen(mouse->name))
166 snprintf(mouse->name, sizeof(mouse->name),
167 "USB HIDBP Mouse %04x:%04x",
168 le16_to_cpu(dev->descriptor.idVendor),
169 le16_to_cpu(dev->descriptor.idProduct));
170
171 usb_make_path(dev, mouse->phys, sizeof(mouse->phys));
172 strlcat(mouse->phys, "/input0", sizeof(mouse->phys));
173
174 input_dev->name = mouse->name;
175 input_dev->phys = mouse->phys;
176 usb_to_input_id(dev, &input_dev->id);
177 input_dev->dev.parent = &intf->dev;
178
179 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
180 input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
181 BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
182 input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
183 input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_SIDE) |
184 BIT_MASK(BTN_EXTRA);
185 input_dev->relbit[0] |= BIT_MASK(REL_WHEEL);
186
187 input_set_drvdata(input_dev, mouse);
188
189 input_dev->open = usb_mouse_open;
190 input_dev->close = usb_mouse_close;
191
192 usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,
193 (maxp > 8 ? 8 : maxp),
194 usb_mouse_irq, mouse, endpoint->bInterval);
195 mouse->irq->transfer_dma = mouse->data_dma;
196 mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
197
198 error = input_register_device(mouse->dev);
199 if (error)
200 goto fail3;
201
202 usb_set_intfdata(intf, mouse);
203 return 0;
204
205 fail3:
206 usb_free_urb(mouse->irq);
207 fail2:
208 usb_free_coherent(dev, 8, mouse->data, mouse->data_dma);
209 fail1:
210 input_free_device(input_dev);
211 kfree(mouse);
212 return error;
213 }
214
215 static void usb_mouse_disconnect(struct usb_interface *intf)
216 {
217 struct usb_mouse *mouse = usb_get_intfdata (intf);
218
219 usb_set_intfdata(intf, NULL);
220 if (mouse) {
221 usb_kill_urb(mouse->irq);
222 input_unregister_device(mouse->dev);
223 usb_free_urb(mouse->irq);
224 usb_free_coherent(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);
225 kfree(mouse);
226 }
227 }
228
229 static struct usb_device_id usb_mouse_id_table [] = {
230 { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
231 USB_INTERFACE_PROTOCOL_MOUSE) },
232 { } /* Terminating entry */
233 };
234
235 MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);
236
237 static struct usb_driver usb_mouse_driver = {
238 .name = "usbmouse",
239 .probe = usb_mouse_probe,
240 .disconnect = usb_mouse_disconnect,
241 .id_table = usb_mouse_id_table,
242 };
243
244 static int __init usb_mouse_init(void)
245 {
246 int retval = usb_register(&usb_mouse_driver);
247 if (retval == 0)
248 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
249 DRIVER_DESC "\n");
250 return retval;
251 }
252
253 static void __exit usb_mouse_exit(void)
254 {
255 usb_deregister(&usb_mouse_driver);
256 }
257
258 module_init(usb_mouse_init);
259 module_exit(usb_mouse_exit);а вот тут скорее всего коордтнаты
Код: Выделить всё
input_report_rel(dev, REL_X, data[1]);
input_report_rel(dev, REL_Y, data[2]);И необходимо как бы постоянно опрашивать устройство и читать эти поля. Правильно?
А на более высоком уровне не позволяют работать условия задачи.
Я про то что драйвер с нуля писать то не нужно) просто как бы немного модифицировать, или как то получать из него что то.
Кроме линукс дивайс драйверс не могу ничего найти почитать. А там ответ найти не удается(
Либо добавит в драйвер свою функцию. Но потом как можно использовать ее?
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
Re: Мышь
Саму функцию? Извне? Никак. Общение с ядром производится посредством системных вызовов (либо спциализированных, либо чтения-записи в /dev-файлы). Функцию же, находящуюся в ядре, может вызвать только ядро.
Так вот через /dev-файлы из него "что-то" и получают.
-
frp
- Сообщения: 1445
- ОС: Debian Squeeze
Re: Мышь
Через устройства в /dev. А вообще, не изобретайте свои велосипеды, все уже давно придумано и без вас. Используйте готовые библиотеки. Функцию ядра напрямую вызвать нельзя.
/dev/random писал(а): ↑27.10.2010 03:52И в линуксе, и в винде прерывания, кроме int3, доступны _только драйверам_.
В linux - еще как минимум int80h - с помощью него осуществляются системные вызовы. Но к аппаратной части все равно имеет доступ только ядро.
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
Погуглил
Нужно значит написать драйвер для ЮСБ мыши на основании драйвера который уже есть usbmouse.c
И через этот драйвер нужно потом получать информацию про позицию курсора мыши
Вот тут обработчик прерываний для клавиатуры. Может можно сделать чтото похожее для мыши? где найти номера прерываний этих?
может кто то подскажет где можно посмотреть примеры кто что то такое делал?
Нужно значит написать драйвер для ЮСБ мыши на основании драйвера который уже есть usbmouse.c
И через этот драйвер нужно потом получать информацию про позицию курсора мыши
Вот тут обработчик прерываний для клавиатуры. Может можно сделать чтото похожее для мыши? где найти номера прерываний этих?
может кто то подскажет где можно посмотреть примеры кто что то такое делал?
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
Он отличаться должен возможностью передачи координат курсора (или величину изменения положения) в другую программу. наверное самым простым вариантом будет передача через файл. Но через тот файл который я укажу, не через дев маус.
Практической пользы в этом нет никакой. Просто такое задание)
Дев маус получает структуру с событиями из драйвера? как то так
Чтобы писалась не вся структура, а отдельная часть из нее. И в определенный файл. Через определенный промежуток времени.
Практической пользы в этом нет никакой. Просто такое задание)
Дев маус получает структуру с событиями из драйвера? как то так
Чтобы писалась не вся структура, а отдельная часть из нее. И в определенный файл. Через определенный промежуток времени.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Мышь
Работать с ФС в драйвере периферийного устройства просто нонсенс. Правильнее всего, а возможно еще и проще - регистрировать вашим драйвером символьное устройство, которое будет открываться клиентским приложением и из которого будут получаться данные о перемещении мышки: чтением данных напрямую из устройства или с помощью вызова ioctl (что мне кажется предпочтительнее).
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
модуль
мэйкфайл
это взято из линукс дивайс драйверс
подскажите в чем проблема
Код: Выделить всё
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);мэйкфайл
Код: Выделить всё
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endifэто взято из линукс дивайс драйверс
Код: Выделить всё
make: Цель `default' не требует выполнения команд.подскажите в чем проблема
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
-
shotdownsystem
- Сообщения: 423
- ОС: Basic command interpreter
Re: Мышь
инит/клеан модуль точно поменялось
структура юсб вроде такая.
остальное смотреть надо, переписывать все равно придется.
puts ("Working, please wait...");while(1);
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
После подключения устройства начинает использоваться нужный для него драйвер
так?
а прерывания для этого устройства может вызывать только этот драйвер или любая программа, которая работает на таком же низком уровне?
так?
а прерывания для этого устройства может вызывать только этот драйвер или любая программа, которая работает на таком же низком уровне?
-
/dev/random
- Администратор
- Сообщения: 5427
- ОС: Gentoo
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
Вот нашел статью
простой пример
обработчик прерываний
обработка IRQ 1 -- прерывание от клавиатуры на архитектуре Intel. При получении прерывания обработчик читает состояние клавиатуры (inb(0x64)) и скан-код нажатой клавиши. Затем, как только ядро сочтет возможным,выводит, через printk, код клавиши (младшие семь бит скан-кода) и признак "нажата/отпущена" (8-й бит скан-кода -- 0 или 1 соответственно).
А где посмотреть список всех прерываний? можно же будет найти в списке всех прерываний прерывание для ЮСБ мыши. вызвать его и считать состояние девайса. нажатие кнопок или положение курсора.
я правильно думаю?
простой пример
обработчик прерываний
обработка IRQ 1 -- прерывание от клавиатуры на архитектуре Intel. При получении прерывания обработчик читает состояние клавиатуры (inb(0x64)) и скан-код нажатой клавиши. Затем, как только ядро сочтет возможным,выводит, через printk, код клавиши (младшие семь бит скан-кода) и признак "нажата/отпущена" (8-й бит скан-кода -- 0 или 1 соответственно).
А где посмотреть список всех прерываний? можно же будет найти в списке всех прерываний прерывание для ЮСБ мыши. вызвать его и считать состояние девайса. нажатие кнопок или положение курсора.
я правильно думаю?
-
shotdownsystem
- Сообщения: 423
- ОС: Basic command interpreter
Re: Мышь
нет, не правильно. на процессор идет сигнал с юсби(или выполняющего его функции) контроллера.
в ядре есть файл mousedev.c, там есть структуры с x и y. Я бы начал копать оттуда.
puts ("Working, please wait...");while(1);
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
shotdownsystem писал(а): ↑25.11.2010 17:39
нет, не правильно. на процессор идет сигнал с юсби(или выполняющего его функции) контроллера.
в ядре есть файл mousedev.c, там есть структуры с x и y. Я бы начал копать оттуда.
так это для Input driver to ExplorerPS/2 device driver module.
а мышь ЮСБ
usbmouse.c
есть там
input_report_rel(dev, REL_X, data[1]);
input_report_rel(dev, REL_Y, data[2]);
вопрос
как этим можно воспользоваться?
-
shotdownsystem
- Сообщения: 423
- ОС: Basic command interpreter
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
в драйвере можно использовать каналы/очереди или еще что то? для взаимодействия с другими процессами.
-
shotdownsystem
- Сообщения: 423
- ОС: Basic command interpreter
Re: Мышь
если встраиваться в чужой драйвер, то лучше либо /proc либо в ioctl добавить команду.
традиционные механизмы как впрочем и библиотеки использовать нельзя. и помним про get_ & put_ user
puts ("Working, please wait...");while(1);
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
посмотрел пример с ioctl
в программе, которая выполняется на пользовательском уровне, вызывается функция, которая описана в драйвере. соответственно работает на низком уровне.
в драйвере есть переменная. обычным принтк ее получается выводить в файл /лог/месанес/...
а нужно просто ее передать в другую программу, которая работает не на низком уровне.
и можно про /proc немного информации? хотя бы в 2 словах
в программе, которая выполняется на пользовательском уровне, вызывается функция, которая описана в драйвере. соответственно работает на низком уровне.
в драйвере есть переменная. обычным принтк ее получается выводить в файл /лог/месанес/...
а нужно просто ее передать в другую программу, которая работает не на низком уровне.
и можно про /proc немного информации? хотя бы в 2 словах
-
shotdownsystem
- Сообщения: 423
- ОС: Basic command interpreter
Re: Мышь
rza писал(а): ↑03.01.2011 15:20посмотрел пример с ioctl
в программе, которая выполняется на пользовательском уровне, вызывается функция, которая описана в драйвере. соответственно работает на низком уровне.
в драйвере есть переменная. обычным принтк ее получается выводить в файл /лог/месанес/...
а нужно просто ее передать в другую программу, которая работает не на низком уровне.
где-то в ioctl
Код: Выделить всё
case THISDRIVER_GETMOUSEXY:
return (x<<16)|y;+добавить в макросы значение THISDRIVER_GETMOUSEXY.
http://www.ibm.com/developerworks/ru/library/l-proc/
Сам не читал, но написано вроде по делу и для 2.6
puts ("Working, please wait...");while(1);
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
это код проги которая работает на уровне юзера
а вот эту функцию я добавил в драйвер
я так понимаю при запуске программы драйвер должен писать в лог одну из 2 фраз ?
почему то не работает
компилируется без ошибок
/dev/input/mice
вот в этом не уверен
как это можно определить/проверить?
Код: Выделить всё
#include <fcntl.h>
#define CDROMEJECT 1
int main ()
{
/* Open a file descriptor to the device specified on the command line. */
int fd = open ("/dev/input/mice", O_RDONLY); //argv[1] is /dev/cdrom
ioctl (fd, CDROMEJECT);
close (fd);
return 0;
}а вот эту функцию я добавил в драйвер
Код: Выделить всё
static int device_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
switch(cmd)
{
case 1:
printk("EJECTED\n");
break;
default:
printk("IOCTL DEFAULT COMMAND EXECUTED\n");
}
return 0;
}я так понимаю при запуске программы драйвер должен писать в лог одну из 2 фраз ?
почему то не работает
компилируется без ошибок
/dev/input/mice
вот в этом не уверен
как это можно определить/проверить?
-
shotdownsystem
- Сообщения: 423
- ОС: Basic command interpreter
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Мышь
а как это сделать?
читал статью
там вроде бы ничего такого не было
читал статью
там вроде бы ничего такого не было