Мышь

Модератор: Модераторы разделов

Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Мышь

Сообщение rza »

Здравствуйте
Помогите с задачей
Нужно определить координаты курсора мыши
Но
Интересует работа с устройством на низком уровне без всяких апи функций.
Делал такое раньше по виндовсом
Было все просто - заносил в регистры проца нужные данные, вызывал прерывание и все...
А тут столкнулся с проблемой
Заранее всем спасибо
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Мышь

Сообщение /dev/random »

rza писал(а):
25.10.2010 22:04
Делал такое раньше по виндовсом
Было все просто - заносил в регистры проца нужные данные, вызывал прерывание и все...

Здесь вы явно что-то недопонимаете. И в линуксе, и в винде прерывания, кроме int3, доступны _только драйверам_.
Если вы писали досовскую программу, то она в винде запускается не напрямую, а через встроенный в винду эмулятор доса (VDM, кажется, называется). Он эмулирует эти прерывания через всё те же API-функции. Получается не уменьшение, а увеличение количества прослоек: программа -> "фальшивые" прерывания -> API -> драйвера -> настоящие прерывания -> оборудование.
Если такой вариант вам подходит, пишите досовскую программу, как писали, и выполняйте в досбоксе. Будет так же, как было в винде, только вместо эмулятора "VDM" будет использоваться эмулятор "DosBox".
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Мышь

Сообщение /dev/random »

личное сообщение

На насколько низком уровне?
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: Мышь

Сообщение rza »

Пункты 1 и 2 мне подходят. Меня интересует перемещение мыши.
Мышь ЮСБ.
Есть же готовый уже драйвер) зачем свой писать? просто нужно получить величину перемещения за определенный промежуток времени.
Читать из дев думаю тоже подойдет. подскажите что почитать можно.
спасибо
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Мышь

Сообщение eddy »

rza писал(а):
27.10.2010 13:58
Читать из дев думаю тоже подойдет. подскажите что почитать можно.

Посмотрите вывод

Код: Выделить всё

cat /dev/input/mouse0

Потом, соответственно, можете в своей программе открыть этот файл на считывание, и, при помощи select'а "выдергивать" при манипуляциях с мышью изменения ее координат/нажатия на кнопки.
Но лучше, все-таки, делать это на более высоком уровне (используя всякие иксовые библиотеки и т.п.).

(посмотрите исходники xev, как там производится работа с мышью и клавиатурой).
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Мышь

Сообщение /dev/random »

rza писал(а):
27.10.2010 13:58
Есть же готовый уже драйвер) зачем свой писать?

Затем, что иначе вас не пустят к прерываниям. Любая программа, попытавшаяся вызвать прерывание (кроме int3), будет немедленно убита. Это позволяется только ядру и модулям ядра (именно их я для упрощения назвал "драйверами").

rza писал(а):
27.10.2010 13:58
Читать из дев думаю тоже подойдет. подскажите что почитать можно.
спасибо

Файлы /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: Мышь

Сообщение rza »

Вот если это драйвер. Не измененная версия.

Код: Выделить всё

*
  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/random »

rza писал(а):
27.10.2010 19:33
Либо добавит в драйвер свою функцию. Но потом как можно использовать ее?

Саму функцию? Извне? Никак. Общение с ядром производится посредством системных вызовов (либо спциализированных, либо чтения-записи в /dev-файлы). Функцию же, находящуюся в ядре, может вызвать только ядро.

rza писал(а):
27.10.2010 19:33
или как то получать из него что то.

Так вот через /dev-файлы из него "что-то" и получают.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Мышь

Сообщение frp »

rza писал(а):
27.10.2010 19:33
как то получать из него что то.

Через устройства в /dev. А вообще, не изобретайте свои велосипеды, все уже давно придумано и без вас. Используйте готовые библиотеки. Функцию ядра напрямую вызвать нельзя.
/dev/random писал(а):
27.10.2010 03:52
И в линуксе, и в винде прерывания, кроме int3, доступны _только драйверам_.

В linux - еще как минимум int80h - с помощью него осуществляются системные вызовы. Но к аппаратной части все равно имеет доступ только ядро.
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

Погуглил
Нужно значит написать драйвер для ЮСБ мыши на основании драйвера который уже есть usbmouse.c
И через этот драйвер нужно потом получать информацию про позицию курсора мыши

Вот тут обработчик прерываний для клавиатуры. Может можно сделать чтото похожее для мыши? где найти номера прерываний этих?

может кто то подскажет где можно посмотреть примеры кто что то такое делал?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Мышь

Сообщение /dev/random »

rza писал(а):
04.11.2010 22:21
Нужно значит написать драйвер для ЮСБ мыши на основании драйвера который уже есть usbmouse.c

Эээ... Так уже есть драйвер, что вы собираетесь делать? Чем ваш драйвер должен отличаться от имеющегося?
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

Он отличаться должен возможностью передачи координат курсора (или величину изменения положения) в другую программу. наверное самым простым вариантом будет передача через файл. Но через тот файл который я укажу, не через дев маус.
Практической пользы в этом нет никакой. Просто такое задание)
Дев маус получает структуру с событиями из драйвера? как то так
Чтобы писалась не вся структура, а отдельная часть из нее. И в определенный файл. Через определенный промежуток времени.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Мышь

Сообщение RasenHerz »

rza писал(а):
08.11.2010 20:10
наверное самым простым вариантом будет передача через файл. Но через тот файл который я укажу, не через дев маус.

Работать с ФС в драйвере периферийного устройства просто нонсенс. Правильнее всего, а возможно еще и проще - регистрировать вашим драйвером символьное устройство, которое будет открываться клиентским приложением и из которого будут получаться данные о перемещении мышки: чтением данных напрямую из устройства или с помощью вызова ioctl (что мне кажется предпочтительнее).
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

модуль

Код: Выделить всё

#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

Re: Мышь

Сообщение watashiwa_daredeska »

rza писал(а):
18.11.2010 12:21
мэйкфайл
Вы его точно привели здесь? Отступы в Makefile имеют значение.
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

поправил мэйкфал и скомпилилось. спасибо

вот нашел статью
статья
помогите разобраться
а может такое быть
что это для старого ядра,а для 2.6 он уже не подходит?
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Мышь

Сообщение shotdownsystem »

rza писал(а):
18.11.2010 15:10
поправил мэйкфал и скомпилилось. спасибо

вот нашел статью
статья
помогите разобраться
а может такое быть
что это для старого ядра,а для 2.6 он уже не подходит?

инит/клеан модуль точно поменялось
структура юсб вроде такая.
остальное смотреть надо, переписывать все равно придется.
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

После подключения устройства начинает использоваться нужный для него драйвер
так?
а прерывания для этого устройства может вызывать только этот драйвер или любая программа, которая работает на таком же низком уровне?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Мышь

Сообщение /dev/random »

rza писал(а):
25.11.2010 09:48
а прерывания для этого устройства может вызывать только этот драйвер или любая программа, которая работает на таком же низком уровне?

Любая (точнее, любой - модуль ядра), при условии, что они с легальным драйвером мешать друг другу не будут.
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

Вот нашел статью
простой пример
обработчик прерываний
обработка IRQ 1 -- прерывание от клавиатуры на архитектуре Intel. При получении прерывания обработчик читает состояние клавиатуры (inb(0x64)) и скан-код нажатой клавиши. Затем, как только ядро сочтет возможным,выводит, через printk, код клавиши (младшие семь бит скан-кода) и признак "нажата/отпущена" (8-й бит скан-кода -- 0 или 1 соответственно).

А где посмотреть список всех прерываний? можно же будет найти в списке всех прерываний прерывание для ЮСБ мыши. вызвать его и считать состояние девайса. нажатие кнопок или положение курсора.
я правильно думаю?
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Мышь

Сообщение shotdownsystem »

rza писал(а):
25.11.2010 11:38
А где посмотреть список всех прерываний? можно же будет найти в списке всех прерываний прерывание для ЮСБ мыши. вызвать его и считать состояние девайса. нажатие кнопок или положение курсора.
я правильно думаю?

нет, не правильно. на процессор идет сигнал с юсби(или выполняющего его функции) контроллера.
в ядре есть файл mousedev.c, там есть структуры с x и y. Я бы начал копать оттуда.
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

shotdownsystem писал(а):
25.11.2010 17:39
rza писал(а):
25.11.2010 11:38
А где посмотреть список всех прерываний? можно же будет найти в списке всех прерываний прерывание для ЮСБ мыши. вызвать его и считать состояние девайса. нажатие кнопок или положение курсора.
я правильно думаю?

нет, не правильно. на процессор идет сигнал с юсби(или выполняющего его функции) контроллера.
в ядре есть файл 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

Re: Мышь

Сообщение shotdownsystem »

rza писал(а):
26.11.2010 14:50
есть там
input_report_rel(dev, REL_X, data[1]);
input_report_rel(dev, REL_Y, data[2]);

вопрос
как этим можно воспользоваться?

printk ("[%i:%i]",(int)data[1],(int)data[2]); //например

puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

в драйвере можно использовать каналы/очереди или еще что то? для взаимодействия с другими процессами.
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Мышь

Сообщение shotdownsystem »

rza писал(а):
17.12.2010 22:13
в драйвере можно использовать каналы/очереди или еще что то? для взаимодействия с другими процессами.

если встраиваться в чужой драйвер, то лучше либо /proc либо в ioctl добавить команду.
традиционные механизмы как впрочем и библиотеки использовать нельзя. и помним про get_ & put_ user
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

посмотрел пример с ioctl
в программе, которая выполняется на пользовательском уровне, вызывается функция, которая описана в драйвере. соответственно работает на низком уровне.
в драйвере есть переменная. обычным принтк ее получается выводить в файл /лог/месанес/...
а нужно просто ее передать в другую программу, которая работает не на низком уровне.

и можно про /proc немного информации? хотя бы в 2 словах
Спасибо сказали:
shotdownsystem
Сообщения: 423
ОС: Basic command interpreter

Re: Мышь

Сообщение shotdownsystem »

rza писал(а):
03.01.2011 15:20
посмотрел пример с ioctl
в программе, которая выполняется на пользовательском уровне, вызывается функция, которая описана в драйвере. соответственно работает на низком уровне.
в драйвере есть переменная. обычным принтк ее получается выводить в файл /лог/месанес/...
а нужно просто ее передать в другую программу, которая работает не на низком уровне.

где-то в ioctl

Код: Выделить всё

case THISDRIVER_GETMOUSEXY:
                    return (x<<16)|y;

+добавить в макросы значение THISDRIVER_GETMOUSEXY.

rza писал(а):
03.01.2011 15:20
и можно про /proc немного информации? хотя бы в 2 словах

http://www.ibm.com/developerworks/ru/library/l-proc/

Сам не читал, но написано вроде по делу и для 2.6
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

это код проги которая работает на уровне юзера

Код: Выделить всё

#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

Re: Мышь

Сообщение shotdownsystem »

в таблицу файл_оперейшн функцию внесли?
puts ("Working, please wait...");while(1);
Спасибо сказали:
Аватара пользователя
rza
Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Мышь

Сообщение rza »

а как это сделать?

читал статью
там вроде бы ничего такого не было
Спасибо сказали: