Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2465 Serge 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
214 serge 7
 
8
;driver sceletone
9
 
10
format MS COFF
11
 
802 serge 12
DEBUG        equ 1
13
 
465 serge 14
API_VERSION     equ 0  ;debug
15
 
214 serge 16
include 'proc32.inc'
281 serge 17
include 'imports.inc'
214 serge 18
 
19
struc IOCTL
20
{  .handle      dd ?
21
   .io_code     dd ?
22
   .input       dd ?
23
   .inp_size    dd ?
24
   .output      dd ?
25
   .out_size    dd ?
26
}
27
 
28
virtual at 0
29
  IOCTL IOCTL
30
end virtual
31
 
32
public START
33
public service_proc
227 serge 34
public version
214 serge 35
 
465 serge 36
DRV_ENTRY    equ 1
37
DRV_EXIT     equ -1
38
STRIDE       equ 4      ;size of row in devices table
214 serge 39
 
465 serge 40
SRV_GETVERSION  equ 0
41
 
214 serge 42
section '.flat' code readable align 16
43
 
44
proc START stdcall, state:dword
45
 
3500 Serge 46
        cmp     [state], 1
47
        jne     .exit
214 serge 48
.entry:
227 serge 49
 
214 serge 50
     if DEBUG
3500 Serge 51
        mov     esi, msgInit
52
        call    SysMsgBoardStr
214 serge 53
     end if
54
 
3500 Serge 55
        stdcall RegService, my_service, service_proc
56
        ret
214 serge 57
.fail:
58
.exit:
3500 Serge 59
        xor     eax, eax
60
        ret
214 serge 61
endp
62
 
63
handle     equ  IOCTL.handle
64
io_code    equ  IOCTL.io_code
65
input      equ  IOCTL.input
66
inp_size   equ  IOCTL.inp_size
67
output     equ  IOCTL.output
68
out_size   equ  IOCTL.out_size
69
 
70
align 4
71
proc service_proc stdcall, ioctl:dword
72
 
3500 Serge 73
        mov     ebx, [ioctl]
74
        mov     eax, [ebx+io_code]
75
        cmp     eax, SRV_GETVERSION
76
        jne     @F
214 serge 77
 
3500 Serge 78
        mov     eax, [ebx+output]
79
        cmp     [ebx+out_size], 4
80
        jne     .fail
81
        mov     [eax], dword API_VERSION
82
        xor     eax, eax
83
        ret
465 serge 84
@@:
85
.fail:
3500 Serge 86
        or      eax, -1
87
        ret
214 serge 88
endp
89
 
90
restore   handle
91
restore   io_code
92
restore   input
93
restore   inp_size
94
restore   output
95
restore   out_size
96
 
97
align 4
98
proc detect
465 serge 99
           locals
100
            last_bus dd ?
101
           endl
214 serge 102
 
3500 Serge 103
        xor     eax, eax
104
        mov     [bus], eax
105
        inc     eax
106
        call    PciApi
107
        cmp     eax, -1
108
        je      .err
214 serge 109
 
3500 Serge 110
        mov     [last_bus], eax
214 serge 111
 
112
.next_bus:
3500 Serge 113
        and     [devfn], 0
214 serge 114
.next_dev:
3500 Serge 115
        stdcall PciRead32, [bus], [devfn], dword 0
116
        test    eax, eax
117
        jz      .next
118
        cmp     eax, -1
119
        je      .next
214 serge 120
 
3500 Serge 121
        mov     edi, devices
214 serge 122
@@:
3500 Serge 123
        mov     ebx, [edi]
124
        test    ebx, ebx
125
        jz      .next
214 serge 126
 
3500 Serge 127
        cmp     eax, ebx
128
        je      .found
465 serge 129
 
3500 Serge 130
        add     edi, STRIDE
131
        jmp     @B
465 serge 132
.next:
3500 Serge 133
        inc     [devfn]
134
        cmp     [devfn], 256
135
        jb      .next_dev
136
        mov     eax, [bus]
137
        inc     eax
138
        mov     [bus], eax
139
        cmp     eax, [last_bus]
140
        jna     .next_bus
141
        xor     eax, eax
142
        ret
214 serge 143
.found:
3500 Serge 144
        xor     eax, eax
145
        inc     eax
146
        ret
214 serge 147
.err:
3500 Serge 148
        xor     eax, eax
149
        ret
214 serge 150
endp
151
 
465 serge 152
DEVICE_ID    equ  1234;  pci device id
153
VENDOR_ID    equ  5678;  device vendor id
214 serge 154
 
155
 
156
;all initialized data place here
157
 
158
align 4
465 serge 159
devices      dd (DEVICE_ID shl 16)+VENDOR_ID
160
             dd 0    ;terminator
214 serge 161
 
465 serge 162
version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
227 serge 163
 
214 serge 164
my_service   db 'MY_SERVICE',0  ;max 16 chars include zero
165
 
166
msgInit      db 'detect hardware...',13,10,0
167
msgPCI       db 'PCI accsess not supported',13,10,0
168
msgFail      db 'device not found',13,10,0
169
 
170
section '.data' data readable writable align 16
171
 
172
;all uninitialized data place here
173