Rev 414 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
405 | serge | 1 | |
2 | ;new_app_base equ 0x60400000 |
||
3 | ;PROC_BASE equ OS_BASE+0x0080000 |
||
4 | |||
5 | |||
6 | { .handle dd ? |
||
7 | .io_code dd ? |
||
8 | .input dd ? |
||
9 | .inp_size dd ? |
||
10 | .output dd ? |
||
11 | .out_size dd ? |
||
12 | } |
||
13 | |||
14 | |||
15 | |||
16 | ;public service_proc |
||
17 | ;public version |
||
18 | |||
19 | |||
20 | |||
21 | |||
22 | DRV_EXIT equ -1 |
||
23 | |||
24 | |||
413 | serge | 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 |
||
30 | MSR_REG equ 6; x3FE ;modem status |
||
31 | |||
405 | serge | 32 | |
33 | LCR_6BIT equ 0x01 |
||
34 | LCR_7BIT equ 0x02 |
||
35 | LCR_8BIT equ 0x03 |
||
36 | LCR_STOP_1 equ 0x00 |
||
37 | LCR_STOP_2 equ 0x04 |
||
38 | LCR_PARITY equ 0x08 |
||
39 | LCR_EVEN equ 0x10 |
||
40 | LCR_STICK equ 0x20 |
||
41 | LCR_BREAK equ 0x40 |
||
42 | LCR_DLAB equ 0x80 |
||
43 | |||
44 | |||
45 | LSR_OE equ 0x02 ;overrun error |
||
46 | LSR_PE equ 0x04 ;parity error |
||
47 | LSR_FE equ 0x08 ;framing error |
||
48 | LSR_BI equ 0x10 ;break interrupt |
||
49 | LSR_THRE equ 0x20 ;transmitter holding empty |
||
50 | LSR_TEMT equ 0x40 ;transmitter empty |
||
51 | LSR_FER equ 0x80 ;FIFO error |
||
52 | |||
53 | |||
54 | FCR_CRB equ 0x02 ;clear reciever FIFO |
||
55 | FCR_CXMIT equ 0x04 ;clear transmitter FIFO |
||
56 | FCR_RDY equ 0x08 ;set RXRDY and TXRDY pins |
||
57 | FCR_FIFO_1 equ 0x00 ;1 byte trigger |
||
58 | FCR_FIFO_4 equ 0x40 ;4 bytes trigger |
||
59 | FCR_FIFO_8 equ 0x80 ;8 bytes trigger |
||
60 | FCR_FIFO_14 equ 0xC0 ;14 bytes trigger |
||
61 | |||
62 | |||
63 | |||
64 | |||
65 | IER_THRI equ 0x02 ;transmitter empty interrupt |
||
66 | IER_LSI equ 0x04 ;line status interrupt |
||
67 | IER_MSI equ 0x08 ;modem status interrupt |
||
68 | |||
69 | |||
70 | MCR_RTS equ 0x02 ;0-> RTS=1, 1-> RTS=0 |
||
71 | MCR_OUT_1 equ 0x04 ;0-> OUT1=1, 1-> OUT1=0 |
||
72 | MCR_OUT_2 equ 0x08 ;0-> OUT2=1, 1-> OUT2=0; enable intr |
||
414 | serge | 73 | MCR_LOOP equ 0x10 ;lopback mode |
405 | serge | 74 | |
75 | |||
76 | MSR_DDSR equ 0x02 ;delta data set redy |
||
77 | MSR_TERI equ 0x04 ;trailinh edge of ring |
||
78 | MSR_DDCD equ 0x08 ;delta carrier detect |
||
79 | |||
80 | |||
81 | |||
82 | RATE_75 equ 1 |
||
83 | RATE_110 equ 2 |
||
84 | RATE_134 equ 3 |
||
85 | RATE_150 equ 4 |
||
86 | RATE_300 equ 5 |
||
87 | RATE_600 equ 6 |
||
88 | RATE_1200 equ 7 |
||
89 | RATE_1800 equ 8 |
||
90 | RATE_2000 equ 9 |
||
91 | RATE_2400 equ 10 |
||
92 | RATE_3600 equ 11 |
||
93 | RATE_4800 equ 12 |
||
94 | RATE_7200 equ 13 |
||
95 | RATE_9600 equ 14 |
||
96 | RATE_19200 equ 15 |
||
97 | RATE_38400 equ 16 |
||
98 | RATE_57600 equ 17 |
||
99 | RATE_115200 equ 18 |
||
100 | |||
101 | |||
413 | serge | 102 | COM_2 equ 2 |
103 | COM_3 equ 3 |
||
104 | COM_4 equ 4 |
||
105 | COM_MAX equ 2 ;only two port supported |
||
106 | |||
405 | serge | 107 | |
413 | serge | 108 | COM_2_BASE equ 0x2F8 |
109 | |||
110 | |||
405 | serge | 111 | COM_2_IRQ equ 3 |
112 | |||
113 | |||
413 | serge | 114 | UART_TRANSMIT equ 1 |
115 | UART_STOP equ 2 |
||
414 | serge | 116 | |
405 | serge | 117 | |
413 | serge | 118 | { |
405 | serge | 119 | .lock dd ? |
413 | serge | 120 | .base dd ? |
405 | serge | 121 | .lcr_reg dd ? |
122 | .mcr_reg dd ? |
||
123 | .rate dd ? |
||
124 | .mode dd ? |
||
125 | .state dd ? |
||
126 | |||
127 | |||
416 | serge | 128 | .rcvr_rp dd ? |
405 | serge | 129 | .rcvr_wp dd ? |
130 | .rcvr_count dd ? |
||
416 | serge | 131 | .rcvr_top dd ? |
132 | |||
405 | serge | 133 | |
414 | serge | 134 | .xmit_rp dd ? |
405 | serge | 135 | .xmit_wp dd ? |
136 | .xmit_count dd ? |
||
414 | serge | 137 | .xmit_free dd ? |
405 | serge | 138 | .xmit_top dd ? |
414 | serge | 139 | } |
405 | serge | 140 | virtual at 0 |
141 | UART UART |
||
413 | serge | 142 | end virtual |
405 | serge | 143 | |
144 | |||
416 | serge | 145 | |
405 | serge | 146 | |
413 | serge | 147 | { |
148 | .magic dd ? ;'CNCT' |
||
149 | .destroy dd ? ;internal destructor |
||
150 | .fd dd ? ;next object in list |
||
151 | .bk dd ? ;prev object in list |
||
152 | .pid dd ? ;owner id |
||
153 | |||
405 | serge | 154 | |
413 | serge | 155 | .uart dd ? ;uart pointer |
156 | } |
||
157 | |||
158 | |||
159 | CONNECTION CONNECTION |
||
160 | end virtual |
||
161 | |||
162 | |||
163 | |||
164 | |||
165 | |||
166 | |||
167 | mov eax, UART_SIZE |
||
168 | call malloc |
||
405 | serge | 169 | test eax, eax |
170 | jz .fail |
||
171 | |||
172 | |||
173 | mov edi, eax |
||
174 | mov ecx, UART_SIZE/4 |
||
413 | serge | 175 | xor eax, eax |
405 | serge | 176 | cld |
177 | rep stosd |
||
178 | |||
179 | |||
413 | serge | 180 | mov [eax+UART.base], COM_1_BASE |
181 | |||
405 | serge | 182 | |
416 | serge | 183 | |
413 | serge | 184 | |
414 | serge | 185 | mov edx, eax |
186 | |||
416 | serge | 187 | |
188 | add eax, 8192 |
||
189 | mov [edi+UART.rcvr_top], eax |
||
190 | add eax, 8192 |
||
191 | mov [edi+UART.xmit_buff], eax |
||
414 | serge | 192 | add eax, 8192 |
193 | mov [edi+UART.xmit_top], eax |
||
194 | |||
195 | |||
196 | test eax, eax |
||
197 | jz .fail |
||
198 | |||
199 | |||
200 | or eax, PG_SW |
||
201 | mov [page_tabs+edx*4], eax |
||
202 | mov [page_tabs+edx*4+8], eax |
||
203 | |||
204 | |||
205 | test eax, eax |
||
206 | jz .fail |
||
207 | |||
208 | |||
209 | mov [page_tabs+edx*4+4], eax |
||
210 | mov [page_tabs+edx*4+12], eax |
||
211 | |||
212 | |||
416 | serge | 213 | test eax, eax |
214 | jz .fail |
||
215 | |||
216 | |||
217 | mov [page_tabs+edx*4+16], eax |
||
218 | mov [page_tabs+edx*4+24], eax |
||
219 | |||
220 | |||
221 | test eax, eax |
||
222 | jz .fail |
||
223 | |||
224 | |||
225 | mov [page_tabs+edx*4+20], eax |
||
226 | mov [page_tabs+edx*4+28], eax |
||
227 | |||
228 | |||
229 | invlpg [eax] |
||
414 | serge | 230 | invlpg [eax+0x1000] |
231 | invlpg [eax+0x2000] |
||
232 | invlpg [eax+0x3000] |
||
233 | invlpg [eax+0x4000] |
||
416 | serge | 234 | invlpg [eax+0x5000] |
235 | invlpg [eax+0x6000] |
||
236 | invlpg [eax+0x7000] |
||
237 | |||
414 | serge | 238 | |
239 | call uart_reset.internal ;eax= uart |
||
240 | |||
241 | |||
413 | serge | 242 | stdcall reg_service, sz_uart_srv, uart_proc |
405 | serge | 243 | ret |
244 | .fail: |
||
245 | xor eax, eax |
||
246 | ret |
||
247 | |||
248 | |||
249 | io_code equ IOCTL.io_code |
||
250 | input equ IOCTL.input |
||
251 | inp_size equ IOCTL.inp_size |
||
252 | output equ IOCTL.output |
||
253 | out_size equ IOCTL.out_size |
||
254 | |||
255 | |||
256 | PORT_OPEN equ 1 |
||
257 | PORT_CLOSE equ 2 |
||
258 | PORT_RESET equ 3 |
||
259 | PORT_SETMODE equ 4 |
||
260 | PORT_GETMODE equ 5 |
||
261 | PORT_SETMCR equ 6 |
||
262 | PORT_GETMCR equ 7 |
||
263 | PORT_READ equ 8 |
||
264 | PORT_WRITE equ 9 |
||
265 | |||
266 | |||
267 | proc uart_proc stdcall, ioctl:dword |
||
268 | |||
269 | |||
270 | mov eax, [ebx+io_code] |
||
271 | cmp eax, PORT_WRITE |
||
272 | ja .fail |
||
273 | |||
274 | |||
275 | jne @F |
||
276 | |||
277 | |||
278 | mov [eax], dword UART_VERSION |
||
279 | xor eax, eax |
||
280 | ret |
||
281 | @@: |
||
282 | cmp eax, PORT_OPEN |
||
283 | jne @F |
||
284 | |||
285 | |||
413 | serge | 286 | mov eax, [ebx] |
287 | call uart_open |
||
288 | mov ebx, [ioctl] |
||
289 | mov ebx, [ebx+output] |
||
290 | mov [ebx], ecx |
||
291 | ret |
||
405 | serge | 292 | @@: |
413 | serge | 293 | mov esi, [ebx+input] ;input buffer |
294 | mov edi, [ebx+output] |
||
414 | serge | 295 | call [uart_func+eax*4] |
413 | serge | 296 | ret |
297 | .fail: |
||
405 | serge | 298 | or eax, -1 |
299 | ret |
||
300 | |||
301 | |||
302 | |||
303 | |||
304 | restore io_code |
||
305 | restore input |
||
306 | restore inp_size |
||
307 | restore output |
||
308 | restore out_size |
||
309 | |||
310 | |||
311 | |||
414 | serge | 312 | ; esi= input buffer |
313 | ; +0 connection |
||
314 | ; |
||
315 | ; retval |
||
316 | ; eax= error code |
||
317 | |||
318 | |||
319 | uart_reset: |
||
320 | mov eax, [esi] |
||
321 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
322 | jne .fail |
||
323 | |||
324 | |||
325 | jne .fail |
||
326 | |||
327 | |||
328 | test eax, eax |
||
329 | jz .fail |
||
330 | |||
331 | |||
413 | serge | 332 | ; disable DTR & RTS |
333 | ; clear FIFO |
||
334 | ; clear pending interrupts |
||
335 | ; |
||
336 | ; param |
||
405 | serge | 337 | ; eax= uart |
413 | serge | 338 | |
405 | serge | 339 | |
340 | .internal: |
||
414 | serge | 341 | mov esi, eax |
413 | serge | 342 | mov [eax+UART.state], UART_CLOSED |
343 | mov edx, [eax+UART.base] |
||
344 | add edx, MCR_REG |
||
345 | xor eax, eax |
||
405 | serge | 346 | out dx, al ;clear DTR & RTS |
413 | serge | 347 | |
405 | serge | 348 | |
413 | serge | 349 | mov ebx, RATE_2400 |
350 | mov ecx, LCR_8BIT+LCR_STOP_1 |
||
351 | call uart_set_mode.internal |
||
352 | |||
405 | serge | 353 | |
413 | serge | 354 | add edx, IIR_REG |
355 | mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14 |
||
405 | serge | 356 | out dx, al |
357 | .clear_RB: |
||
358 | mov edx, [esi+UART.base] |
||
413 | serge | 359 | add edx, LSR_REG |
360 | in al, dx |
||
405 | serge | 361 | test eax, LSR_DR |
362 | jz @F |
||
363 | |||
364 | |||
413 | serge | 365 | in al, dx |
405 | serge | 366 | jmp .clear_RB |
367 | @@: |
||
368 | mov edx, [esi+UART.base] |
||
413 | serge | 369 | add edx, IER_REG |
370 | mov eax,IER_RDAI+IER_THRI+IER_LSI |
||
405 | serge | 371 | out dx, al |
372 | .clear_IIR: |
||
373 | mov edx, [esi+UART.base] |
||
413 | serge | 374 | add edx, IIR_REG |
375 | in al, dx |
||
405 | serge | 376 | test al, IIR_INTR |
377 | jnz .done |
||
378 | |||
379 | |||
380 | and eax, 3 |
||
381 | jnz @F |
||
382 | |||
383 | |||
413 | serge | 384 | add edx, MSR_REG |
385 | in al, dx |
||
405 | serge | 386 | jmp .clear_IIR |
387 | @@: |
||
388 | cmp eax, 1 |
||
389 | je .clear_IIR |
||
390 | |||
391 | |||
392 | jne @F |
||
393 | |||
394 | |||
413 | serge | 395 | in al, dx |
405 | serge | 396 | jmp .clear_IIR |
397 | @@: |
||
398 | mov edx, [esi+UART.base] |
||
413 | serge | 399 | add edx, LSR_REG |
400 | in al, dx |
||
405 | serge | 401 | jmp .clear_IIR |
402 | .done: |
||
403 | mov edi, [esi+UART.rcvr_buff] |
||
416 | serge | 404 | mov ecx, 8192/4 |
414 | serge | 405 | xor eax, eax |
405 | serge | 406 | |
407 | |||
416 | serge | 408 | mov [esi+UART.rcvr_wp], edi |
409 | mov [esi+UART.rcvr_count], eax |
||
410 | |||
411 | |||
412 | rep stosd |
||
413 | |||
414 | |||
415 | mov ecx, 8192/4 |
||
416 | |||
417 | |||
414 | serge | 418 | mov [esi+UART.xmit_wp], edi |
419 | mov [esi+UART.xmit_count], eax |
||
420 | mov [esi+UART.xmit_free], 8192 |
||
421 | |||
405 | serge | 422 | |
423 | ret ;eax= 0 |
||
416 | serge | 424 | .fail: |
414 | serge | 425 | or eax, -1 |
426 | ret |
||
427 | |||
405 | serge | 428 | |
429 | ; esi= input buffer |
||
413 | serge | 430 | ; +0 connection |
431 | ; +4 rate |
||
432 | ; +8 mode |
||
433 | ; |
||
434 | ; retval |
||
435 | ; eax= error code |
||
436 | |||
405 | serge | 437 | |
438 | uart_set_mode: |
||
413 | serge | 439 | mov eax, [esi] |
440 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
441 | jne .fail |
||
442 | |||
443 | |||
444 | jne .fail |
||
445 | |||
446 | |||
447 | test eax, eax |
||
448 | jz .fail |
||
449 | |||
450 | |||
451 | mov ecx, [esi+8] |
||
452 | |||
453 | |||
454 | ; eax= uart |
||
455 | ; ebx= baud rate |
||
456 | ; ecx= mode |
||
457 | |||
458 | |||
459 | .internal: |
||
460 | cmp ebx, RATE_115200 |
||
461 | ja .fail |
||
405 | serge | 462 | |
463 | |||
413 | serge | 464 | jae .fail |
405 | serge | 465 | |
466 | |||
413 | serge | 467 | mov [eax+UART.mode], ecx |
468 | |||
405 | serge | 469 | |
413 | serge | 470 | mov bx, [divisor+ebx*2] |
471 | |||
405 | serge | 472 | |
413 | serge | 473 | push edx |
474 | add edx, LCR_REG |
||
475 | in al, dx |
||
405 | serge | 476 | or al, 0x80 |
477 | out dx, al |
||
478 | |||
479 | |||
413 | serge | 480 | mov al, bl |
481 | out dx, al |
||
405 | serge | 482 | |
483 | |||
484 | mov al, bh |
||
413 | serge | 485 | out dx, al |
405 | serge | 486 | |
487 | |||
413 | serge | 488 | mov eax, ecx |
489 | out dx, al |
||
405 | serge | 490 | xor eax, eax |
413 | serge | 491 | ret |
492 | .fail: |
||
405 | serge | 493 | or eax, -1 |
413 | serge | 494 | ret |
405 | serge | 495 | |
496 | |||
414 | serge | 497 | ; esi= input buffer |
498 | ; +0 connection |
||
499 | ; +4 modem control reg valie |
||
500 | ; |
||
501 | ; retval |
||
502 | ; eax= error code |
||
503 | |||
413 | serge | 504 | |
505 | uart_set_mcr: |
||
414 | serge | 506 | |
413 | serge | 507 | |
414 | serge | 508 | cmp [eax+APPOBJ.magic], 'CNCT' |
509 | jne .fail |
||
510 | |||
511 | |||
512 | jne .fail |
||
513 | |||
514 | |||
515 | test eax, eax |
||
516 | jz .fail |
||
517 | |||
518 | |||
519 | |||
520 | |||
413 | serge | 521 | mov edx, [eax+UART.base] |
522 | add edx, MCR_REG |
||
523 | mov al, bl |
||
524 | out dx, al |
||
525 | xor eax, eax |
||
414 | serge | 526 | ret |
413 | serge | 527 | .fail: |
414 | serge | 528 | or eax, -1 |
529 | ret |
||
530 | |||
413 | serge | 531 | |
405 | serge | 532 | ; eax= port |
413 | serge | 533 | ; |
534 | ; retval |
||
535 | ; ecx= connection |
||
536 | ; eax= error code |
||
537 | |||
405 | serge | 538 | |
539 | uart_open: |
||
413 | serge | 540 | dec eax |
541 | cmp eax, COM_MAX |
||
542 | jae .fail |
||
543 | |||
544 | |||
545 | push esi |
||
546 | .do_wait: |
||
547 | cmp dword [esi+UART.lock],0 |
||
548 | je .get_lock |
||
549 | call change_task |
||
550 | jmp .do_wait |
||
551 | .get_lock: |
||
552 | mov eax, 1 |
||
553 | xchg eax, [esi+UART.lock] |
||
554 | test eax, eax |
||
555 | jnz .do_wait |
||
556 | |||
557 | |||
558 | call uart_reset.internal |
||
414 | serge | 559 | |
413 | serge | 560 | |
561 | shl ebx, 5 |
||
562 | mov ebx, [CURRENT_TASK+ebx+4] |
||
563 | mov eax, CONNECTION_SIZE |
||
564 | call create_kernel_object |
||
565 | pop esi ;uart |
||
566 | test eax, eax |
||
567 | jz .fail |
||
568 | |||
569 | |||
570 | mov [eax+APPOBJ.destroy], uart_close.destroy |
||
571 | mov [eax+CONNECTION.uart], esi |
||
572 | mov ecx, eax |
||
573 | xor eax, eax |
||
574 | ret |
||
575 | .fail: |
||
576 | or eax, -1 |
||
577 | ret |
||
578 | restore .uart |
||
579 | |||
580 | |||
581 | ; esi= input buffer |
||
582 | |||
583 | |||
584 | uart_close: |
||
585 | mov eax, [esi] |
||
586 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
587 | jne .fail |
||
588 | |||
589 | |||
590 | jne .fail |
||
591 | .destroy: |
||
592 | push [eax+CONNECTION.uart] |
||
593 | call destroy_kernel_object ;eax= object |
||
594 | pop eax ;eax= uart |
||
595 | test eax, eax |
||
596 | jz .fail |
||
597 | |||
598 | |||
599 | mov [eax+UART.lock], 0 ;release port |
||
600 | xor eax, eax |
||
601 | ret |
||
602 | .fail: |
||
603 | or eax, -1 |
||
604 | ret |
||
605 | |||
606 | |||
607 | |||
608 | ; eax= uart |
||
609 | ; ebx= baud rate |
||
610 | |||
611 | |||
612 | set_rate: |
||
405 | serge | 613 | cmp ebx, RATE_115200 |
413 | serge | 614 | ja .fail |
405 | serge | 615 | |
616 | |||
413 | serge | 617 | mov bx, [divisor+ebx*2] |
618 | |||
405 | serge | 619 | |
413 | serge | 620 | add edx, LCR_REG |
621 | in al, dx |
||
405 | serge | 622 | push eax |
413 | serge | 623 | or al, 0x80 |
405 | serge | 624 | out dx, al |
625 | |||
626 | |||
413 | serge | 627 | mov al, bl |
405 | serge | 628 | out dx, al |
629 | |||
630 | |||
413 | serge | 631 | mov al, bh |
405 | serge | 632 | out dx, al |
633 | |||
634 | |||
413 | serge | 635 | add edx, LCR_REG-1 |
636 | out dx, al |
||
405 | serge | 637 | .fail: |
638 | ret |
||
639 | |||
640 | |||
413 | serge | 641 | |
642 | ; ebx= uart |
||
643 | |||
644 | |||
405 | serge | 645 | transmit: |
646 | push esi |
||
647 | push edi |
||
413 | serge | 648 | |
405 | serge | 649 | |
413 | serge | 650 | |
405 | serge | 651 | |
652 | cli |
||
653 | |||
654 | |||
413 | serge | 655 | mov ecx, [ebx+UART.xmit_count] |
414 | serge | 656 | test ecx, ecx |
657 | je .stop |
||
658 | |||
405 | serge | 659 | |
414 | serge | 660 | jbe @F |
661 | mov ecx, 16 |
||
662 | @@: |
||
405 | serge | 663 | sub [ebx+UART.xmit_count], ecx |
414 | serge | 664 | add [ebx+UART.xmit_free], ecx |
665 | cld |
||
666 | @@: |
||
667 | lodsb |
||
668 | out dx, al |
||
405 | serge | 669 | dec ecx |
414 | serge | 670 | jnz @B |
671 | |||
405 | serge | 672 | |
414 | serge | 673 | jb @F |
674 | sub esi, 8192 |
||
675 | @@: |
||
676 | mov [ebx+UART.xmit_rp], esi |
||
413 | serge | 677 | |
414 | serge | 678 | |
679 | je .stop |
||
680 | |||
681 | |||
413 | serge | 682 | jmp @F |
414 | serge | 683 | .stop: |
684 | mov [ebx+UART.state], UART_STOP |
||
685 | @@: |
||
686 | popfd |
||
405 | serge | 687 | pop edi |
413 | serge | 688 | pop esi |
405 | serge | 689 | ret |
690 | |||
691 | |||
414 | serge | 692 | |
413 | serge | 693 | ; esi= input buffer |
414 | serge | 694 | ; +0 connection |
695 | ; +4 dst buffer |
||
696 | ; +8 dst size |
||
697 | ; edi= output buffer |
||
698 | ; +0 bytes read |
||
699 | |||
700 | |||
701 | ; eax= error code |
||
702 | |||
703 | |||
704 | uart_read: |
||
705 | mov eax, [esi] |
||
706 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
707 | jne .fail |
||
708 | |||
709 | |||
710 | jne .fail |
||
711 | |||
712 | |||
713 | test eax, eax |
||
714 | jz .fail |
||
715 | |||
716 | |||
717 | mov ecx, [eax+UART.rcvr_count] |
||
416 | serge | 718 | cmp ecx, ebx |
414 | serge | 719 | jbe @F |
720 | mov ecx, ebx |
||
721 | @@: |
||
722 | mov [edi], ecx ;bytes read |
||
723 | test ecx, ecx |
||
724 | jz .done |
||
725 | |||
726 | |||
416 | serge | 727 | |
414 | serge | 728 | |
729 | mov esi, [eax+UART.rcvr_rp] |
||
416 | serge | 730 | cld |
414 | serge | 731 | rep movsb |
416 | serge | 732 | pop ecx |
733 | |||
734 | |||
735 | jb @F |
||
736 | sub esi, 8192 |
||
737 | @@: |
||
414 | serge | 738 | mov [eax+UART.rcvr_rp], esi |
416 | serge | 739 | sub [eax+UART.rcvr_count], ecx |
740 | .done: |
||
414 | serge | 741 | xor eax, eax |
742 | ret |
||
416 | serge | 743 | .fail: |
414 | serge | 744 | or eax, -1 |
745 | ret |
||
746 | |||
747 | |||
748 | ; esi= input buffer |
||
749 | ; +0 connection |
||
750 | ; +4 src buffer |
||
751 | ; +8 src size |
||
752 | ; |
||
753 | ; retval |
||
754 | ; eax= error code |
||
755 | |||
756 | |||
757 | uart_write: |
||
758 | mov eax, [esi] |
||
759 | cmp [eax+APPOBJ.magic], 'CNCT' |
||
760 | jne .fail |
||
761 | |||
762 | |||
763 | jne .fail |
||
764 | |||
765 | |||
766 | test eax, eax |
||
767 | jz .fail |
||
768 | |||
769 | |||
770 | mov edx, [esi+8] |
||
771 | |||
772 | |||
773 | ; eax= uart |
||
413 | serge | 774 | ; ebx= src |
775 | ; edx= count |
||
776 | |||
405 | serge | 777 | |
778 | .internal: |
||
414 | serge | 779 | mov esi, ebx |
413 | serge | 780 | mov edi, [eax+UART.xmit_wp] |
781 | .write: |
||
405 | serge | 782 | test edx, edx |
413 | serge | 783 | jz .fail |
414 | serge | 784 | .wait: |
405 | serge | 785 | cmp [eax+UART.xmit_free], 0 |
413 | serge | 786 | jne .fill |
405 | serge | 787 | |
788 | |||
413 | serge | 789 | je .wait |
405 | serge | 790 | |
791 | |||
413 | serge | 792 | push edx |
793 | call transmit |
||
405 | serge | 794 | pop edx |
413 | serge | 795 | mov eax, ebx |
796 | jmp .write |
||
405 | serge | 797 | .fill: |
798 | mov ecx, [eax+UART.xmit_free] |
||
413 | serge | 799 | cmp ecx, edx |
800 | jbe @F |
||
801 | mov ecx, edx |
||
802 | @@: |
||
405 | serge | 803 | push ecx |
414 | serge | 804 | cld |
805 | rep movsb |
||
806 | pop ecx |
||
807 | sub [eax+UART.xmit_free], ecx |
||
413 | serge | 808 | add [eax+UART.xmit_count], ecx |
414 | serge | 809 | sub edx, ecx |
413 | serge | 810 | jnz .wait |
414 | serge | 811 | .done: |
405 | serge | 812 | cmp edi, [eax+UART.xmit_top] |
414 | serge | 813 | jb @F |
814 | sub edi, 8192 |
||
815 | @@: |
||
816 | mov [eax+UART.xmit_wp], edi |
||
413 | serge | 817 | cmp [eax+UART.state], UART_TRANSMIT |
818 | je @F |
||
405 | serge | 819 | mov ebx, eax |
413 | serge | 820 | call transmit |
405 | serge | 821 | @@: |
822 | xor eax, eax |
||
414 | serge | 823 | ret |
405 | serge | 824 | .fail: |
414 | serge | 825 | or eax, -1 |
826 | ret |
||
827 | |||
405 | serge | 828 | |
414 | serge | 829 | |
405 | serge | 830 | com_2_isr: |
413 | serge | 831 | mov ebx, [com2] |
832 | jmp com_1_isr.get_info |
||
833 | align 4 |
||
834 | com_1_isr: |
||
835 | mov ebx, [com1] |
||
836 | .get_info: |
||
405 | serge | 837 | mov edx, [ebx+UART.base] |
413 | serge | 838 | add edx, IIR_REG |
839 | in al, dx |
||
405 | serge | 840 | |
841 | |||
842 | jnz .done |
||
843 | |||
844 | |||
845 | and eax, 3 |
||
846 | |||
847 | |||
848 | jmp .get_info |
||
849 | .done: |
||
850 | ret |
||
851 | |||
852 | |||
853 | isr_line: |
||
854 | mov edx, [ebx+UART.base] |
||
413 | serge | 855 | add edx, LSR_REG |
856 | in al, dx |
||
405 | serge | 857 | ret |
858 | |||
859 | |||
860 | isr_recieve: |
||
861 | mov esi, [ebx+UART.base] |
||
416 | serge | 862 | add esi, LSR_REG |
863 | mov edi, [ebx+UART.rcvr_wp] |
||
864 | xor ecx, ecx |
||
865 | cld |
||
866 | .read: |
||
867 | mov edx, esi |
||
868 | in al, dx |
||
869 | test eax, LSR_DR |
||
870 | jz .done |
||
871 | |||
872 | |||
413 | serge | 873 | in al, dx |
405 | serge | 874 | stosb |
416 | serge | 875 | inc ecx |
876 | jmp .read |
||
877 | .done: |
||
878 | cmp edi, [ebx+UART.rcvr_top] |
||
879 | jb @F |
||
880 | sub edi, 8192 |
||
881 | @@: |
||
882 | mov [ebx+UART.rcvr_wp], edi |
||
883 | add [ebx+UART.rcvr_count], ecx |
||
884 | ret |
||
405 | serge | 885 | |
886 | |||
887 | isr_modem: |
||
888 | mov edx, [ebx+UART.base] |
||
413 | serge | 889 | add edx, MSR_REG |
890 | in al, dx |
||
891 | ret |
||
892 | |||
405 | serge | 893 | |
894 | |||
413 | serge | 895 | com1 dd 0 |
896 | com2 dd 0 |
||
897 | |||
405 | serge | 898 | |
899 | uart_func dd 0 ;SRV_GETVERSION |
||
413 | serge | 900 | dd 0 ;PORT_OPEN |
901 | dd uart_close ;PORT_CLOSE |
||
902 | dd uart_reset ;PORT_RESET |
||
414 | serge | 903 | dd uart_set_mode ;PORT_SETMODE |
413 | serge | 904 | dd 0 ;PORT_GETMODE |
414 | serge | 905 | dd uart_set_mcr ;PORT_SETMODEM |
906 | dd 0 ;PORT_GETMODEM |
||
907 | dd uart_read ;PORT_READ |
||
908 | dd uart_write ;PORT_WRITE |
||
909 | |||
405 | serge | 910 | |
911 | dd transmit |
||
912 | dd isr_recieve |
||
913 | dd isr_line |
||
914 | |||
915 | |||
413 | serge | 916 | |
405 | serge | 917 | |
918 | dw 192, 96, 64, 58, 48, 32 |
||
919 | dw 24, 16, 12, 6, 3, 2, 1 |
||
920 | |||
921 | |||
922 | |||
923 | |||
924 |