Subversion Repositories Kolibri OS

Rev

Rev 769 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
769 Rus 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
774 Rus 6
;; Includes source code by Kulakov Vladimir Gennadievich.       ;;
7
;; Modified by Mario79 and Rus.                                 ;;
769 Rus 8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
 
10
;driver sceletone
11
 
12
format MS COFF
13
 
14
API_VERSION	equ 5  ;debug
15
 
16
include 'proc32.inc'
17
include 'imports.inc'
18
 
19
OS_BASE 	equ 0x80000000;
20
new_app_base	equ 0x0
21
PROC_BASE	equ OS_BASE+0x0080000
22
 
23
struc IOCTL
24
{  .handle	dd ?
25
   .io_code	dd ?
26
   .input	dd ?
27
   .inp_size	dd ?
28
   .output	dd ?
29
   .out_size	dd ?
30
}
31
 
32
virtual at 0
33
  IOCTL IOCTL
34
end virtual
35
 
36
public START
37
public version
38
 
39
DEBUG	     equ 0
40
 
41
DRV_ENTRY    equ 1
42
DRV_EXIT     equ -1
43
STRIDE	     equ 4	;size of row in devices table
44
 
45
SRV_GETVERSION	equ 0
46
 
47
section '.flat' code readable align 16
48
 
49
proc START stdcall, state:dword
50
 
51
	   cmp [state], 1
52
	   jne .exit
53
.entry:
54
	;Detect_COM_Mouse:
55
if DEBUG
56
	mov    esi, msgInit
57
	call   Boot_Log
58
end if
59
	mov    bx, 0x3f8
60
	call   MSMouseSearch
61
	cmp    AL,'M'
62
	jne    @f
63
	;mov    [com1_mouse_detected],1
64
	;mov     [irq_owner+4*4], 1      ; IRQ4 owner is System
65
 
66
	mov	dx, bx
67
	inc	dx			 ; 0x3f8 + 1
68
	mov	al, 1
69
	out	dx, al
70
 
774 Rus 71
	stdcall AttachIntHandler, 4, irq4_handler, dword 0
769 Rus 72
if DEBUG
73
	cmp	eax, 0
74
	jne	.label1
75
 
76
	mov	esi, msg_error_attach_int_handler
77
	call	Boot_Log
78
end if
79
     .label1:
80
	mov	eax, 0
81
	mov	ebx, 0x3F8
82
	mov	ecx, 0x3FF
83
	call	ReservePortArea
84
 
85
if DEBUG
86
	cmp	eax, 1
87
	jne	.go
88
 
89
	mov	esi, msg_error_reserve_ports
90
	call	Boot_Log
91
 
92
     .go:
93
	mov	esi,boot_setmouse_type
94
	call	Boot_Log
95
end if
96
     @@:
97
	mov	bx, 0x2f8
98
	call	MSMouseSearch
99
	cmp	AL,'M'
100
	jne	.resume
101
	;mov     [com2_mouse_detected],1
102
	;mov     [irq_owner+3*4], 1      ; IRQ3 owner is System
103
 
774 Rus 104
	stdcall AttachIntHandler, 3, irq3_handler, dword 0
769 Rus 105
 
106
	mov	eax, 0
107
	mov	ebx, 0x2F8
108
	mov	ecx, 0x3F8
109
	call	ReservePortArea
110
if DEBUG
111
	cmp	eax, 1
112
	jne	@f
113
 
114
	mov	esi, msg_error_reserve_ports
115
	call	Boot_Log
116
      @@:
117
 
118
	mov	esi,boot_setmouse_type + 22
119
	call	Boot_Log
120
end if
121
      .resume:
122
 
123
	   stdcall RegService, my_service, service_proc
124
if DEBUG
125
	   cmp	eax, 0
126
	   jne	@f
127
 
128
	   mov	esi, msg_exit
129
	   call Boot_Log
130
end if
131
	 @@:
132
	   ret
133
.fail:
134
.exit:
135
if DEBUG
136
	   mov	esi, msg_exit
137
	   call Boot_Log
138
end if
139
	   xor eax, eax
140
	   ret
141
endp
142
 
143
handle	   equ	IOCTL.handle
144
io_code    equ	IOCTL.io_code
145
input	   equ	IOCTL.input
146
inp_size   equ	IOCTL.inp_size
147
output	   equ	IOCTL.output
148
out_size   equ	IOCTL.out_size
149
 
150
align 4
151
proc service_proc stdcall, ioctl:dword
152
 
153
	   mov ebx, [ioctl]
154
	   mov eax, [ebx+io_code]
155
	   cmp eax, SRV_GETVERSION
156
	   jne @F
157
 
158
	   mov eax, [ebx+output]
159
	   cmp [ebx+out_size], 4
160
	   jne .fail
161
	   mov [eax], dword API_VERSION
162
	   xor eax, eax
163
	   ret
164
@@:
165
.fail:
166
	   or eax, -1
167
	   ret
168
endp
169
 
170
align 4
171
MSMouseSearch:
172
	; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ
173
MouseSearch:
174
	; Устанавливаем скорость
175
	; приема/передачи 1200 бод
176
	; in bx COM Port Base Address
177
	mov	DX, bx
178
	add	DX,3
179
	in	AL,DX
180
	or	AL,80h	;установить бит DLAB
181
	out	DX,AL
182
	mov	DX, bx
183
	mov	AL,60h	;1200 бод
184
	out	DX,AL
185
	inc	DX
186
	mov	AL,0
187
	out	DX,AL
188
	; Установить длину слова 7 бит, 1 стоповый бит,
189
	; четность не контролировать
190
	mov	DX, bx
191
	add	DX,3
192
	mov	AL,00000010b
193
	out	DX,AL
194
	; Запретить все прерывани
195
	mov	dx, bx
196
	inc	dx
197
	mov	AL,0
198
	out	DX,AL
199
; Проверить, что устройство подключено и являетс
200
; мышью типа MSMouse
201
	; Отключить питание мыши и прерывани
202
	mov	DX, bx
203
	add	EDX,4	;регистр управления модемом
204
	mov	AL,0	;сбросить DTR, RTS и OUT2
205
	out	DX,AL
206
	; Ожидать 5 "тиков" (0,2 с)
207
	mov	ecx, 0xFFFF
208
	loop	$
209
	; Включить питание мыши
210
	mov	al, 1
211
	out	dx, al
212
	mov	ecx, 0xFFFF
213
	loop	$
214
	; Очистить регистр данных
215
	mov	dx, bx
216
	in	AL,DX
217
	add	edx, 4
218
	mov	AL, 1011b  ;установить DTR и RTS и OUT2
219
	out	DX,AL
220
	mov	ecx, 0x1FFFF
221
; Цикл опроса порта
222
WaitData:
223
	; Ожидать еще 10 "тиков"
224
	 dec  ecx
225
	 cmp  ecx,0
226
	 je	NoMouse
227
	; Проверить наличие идентификационного байта
228
	mov	DX, bx
229
	add	DX,5
230
	in	AL,DX
231
	test	AL,1   ;Данные готовы?
232
	jz	WaitData
233
	; Ввести данные
234
	mov	DX, bx
235
	in	AL,DX
236
NoMouse:
237
	ret
238
 
239
align 4
240
irq3_handler:
241
	mov	dx, 0x2f8
242
	mov	esi, com2_mouse
243
	jmp	irq_handler
244
 
245
align 4
246
irq4_handler:
247
	mov	dx, 0x3f8
248
	mov	esi, com1_mouse
249
 
250
irq_handler:
251
 
252
; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
253
	add	edx, 5		; xFDh
254
	in	al, dx
255
	test	al, 1		; Данные готовы?
256
	jz	.Error
257
; Ввести данные
258
	sub	edx, 5
259
	in	al, dx
260
; Сбросить старший незначащий бит
261
	and	al, 01111111b
262
 
263
; Определить порядковый номер принимаемого байта
264
	cmp	[esi+COM_MOUSE_DATA.MouseByteNumber], 2
265
	ja	.Error
266
	jz	.ThirdByte
267
	jp	.SecondByte
268
; Сохранить первый байт данных
269
.FirstByte:
270
	test	al, 1000000b	; Первый байт посылки?
271
	jz	.Error
272
	mov	[esi+COM_MOUSE_DATA.FirstByte], al
273
	inc	[esi+COM_MOUSE_DATA.MouseByteNumber]
274
	jmp	.EndMouseInterrupt
275
; Сохранить второй байт данных
276
.SecondByte:
277
	test	al, 1000000b
278
	jnz	.Error
279
	mov	[esi+COM_MOUSE_DATA.SecondByte], al
280
	inc	[esi+COM_MOUSE_DATA.MouseByteNumber]
281
	jmp	.EndMouseInterrupt
282
; Сохранить третий байт данных
283
.ThirdByte:
284
	test	al, 1000000b
285
	jnz	.Error
286
	mov	[esi+COM_MOUSE_DATA.ThirdByte], al
287
	mov	[esi+COM_MOUSE_DATA.MouseByteNumber], 0
288
; (Пакет данных от мыши принят полностью).
289
; Записать новое значение состояния кнопок мыши
290
	mov	al, [esi+COM_MOUSE_DATA.FirstByte]
291
	mov	ah, al
292
	shr	al, 3
293
	and	al, 2
294
	shr	ah, 5
295
	and	ah, 1
296
	add	al, ah
297
	movzx	eax, al
298
	mov	[BTN_DOWN], eax
299
 
300
; Прибавить перемещение по X к координате X
301
	mov	al, [esi+COM_MOUSE_DATA.FirstByte]
302
	shl	al, 6
303
	or	al, [esi+COM_MOUSE_DATA.SecondByte]
304
 
305
	cbw
306
	movzx	eax, ax
307
	mov	[MOUSE_X], eax
308
 
309
; Прибавить перемещение по Y к координате Y
310
	mov	al, [esi+COM_MOUSE_DATA.FirstByte]
311
	and	al, 00001100b
312
	shl	al, 4
313
	or	al, [esi+COM_MOUSE_DATA.ThirdByte]
314
 
315
	cbw
316
	movzx	eax, ax
317
	neg	eax
318
	mov	[MOUSE_Y], eax
319
 
320
	stdcall SetMouseData, [BTN_DOWN], [MOUSE_X], [MOUSE_Y], 0, 0
321
 
322
	jmp	.EndMouseInterrupt
323
 
324
.Error:
325
; Произошел сбой в порядке передачи информации от
326
; мыши, обнулить счетчик байтов пакета данных
327
 
328
	mov	[esi+COM_MOUSE_DATA.MouseByteNumber],0
329
.EndMouseInterrupt:
330
 
331
	ret
332
 
333
;all initialized data place here
334
 
335
align 4
336
 
337
struc COM_MOUSE_DATA {
338
; Номер принимаемого от мыши байта
339
	.MouseByteNumber	db	?
340
; Трехбайтовая структура данных, передаваемая мышью
341
	.FirstByte		db	?
342
	.SecondByte		db	?
343
	.ThirdByte		db	?
344
	;.timer_ticks_com        dd      ?
345
}
346
virtual at 0
347
 COM_MOUSE_DATA COM_MOUSE_DATA
348
end virtual
349
 
350
com1_mouse COM_MOUSE_DATA
351
com2_mouse COM_MOUSE_DATA
352
 
353
MOUSE_X      dd 0
354
MOUSE_Y      dd 0
355
BTN_DOWN     dd 0
356
 
357
COMPortBaseAddr dw 3F8h
358
 
359
 
360
 
361
version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
362
 
774 Rus 363
my_service   db 'COM_Mouse',0  ;max 16 chars include zero
769 Rus 364
 
365
if DEBUG
366
msgInit 		     db   'Preved bugoga!',13,10,0
367
boot_setmouse_type	     db   'Detected - COM1 mouse',13,10,0
368
			     db   'Detected - COM2 mouse',13,10,0
369
msg_error_reserve_ports      db   'Error reserving ports!',13,10,0
370
msg_error_attach_int_handler db   'Error attach interrupt handler!',13,10,0
371
msg_exit		     db   'Exit!',13,10,0
372
end if
373
 
374
section '.data' data readable writable align 16
375
 
376
;all uninitialized data place here
377