Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 425 $
164 serge 2
 
227 serge 3
DRV_ENTRY    equ  1
4
DRV_EXIT     equ -1
378 serge 5
DRV_COMPAT   equ  4  ;minimal required drivers version
6
DRV_CURRENT  equ  4  ;current drivers model version
214 serge 7
 
227 serge 8
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
9
 
164 serge 10
align 4
11
proc attach_int_handler stdcall, irq:dword, handler:dword
12
 
13
	 mov ebx, [irq]        ;irq num
14
	 test ebx, ebx
15
	 jz .err
16
	 mov eax, [handler]
17
	 test eax, eax
18
	 jz .err
19
	 mov [irq_tab+ebx*4], eax
20
         stdcall enable_irq, [irq]
21
	 ret
22
.err:
23
	 xor eax, eax
24
	 ret
25
endp
26
 
27
align 4
28
proc  detach_int_handler
29
 
30
	   ret
31
endp
32
 
33
align 4
34
proc enable_irq stdcall, irq_line:dword
35
           mov ebx, [irq_line]
36
           mov edx, 0x21
37
           cmp ebx, 8
38
           jb @F
39
           mov edx, 0xA1
40
           sub ebx,8
41
@@:
42
           in al,dx
43
           btr eax, ebx
44
           out dx, al
45
           ret
46
endp
47
 
48
align 16
49
;; proc irq_serv
50
 
51
irq_serv:
52
 
53
.irq_1:
54
	   push eax
55
	   mov eax, 1
56
	   jmp .main
57
align 4
58
.irq_2:
59
	   push eax
60
	   mov eax, 2
61
	   jmp .main
62
align 4
63
.irq_3:
64
	   push eax
65
	   mov eax, 3
66
	   jmp .main
67
align 4
68
.irq_4:
69
	   push eax
70
	   mov eax, 4
71
	   jmp .main
72
align 4
73
.irq_5:
74
	   push eax
75
	   mov eax, 5
76
	   jmp .main
77
align 4
78
.irq_6:
79
	   push eax
80
	   mov eax, 6
81
	   jmp .main
82
align 4
83
.irq_7:
84
	   push eax
85
	   mov eax, 7
86
	   jmp .main
87
align 4
88
.irq_8:
89
	   push eax
90
	   mov eax, 8
91
	   jmp .main
92
align 4
93
.irq_9:
94
	   push eax
95
	   mov eax, 9
96
	   jmp .main
97
align 4
98
.irq_10:
99
	   push eax
100
	   mov eax, 10
101
	   jmp .main
102
align 4
103
.irq_11:
104
	   push eax
105
	   mov eax, 11
106
	   jmp .main
107
align 4
108
.irq_12:
109
	   push eax
110
	   mov eax, 12
111
	   jmp .main
112
align 4
113
.irq_13:
114
	   push eax
115
	   mov eax, 13
116
	   jmp .main
117
align 4
118
.irq_14:
119
	   push eax
120
	   mov eax, 14
121
	   jmp .main
122
align 4
123
.irq_15:
124
	   push eax
125
	   mov eax, 15
126
	   jmp .main
127
 
128
align 16
129
.main:
130
	   save_ring3_context
131
	   mov	 bx, os_data
132
	   mov	 ds, bx
133
	   mov	 es, bx
134
 
135
	   mov ebx, [irq_tab+eax*4]
136
	   test ebx, ebx
137
	   jz .exit
138
 
139
           call ebx
140
 
141
.exit:
142
	   restore_ring3_context
143
 
144
           cmp eax, 8
145
	   mov al, 0x20
146
           jb @f
147
	   out 0xa0, al
148
@@:
149
           out 0x20, al
150
 
151
           pop eax
152
	   iret
153
 
154
align 4
155
proc get_notify stdcall, p_ev:dword
156
 
157
.wait:
158
           mov ebx,[CURRENT_TASK]
159
           shl ebx,8
380 serge 160
           test dword [ebx+SLOT_BASE+0xA8],EVENT_NOTIFY
164 serge 161
	   jz @f
380 serge 162
           and dword [ebx+SLOT_BASE+0xA8], not EVENT_NOTIFY
164 serge 163
	   mov edi, [p_ev]
164
	   mov dword [edi], EV_INTR
380 serge 165
           mov eax, [ebx+SLOT_BASE+APPDATA.event]
164 serge 166
	   mov dword [edi+4], eax
167
	   ret
168
@@:
169
	   call change_task
170
	   jmp .wait
171
endp
172
 
173
align 4
174
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
175
	   xor eax, eax
176
	   xor ebx, ebx
177
	   mov ah, byte [bus]
178
           mov al, 6
179
	   mov bh, byte [devfn]
180
	   mov bl, byte [reg]
181
	   call pci_read_reg
182
	   ret
183
endp
184
 
185
align 4
186
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
187
	   xor eax, eax
188
	   xor ebx, ebx
189
	   mov ah, byte [bus]
190
           mov al, 4
191
	   mov bh, byte [devfn]
192
	   mov bl, byte [reg]
193
	   call pci_read_reg
194
	   ret
195
endp
196
 
197
align 4
198
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
199
	   xor eax, eax
200
	   xor ebx, ebx
201
	   mov ah, byte [bus]
202
           mov al, 8
203
	   mov bh, byte [devfn]
204
	   mov bl, byte [reg]
205
           mov ecx, [val]
206
           call pci_write_reg
207
	   ret
208
endp
209
 
210
handle     equ  IOCTL.handle
211
io_code    equ  IOCTL.io_code
212
input      equ  IOCTL.input
213
inp_size   equ  IOCTL.inp_size
214
output     equ  IOCTL.output
215
out_size   equ  IOCTL.out_size
216
 
217
 
218
align 4
219
proc srv_handler stdcall, ioctl:dword
220
           mov esi, [ioctl]
221
           test esi, esi
222
           jz .err
223
 
224
           mov edi, [esi+handle]
225
           cmp [edi+SRV.magic], ' SRV'
226
	   jne .fail
227
 
228
           cmp [edi+SRV.size], SRV_SIZE
229
	   jne .fail
230
 
231
           stdcall [edi+SRV.srv_proc], esi
232
           ret
233
.fail:
234
           xor eax, eax
235
           not eax
236
           mov [esi+output], eax
237
           mov [esi+out_size], 4
238
           ret
239
.err:
240
           xor eax, eax
241
           not eax
242
           ret
243
endp
244
 
377 serge 245
; param
246
;  ebx= io_control
247
;
248
; retval
249
;  eax= error code
250
 
164 serge 251
align 4
377 serge 252
srv_handlerEx:
253
           test ebx, ebx
254
           jz .fail
255
           add ebx, new_app_base
164 serge 256
 
377 serge 257
           mov eax, [ebx+handle]
258
           cmp [eax+SRV.magic], ' SRV'
164 serge 259
	   jne .fail
260
 
377 serge 261
           cmp [eax+SRV.size], SRV_SIZE
164 serge 262
	   jne .fail
263
 
377 serge 264
           add [ebx+input], new_app_base
265
           add [ebx+output], new_app_base
164 serge 266
 
377 serge 267
           stdcall [eax+SRV.srv_proc], ebx
164 serge