Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5558 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
6878 hidnplayr 3
;; Copyright (C) KolibriOS team 2015-2017. All rights reserved. ;;
5558 hidnplayr 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
format PE DLL native 0.05
9
entry START
10
 
11
        DEBUG                   = 1
12
        __DEBUG__               = 1
13
        __DEBUG_LEVEL__         = 1             ; 1 = verbose, 2 = errors only
14
 
15
 
16
        API_VERSION             = 0  ;debug
17
 
18
        STRIDE                  = 4      ;size of row in devices table
19
 
20
        SRV_GETVERSION          = 0
21
 
22
section '.flat' code readable writable executable
23
 
6878 hidnplayr 24
include '../proc32.inc'
25
include '../struct.inc'
26
include '../macros.inc'
27
include '../peimport.inc'
28
include '../fdo.inc'
5558 hidnplayr 29
 
6878 hidnplayr 30
GPIO_PORT_CONFIG_ADDR = 0xF100
31
GPIO_DATA_ADDR = 0xF200
32
ADC_ADDR = 0xFE00
33
 
5558 hidnplayr 34
proc START c, state:dword, cmdline:dword
35
 
36
        cmp     [state], 1
37
        jne     .exit
38
.entry:
39
 
40
        push    esi
41
        DEBUGF  1,"Loading vortex86EX GPIO driver\n"
42
        call    detect
43
        pop     esi
44
        test    eax, eax
45
        jz      .fail
46
 
47
; Set crossbar base address register in southbridge
6878 hidnplayr 48
        invoke  PciWrite16, [bus], [dev], 0x64, 0x0A00 or 1
5558 hidnplayr 49
 
50
; Set GPIO base address register in southbridge
6878 hidnplayr 51
        invoke  PciWrite16, [bus], [dev], 0x62, GPIO_PORT_CONFIG_ADDR or 1
5558 hidnplayr 52
 
6878 hidnplayr 53
        DEBUGF  1,"Setting up ADC\n"
54
 
55
; Enable ADC
56
        invoke  PciRead32, [bus], [dev], 0xBC
57
        and     eax, not (1 shl 28)
58
        invoke  PciWrite32, [bus], [dev], 0xBC, eax
59
 
60
        DEBUGF  1,"1\n"
61
 
62
; Set ADC base address
63
        mov     ebx, [dev]
64
        inc     ebx
65
        invoke  PciRead16, [bus], ebx, 0xDE
66
        or      ax, 0x02
67
        invoke  PciWrite16, [bus], ebx, 0xDE, eax
68
 
69
        invoke  PciWrite32, [bus], ebx, 0xE0, 0x00500000 or ADC_ADDR
70
 
71
        DEBUGF  1,"2\n"
72
 
73
; set up ADC
74
        mov     dx, ADC_ADDR + 1
75
        xor     al, al
76
        out     dx, al
77
 
78
        DEBUGF  1,"3\n"
79
 
80
; Empty FIFO
81
  @@:
82
        mov     dx, ADC_ADDR + 2        ; Status register
83
        in      al, dx
84
        test    al, 0x01                ; FIFO ready
85
        jz      @f
86
        mov     dx, ADC_ADDR + 4
87
        in      ax, dx
88
        jmp     @r
89
  @@:
90
 
91
        DEBUGF  1,"4\n"
92
 
5558 hidnplayr 93
; Enable GPIO0-9
6878 hidnplayr 94
        mov     dx, GPIO_PORT_CONFIG_ADDR + 0  ; General-Purpose I/O Data & Direction Decode Enable
5558 hidnplayr 95
        mov     eax, 0x000001ff
96
        out     dx, eax
97
 
6878 hidnplayr 98
        mov     ecx, 10                 ; 10 GPIO ports total
99
        mov     dx, GPIO_PORT_CONFIG_ADDR + 4  ; General-Purpose I/O Port0 Data & Direction Decode Address
100
        mov     ax, GPIO_DATA_ADDR
5558 hidnplayr 101
  .gpio_init:
102
; Set GPIO data port base address
103
        out     dx, ax
104
        add     ax, 2
105
        add     dx, 2
106
; Set GPIO direction base address
107
        out     dx, ax
108
        add     ax, 2
109
        add     dx, 2
110
; loop
111
        dec     ecx
112
        jnz     .gpio_init
113
 
114
; Set GPIO0 pin 0 as output
115
        mov     al, 0x01
6878 hidnplayr 116
        mov     dx, GPIO_DATA_ADDR + 0*4 + 2
5558 hidnplayr 117
        out     dx, al
118
 
119
        invoke  RegService, my_service, service_proc
120
        ret
6878 hidnplayr 121
  .fail:
122
  .exit:
5558 hidnplayr 123
        xor     eax, eax
124
        ret
125
endp
126
 
127
proc service_proc stdcall, ioctl:dword
128
 
129
        mov     ebx, [ioctl]
130
        mov     eax, [ebx+IOCTL.io_code]
131
        cmp     eax, SRV_GETVERSION
132
        jne     @F
133
 
134
        mov     eax, [ebx+IOCTL.output]
135
        cmp     [ebx+IOCTL.out_size], 4
136
        jne     .fail
137
        mov     dword [eax], API_VERSION
138
        xor     eax, eax
139
        ret
6878 hidnplayr 140
  @@:
5558 hidnplayr 141
        cmp     eax, 1  ; read GPIO P0
6878 hidnplayr 142
        jne     .no_gpioread
143
        mov     dx, GPIO_DATA_ADDR + 0x00
5558 hidnplayr 144
        in      al, dx
145
        ret
6878 hidnplayr 146
  .no_gpioread:
5558 hidnplayr 147
        cmp     eax, 2  ; write GPIO P0
6878 hidnplayr 148
        jne     .no_gpiowrite
5558 hidnplayr 149
 
150
        mov     eax, [ebx + IOCTL.input]
6878 hidnplayr 151
        mov     dx, GPIO_DATA_ADDR + 0x00
5558 hidnplayr 152
        out     dx, al
153
        xor     eax, eax
154
        ret
6878 hidnplayr 155
  .no_gpiowrite:
156
        cmp     eax, 3  ; read ADC channel 0
157
        jne     .no_adcread
158
 
159
        mov     dx, ADC_ADDR + 1
160
        mov     al, 1 shl 3             ; Power down ADC
161
        out     dx, al
162
 
163
        mov     dx, ADC_ADDR + 0        ; AUX channel select register
164
        mov     al, 1 shl 0             ; Enable AUX0 scan
165
        out     dx, al
166
 
167
        mov     dx, ADC_ADDR + 1
168
        mov     al, 1 shl 0             ; Single shot, no interrupts, start
169
        out     dx, al
170
 
171
        mov     dx, ADC_ADDR + 2
172
  @@:
173
        in      al, dx
174
        test    al, 1 shl 0             ; data ready?
175
        jz      @r
176
 
177
        mov     dx, ADC_ADDR + 4
178
        in      ax, dx                  ; read the data and return to user call
179
        DEBUGF  1, "ADC read: 0x%x\n", eax:4
180
        ret
181
  .no_adcread:
182
  .fail:
5558 hidnplayr 183
        or      eax, -1
184
        ret
185
endp
186
 
187
 
188
proc detect
189
        push    ebx
190
        invoke  GetPCIList
191
        mov     ebx, eax
6878 hidnplayr 192
  .next_dev:
5558 hidnplayr 193
        mov     eax, [eax+PCIDEV.fd]
194
        cmp     eax, ebx
195
        jz      .err
196
        mov     edx, [eax+PCIDEV.vendor_device_id]
197
 
198
        mov     esi, devices
6878 hidnplayr 199
  @@:
5558 hidnplayr 200
        cmp     dword [esi], 0
201
        jz      .next_dev
202
        cmp     edx, [esi]
203
        jz      .found
204
 
205
        add     esi, STRIDE
206
        jmp     @B
207
 
6878 hidnplayr 208
  .found:
5558 hidnplayr 209
        movzx   ebx, [eax+PCIDEV.devfn]
210
        mov     [dev], ebx
211
        movzx   ebx, [eax+PCIDEV.bus]
212
        mov     [bus], ebx
213
        xor     eax, eax
214
        inc     eax
215
        pop     ebx
216
        ret
6878 hidnplayr 217
  .err:
5558 hidnplayr 218
        DEBUGF  1,"Could not find vortex86EX south bridge!\n"
219
        xor     eax, eax
220
        pop     ebx
221
        ret
222
endp
223
 
224
DEVICE_ID    = 6011h
225
VENDOR_ID    = 17F3h
226
 
227
;all initialized data place here
228
 
229
align 4
230
devices      dd (DEVICE_ID shl 16)+VENDOR_ID
231
             dd 0    ;terminator
232
 
233
my_service   db '86DUINO-GPIO',0  ;max 16 chars include zero
234
 
235
include_debug_strings                           ; All data wich FDO uses will be included here
236
 
237
dev     dd ?
238
bus     dd ?
239
 
240
align 4
241
data fixups
242
end data