Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
492 kastigar 1
format MS COFF
2
 
3
include '../../../proc32.inc'
4
include '../../../imports.inc'
5
 
6
struc IOCTL
774 Rus 7
{  .handle	dd ?
8
   .io_code	dd ?
9
   .input	dd ?
10
   .inp_size	dd ?
11
   .output	dd ?
12
   .out_size	dd ?
492 kastigar 13
}
14
 
15
virtual at 0
16
  IOCTL IOCTL
17
end virtual
18
 
19
public START
20
public version
21
 
22
DRV_ENTRY  equ 1
23
DRV_EXIT   equ -1
24
 
774 Rus 25
MT_3B	    equ 0
492 kastigar 26
MT_3BScroll equ 3
27
MT_5BScroll equ 4
28
 
29
PS2_DRV_VER equ 1
30
 
31
section '.flat' code readable align 16
32
 
33
 
34
proc START stdcall, state:dword
35
 
774 Rus 36
	  cmp [state], DRV_ENTRY
37
	  jne .fin
492 kastigar 38
  .init:
39
 
774 Rus 40
	  call detect_mouse
41
	  test eax,eax
42
	  jnz  .exit
492 kastigar 43
 
774 Rus 44
	  mov  [MouseType],MT_3B
492 kastigar 45
 
774 Rus 46
	  call try_mode_ID3
47
	  test eax,eax
48
	  jnz  .stop_try
49
	  mov  [MouseType],MT_3BScroll
50
 
51
	  call try_mode_ID4
52
	  test eax,eax
53
	  jnz  .stop_try
54
	  mov  [MouseType],MT_5BScroll
55
 
492 kastigar 56
  .stop_try:
57
 
774 Rus 58
	  mov  bl, 0x20        ; read command byte
59
	  call kbd_cmd
60
	  cmp  ah,1
61
	  je   .exit
492 kastigar 62
 
774 Rus 63
	  call kbd_read
64
	  cmp  ah,1
65
	  je   .exit
492 kastigar 66
 
774 Rus 67
	  or   al, 10b
68
	  push eax
69
	  mov  bl, 0x60        ; write command byte
70
	  call kbd_cmd
71
	  cmp  ah,1
72
	  je   .exit
492 kastigar 73
 
774 Rus 74
	  pop  eax
75
	  call kbd_write
76
	  cmp  ah,1
77
	  je   .exit
492 kastigar 78
 
774 Rus 79
	  mov  al, 0xF4        ; enable data reporting
80
	  call mouse_cmd
492 kastigar 81
 
774 Rus 82
	  mov  bl, 0xAE        ; enable keyboard interface
83
	  call kbd_cmd
84
 
85
	  stdcall AttachIntHandler, 12, irq_handler, dword 0
86
	  stdcall RegService, my_service, service_proc
87
		ret
492 kastigar 88
 
89
  .fin:
774 Rus 90
	  ;stdcall DetachIntHandler, 12, irq_handler
91
	  mov  bl, 0xA7        ; disable mouse interface
92
	  call kbd_cmd
93
	  xor  eax, eax
94
	  ret
492 kastigar 95
 
96
  .exit:
774 Rus 97
	  mov  bl, 0xA7        ; disable mouse interface
98
	  call kbd_cmd
99
	  mov  bl, 0xAE        ; enable keyboard interface
100
	  call kbd_cmd
101
	  xor  eax, eax
102
	  ret
492 kastigar 103
endp
104
 
105
proc service_proc stdcall, ioctl:dword
106
    mov  edi, [ioctl]
107
    mov  eax, [edi+IOCTL.io_code]
108
    test eax, eax
774 Rus 109
    jz	 .getversion
492 kastigar 110
    cmp  eax,1
774 Rus 111
    jz	 .gettype
492 kastigar 112
 
113
  .err:
774 Rus 114
    or	 eax, -1
492 kastigar 115
    ret
116
 
117
  .ok:
118
    xor  eax, eax
119
    ret
120
 
121
  .getversion:
122
    cmp  [edi+IOCTL.out_size], 4
774 Rus 123
    jb	 .err
492 kastigar 124
    mov  edi, [edi+IOCTL.output]
125
    mov  dword [edi], PS2_DRV_VER		; version of driver
126
    jmp  .ok
127
  .gettype:
128
    cmp  [edi+IOCTL.out_size], 4
774 Rus 129
    jb	 .err
492 kastigar 130
    mov  edi, [edi+IOCTL.output]
131
    mov  eax,[MouseType]
132
    mov  dword [edi], eax		; mouse type
133
    jmp  .ok
134
endp
135
 
136
detect_mouse:
137
 
138
    mov  bl, 0xAD	     ; disable keyboard interface
139
    call kbd_cmd
140
    cmp  ah,1
774 Rus 141
    je	 .fail
492 kastigar 142
 
143
    mov  bl, 0xA8	     ; enable mouse interface
144
    call kbd_cmd
145
    cmp  ah,1
774 Rus 146
    je	 .fail
492 kastigar 147
 
774 Rus 148
	  mov  al, 0xFF      ; reset
492 kastigar 149
    call mouse_cmd
774 Rus 150
    jc	 .fail
492 kastigar 151
 
152
    call mouse_read
774 Rus 153
    jc	 .fail
492 kastigar 154
    cmp  al, 0xAA
774 Rus 155
    jne  .fail	       ; dead mouse
492 kastigar 156
 
157
    ; get device ID
158
    call mouse_read
774 Rus 159
    jc	 .fail
492 kastigar 160
    cmp  al, 0x00
774 Rus 161
    jne  .fail	      ; unknown device
492 kastigar 162
    xor  eax,eax
163
    ret
164
 
165
  .fail:
774 Rus 166
    or	 eax,-1
492 kastigar 167
    ret
168
 
169
try_mode_ID3:
170
    mov  al, 0xF3    ;Set Sample Rate
171
    call mouse_cmd
774 Rus 172
    jc	 .fail
492 kastigar 173
    mov  al, 0xC8    ;200d
174
    call mouse_cmd
774 Rus 175
    jc	 .fail
492 kastigar 176
    mov  al, 0xF3    ;Set Sample Rate
177
    call mouse_cmd
774 Rus 178
    jc	 .fail
492 kastigar 179
    mov  al, 0x64    ;100d
180
    call mouse_cmd
774 Rus 181
    jc	 .fail
492 kastigar 182
    mov  al, 0xF3    ;Set Sample Rate
183
    call mouse_cmd
774 Rus 184
    jc	 .fail
492 kastigar 185
    mov  al, 0x50    ;80d
186
    call mouse_cmd
774 Rus 187
    jc	 .fail
492 kastigar 188
 
189
    mov  al, 0xF2    ;Get device id
190
    call mouse_cmd
774 Rus 191
    jc	 .fail
492 kastigar 192
 
193
    call mouse_read
774 Rus 194
    jc	 .fail
492 kastigar 195
    cmp  al, 0x03
196
    jne  .fail
197
 
198
    xor  eax,eax
199
    ret
200
  .fail:
774 Rus 201
    or	 eax,-1
492 kastigar 202
    ret
203
 
204
try_mode_ID4:
205
    mov  al, 0xF3    ;Set Sample Rate
206
    call mouse_cmd
774 Rus 207
    jc	 .fail
492 kastigar 208
    mov  al, 0xC8    ;200d
209
    call mouse_cmd
774 Rus 210
    jc	 .fail
492 kastigar 211
    mov  al, 0xF3    ;Set Sample Rate
212
    call mouse_cmd
774 Rus 213
    jc	 .fail
492 kastigar 214
    mov  al, 0xC8    ;100d
215
    call mouse_cmd
774 Rus 216
    jc	 .fail
492 kastigar 217
    mov  al, 0xF3    ;Set Sample Rate
218
    call mouse_cmd
774 Rus 219
    jc	 .fail
492 kastigar 220
    mov  al, 0x50    ;80d
221
    call mouse_cmd
774 Rus 222
    jc	 .fail
492 kastigar 223
 
224
    mov  al, 0xF2    ;Get device id
225
    call mouse_cmd
774 Rus 226
    jc	 .fail
492 kastigar 227
 
228
    call mouse_read
774 Rus 229
    jc	 .fail
492 kastigar 230
    cmp  al, 0x04
231
    jne  .fail
232
 
233
    xor  eax,eax
234
    ret
235
 
236
  .fail:
774 Rus 237
    or	 eax,-1
492 kastigar 238
    ret
239
 
240
include 'ps2m_iofuncs.inc'
241
include 'ps2m_irqh.inc'
242
 
243
section '.data' data readable writable align 16
244
 
774 Rus 245
version 	  dd  0x00050005
492 kastigar 246
my_service	db  'ps2mouse',0
247
 
248
;iofuncs data
774 Rus 249
mouse_cmd_byte	 db 0
250
mouse_nr_tries	 db 0
492 kastigar 251
mouse_nr_resends db 0
252
 
253
;hid data
254
mouse_byte  dd 0
255
 
256
first_byte  db 0
257
second_byte db 0
258
third_byte  db 0
259
fourth_byte db 0
260
 
261
;main data
774 Rus 262
MouseType	 dd 0
492 kastigar 263
 
774 Rus 264
XMoving 	 dd 0
265
YMoving 	 dd 0
266
ZMoving 	 dd 0
267
ButtonState	 dd 0
492 kastigar 268
;timerTicks       dd 0