Subversion Repositories Kolibri OS

Rev

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

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