Subversion Repositories Kolibri OS

Rev

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