Subversion Repositories Kolibri OS

Rev

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