Subversion Repositories Kolibri OS

Rev

Rev 3539 | Rev 5075 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3539 Rev 5072
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;; Includes source code by Kulakov Vladimir Gennadievich.       ;;
6
;; Includes source code by Kulakov Vladimir Gennadievich.       ;;
7
;; Modified by Mario79 and Rus.                                 ;;
7
;; Modified by Mario79 and Rus.                                 ;;
8
;; 02.12.2009                                              ;;
8
;; 02.12.2009                                              ;;
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 10... Line 10...
10
 
10
 
-
 
11
format PE DLL native
Line -... Line 12...
-
 
12
entry START
11
;driver sceletone
13
 
-
 
14
        CURRENT_API             = 0x0200
Line 12... Line 15...
12
 
15
        COMPATIBLE_API          = 0x0100
-
 
16
        API_VERSION             = (COMPATIBLE_API shl 16) + CURRENT_API
Line 13... Line -...
13
format MS COFF
-
 
14
 
17
 
Line 15... Line -...
15
DEBUG        equ 0
-
 
16
 
-
 
17
include 'proc32.inc'
-
 
18
include 'imports.inc'
-
 
19
 
-
 
20
API_VERSION     equ 5  ;debug
-
 
21
 
-
 
22
struc IOCTL
-
 
23
{  .handle      dd ?
-
 
24
   .io_code     dd ?
-
 
25
   .input       dd ?
-
 
26
   .inp_size    dd ?
-
 
27
   .output      dd ?
-
 
28
   .out_size    dd ?
-
 
29
}
-
 
30
 
-
 
31
virtual at 0
-
 
32
  IOCTL IOCTL
-
 
33
end virtual
-
 
34
 
-
 
35
public START
-
 
36
public version
-
 
37
 
-
 
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
18
        __DEBUG__               = 1
46
 
-
 
47
proc START stdcall, state:dword
-
 
48
 
-
 
49
        cmp     [state], 1
-
 
50
        jne     .exit
19
        __DEBUG_LEVEL__         = 2
51
.entry:
-
 
52
        ;Detect_COM_Mouse:
-
 
53
if DEBUG
-
 
54
        mov     esi, msgInit
20
 
55
        call    Boot_Log
21
section '.flat' readable writable executable
56
end if
-
 
57
        mov     bx, 0x3f8
-
 
Line 58... Line 22...
58
        call    MSMouseSearch
22
 
59
        cmp     AL, 'M'
23
include '../proc32.inc'
-
 
24
include '../struct.inc'
60
        jne     @f
25
include '../macros.inc'
61
        ;mov    [com1_mouse_detected],1
26
include '../fdo.inc'
Line 62... Line -...
62
        ;mov     [irq_owner+4*4], 1      ; IRQ4 owner is System
-
 
63
 
-
 
64
        mov     dx, bx
27
 
65
        inc     dx                       ; 0x3f8 + 1
-
 
Line 66... Line -...
66
        mov     al, 1
-
 
67
        out     dx, al
-
 
68
 
-
 
69
        stdcall AttachIntHandler, 4, irq4_handler, dword 0
-
 
70
if DEBUG
-
 
71
        test    eax, eax
-
 
72
        jne     .label1
-
 
73
 
28
; Serial data packet format:
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
        xor     ebx, ebx
-
 
82
        mov     ecx, 0x3F8
-
 
83
        mov     edx, 0x3FF
-
 
84
        call    ReservePortArea
-
 
85
 
-
 
86
if DEBUG
-
 
87
        cmp     eax, 1
-
 
88
        jne     .go
-
 
89
 
-
 
90
        mov     esi, msg_error_reserve_ports
-
 
91
        call    Boot_Log
-
 
92
 
-
 
93
     .go:
-
 
94
        mov     esi, boot_setmouse_type
-
 
95
        call    Boot_Log
-
 
96
end if
-
 
97
     @@:
-
 
98
        mov     bx, 0x2f8
-
 
99
        call    MSMouseSearch
-
 
100
        cmp     AL, 'M'
-
 
101
        jne     .resume
-
 
102
        ;mov     [com2_mouse_detected],1
29
;            D6    D5    D4    D3    D2    D1    D0
103
        ;mov     [irq_owner+3*4], 1      ; IRQ3 owner is System
-
 
104
 
30
; 1st byte    1    LB    RB    Y7    Y6    X7    X6
Line 105... Line -...
105
        stdcall AttachIntHandler, 3, irq3_handler, dword 0
-
 
106
 
-
 
107
;       mov     eax, 0
-
 
108
;       mov     ebx, 0x2F8
-
 
109
;       mov     ecx, 0x3F8
-
 
110
        xor     ebx, ebx
-
 
111
        mov     ecx, 0x2F8
-
 
112
        mov     edx, 0x3F8
-
 
113
 
-
 
114
        call    ReservePortArea
-
 
115
if DEBUG
-
 
116
        cmp     eax, 1
31
; 2nd byte    0    X5    X4    X3    X2    X1    X0
117
        jne     @f
-
 
Line -... Line 32...
-
 
32
; 3rd byte    0    Y5    Y4    Y3    Y2    Y1    Y0
-
 
33
 
-
 
34
struct com_mouse_data
-
 
35
 
-
 
36
        port            dw ?
-
 
37
        offset          db ?
-
 
38
        data            rb 3
118
 
39
 
119
        mov     esi, msg_error_reserve_ports
40
ends
120
        call    Boot_Log
41
 
121
      @@:
42
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
43
;;                        ;;
-
 
44
;; proc START             ;;
Line 122... Line 45...
122
 
45
;;                        ;;
123
        mov     esi, boot_setmouse_type + 22
46
;; (standard driver proc) ;;
-
 
47
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
48
 
124
        call    Boot_Log
49
proc START c, reason:dword, cmdline:dword
125
end if
50
 
126
      .resume:
51
        cmp     [reason], DRV_ENTRY
-
 
52
        jne     .fail
127
 
53
 
128
        stdcall RegService, my_service, service_proc
-
 
129
if DEBUG
-
 
130
        test    eax, eax
-
 
131
        jne     @f
-
 
132
 
-
 
133
        mov     esi, msg_exit
54
        DEBUGF  2,"Loading serial mouse driver\n"
134
        call    Boot_Log
55
 
-
 
56
        stdcall init_mouse, 0x3f8, 4
135
end if
57
        stdcall init_mouse, 0x2f8, 3
Line 136... Line -...
136
         @@:
-
 
137
        ret
-
 
138
.fail:
-
 
139
.exit:
-
 
140
if DEBUG
-
 
141
        mov     esi, msg_exit
-
 
Line 142... Line -...
142
        call    Boot_Log
-
 
143
end if
58
        stdcall init_mouse, 0x3e8, 4
Line 144... Line 59...
144
        xor     eax, eax
59
        stdcall init_mouse, 0x2e8, 3
145
        ret
60
 
146
endp
61
        invoke  RegService, my_service, service_proc
147
 
62
        ret
Line 148... Line 63...
148
handle     equ  IOCTL.handle
63
 
149
io_code    equ  IOCTL.io_code
64
  .fail:
150
input      equ  IOCTL.input
65
        xor     eax, eax
151
inp_size   equ  IOCTL.inp_size
66
        ret
152
output     equ  IOCTL.output
67
 
153
out_size   equ  IOCTL.out_size
68
endp
154
 
69
 
155
align 4
70
 
156
proc service_proc stdcall, ioctl:dword
71
proc service_proc stdcall, ioctl:dword
157
 
72
 
158
        mov     ebx, [ioctl]
73
        mov     ebx, [ioctl]
Line 159... Line 74...
159
        mov     eax, [ebx+io_code]
74
        mov     eax, [ebx + IOCTL.io_code]
160
        cmp     eax, SRV_GETVERSION
75
        cmp     eax, 0 ;SRV_GETVERSION
-
 
76
        jne     .fail
-
 
77
 
-
 
78
        mov     eax, [ebx + IOCTL.output]
161
        jne     @F
79
        cmp     [ebx + IOCTL.out_size], 4
-
 
80
        jne     .fail
-
 
81
        mov     [eax], dword API_VERSION
162
 
82
        xor     eax, eax
163
        mov     eax, [ebx+output]
83
        ret
-
 
84
 
-
 
85
  .fail:
-
 
86
        or      eax, -1
-
 
87
        ret
164
        cmp     [ebx+out_size], 4
88
endp
-
 
89
 
165
        jne     .fail
90
 
-
 
91
proc init_mouse stdcall port, irq
-
 
92
 
166
        mov     [eax], dword API_VERSION
93
        DEBUGF  1, "Trying to init serial mouse on port 0x%x\n", [port]
167
        xor     eax, eax
94
 
168
        ret
95
        xor     ebx, ebx        ; reserve port area
169
@@:
96
        mov     ecx, [port]
170
.fail:
97
        lea     edx, [ecx + 7]
-
 
98
        push    ebp
171
        or      eax, -1
99
        invoke  ReservePortArea
172
        ret
100
        pop     ebp
173
endp
101
        test    eax, eax
174
 
102
        jnz     .fail
175
align 4
103
 
176
MSMouseSearch:
104
        DEBUGF  1, "Reserved port area\n"
177
        ; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ
-
 
-
 
105
 
178
MouseSearch:
106
        mov     bx, word[port]
179
        ; Устанавливаем скорость
107
 
180
        ; приема/передачи 1200 бод
108
        ; Set the speed to 1200 baud
181
        ; in bx COM Port Base Address
109
        mov     dx, bx
182
        mov     DX, bx
110
        add     dx, 3
-
 
111
        in      al, dx
183
        add     DX, 3
112
        or      al, 80h         ; set DLAB bit
184
        in      AL, DX
113
        out     dx, al
185
        or      AL, 80h ;установить бит DLAB
114
 
186
        out     DX, AL
115
        mov     dx, bx
187
        mov     DX, bx
116
        mov     al, 60h         ; 1200 baud
-
 
117
        out     dx, al
188
        mov     AL, 60h ;1200 бод
118
        inc     dx
-
 
119
        mov     al, 0
189
        out     DX, AL
120
        out     dx, al
190
        inc     DX
-
 
191
        mov     AL, 0
121
 
192
        out     DX, AL
122
        ; Use 7 bit words, 1 stop bit, no parity control, reset DLAB bit
193
        ; Установить длину слова 7 бит, 1 стоповый бит,
123
        mov     dx, bx
194
        ; четность не контролировать
124
        add     dx, 3
-
 
125
        mov     al, 00000010b
195
        mov     DX, bx
126
        out     dx, al
196
        add     DX, 3
127
 
197
        mov     AL, 00000010b
128
        ; Disable interrupts
-
 
129
        mov     dx, bx
198
        out     DX, AL
130
        inc     dx
199
        ; Запретить все прерывани
131
        mov     al, 0
200
        mov     dx, bx
132
        out     dx, al
-
 
133
 
-
 
134
; Check if a MS type serial mouse is connected
201
        inc     dx
135
 
202
        mov     AL, 0
136
; Disable power and mouse interrupts
-
 
137
        mov     dx, bx
203
        out     DX, AL
138
        add     dx, 4           ; modem control register
204
; Проверить, что устройство подключено и являетс
139
        mov     al, 0           ; reset DTR, RTS, and OUT2
205
; мышью типа MSMouse
140
        out     dx, al
-
 
141
 
-
 
142
; Wait 5 ticks (0.2s)
206
        ; Отключить питание мыши и прерывани
143
        mov     esi, 200
207
        mov     DX, bx
144
        invoke  Sleep
208
        add     EDX, 4  ;регистр управления модемом
145
 
-
 
146
; Power on the mouse
209
        mov     AL, 0   ;сбросить DTR, RTS и OUT2
147
        mov     al, 1
210
        out     DX, AL
148
        out     dx, al
211
        ; Ожидать 5 "тиков" (0,2 с)
149
 
212
        mov     ecx, 0xFFFF
-
 
213
        loop    $
150
; Wait 5 ticks (0.2s)
-
 
151
        mov     esi, 200
-
 
152
        invoke  Sleep
-
 
153
 
-
 
154
; Clear data register
214
        ; Включить питание мыши
155
        mov     dx, bx
215
        mov     al, 1
156
        in      al, dx
216
        out     dx, al
157
 
-
 
158
; set DTR, DTS and OUT2
-
 
159
        add     dx, 4
-
 
160
        mov     al, 1011b
217
        mov     ecx, 0xFFFF
161
        out     dx, al
218
        loop    $
162
 
219
        ; Очистить регистр данных
163
        mov     ecx, 0x1FFFF
-
 
164
; Poll port
-
 
165
  .loop:
-
 
166
        dec     ecx
-
 
167
        jz      .fail
-
 
168
 
-
 
169
; Check if identification byte is available
-
 
170
        mov     dx, bx
-
 
171
        add     dx, 5
-
 
172
        in      al, dx
-
 
173
        test    al, 1           ; data ready?
-
 
174
        jz      .loop
-
 
175
 
-
 
176
; Read data byte
-
 
177
        mov     dx, bx
220
        mov     dx, bx
178
        in      al, dx
-
 
179
        cmp     al, 'M'
-
 
180
        jne     .free
-
 
181
 
-
 
182
        DEBUGF  2, "Serial mouse detected on port 0x%x\n", [port]
-
 
183
 
221
        in      AL, DX
184
; Create data struct
-
 
185
 
-
 
186
        invoke  Kmalloc, sizeof.com_mouse_data
-
 
187
        test    eax, eax
-
 
188
        jz      .fail
222
        add     edx, 4
189
 
-
 
190
        DEBUGF  1, "Structure 0x%x allocated\n", eax
223
        mov     AL, 1011b  ;установить DTR и RTS и OUT2
191
 
224
        out     DX, AL
192
        mov     bx, word[port]
-
 
193
        mov     [eax + com_mouse_data.port], bx
225
        mov     ecx, 0x1FFFF
194
        mov     [eax + com_mouse_data.offset], 0
226
; Цикл опроса порта
195
 
Line 227... Line 196...
227
WaitData:
196
; Attach int handler
-
 
197
 
228
        ; Ожидать еще 10 "тиков"
198
        invoke  AttachIntHandler, [irq], irq_handler, eax
-
 
199
        test    eax, eax
229
        dec     ecx
200
        jz      .fail
230
;        cmp  ecx,0
201
 
-
 
202
        DEBUGF  1, "Attached int handler\n"
-
 
203
 
231
        jz      NoMouse
204
; Enable interrupts
232
        ; Проверить наличие идентификационного байта
205
        mov     dx, word[port]
233
        mov     DX, bx
206
        inc     dx
234
        add     DX, 5
207
        mov     al, 1
235
        in      AL, DX
208
        out     dx, al
236
        test    AL, 1  ;Данные готовы?
209
 
-
 
210
        xor     eax, eax
-
 
211
        ret
-
 
212
 
-
 
213
  .free:
Line 237... Line 214...
237
        jz      WaitData
214
        DEBUGF  1, "Freeing port area\n"
Line -... Line 215...
-
 
215
        xor     ebx, ebx
-
 
216
        inc     ebx             ; free port area
-
 
217
        mov     ecx, [port]
-
 
218
        lea     edx, [ecx + 7]
238
        ; Ввести данные
219
        push    ebp
239
        mov     DX, bx
220
        invoke  ReservePortArea
240
        in      AL, DX
221
        pop     ebp
241
NoMouse:
222
 
242
        ret
223
  .fail:
243
 
224
        DEBUGF  1, "Failed\n"
244
align 4
225
        or      eax, -1
245
irq3_handler:
226
        ret
246
        mov     dx, 0x2f8
-
 
247
        mov     esi, com2_mouse
227
 
Line 248... Line 228...
248
        jmp     irq_handler
228
endp
249
 
229
 
250
align 4
230
 
251
irq4_handler:
231
 
252
        mov     dx, 0x3f8
232
irq_handler:
253
        mov     esi, com1_mouse
-
 
-
 
233
 
254
 
234
        push    esi
255
irq_handler:
235
        mov     esi, [esp+2*4]
256
 
236
 
257
; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
237
  .read_loop:
258
        add     edx, 5          ; xFDh
238
        mov     dx, [esi + com_mouse_data.port]
259
        in      al, dx
239
        add     dx, 5
-
 
240
        in      al, dx
260
        test    al, 1           ; Данные готовы?
241
        test    al, 1           ; data ready?
261
        jz      .Error
242
        jz      .end
262
; Ввести данные
243
; read data
263
        sub     edx, 5
244
        sub     dx, 5
264
        in      al, dx
245
        in      al, dx
265
; Сбросить старший незначащий бит
246
        and     al, 01111111b   ; clear MSB (use 7 bit words)
266
        and     al, 01111111b
247
 
-
 
248
; Check which data byte we are reading
267
 
249
        cmp     [esi + com_mouse_data.offset], 2
268
; Определить порядковый номер принимаемого байта
250
        ja      .reset
269
        cmp     [esi+COM_MOUSE_DATA.MouseByteNumber], 2
251
        je      .ThirdByte
270
        ja      .Error
252
        jp      .SecondByte
271
        jz      .ThirdByte
253
 
-
 
254
; read first data byte
272
        jp      .SecondByte
255
        test    al, 01000000b   ; First byte indicator set?
273
; Сохранить первый байт данных
-
 
274
.FirstByte:
-
 
-
 
256
        jz      .reset
-
 
257
        mov     [esi + com_mouse_data.data+0], al
275
        test    al, 1000000b    ; Первый байт посылки?
258
        inc     [esi + com_mouse_data.offset]
276
        jz      .Error
259
        jmp     .read_loop
277
        mov     [esi+COM_MOUSE_DATA.FirstByte], al
260
 
278
        inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
261
; read second data byte
279
        jmp     .EndMouseInterrupt
262
  .SecondByte:
280
; Сохранить второй байт данных
263
        test    al, 01000000b   ; First byte indicator set?
281
.SecondByte:
264
        jnz     .reset
282
        test    al, 1000000b
265
        mov     [esi + com_mouse_data.data+1], al
283
        jnz     .Error
266
        inc     [esi + com_mouse_data.offset]
Line 284... Line 267...
284
        mov     [esi+COM_MOUSE_DATA.SecondByte], al
267
        jmp     .read_loop
285
        inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
268
 
286
        jmp     .EndMouseInterrupt
269
; read third data byte
287
; Сохранить третий байт данных
270
  .ThirdByte:
288
.ThirdByte:
-
 
289
        test    al, 1000000b
-
 
290
        jnz     .Error
271
        test    al, 01000000b   ; First byte indicator set?
291
        mov     [esi+COM_MOUSE_DATA.ThirdByte], al
272
        jnz     .reset
Line 292... Line 273...
292
        mov     [esi+COM_MOUSE_DATA.MouseByteNumber], 0
273
        mov     [esi + com_mouse_data.data+2], al
293
; (Пакет данных от мыши принят полностью).
274
 
294
; Записать новое значение состояния кнопок мыши
275
; Data packet is complete, parse it and set mouse data
295
        mov     al, [esi+COM_MOUSE_DATA.FirstByte]
276
 
296
        mov     ah, al
277
; Buttons
297
        shr     al, 3
-
 
298
        and     al, 2
-
 
299
        shr     ah, 5
278
        mov     al, [esi + com_mouse_data.data+0]
300
        and     ah, 1
279
        mov     ah, al
301
        add     al, ah
280
        shr     al, 3           ; right mouse button
Line 302... Line 281...
302
        movzx   eax, al
281
        and     al, 2           ;
Line 303... Line -...
303
        mov     [BTN_DOWN], eax
-
 
304
 
-
 
305
; Прибавить перемещение по X к координате X
282
        shr     ah, 5           ; left mouse button
306
        mov     al, [esi+COM_MOUSE_DATA.FirstByte]
-
 
307
        shl     al, 6
-
 
308
        or      al, [esi+COM_MOUSE_DATA.SecondByte]
-
 
309
 
283
        and     ah, 1           ;
-
 
284
        add     al, ah
310
        cbw
285
        movzx   eax, al
311
        movzx   eax, ax
286
        mov     [BTN_DOWN], eax
312
        mov     [MOUSE_X], eax
287
 
Line 313... Line -...
313
 
-
 
314
; Прибавить перемещение по Y к координате Y
-
 
315
        mov     al, [esi+COM_MOUSE_DATA.FirstByte]
-
 
316
        and     al, 00001100b
-
 
317
        shl     al, 4
-
 
318
        or      al, [esi+COM_MOUSE_DATA.ThirdByte]
-
 
319
 
-
 
320
        cbw
-
 
321
        movzx   eax, ax
-
 
322
        neg     eax
-
 
323
        mov     [MOUSE_Y], eax
-
 
324
 
-
 
325
        stdcall SetMouseData, [BTN_DOWN], [MOUSE_X], [MOUSE_Y], 0, 0
-
 
326
 
-
 
327
        jmp     .EndMouseInterrupt
-
 
328
 
-
 
329
.Error:
-
 
330
; Произошел сбой в порядке передачи информации от
-
 
331
; мыши, обнулить счетчик байтов пакета данных
-
 
332
 
-
 
333
        mov     [esi+COM_MOUSE_DATA.MouseByteNumber], 0
-
 
334
.EndMouseInterrupt:
-
 
335
        mov     al, 1
-
 
336
        ret
-
 
337
 
-
 
338
;all initialized data place here
-
 
339
 
-
 
Line 340... Line 288...
340
align 4
288
; X coordinate
Line 341... Line 289...
341
 
289
        mov     al, [esi + com_mouse_data.data+0]
-
 
290
        shl     al, 6
Line 342... Line -...
342
struc COM_MOUSE_DATA {
-
 
343
; Номер принимаемого от мыши байта
-
 
344
        .MouseByteNumber        db      ?
-
 
345
; Трехбайтовая структура данных, передаваемая мышью
-
 
346
        .FirstByte              db      ?
-
 
347
        .SecondByte             db      ?
-
 
348
        .ThirdByte              db      ?
291
        or      al, [esi + com_mouse_data.data+1]
349
        ;.timer_ticks_com        dd      ?
-
 
Line 350... Line 292...
350
}
292
        movsx   eax, al
Line 351... Line 293...
351
virtual at 0
293
        mov     [MOUSE_X], eax
Line -... Line 294...
-
 
294
 
-
 
295
; Y coordinate
-
 
296
        mov     al, [esi + com_mouse_data.data+0]
352
 COM_MOUSE_DATA COM_MOUSE_DATA
297
        and     al, 00001100b