Rev 405 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 405 | Rev 413 | ||
---|---|---|---|
Line 20... | Line 20... | ||
20 | 20 | ||
Line 21... | Line 21... | ||
21 | DRV_ENTRY equ 1 |
21 | DRV_ENTRY equ 1 |
22 | DRV_EXIT equ -1 |
22 | DRV_EXIT equ -1 |
Line -... | Line 23... | ||
- | 23 | ||
- | 24 | THR_REG equ 0; x3f8 ;transtitter/reciever |
|
- | 25 | IER_REG equ 1; x3f9 ;interrupt enable |
|
- | 26 | IIR_REG equ 2; x3fA ;interrupt info |
|
- | 27 | LCR_REG equ 3; x3FB ;line control |
|
- | 28 | MCR_REG equ 4; x3FC ;modem control |
|
- | 29 | LSR_REG equ 5; x3FD ;line status |
|
Line 23... | Line 30... | ||
23 | 30 | MSR_REG equ 6; x3FE ;modem status |
|
24 | 31 | ||
25 | LCR_5BIT equ 0x00 |
32 | LCR_5BIT equ 0x00 |
26 | LCR_6BIT equ 0x01 |
33 | LCR_6BIT equ 0x01 |
Line 61... | Line 68... | ||
61 | 68 | ||
Line 62... | Line 69... | ||
62 | MCR_DTR equ 0x01 ;0-> DTR=1, 1-> DTR=0 |
69 | MCR_DTR equ 0x01 ;0-> DTR=1, 1-> DTR=0 |
63 | MCR_RTS equ 0x02 ;0-> RTS=1, 1-> RTS=0 |
70 | MCR_RTS equ 0x02 ;0-> RTS=1, 1-> RTS=0 |
64 | MCR_OUT_1 equ 0x04 ;0-> OUT1=1, 1-> OUT1=0 |
71 | MCR_OUT_1 equ 0x04 ;0-> OUT1=1, 1-> OUT1=0 |
65 | MCR_OUT_2 equ 0x08 ;0-> OUT2=1, 1-> OUT2=0 |
72 | MCR_OUT_2 equ 0x08 ;0-> OUT2=1, 1-> OUT2=0 enable intr |
66 | MCR_LOOP equ 0x10 ;lopback mode |
73 | MCR_LOOP equ 0x10 ;lopback mode |
Line 67... | Line 74... | ||
67 | 74 | ||
68 | MSR_DCTS equ 0x01 ;delta clear to send |
75 | MSR_DCTS equ 0x01 ;delta clear to send |
69 | MSR_DDSR equ 0x02 ;delta data set redy |
76 | MSR_DDSR equ 0x02 ;delta data set redy |
70 | MSR_TERI equ 0x04 ;trailinh edge of ring |
77 | MSR_TERI equ 0x04 ;trailinh edge of ring |
Line 71... | Line -... | ||
71 | MSR_DDCD equ 0x08 ;delta carrier detect |
- | |
72 | - | ||
73 | COM_THR equ 0x3f8 ;transtitter/reciever |
- | |
74 | COM_IER equ 0x3f9 ;interrupt enable |
- | |
75 | COM_IIR equ 0x3fA ;interrupt info |
- | |
76 | COM_LCR equ 0x3FB ;line control |
- | |
77 | COM_MCR equ 0x3FC ;modem control |
- | |
Line 78... | Line 78... | ||
78 | COM_LSR equ 0x3FD ;line status |
78 | MSR_DDCD equ 0x08 ;delta carrier detect |
79 | COM_MSR equ 0x3FE ;modem status |
79 | |
80 | 80 | ||
81 | RATE_50 equ 0 |
81 | RATE_50 equ 0 |
Line 97... | Line 97... | ||
97 | RATE_38400 equ 16 |
97 | RATE_38400 equ 16 |
98 | RATE_57600 equ 17 |
98 | RATE_57600 equ 17 |
99 | RATE_115200 equ 18 |
99 | RATE_115200 equ 18 |
100 | 100 | ||
Line 101... | Line 101... | ||
101 | COM_1 equ 0 |
101 | COM_1 equ 1 |
102 | COM_2 equ 1 |
102 | COM_2 equ 2 |
103 | COM_3 equ 2 |
103 | COM_3 equ 3 |
104 | COM_4 equ 3 |
104 | COM_4 equ 4 |
- | 105 | COM_MAX equ 2 ;only two port supported |
|
- | 106 | ||
- | 107 | COM_1_BASE equ 0x3F8 |
|
- | 108 | COM_2_BASE equ 0x2F8 |
|
Line 105... | Line 109... | ||
105 | 109 | ||
106 | COM_1_IRQ equ 4 |
110 | COM_1_IRQ equ 4 |
107 | COM_2_IRQ equ 3 |
- | |
Line -... | Line 111... | ||
- | 111 | COM_2_IRQ equ 3 |
|
- | 112 | ||
Line 108... | Line 113... | ||
108 | TRANSMIT equ 1 |
113 | UART_CLOSED equ 0 |
109 | 114 | UART_TRANSMIT equ 1 |
|
- | 115 | ||
- | 116 | struc UART |
|
110 | 117 | { |
|
111 | struc COMPORT |
118 | ; .owner dd ? unused |
112 | { |
119 | .lock dd ? |
113 | .base dd ? |
120 | .base dd ? |
114 | .lcr_reg dd ? |
121 | .lcr_reg dd ? |
115 | .mcr_reg dd ? |
122 | .mcr_reg dd ? |
116 | .rate dd ? |
- | |
Line 117... | Line 123... | ||
117 | .mode dd ? |
123 | .rate dd ? |
118 | .state dd ? |
124 | .mode dd ? |
119 | .connection dd ? |
125 | .state dd ? |
120 | - | ||
Line 121... | Line 126... | ||
121 | .rcvr_rp dd ? |
126 | |
122 | .rcvr_wp dd ? |
127 | .rcvr_rp dd ? |
123 | .rcvr_free dd ? |
128 | .rcvr_wp dd ? |
124 | .rcvr_count dd ? |
- | |
125 | - | ||
126 | .xmit_rp dd ? |
129 | .rcvr_free dd ? |
- | 130 | ||
- | 131 | .xmit_rp dd ? |
|
- | 132 | .xmit_wp dd ? |
|
- | 133 | .xmit_free dd ? |
|
- | 134 | .rcvr_buffer rb 128 |
|
- | 135 | .xmit_buffer rb 128 |
|
- | 136 | } |
|
- | 137 | virtual at 0 |
|
- | 138 | UART UART |
|
- | 139 | end virtual |
|
- | 140 | ||
- | 141 | RCVR_OFFSET equ 14*4 |
|
- | 142 | XMIT_OFFSET equ (13*4*128) |
|
- | 143 | UART_SIZE equ (256+13*4) |
|
- | 144 | ||
- | 145 | struc CONNECTION |
|
- | 146 | { |
|
- | 147 | .magic dd ? ;'CNCT' |
|
- | 148 | .destroy dd ? ;internal destructor |
|
- | 149 | .fd dd ? ;next object in list |
|
127 | .xmit_wp dd ? |
150 | .bk dd ? ;prev object in list |
- | 151 | .pid dd ? ;owner id |
|
128 | .xmit_free dd ? |
152 | |
129 | .xmit_count dd ? |
153 | .id dd ? ;reserved |
130 | .xmit_buffer rb 128 |
154 | .uart dd ? ;uart pointer |
Line 131... | Line 155... | ||
131 | .rcvr_buffer rb 128 |
155 | } |
Line 132... | Line 156... | ||
132 | } |
156 | |
Line 133... | Line 157... | ||
133 | virtual at 0 |
157 | virtual at 0 |
134 | COMPORT COMPORT |
158 | CONNECTION CONNECTION |
135 | end virtual |
159 | end virtual |
136 | 160 | ||
137 | COMPORT_SIZE equ 256+15*4 |
161 | CONNECTION_SIZE equ 7*4 |
Line 138... | Line 162... | ||
138 | 162 | ||
139 | UART_VERSION equ 0x00000000 |
163 | UART_VERSION equ 0x12345678 ;debug |
140 | 164 | ||
141 | init_com: |
165 | init_uart_service: |
142 | mov eax, COMPORT_SIZE |
166 | mov eax, UART_SIZE |
143 | call malloc |
167 | call malloc |
Line 144... | Line 168... | ||
144 | test eax, eax |
168 | test eax, eax |
- | 169 | jz .fail |
|
- | 170 | ||
- | 171 | mov [com1], eax |
|
Line 145... | Line 172... | ||
145 | jz .fail |
172 | mov edi, eax |
146 | 173 | mov ecx, UART_SIZE/4 |
|
147 | mov [com1], eax |
174 | xor eax, eax |
148 | mov edi, eax |
175 | cld |
149 | mov ecx, COMPORT_SIZE/4 |
176 | rep stosd |
150 | xor eax, eax |
177 | |
Line 189... | Line 216... | ||
189 | cmp eax, SRV_GETVERSION |
216 | cmp eax, SRV_GETVERSION |
190 | jne @F |
217 | jne @F |
Line 191... | Line 218... | ||
191 | 218 | ||
192 | mov eax, [ebx+output] |
- | |
193 | mov eax, [eax] |
219 | mov eax, [ebx+output] |
194 | mov [eax], dword UART_VERSION |
220 | mov [eax], dword UART_VERSION |
195 | xor eax, eax |
221 | xor eax, eax |
196 | ret |
222 | ret |
197 | @@: |
223 | @@: |
198 | cmp eax, PORT_OPEN |
224 | cmp eax, PORT_OPEN |
199 | jne @F |
- | |
200 | call open_port |
- | |
201 | ret |
- | |
202 | - | ||
203 | - | ||
204 | mov esi, [ebx+input] |
- | |
205 | mov ecx, [esi] |
- | |
206 | mov edx, [com1] |
- | |
207 | cmp [edx+COMPORT.connection], ecx |
- | |
208 | je @F |
- | |
209 | mov edx, [com2] |
- | |
210 | cmp [edx+COMPORT.connection], ecx |
- | |
Line -... | Line 225... | ||
- | 225 | jne @F |
|
- | 226 | ||
- | 227 | mov ebx, [ebx+input] |
|
- | 228 | mov eax, [ebx] |
|
211 | jne .fail |
229 | call uart_open |
- | 230 | mov ebx, [ioctl] |
|
- | 231 | mov ebx, [ebx+output] |
|
- | 232 | mov [ebx], ecx |
|
- | 233 | ret |
|
212 | 234 | @@: |
|
213 | mov edi, [ebx+output] |
235 | mov esi, [ebx+input] ;input buffer |
214 | call [uart_func+eax*4] ;edx, esi, edi |
- | |
215 | ret |
236 | call [uart_func+eax*4] |
216 | 237 | ret |
|
217 | .fail: |
238 | .fail: |
Line 218... | Line 239... | ||
218 | or eax, -1 |
239 | or eax, -1 |
Line 227... | Line 248... | ||
227 | restore output |
248 | restore output |
228 | restore out_size |
249 | restore out_size |
229 | 250 | ||
Line 230... | Line -... | ||
230 | - | ||
231 | open_port: |
- | |
232 | ret |
- | |
233 | - | ||
234 | ; param |
- | |
235 | ; edx= port |
- | |
236 | ; esi= input data |
- | |
237 | ; edi= output data |
- | |
238 | ; |
- | |
239 | ; retval |
- | |
240 | ; eax=0 success |
- | |
241 | ; eax <>0 error |
- | |
242 | - | ||
243 | align 4 |
- | |
244 | close_port: |
- | |
245 | - | ||
246 | call reset |
- | |
247 | mov [edx+COMPORT.connection], 0 |
- | |
248 | xor eax, eax |
- | |
249 | ret |
- | |
250 | - | ||
251 | 251 | ||
- | 252 | ; set mode 2400 bod 8-bit |
|
252 | ; set mode 2400 bod 8-bit |
253 | ; disable DTR & RTS |
253 | ; clear FIFO |
254 | ; clear FIFO |
- | 255 | ; clear pending interrupts |
|
- | 256 | ; |
|
- | 257 | ; param |
|
Line 254... | Line 258... | ||
254 | ; clear pending interrupts |
258 | ; eax= uart |
255 | 259 | ||
- | 260 | align 4 |
|
- | 261 | uart_reset: |
|
- | 262 | mov esi, eax |
|
- | 263 | mov [eax+UART.state], UART_CLOSED |
|
- | 264 | mov edx, [eax+UART.base] |
|
- | 265 | add edx, MCR_REG |
|
- | 266 | xor eax, eax |
|
- | 267 | out dx, al ;clear DTR & RTS |
|
256 | align 4 |
268 | |
257 | reset: |
269 | mov eax, esi |
258 | mov eax, RATE_2400 |
270 | mov ebx, RATE_2400 |
Line -... | Line 271... | ||
- | 271 | mov ecx, LCR_8BIT+LCR_STOP_1 |
|
- | 272 | call uart_set_mode.internal |
|
259 | mov ebx, LCR_8BIT+LCR_STOP_1 |
273 | |
260 | call set_mode |
- | |
261 | 274 | mov edx, [esi+UART.base] |
|
262 | mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14 |
- | |
263 | mov edx, COM_IIR |
275 | add edx, IIR_REG |
- | 276 | mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14 |
|
264 | out dx, al |
277 | out dx, al |
265 | 278 | .clear_RB: |
|
266 | .clear_RB: |
279 | mov edx, [esi+UART.base] |
267 | mov edx, COM_LSR |
280 | add edx, LSR_REG |
Line 268... | Line 281... | ||
268 | in al, dx |
281 | in al, dx |
269 | test eax, LSR_DR |
282 | test eax, LSR_DR |
270 | jz @F |
283 | jz @F |
271 | 284 | ||
- | 285 | mov edx, [esi+UART.base] |
|
- | 286 | in al, dx |
|
272 | mov edx, COM_THR |
287 | jmp .clear_RB |
273 | in al, dx |
- | |
274 | jmp .clear_RB |
288 | @@: |
275 | @@: |
- | |
276 | mov eax,IER_RDAI+IER_THRI+IER_LSI |
289 | mov edx, [esi+UART.base] |
- | 290 | add edx, IER_REG |
|
277 | mov edx, COM_IER |
291 | mov eax,IER_RDAI+IER_THRI+IER_LSI |
278 | out dx, al |
292 | out dx, al |
279 | 293 | .clear_IIR: |
|
280 | .clear_IIR: |
294 | mov edx, [esi+UART.base] |
Line 281... | Line 295... | ||
281 | mov edx, COM_IIR |
295 | add edx, IIR_REG |
282 | in al, dx |
296 | in al, dx |
283 | test al, IIR_INTR |
297 | test al, IIR_INTR |
Line -... | Line 298... | ||
- | 298 | jnz .done |
|
284 | jnz .done |
299 | |
285 | 300 | shr eax, 1 |
|
286 | shr eax, 1 |
301 | and eax, 3 |
287 | and eax, 3 |
302 | jnz @F |
288 | jnz @F |
303 | |
289 | 304 | mov edx, [esi+UART.base] |
|
Line 290... | Line 305... | ||
290 | mov edx, COM_MSR |
305 | add edx, MSR_REG |
291 | in al, dx |
306 | in al, dx |
Line 292... | Line 307... | ||
292 | jmp .clear_IIR |
307 | jmp .clear_IIR |
293 | @@: |
308 | @@: |
294 | cmp eax, 1 |
309 | cmp eax, 1 |
295 | je .clear_IIR |
310 | je .clear_IIR |
- | 311 | ||
296 | 312 | cmp eax, 2 |
|
297 | cmp eax, 2 |
313 | jne @F |
298 | jne @F |
314 | |
299 | - | ||
300 | mov edx, COM_THR |
315 | mov edx, [esi+UART.base] |
301 | in al, dx |
316 | in al, dx |
302 | jmp .clear_IIR |
- | |
303 | @@: |
317 | jmp .clear_IIR |
- | 318 | @@: |
|
Line 304... | Line 319... | ||
304 | mov edx, COM_LSR |
319 | mov edx, [esi+UART.base] |
305 | in al, dx |
320 | add edx, LSR_REG |
306 | jmp .clear_IIR |
321 | in al, dx |
307 | - | ||
308 | .done: |
- | |
309 | mov edi, rcvr_buff |
322 | jmp .clear_IIR |
310 | xor eax, eax |
323 | .done: |
311 | mov ecx, 256/4 |
324 | lea edi, [esi+UART.rcvr_buffer] |
312 | - | ||
Line 313... | Line 325... | ||
313 | mov [rcvr_rp], edi |
325 | mov ecx, 256/4 |
314 | mov [rcvr_wp], edi |
326 | xor eax, eax |
315 | mov [rcvr_free], 128 |
327 | |
Line -... | Line 328... | ||
- | 328 | mov [esi+UART.rcvr_rp], eax |
|
316 | ;; mov [rcvr_count], 16 |
329 | mov [esi+UART.rcvr_wp], eax |
- | 330 | mov [esi+UART.rcvr_free], 128 |
|
317 | 331 | mov [esi+UART.xmit_rp], eax |
|
- | 332 | mov [esi+UART.xmit_wp], eax |
|
- | 333 | mov [esi+UART.xmit_free], 128 |
|
- | 334 | ||
- | 335 | cld |
|
318 | mov [xmit_rp], xmit_buff |
336 | rep stosd |
Line 319... | Line 337... | ||
319 | mov [xmit_wp], xmit_buff |
337 | ret |
320 | mov [xmit_free], 128 |
338 | |
- | 339 | ||
- | 340 | ; param |
|
- | 341 | ; esi= input buffer |
|
- | 342 | ; +0 connection |
|
- | 343 | ; +4 rate |
|
- | 344 | ; +8 mode |
|
- | 345 | ; |
|
- | 346 | ; retval |
|
- | 347 | ; eax= error code |
|
- | 348 | ||
- | 349 | align 4 |
|
- | 350 | uart_set_mode: |
|
- | 351 | mov eax, [esi] |
|
- | 352 | cmp [eax+APPOBJ.magic], 'CNCT' |
|
- | 353 | jne .fail |
|
- | 354 | ||
- | 355 | cmp [eax+APPOBJ.destroy], uart_close.destroy |
|
- | 356 | jne .fail |
|
- | 357 | ||
- | 358 | mov eax, [eax+CONNECTION.uart] |
|
- | 359 | test eax, eax |
|
321 | mov [xmit_count], 16 ;FIFO free |
360 | jz .fail |
322 | 361 | ||
Line 323... | Line 362... | ||
323 | cld |
362 | mov ebx, [esi+4] |
324 | rep stosd |
363 | mov ecx, [esi+8] |
Line 325... | Line 364... | ||
325 | ret |
364 | |
326 | 365 | ; param |
|
Line -... | Line 366... | ||
- | 366 | ; eax= uart |
|
327 | ; param |
367 | ; ebx= baud rate |
Line -... | Line 368... | ||
- | 368 | ; ecx= mode |
|
- | 369 | ||
328 | ; eax= rate constant |
370 | align 4 |
329 | ; ebx= mode bits |
371 | .internal: |
330 | 372 | cmp ebx, RATE_115200 |
|
331 | align 4 |
373 | ja .fail |
Line 332... | Line 374... | ||
332 | set_mode: |
374 | |
333 | cmp eax, RATE_115200 |
375 | cmp ecx, LCR_BREAK |
334 | ja .fail |
376 | jae .fail |
Line 335... | Line 377... | ||
335 | 377 | ||
336 | cmp ebx, LCR_BREAK |
378 | mov [eax+UART.rate], ebx |
337 | jae .fail |
379 | mov [eax+UART.mode], ecx |
Line 338... | Line 380... | ||
338 | 380 | ||
339 | mov [rate], eax |
381 | mov esi, eax |
- | 382 | mov bx, [divisor+ebx*2] |
|
- | 383 | ||
- | 384 | mov edx, [esi+UART.base] |
|
- | 385 | push edx |
|
- | 386 | add edx, LCR_REG |
|
- | 387 | in al, dx |
|
- | 388 | or al, 0x80 |
|
- | 389 | out dx, al |
|
- | 390 | ||
- | 391 | pop edx |
|
- | 392 | mov al, bl |
|
- | 393 | out dx, al |
|
- | 394 | ||
- | 395 | inc dx |
|
- | 396 | mov al, bh |
|
340 | mov [mode], ebx |
397 | out dx, al |
- | 398 | ||
- | 399 | add edx, LCR_REG-1 |
|
- | 400 | mov eax, ecx |
|
- | 401 | out dx, al |
|
- | 402 | xor eax, eax |
|
- | 403 | ret |
|
- | 404 | .fail: |
|
- | 405 | or eax, -1 |
|
- | 406 | ret |
|
- | 407 | ||
- | 408 | ||
- | 409 | align 4 |
|
- | 410 | uart_set_modem: |
|
- | 411 | ||
- | 412 | mov [eax+UART.mcr_reg], ebx |
|
- | 413 | mov edx, [eax+UART.base] |
|
- | 414 | add edx, MCR_REG |
|
- | 415 | mov al, bl |
|
- | 416 | out dx, al |
|
- | 417 | ret |
|
- | 418 | ||
- | 419 | ; param |
|
- | 420 | ; eax= port |
|
- | 421 | ; |
|
- | 422 | ; retval |
|
- | 423 | ; ecx= connection |
|
- | 424 | ; eax= error code |
|
- | 425 | ||
- | 426 | align 4 |
|
- | 427 | uart_open: |
|
- | 428 | dec eax |
|
- | 429 | cmp eax, COM_MAX |
|
- | 430 | jae .fail |
|
- | 431 | ||
- | 432 | mov esi, [com1+eax*4] ;uart |
|
- | 433 | push esi |
|
- | 434 | .do_wait: |
|
- | 435 | cmp dword [esi+UART.lock],0 |
|
- | 436 | je .get_lock |
|
- | 437 | call change_task |
|
- | 438 | jmp .do_wait |
|
- | 439 | .get_lock: |
|
- | 440 | mov eax, 1 |
|
- | 441 | xchg eax, [esi+UART.lock] |
|
- | 442 | test eax, eax |
|
- | 443 | jnz .do_wait |
|
341 | 444 | ||
- | 445 | mov eax, esi ;uart |
|
342 | mov cx, [divisor+eax*2] |
446 | call uart_reset |
- | 447 | ||
Line 343... | Line 448... | ||
343 | 448 | mov ebx, [CURRENT_TASK] |
|
- | 449 | shl ebx, 5 |
|
- | 450 | mov ebx, [CURRENT_TASK+ebx+4] |
|
- | 451 | mov eax, CONNECTION_SIZE |
|
- | 452 | call create_kernel_object |
|
- | 453 | pop esi ;uart |
|
- | 454 | test eax, eax |
|
- | 455 | jz .fail |
|
- | 456 | ||
- | 457 | mov [eax+APPOBJ.magic], 'CNCT' |
|
- | 458 | mov [eax+APPOBJ.destroy], uart_close.destroy |
|
- | 459 | mov [eax+CONNECTION.uart], esi |
|
- | 460 | mov ecx, eax |
|
- | 461 | xor eax, eax |
|
- | 462 | ret |
|
- | 463 | .fail: |
|
- | 464 | or eax, -1 |
|
- | 465 | ret |
|
- | 466 | restore .uart |
|
- | 467 | ||
- | 468 | ; param |
|
- | 469 | ; esi= input buffer |
|
- | 470 | ||
- | 471 | align 4 |
|
- | 472 | uart_close: |
|
- | 473 | mov eax, [esi] |
|
- | 474 | cmp [eax+APPOBJ.magic], 'CNCT' |
|
- | 475 | jne .fail |
|
- | 476 | ||
344 | mov dx, COM_LCR |
477 | cmp [eax+APPOBJ.destroy], uart_close.destroy |
Line 345... | Line 478... | ||
345 | in al, dx |
478 | jne .fail |
346 | or al, 0x80 |
479 | .destroy: |
347 | out dx, al |
480 | push [eax+CONNECTION.uart] |
348 | 481 | call destroy_kernel_object ;eax= object |
|
Line 349... | Line 482... | ||
349 | mov dx, COM_THR |
482 | pop eax ;eax= uart |
350 | mov al, cl |
483 | test eax, eax |
Line -... | Line 484... | ||
- | 484 | jz .fail |
|
351 | out dx, al |
485 | |
352 | 486 | mov [eax+UART.state], UART_CLOSED |
|
- | 487 | mov [eax+UART.lock], 0 ;release port |
|
353 | inc dx |
488 | xor eax, eax |
354 | mov al, ch |
489 | ret |
Line 355... | Line 490... | ||
355 | out dx, al |
490 | .fail: |
356 | 491 | or eax, -1 |
|
357 | mov dx, COM_LCR |
492 | ret |
Line 358... | Line 493... | ||
358 | mov eax, ebx |
493 | |
359 | out dx, al |
494 | |
360 | .fail: |
495 | ; param |
Line 361... | Line 496... | ||
361 | ret |
496 | ; eax= uart |
362 | 497 | ; ebx= baud rate |
|
363 | ; param |
498 | |
364 | ; eax= rate constant |
499 | align 4 |
365 | 500 | set_rate: |
|
Line -... | Line 501... | ||
- | 501 | cmp ebx, RATE_115200 |
|
- | 502 | ja .fail |
|
- | 503 | ||
- | 504 | mov [eax+UART.rate], ebx |
|
366 | align 4 |
505 | mov bx, [divisor+ebx*2] |
367 | set_rate: |
506 | |
368 | cmp eax, RATE_115200 |
507 | mov edx, [eax+UART.base] |
369 | ja .fail |
508 | add edx, LCR_REG |
- | 509 | in al, dx |
|
Line 370... | Line 510... | ||
370 | 510 | push eax |
|
Line 371... | Line 511... | ||
371 | mov [rate], eax |
511 | or al, 0x80 |
372 | mov bx, [divisor+eax*2] |
512 | out dx, al |
Line -... | Line 513... | ||
- | 513 | ||
373 | 514 | sub edx, LCR_REG |
|
- | 515 | mov al, bl |
|
374 | mov dx, COM_LCR |
516 | out dx, al |
Line 375... | Line 517... | ||
375 | in al, dx |
517 | |
376 | or al, 0x80 |
518 | inc edx |
377 | out dx, al |
519 | mov al, bh |
378 | 520 | out dx, al |
|
379 | mov dx, COM_THR |
521 | |
380 | mov al, bl |
522 | pop eax |
Line 381... | Line 523... | ||
381 | out dx, al |
523 | add edx, LCR_REG-1 |
382 | 524 | out dx, al |
|
383 | inc dx |
525 | .fail: |
384 | mov al, bh |
526 | ret |
Line 385... | Line 527... | ||
385 | out dx, al |
527 | |
386 | 528 | ||
387 | mov dx, COM_LCR |
529 | ; param |
388 | mov eax, [lcr_reg] |
- | |
389 | out dx, al |
530 | ; ebx= uart |
390 | .fail: |
531 | |
391 | ret |
532 | align 4 |
392 | 533 | transmit: |
|
393 | align 4 |
534 | push esi |
- | 535 | push edi |
|
- | 536 | push ebp |
|
394 | transmit: |
537 | |
395 | push esi |
538 | mov edx, [ebx+UART.base] |
Line 396... | Line 539... | ||
396 | mov edx, COM_THR |
539 | |
- | 540 | pushfd |
|
397 | 541 | cli |
|
398 | mov [xmit_count], 16 |
542 | |
Line 399... | Line 543... | ||
399 | 543 | mov ebp, 16 |
|
400 | pushfd |
544 | mov esi, [ebx+UART.xmit_rp] |
401 | cli |
545 | lea edi, [ebx+UART.xmit_buffer] |
402 | 546 | mov ecx, [ebx+UART.xmit_free] |
|
- | 547 | ||
403 | mov esi, [xmit_rp] |
548 | cmp ecx, 128 |
404 | mov ecx, [xmit_free] |
549 | je .exit |
405 | 550 | @@: |
|
406 | cmp ecx, 128 |
551 | and esi, 127 |
407 | je .exit |
552 | mov al, [esi+edi] |
408 | @@: |
553 | inc esi |
Line 409... | Line 554... | ||
409 | and esi, 127 |
554 | |
410 | mov al, [xmit_buff+esi] |
555 | out dx, al |
Line -... | Line 556... | ||
- | 556 | inc ecx |
|
- | 557 | dec ebp |
|
411 | inc esi |
558 | jz .done |
- | 559 | ||
- | 560 | cmp ecx, 128 |
|
- | 561 | jne @B |
|
412 | 562 | .done: |
|
413 | out dx, al |
563 | mov [ebx+UART.xmit_rp], esi |
414 | inc ecx |
564 | mov [ebx+UART.xmit_free], ecx |
415 | dec [xmit_count] |
565 | mov [ebx+UART.state], UART_TRANSMIT |
- | 566 | .exit: |
|
416 | jz .done |
567 | popfd |
417 | 568 | pop ebp |
|
Line 418... | Line 569... | ||
418 | cmp ecx, 128 |
569 | pop edi |
419 | jne @B |
570 | pop esi |
420 | .done: |
571 | ret |
421 | add esi, xmit_buff |
572 | |
422 | mov [xmit_rp], esi |
573 | ; param |
423 | mov [xmit_free], ecx |
574 | ; eax= uart |
424 | mov [com_state], TRANSMIT |
575 | ; ebx= src |
425 | .exit: |
576 | ; edx= count |
Line -... | Line 577... | ||
- | 577 | ||
426 | popfd |
578 | align 4 |
427 | pop esi |
579 | uart_write: |
Line 428... | Line 580... | ||
428 | ret |
580 | mov esi, ebx |
429 | 581 | mov edi, [eax+UART.xmit_wp] |
|
430 | 582 | lea ebx, [eax+UART.xmit_buffer] |
|
431 | ; eax= src |
583 | .write: |
432 | ; ebx= count |
- | |
433 | 584 | test edx, edx |
|
- | 585 | jz .done |
|
434 | align 4 |
586 | .wait: |
435 | comm_send: |
587 | cmp [eax+UART.xmit_free], 0 |
- | 588 | jne .fill |
|
436 | mov edi, [xmit_wp] |
589 | |
437 | mov esi, eax |
590 | cmp [eax+UART.state], UART_TRANSMIT |
438 | .write: |
591 | je .wait |
Line 439... | Line 592... | ||
439 | test ebx, ebx |
592 | |
440 | jz .done |
593 | mov ebx, eax |
- | 594 | push edx |
|
- | 595 | call transmit |
|
- | 596 | pop edx |
|
- | 597 | mov eax, ebx |
|
- | 598 | lea ebx, [ebx+UART.xmit_buffer] |
|
Line 441... | Line 599... | ||
441 | .wait: |
599 | jmp .write |
- | 600 | .fill: |
|
442 | cmp [xmit_free], 0 |
601 | mov ecx, 128 |
443 | jne .fill |
602 | sub ecx, edi |
Line 444... | Line 603... | ||
444 | 603 | jz .clip |
|
445 | cmp [com_state], TRANSMIT |
604 | cmp ecx, [eax+UART.xmit_free] |
Line 496... | Line 655... | ||
496 | ret |
655 | ret |
497 | 656 | ||
Line 498... | Line 657... | ||
498 | align 4 |
657 | align 4 |
499 | isr_line: |
658 | isr_line: |
- | 659 | mov edx, [ebx+UART.base] |
|
500 | mov edx, COM_LSR |
660 | add edx, LSR_REG |
501 | in al, dx |
661 | in al, dx |
502 | ret |
662 | ret |
Line 503... | Line 663... | ||
503 | 663 | ||
504 | align 4 |
664 | align 4 |
505 | isr_recieve: |
665 | isr_recieve: |
506 | mov edx, COM_THR |
666 | mov edx, [ebx+UART.base] |
507 | in al, dx |
667 | in al, dx |
Line 508... | Line 668... | ||
508 | ret |
668 | ret |
509 | 669 | ||
- | 670 | align 4 |
|
510 | align 4 |
671 | isr_modem: |
511 | isr_modem: |
672 | mov edx, [ebx+UART.base] |
512 | mov edx, COM_MSR |
673 | add edx, MSR_REG |
Line -... | Line 674... | ||
- | 674 | in al, dx |
|
- | 675 | ret |
|
- | 676 | ||
Line 513... | Line 677... | ||
513 | in al, dx |
677 | |
514 | ret |
678 | align 4 |
515 | 679 | com1 dd 0 |
|
516 | 680 | com2 dd 0 |
|
- | 681 | ||
- | 682 | align 4 |
|
- | 683 | uart_func dd 0 ;SRV_GETVERSION |
|
- | 684 | dd 0 ;PORT_OPEN |
|
- | 685 | dd uart_close ;PORT_CLOSE |
|
- | 686 | dd 0 ;PORT_RESET |
|
- | 687 | dd uart_set_mode ;PORT_SETMODE |
|
- | 688 | ; dd uart.get_mode ;PORT_GETMODE |
|
- | 689 | ; dd uart.set_mcr ;PORT_SETMCR |
|
Line 517... | Line 690... | ||
517 | 690 | ;PORT_GETMCR equ 7 |
|
518 | align 4 |
691 | ;PORT_READ equ 8 |
519 | uart_func dd 0 ;get version |
692 | ;PORT_WRITE equ 9 |
520 | dd 0 ;open port |
693 | |
Line -... | Line 694... | ||
- | 694 | ||
Line 521... | Line 695... | ||
521 | dd close_port |
695 | |
522 | 696 | ||
523 | 697 | isr_action dd isr_modem |
|
Line 524... | Line 698... | ||
524 | isr_action dd isr_modem |
698 | dd transmit |
Line 525... | Line -... | ||
525 | dd transmit |
- | |
526 | dd isr_recieve |
- | |
527 | dd isr_line |
- | |
528 | - | ||
529 | - | ||
530 | divisor dw 2304, 1536, 1047, 857, 768, 384 |
- | |
531 | dw 192, 96, 64, 58, 48, 32 |
- | |
Line 532... | Line -... | ||
532 | dw 24, 16, 12, 6, 3, 2, 1 |
- | |
533 | - | ||
534 | - | ||
535 | - | ||
536 | sz_uart_srv db 'UART',0 |
- | |
537 | - | ||
538 | ;version dd 0x00040000 |
- | |
539 | - | ||
540 | - | ||
541 | align 4 |
- | |
542 | - | ||
543 | com1 dd ? |
- | |
544 | com2 dd ? |
- | |
545 | - | ||
546 | rcvr_rp dd ? |
- | |
547 | rcvr_wp dd ? |
- | |
548 | rcvr_free dd ? |
- | |
549 | rcvr_count dd ? |
- | |
550 | - | ||
551 | xmit_rp dd ? |
- | |
552 | xmit_wp dd ? |
- |