0 / 0 / 0 Регистрация: 21.02.2013 Сообщений: 31 |
|
1 |
|
Написать драйвер для мышки05.05.2013, 17:10. Показов 18401. Ответов 25
помогите написать драйвер мыши!!
__________________
0 |
Клюг 7673 / 3188 / 382 Регистрация: 03.05.2011 Сообщений: 8,380 |
|
05.05.2013, 19:30 |
2 |
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
06.05.2013, 12:32 |
3 |
Поможем, если напишете, какой конкретно драйвер нужен и для чего.
0 |
0 / 0 / 0 Регистрация: 21.02.2013 Сообщений: 31 |
|
07.05.2013, 15:29 [ТС] |
4 |
надо чтобы был
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
07.05.2013, 15:40 |
5 |
А хоть какой-то опыт написания драйверов есть ?
0 |
Модератор 8773 / 6561 / 889 Регистрация: 14.02.2011 Сообщений: 23,018 |
|
07.05.2013, 15:43 |
6 |
надо чтобы был А система какая?
0 |
0 / 0 / 0 Регистрация: 21.02.2013 Сообщений: 31 |
|
07.05.2013, 15:58 [ТС] |
7 |
опыта нет. Мишь usb!
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
07.05.2013, 16:13 |
8 |
Вот в этой теме я выкладывал список полезной литературы по системному
0 |
1 / 1 / 0 Регистрация: 08.09.2013 Сообщений: 9 |
|
08.09.2013, 00:51 |
9 |
Убежденный,
0 |
Модератор 8773 / 6561 / 889 Регистрация: 14.02.2011 Сообщений: 23,018 |
|
08.09.2013, 00:57 |
10 |
Например, надо чтобы мышка возвращала свои координаты в таблицу при ее перемещении на несколько метров. Хотя бы на 1 метр. интересно у тебя провода хватит
0 |
637 / 415 / 27 Регистрация: 03.11.2009 Сообщений: 1,855 |
|
08.09.2013, 01:18 |
11 |
надо чтобы мышка возвращала свои координаты в таблицу при ее перемещении на несколько метров. почитайте устройство мышки, она никак не сможет вернуть вам метры
0 |
Модератор 8773 / 6561 / 889 Регистрация: 14.02.2011 Сообщений: 23,018 |
|
08.09.2013, 01:22 |
12 |
почитайте устройство мышки, она никак не сможет вернуть вам метры а что она возвращает? миллиметры?
0 |
1 / 1 / 0 Регистрация: 08.09.2013 Сообщений: 9 |
|
08.09.2013, 08:22 |
13 |
интересно у тебя провода хватит ХР самая обычная. Мышка при этом будет выполнять роль учебного прибора, а не обычной мышки.. я надеюсь, что мне удастся довести это до конца и что я не ошибаюсь…
0 |
Клюг 7673 / 3188 / 382 Регистрация: 03.05.2011 Сообщений: 8,380 |
|
08.09.2013, 08:48 |
14 |
В DriverStudio есть примеры и вообще много вкусняшек. Код http://exelab.ru/download.php?action=get&n=NTc1
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
08.09.2013, 09:32 |
15 |
Мне надо бы мышку обуздать и заставить ее работать в несвойственном режиме. Например, надо чтобы мышка возвращала свои координаты в таблицу при ее перемещении на несколько метров. Хотя бы на 1 метр. И при этом желательно, чтобы курсор перемещался только в пределах экрана. Хотя это может и не так существенно… Повесить фильтр над драйвером класса мыши (mouclass.sys) и обрабатывать результаты
0 |
1 / 1 / 0 Регистрация: 08.09.2013 Сообщений: 9 |
|
08.09.2013, 11:20 |
16 |
почитайте устройство мышки, она никак не сможет вернуть вам метры В каком смысле «не сможет вернуть метры»? У меня уже есть программка, которая это делает при перемещении мышки на 40-50 см и при этом курсор перемещается в пределах экрана. Но ее автор пропал, а там надо еще поработать… Добавлено через 2 минуты
В DriverStudio есть примеры и вообще много вкусняшек. Код http://exelab.ru/download.php?action=get&n=NTc1 Дело в том, что я совсем не программист…
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
08.09.2013, 11:21 |
17 |
Мышь не работает с физическими единицами измерения длины, она
1 |
1 / 1 / 0 Регистрация: 08.09.2013 Сообщений: 9 |
|
08.09.2013, 11:25 |
18 |
Повесить фильтр над драйвером класса мыши (mouclass.sys) и обрабатывать результаты «Делов-то» Тем более интересно. Не согласились бы Вы пообщаться более подробно и длительно? Добавлено через 3 минуты
Мышь не работает с физическими единицами измерения длины, она Вот консультации на эту тему мне и нужны для того, чтобы сделать (в случае успеха) обучение некоторых разделов школьной физики легким и интересным.. Требованиями к точность воспроизведения координат возможно можно немного пожертвовать…
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
08.09.2013, 11:34 |
19 |
Ок, задавайте конкретные вопросы. Форум ведь для того и нужен.
1 |
1 / 1 / 0 Регистрация: 08.09.2013 Сообщений: 9 |
|
08.09.2013, 11:40 |
20 |
Ок, задавайте конкретные вопросы. Форум ведь для того и нужен. Но вопросов много, появляются они постепенно и они будут от «чайника».. Скорее всего здесь предстоит немало работы после того, как будет показано, что это в принципе реально..
0 |
Урок 3. Сборка и запуск драйвера
Еще один, особый, вид программ – драйверы. В отличие от остальных – выполняются в особом режиме, где они имеют ряд возможностей, недоступных для обычных приложений Windows. Однако это осложняется тем, что в этом режиме практически отсутствуют средства для взаимодействия с пользователем. Для тестирования драйвера можно пользоваться функцией DbgPrint, выдающей отладочные сообщения отладчику. Но отладчика может не оказаться и этих сообщений никто в таком случае не увидит. Для обычного же взаимодействия с пользователем драйвер должен полагаться на прикладные приложения, обмениваясь с ними запросами ввода/вывода.
Сообщения, выдаваемые отладчику, проще всего увидеть при помощи программы DebugView, которую нужно запустить перед сеансом проверки.
Создание проекта будем вести следующим образом. Создаем папку DrvHello, где будем разрабатывать приложение-драйвер. Внутри нее создаем такие файлы:
• makefile
# # DO NOT EDIT THIS FILE!!! Edit .sources. if you want to add a new source # file to this component. This file merely indirects to the real make file # that is shared by all the driver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV)makefile.def
Над текстом этого файла не следует задумываться, он просто должен присутствовать в таком вот неизменном виде. Хотя в чужих проектах этого файла может и не быть, либо он будет работать другим образом. В общем, если он есть и содержит это содержимое – то все в порядке, если нет – необходимы дополнительные исследования.
• sources
TARGETNAME=drvhello TARGETTYPE=DRIVER TARGETPATH=obj SOURCES=main.c
Задает параметры сборки. Здесь в параметре SOURCES необходимо перечислить через пробел все файлы с исходным кодом, которые нужно будет скомпилировать.
• main.c – это наш файл с исходным кодом. Может носить любое имя, их может быть много, а может быть очень много. Главное, не забыть их все перечислить в файле sources
#include "ntddk.h" #pragma code_seg("INIT") NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { DbgPrint("Hello, world!"); // Выдача отладочного сообщения return STATUS_DEVICE_CONFIGURATION_ERROR; // Выдача ошибки заставит систему сразу же выгрузить драйвер } #pragma code_seg()
Основная функция у нас здесь носит название DriverEntry. Запускаться она будет при попытке загрузки драйвера. А чтобы сделать такую попытку – нужна программа-загрузчик, которую напишем чуть поздней.
Откомпилируем драйвер. Чтобы мы могли что-то увидеть в отладчике, драйвер должен быть собран в отладочном режиме. Напомню, что отладочный режим у программистов драйверов называется checked, а финальный — free (прикладные программисты так не заморачиваются и называют их debug и release соответственно). В этом режиме программный код не оптимизируется и исполняемый файл содержит много избыточной информации, совершенно не нужной для работы, но очень полезной при изучении того, что будет делать этот код.
Для сборки открываем меню Start, затем Programs/Windows Driver Kits/WDK <номер версии>/Build Environment/Windows Server 2003 (или Windows XP)/ x86 Checked Build Environment. Щелкаем и попадаем в консольное окно. Если FAR был добавлен в PATH, то можно набрать far и перейти в директорию проекта обычным способом, иначе туда придется добираться используя команду cd (и может быть смену диска). Когда добрались до папки DrvHello (там где лежат три файла, которые были созданы выше) – набираем команду nmake. Если сборка прошла без ошибок, то будет созданы директории objchk_wnet_x86/i386, а в ней уже можно обнаружить файл drvhello.sys. Это и есть наш собранный драйвер.
Теперь вернемся к загрузчику. Это у нас будет консольное приложение (см. главу 1). Имя я ему дал DrvHelloloader и разместил, как всегда, в c:Projects. Имя файла с исходным кодом такое же – main.c, содержимое:
#include <windows.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") void main(int argc, char* argv[]) { char serviceName[] = "drvhello"; char driverBinary[MAX_PATH] = ""; SC_HANDLE hSc; SC_HANDLE hService; // Чтобы запустить драйвер, потребуется полный путь к нему // Предполагаем, что он лежит в той же папке, что и экзешник strcpy(driverBinary, argv[0]); // argv[0] - здесь будет имя экзешника с полным путем PathRemoveFileSpec(driverBinary); // Выкидываем имя экзешника, остается только путь к папке strcat(driverBinary, "\drvhello.sys"); // Добавляем имя драйвера. // Бэкслэш в строках Си надо удваивать, из-за его специального значения. hSc = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); // Открываем SCM (Service Control Management) // Это такая штука, которая позволяет запускать драйверы // из пользовательского режима CreateService(hSc, serviceName, serviceName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, driverBinary, NULL, NULL, NULL, NULL, NULL); // Загрузка в 3 этапа - создаем службу hService = OpenService(hSc, serviceName, SERVICE_ALL_ACCESS); // Открываем ее StartService(hService, 0, NULL); // И запускаем. Вообще-то было бы неплохо // еще и закрыть ее... Как нибудь потом. }
Выбираем в меню cтудии – Build/Rebuild Solution. Произойдет пересборка проекта без запуска. В принципе, можно и запустить. Находим экзешник в папке проекта, докидываем в ту же папку drvhello.sys. Далее запускаем DebugView, включаем галочку Capture/Capture Kernel, как показано на рисунке:
Рис. 3.1 – Настройка DebugView
Теперь запускаем программу. Если все прошло успешно – видим следующую картину:
Рис. 3.2 – Проверка драйвера
Вот такой простой код позволяет уже очень много – работать на уровне ядра. Но следует помнить, что если допустить ошибку в прикладной программе – упадет она одна; если в драйвере – вся система. К примеру, если в код драйвера перед DbgPrint добавить строку:
int a = *((int *)0);
которая делает попытку прочесть содержимое памяти по нулевому адресу – то картинка будет уже иной:
Рис. 3.3 – Попытка чтения из нулевого адреса
Если бы это был не драйвер, а просто программа пользовательского режима, то при выполнении этого кода она бы просто закрылась, выдав ошибку:
Рис. 3.4 – Та же ошибка в программе пользовательского режима
Till now we have seen only static output on the black window in C/C++ without any peripheral device interaction(like mouse). Here static means that interaction with the output screen through the mouse to run a dynamic event or task. The goal will be to make the pointer of the mouse visible on our output screen, through which it can see any new event when the mouse is clicked on the same output window.
Requirement: Turbo C++ IDE or DOS BOX
Fundamental Knowledge:
The idea is to tell a mouse to do anything on the output screen. In actual the communication with the mouse directly is not possible but through the driver provided. The idea is to use interrupts to get access to this driver. Each device provided by a computer has a unique port which is a hexadecimal value that is designed to be machine-independent enhancing the portability of the program. Mouse has port 0X33 attached to it. Use of address registers is also required to access these port. These are basically UNION of type REGS defined in “dos.h“. Use two registers to communicate to a device driver one for input and one for output and send value to device driver through the input register and receive information in it embedded in the output register.
Now there are two ways to display mouse pointer on C/C++ screen. First is the non-graphic mode and the second is Graphic mode, Here we use graphic mode. To switch our output window in Graphic mode steps are listed below:
Enable Graphic mode: For enabling the graphics mode use initgraph() function which is used to initialize the graphics mode. This function is present in “graphics.h“ header file.
Syntax of initgraph():
void initgraph(int *gdriver, int *gmode, char *pathtodriver);
- gdriver: It is an integer that specifies which graphics driver is to be used. Use DETECT it means compiler auto select the suitable driver according to requirement.
- gmode: It is also an integer that specifies the initial graphics mode. when gdriver = DETECT In this case, initgraph() sets gmode to the highest resolution available for the detected driver.
- pathtodriver: It denotes the directory path where initgraph must look for graphic drivers.
Program 1:
C
#include <conio.h>
#include <graphics.h>
int
main()
{
int
gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode,
"C:\TC\BGI"
);
errorcode = graphresult();
if
(errorcode == grOk)
printf
(
"Graphics enabled: %sn"
,
grapherrormsg(errorcode));
else
printf
(
"Graphics error: %sn"
,
grapherrormsg(errorcode));
getch();
closegraph();
return
0;
}
C++
#include <bits/stdc++.h>
#include <conio.h>
#include <graphics.h>
int
main()
{
int
gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode,
"C:\TC\BGI"
);
errorcode = graphresult();
if
(errorcode == grOk)
cout <<
"Graphics enabled: n"
<< grapherrormsg(errorcode);
else
cout <<
"Graphics error: n"
<< grapherrormsg(errorcode);
getch();
closegraph();
return
0;
}
Output:
Prerequisite for Mouse Programming:
AX Register: The various mouse functions can be access using different values of AX input Register and passing those values to mouse port using an interrupt. Functions are listed below in the table:
Here AX, BX, CX, and DX are members of UNION REGS.
Interrupt | Service | Description |
0X33 OR 51 |
0 |
|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
7 |
|
|
8 |
|
int86() function: The int86() is a C library function that facilitates access to bare bone DOS and BIOS service interrupts. It is a wrapper over inline assembly interrupt call. It takes CPU register values with object to a structure where member variables are equivalent to CPU registers. It takes three arguments.
// Declaration syntax
int int86(int intno, union REGS* inregs, union REGS* outregs);
// intno – Interrupt vector /service number
// inregs – Input argument registers as REGS
// outregs – Output argument registers as REGS
Use Cases of Mouse Programming:
There are various use cases of the Mouse Programming that are listed below:
- Detecting Mouse
- Display mouse pointer in graphics mode
- Hide pointer
- Determine Current position
- Identified which mouse button is clicked
- Restrict mouse pointer
- Free hand drawing (Use of all function)
Program 2:
Below is the program to check if a mouse driver is loaded or not:
C
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdio.h>
union
REGS in, out;
void
detectMouse()
{
in.x.ax = 0;
int86(0X33, &in, &out);
if
(out.x.ax == 0)
printf
(
"nMouse Failed To Initialize"
);
else
printf
(
"nMouse was Successfully Initialized"
);
}
int
main()
{
clrscr();
int
gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode,
"c:tcbgi"
);
detectMouse();
getch();
closegraph();
return
0;
}
C++
#include <bits/stdc++.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdio.h>
union
REGS in, out;
void
detectMouse()
{
in.x.ax = 0;
int86(0X33, &in, &out);
if
(out.x.ax == 0)
cout <<
"nMouse Failed To"
<<
" Initialize"
;
else
cout <<
"nMouse was Successfully"
<<
" Initialized"
;
}
int
main()
{
clrscr();
int
gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode,
"c:tcbgi"
);
detectMouse();
getch();
closegraph();
return
0;
}
Output:
Till now we have seen only static output on the black window in C/C++ without any peripheral device interaction(like mouse). Here static means that interaction with the output screen through the mouse to run a dynamic event or task. The goal will be to make the pointer of the mouse visible on our output screen, through which it can see any new event when the mouse is clicked on the same output window.
Requirement: Turbo C++ IDE or DOS BOX
Fundamental Knowledge:
The idea is to tell a mouse to do anything on the output screen. In actual the communication with the mouse directly is not possible but through the driver provided. The idea is to use interrupts to get access to this driver. Each device provided by a computer has a unique port which is a hexadecimal value that is designed to be machine-independent enhancing the portability of the program. Mouse has port 0X33 attached to it. Use of address registers is also required to access these port. These are basically UNION of type REGS defined in “dos.h“. Use two registers to communicate to a device driver one for input and one for output and send value to device driver through the input register and receive information in it embedded in the output register.
Now there are two ways to display mouse pointer on C/C++ screen. First is the non-graphic mode and the second is Graphic mode, Here we use graphic mode. To switch our output window in Graphic mode steps are listed below:
Enable Graphic mode: For enabling the graphics mode use initgraph() function which is used to initialize the graphics mode. This function is present in “graphics.h“ header file.
Syntax of initgraph():
void initgraph(int *gdriver, int *gmode, char *pathtodriver);
- gdriver: It is an integer that specifies which graphics driver is to be used. Use DETECT it means compiler auto select the suitable driver according to requirement.
- gmode: It is also an integer that specifies the initial graphics mode. when gdriver = DETECT In this case, initgraph() sets gmode to the highest resolution available for the detected driver.
- pathtodriver: It denotes the directory path where initgraph must look for graphic drivers.
Program 1:
C
#include <conio.h>
#include <graphics.h>
int
main()
{
int
gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode,
"C:\TC\BGI"
);
errorcode = graphresult();
if
(errorcode == grOk)
printf
(
"Graphics enabled: %sn"
,
grapherrormsg(errorcode));
else
printf
(
"Graphics error: %sn"
,
grapherrormsg(errorcode));
getch();
closegraph();
return
0;
}
C++
#include <bits/stdc++.h>
#include <conio.h>
#include <graphics.h>
int
main()
{
int
gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode,
"C:\TC\BGI"
);
errorcode = graphresult();
if
(errorcode == grOk)
cout <<
"Graphics enabled: n"
<< grapherrormsg(errorcode);
else
cout <<
"Graphics error: n"
<< grapherrormsg(errorcode);
getch();
closegraph();
return
0;
}
Output:
Prerequisite for Mouse Programming:
AX Register: The various mouse functions can be access using different values of AX input Register and passing those values to mouse port using an interrupt. Functions are listed below in the table:
Here AX, BX, CX, and DX are members of UNION REGS.
Interrupt | Service | Description |
0X33 OR 51 |
0 |
|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
7 |
|
|
8 |
|
int86() function: The int86() is a C library function that facilitates access to bare bone DOS and BIOS service interrupts. It is a wrapper over inline assembly interrupt call. It takes CPU register values with object to a structure where member variables are equivalent to CPU registers. It takes three arguments.
// Declaration syntax
int int86(int intno, union REGS* inregs, union REGS* outregs);
// intno – Interrupt vector /service number
// inregs – Input argument registers as REGS
// outregs – Output argument registers as REGS
Use Cases of Mouse Programming:
There are various use cases of the Mouse Programming that are listed below:
- Detecting Mouse
- Display mouse pointer in graphics mode
- Hide pointer
- Determine Current position
- Identified which mouse button is clicked
- Restrict mouse pointer
- Free hand drawing (Use of all function)
Program 2:
Below is the program to check if a mouse driver is loaded or not:
C
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdio.h>
union
REGS in, out;
void
detectMouse()
{
in.x.ax = 0;
int86(0X33, &in, &out);
if
(out.x.ax == 0)
printf
(
"nMouse Failed To Initialize"
);
else
printf
(
"nMouse was Successfully Initialized"
);
}
int
main()
{
clrscr();
int
gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode,
"c:tcbgi"
);
detectMouse();
getch();
closegraph();
return
0;
}
C++
#include <bits/stdc++.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdio.h>
union
REGS in, out;
void
detectMouse()
{
in.x.ax = 0;
int86(0X33, &in, &out);
if
(out.x.ax == 0)
cout <<
"nMouse Failed To"
<<
" Initialize"
;
else
cout <<
"nMouse was Successfully"
<<
" Initialized"
;
}
int
main()
{
clrscr();
int
gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode,
"c:tcbgi"
);
detectMouse();
getch();
closegraph();
return
0;
}
Output:
Как написать драйвер для мышки? И где в ядре находится
Модератор: Модераторы разделов
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
- Контактная информация:
Re: Как написать драйвер для мышки? И где в ядре находится
Сообщение
Portnov » 27.04.2009 09:57
1. Роберт Лав, ‘Разработка ядра Linux’; Он же, ‘Системное программирование для Linux’ (эти две есть по-русски). «Linux Device Drivers» (http://lwn.net/Kernel/LDD3/).
2. Для ps/2 — drivers/input/mouse/. Для usb, насколько я понял — drivers/hid/usbhid/.
-
Denjs
- Сообщения: 1685
- ОС: SuSe 10.2
Re: Как написать драйвер для мышки? И где в ядре находится
Сообщение
Denjs » 27.04.2009 10:19
DaemonTux писал(а): ↑
27.04.2009 07:57
nofelet писал(а): ↑
27.04.2009 02:08
1. Как писать драйвера для линукс? С чего начать ? Литература?
2. В какой папке в ядре находится исходники дров для мышки ?
Для чего вам писать свой драйвер?
ну, например, мне не помешал-бы драйвер для «Genius NewSketch 1212 HR II» паншета )))
просто валяется без дела уже несколько лет, а выбрасывать жалко…
QDroid — Среда исполнения и фреймворк для QtScript.
OTPD — Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
-
Stauffenberg
- Сообщения: 2028
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: Как написать драйвер для мышки? И где в ядре находится
Сообщение
Stauffenberg » 27.04.2009 12:46
nofelet писал(а): ↑
27.04.2009 02:08
1. Как писать драйвера для линукс? С чего начать ? Литература?
Я сейчас тоже решил поиграться с ядром. Но я пишу драйвер клавиатуры (: Могу посоветовать:
* http://kernelnewbies.org/
* Essential Linux Device Driver — в книге и основы работы мышек и примеры кода. Очень хорошая книга для тех, кто хочет научиться писать модули ядра (драйвера).
nofelet писал(а): ↑
27.04.2009 02:08
2. В какой папке в ядре находится исходники дров для мышки ?
/usr/src/linux/drivers/input/serio/i8042.c
драйвер контроллера i8042
Labor omnia vincit
«Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
-
rza
- Сообщения: 105
- ОС: Linux Mint 11 Katya
Re: Как написать драйвер для мышки? И где в ядре находится
Сообщение
rza » 23.10.2010 00: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
260
usbmouse.c
подскажите пожалуйста как отсюда получить координаты курсора?
input_report_rel(dev, REL_X, data[1]);
input_report_rel(dev, REL_Y, data[2]);
-
Helmik
- Сообщения: 9
- ОС: openSUSE
- Контактная информация:
Re: Как написать драйвер для мышки? И где в ядре находится
Сообщение
Helmik » 23.01.2011 21:16
rza писал(а): ↑
23.10.2010 00: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 260
usbmouse.c
подскажите пожалуйста как отсюда получить координаты курсора?
input_report_rel(dev, REL_X, data[1]);
input_report_rel(dev, REL_Y, data[2]);
Смещение по оси X находится в data[1], по Y: в data[2].
Можете вставить printk(KERN_ALERT «(x: %i; y: %i)», data[1], data[2]); и посмотреть что будет.
To be a rock and not to roll.