Subversion Repositories Kolibri OS

Rev

Rev 413 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 413 Rev 414
Line 68... Line 68...
68
 
68
 
Line 69... Line 69...
69
MCR_DTR          equ  0x01     ;0-> DTR=1, 1-> DTR=0
69
MCR_DTR          equ  0x01     ;0-> DTR=1, 1-> DTR=0
70
MCR_RTS          equ  0x02     ;0-> RTS=1, 1-> RTS=0
70
MCR_RTS          equ  0x02     ;0-> RTS=1, 1-> RTS=0
71
MCR_OUT_1        equ  0x04     ;0-> OUT1=1, 1-> OUT1=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
72
MCR_OUT_2        equ  0x08     ;0-> OUT2=1, 1-> OUT2=0;  enable intr
73
MCR_LOOP         equ  0x10     ;lopback mode
73
MCR_LOOP         equ  0x10     ;lopback mode
Line 74... Line 74...
74
 
74
 
75
MSR_DCTS         equ  0x01     ;delta clear to send
75
MSR_DCTS         equ  0x01     ;delta clear to send
76
MSR_DDSR         equ  0x02     ;delta data set redy
76
MSR_DDSR         equ  0x02     ;delta data set redy
Line 111... Line 111...
111
COM_2_IRQ        equ  3
111
COM_2_IRQ        equ  3
112
 
112
 
Line 113... Line 113...
113
UART_CLOSED      equ  0
113
UART_CLOSED      equ  0
114
UART_TRANSMIT    equ  1
114
UART_TRANSMIT    equ  1
-
 
115
UART_STOP        equ  2
Line 115... Line 116...
115
 
116
 
116
struc UART
117
struc UART
117
{
-
 
118
  ; .owner        dd ?   unused
118
{
119
   .lock         dd ?
119
   .lock         dd ?
120
   .base         dd ?
120
   .base         dd ?
121
   .lcr_reg      dd ?
121
   .lcr_reg      dd ?
122
   .mcr_reg      dd ?
122
   .mcr_reg      dd ?
123
   .rate         dd ?
123
   .rate         dd ?
124
   .mode         dd ?
124
   .mode         dd ?
Line 125... Line 125...
125
   .state        dd ?
125
   .state        dd ?
126
 
126
 
127
   .rcvr_rp      dd ?
127
   .rcvr_rp      dd ?
Line -... Line 128...
-
 
128
   .rcvr_wp      dd ?
128
   .rcvr_wp      dd ?
129
   .rcvr_cnt     dd ?
129
   .rcvr_free    dd ?
130
 
-
 
131
   .xmit_buff    dd ?
130
 
132
   .xmit_rp      dd ?
131
   .xmit_rp      dd ?
-
 
132
   .xmit_wp      dd ?
133
   .xmit_wp      dd ?
133
   .xmit_free    dd ?
134
   .xmit_count   dd ?
134
   .rcvr_buffer  rb 128
135
   .xmit_free    dd ?
135
   .xmit_buffer  rb 128
136
   .xmit_top     dd ?
136
}
137
}
Line 137... Line -...
137
virtual at 0
-
 
138
  UART UART
-
 
139
end virtual
138
virtual at 0
Line 140... Line 139...
140
 
139
  UART UART
141
RCVR_OFFSET   equ 14*4
140
end virtual
142
XMIT_OFFSET   equ (13*4*128)
141
 
143
UART_SIZE     equ (256+13*4)
142
UART_SIZE     equ 16*4
Line 177... Line 176...
177
 
176
 
Line 178... Line 177...
178
           mov eax, [com1]
177
           mov eax, [com1]
179
           mov [eax+UART.base], COM_1_BASE
178
           mov [eax+UART.base], COM_1_BASE
Line -... Line 179...
-
 
179
 
-
 
180
           stdcall alloc_kernel_space, 16384
-
 
181
 
-
 
182
           mov edi, [com1]
-
 
183
           mov edx, eax
-
 
184
           mov [edi+UART.xmit_buff], eax
-
 
185
           add eax, 8192
-
 
186
           mov [edi+UART.xmit_top], eax
-
 
187
 
-
 
188
           call alloc_page
-
 
189
           test eax, eax
-
 
190
           jz .fail
-
 
191
 
-
 
192
           shr edx, 12
-
 
193
           or eax, PG_SW
-
 
194
           mov [page_tabs+edx*4], eax
-
 
195
           mov [page_tabs+edx*4+8], eax
-
 
196
 
-
 
197
           call alloc_page
-
 
198
           test eax, eax
-
 
199
           jz .fail
-
 
200
 
-
 
201
           or eax, PG_SW
-
 
202
           mov [page_tabs+edx*4+4], eax
-
 
203
           mov [page_tabs+edx*4+12], eax
-
 
204
 
-
 
205
           mov eax, [edi+UART.xmit_buff]
-
 
206
           invlpg [eax]
-
 
207
           invlpg [eax+0x1000]
-
 
208
           invlpg [eax+0x2000]
-
 
209
           invlpg [eax+0x3000]
-
 
210
 
180
 
211
           mov eax, edi
Line 181... Line 212...
181
           call uart_reset   ;eax= uart
212
           call uart_reset.internal   ;eax= uart
182
 
213
 
183
           stdcall attach_int_handler, COM_1_IRQ, com_1_isr
214
           stdcall attach_int_handler, COM_1_IRQ, com_1_isr
184
           stdcall reg_service, sz_uart_srv, uart_proc
215
           stdcall reg_service, sz_uart_srv, uart_proc
Line 232... Line 263...
232
           mov [ebx], ecx
263
           mov [ebx], ecx
233
           ret
264
           ret
234
@@:
265
@@:
235
           mov esi, [ebx+input]     ;input buffer
266
           mov esi, [ebx+input]     ;input buffer
236
           call [uart_func+eax*4]
267
           mov edi, [ebx+output]
-
 
268
           call [uart_func+eax*4]
237
           ret
269
           ret
238
.fail:
270
.fail:
239
           or eax, -1
271
           or eax, -1
240
           ret
272
           ret
241
 
273
 
Line 248... Line 280...
248
restore   output
280
restore   output
249
restore   out_size
281
restore   out_size
250
 
282
 
Line -... Line 283...
-
 
283
 
-
 
284
; param
-
 
285
;  esi=  input buffer
-
 
286
;        +0 connection
-
 
287
;
-
 
288
; retval
-
 
289
;  eax= error code
-
 
290
 
-
 
291
align 4
-
 
292
uart_reset:
-
 
293
           mov eax, [esi]
-
 
294
           cmp [eax+APPOBJ.magic], 'CNCT'
-
 
295
           jne .fail
-
 
296
 
-
 
297
           cmp [eax+APPOBJ.destroy], uart_close.destroy
-
 
298
           jne .fail
-
 
299
 
-
 
300
           mov eax, [eax+CONNECTION.uart]
-
 
301
           test eax, eax
-
 
302
           jz .fail
251
 
303
 
252
; set mode 2400 bod 8-bit
304
; set mode 2400 bod 8-bit
253
; disable DTR & RTS
305
; disable DTR & RTS
254
; clear FIFO
306
; clear FIFO
255
; clear pending interrupts
307
; clear pending interrupts
256
;
308
;
257
; param
309
; param
Line 258... Line 310...
258
;  eax= uart
310
;  eax= uart
259
 
311
 
260
align 4
312
align 4
261
uart_reset:
313
.internal:
262
           mov esi, eax
314
           mov esi, eax
263
           mov [eax+UART.state], UART_CLOSED
315
           mov [eax+UART.state], UART_CLOSED
264
           mov edx, [eax+UART.base]
316
           mov edx, [eax+UART.base]
Line 320... Line 372...
320
           add edx, LSR_REG
372
           add edx, LSR_REG
321
           in al, dx
373
           in al, dx
322
           jmp .clear_IIR
374
           jmp .clear_IIR
323
.done:
375
.done:
324
           lea edi, [esi+UART.rcvr_buffer]
376
           mov edi, [esi+UART.xmit_buff]
325
           mov ecx, 256/4
377
           mov ecx, 8192/4
326
           xor eax, eax
378
           xor eax, eax
327
 
379
 
Line 328... Line 380...
328
           mov [esi+UART.rcvr_rp], eax
380
           mov [esi+UART.xmit_rp], edi
329
           mov [esi+UART.rcvr_wp], eax
-
 
330
           mov [esi+UART.rcvr_free], 128
-
 
331
           mov [esi+UART.xmit_rp], eax
381
           mov [esi+UART.xmit_wp], edi
332
           mov [esi+UART.xmit_wp], eax
382
           mov [esi+UART.xmit_count], eax
333
           mov [esi+UART.xmit_free], 128
383
           mov [esi+UART.xmit_free], 8192
Line 334... Line 384...
334
 
384
 
335
           cld
385
           cld
336
           rep stosd
-
 
Line -... Line 386...
-
 
386
           rep stosd
-
 
387
 
-
 
388
 
-
 
389
;           mov [esi+UART.rcvr_rp], eax
-
 
390
;           mov [esi+UART.rcvr_wp], eax
-
 
391
;           mov [esi+UART.rcvr_cnt], eax
-
 
392
 
-
 
393
           ret
-
 
394
.fail:
337
           ret
395
           or eax, -1
338
 
396
           ret
339
 
397
 
340
; param
398
; param
341
;  esi=  input buffer
399
;  esi=  input buffer
Line 404... Line 462...
404
.fail:
462
.fail:
405
           or eax, -1
463
           or eax, -1
406
           ret
464
           ret
407
 
465
 
Line -... Line 466...
-
 
466
; param
-
 
467
;  esi=  input buffer
-
 
468
;        +0 connection
-
 
469
;        +4 modem control reg valie
-
 
470
;
-
 
471
; retval
-
 
472
;  eax= error code
Line 408... Line 473...
408
 
473
 
409
align 4
474
align 4
-
 
475
uart_set_mcr:
-
 
476
 
-
 
477
           mov eax, [esi]
-
 
478
           cmp [eax+APPOBJ.magic], 'CNCT'
-
 
479
           jne .fail
-
 
480
 
-
 
481
           cmp [eax+APPOBJ.destroy], uart_close.destroy
-
 
482
           jne .fail
-
 
483
 
-
 
484
           mov eax, [eax+CONNECTION.uart]
-
 
485
           test eax, eax
-
 
486
           jz .fail
-
 
487
 
Line 410... Line 488...
410
uart_set_modem:
488
           mov ebx, [esi+4]
411
 
489
 
412
           mov [eax+UART.mcr_reg], ebx
490
           mov [eax+UART.mcr_reg], ebx
413
           mov edx, [eax+UART.base]
491
           mov edx, [eax+UART.base]
414
           add edx, MCR_REG
492
           add edx, MCR_REG
-
 
493
           mov al, bl
-
 
494
           out dx, al
-
 
495
           xor eax, eax
-
 
496
           ret
415
           mov al, bl
497
.fail:
Line 416... Line 498...
416
           out dx, al
498
           or eax, -1
417
           ret
499
           ret
418
 
500
 
Line 442... Line 524...
442
           test eax, eax
524
           test eax, eax
443
           jnz .do_wait
525
           jnz .do_wait
444
 
526
 
Line 445... Line 527...
445
           mov eax, esi                  ;uart
527
           mov eax, esi                  ;uart
446
           call uart_reset
528
           call uart_reset.internal
Line 447... Line 529...
447
 
529
 
448
           mov ebx, [CURRENT_TASK]
530
           mov ebx, [CURRENT_TASK]
449
           shl ebx, 5
531
           shl ebx, 5
450
           mov ebx, [CURRENT_TASK+ebx+4]
532
           mov ebx, [CURRENT_TASK+ebx+4]
Line 532... Line 614...
532
align 4
614
align 4
533
transmit:
615
transmit:
534
           push esi
616
           push esi
535
           push edi
617
           push edi
536
           push ebp
-
 
Line 537... Line 618...
537
 
618
 
Line 538... Line 619...
538
           mov edx, [ebx+UART.base]
619
           mov edx, [ebx+UART.base]
539
 
620
 
Line 540... Line -...
540
           pushfd
-
 
541
           cli
621
           pushfd
542
 
622
           cli
543
           mov ebp, 16
623
 
-
 
624
           mov esi, [ebx+UART.xmit_rp]
Line 544... Line 625...
544
           mov esi, [ebx+UART.xmit_rp]
625
           mov ecx, [ebx+UART.xmit_count]
545
           lea edi, [ebx+UART.xmit_buffer]
626
           test ecx, ecx
-
 
627
           je .stop
546
           mov ecx, [ebx+UART.xmit_free]
628
 
547
 
629
           cmp ecx, 16
548
           cmp ecx, 128
630
           jbe @F
549
           je .exit
631
           mov ecx, 16
550
@@:
632
@@:
-
 
633
           sub [ebx+UART.xmit_count], ecx
551
           and esi, 127
634
           add [ebx+UART.xmit_free], ecx
552
           mov al, [esi+edi]
-
 
553
           inc esi
635
           cld
554
 
636
@@:
Line 555... Line 637...
555
           out dx, al
637
           lodsb
556
           inc ecx
638
           out dx, al
-
 
639
           dec ecx
557
           dec ebp
640
           jnz @B
558
           jz .done
641
 
-
 
642
           cmp esi,[ebx+UART.xmit_top]
559
 
643
           jb @F
-
 
644
           sub esi, 8192
-
 
645
@@:
560
           cmp ecx, 128
646
           mov [ebx+UART.xmit_rp], esi
-
 
647
 
561
           jne @B
648
           cmp [ebx+UART.xmit_count], 0
-
 
649
           je .stop
-
 
650
 
562
.done:
651
           mov [ebx+UART.state], UART_TRANSMIT
563
           mov [ebx+UART.xmit_rp], esi
-
 
564
           mov [ebx+UART.xmit_free], ecx
652
           jmp @F
565
           mov [ebx+UART.state], UART_TRANSMIT
653
.stop:
566
.exit:
654
           mov [ebx+UART.state], UART_STOP
Line -... Line 655...
-
 
655
@@:
-
 
656
           popfd
-
 
657
           pop edi
-
 
658
           pop esi
-
 
659
           ret
-
 
660
 
-
 
661
 
-
 
662
; param
-
 
663
;  esi=  input buffer
-
 
664
;        +0 connection
-
 
665
;        +4 dst buffer
-
 
666
;        +8 dst size
-
 
667
;  edi=  output buffer
-
 
668
;        +0 bytes read
-
 
669
 
-
 
670
; retval
-
 
671
;  eax= error code
-
 
672
 
-
 
673
align 4
-
 
674
uart_read:
-
 
675
           mov eax, [esi]
-
 
676
           cmp [eax+APPOBJ.magic], 'CNCT'
-
 
677
           jne .fail
-
 
678
 
-
 
679
           cmp [eax+APPOBJ.destroy], uart_close.destroy
-
 
680
           jne .fail
-
 
681
 
-
 
682
           mov eax, [eax+CONNECTION.uart]
-
 
683
           test eax, eax
-
 
684
           jz .fail
-
 
685
 
-
 
686
           mov ebx, [esi+8]    ;dst size
-
 
687
           mov ecx, [eax+UART.rcvr_cnt]
-
 
688
           cmp ecx, ebx
-
 
689
           jbe @F
-
 
690
           mov ecx, ebx
-
 
691
@@:
-
 
692
           mov [edi], ecx      ;bytes read
-
 
693
           test ecx, ecx
-
 
694
           jz .done
-
 
695
 
-
 
696
           sub [eax+UART.rcvr_cnt], ecx
-
 
697
 
-
 
698
           push eax
-
 
699
           mov edi, [esi+4]    ;dst
-
 
700
       ;    lea esi, [eax+RCVR_OFFSET]
-
 
701
           mov ebx, [eax+UART.rcvr_rp]
-
 
702
           cld
-
 
703
@@:
-
 
704
           and ebx, 127
-
 
705
           mov al, [esi+ebx]
-
 
706
           stosb
-
 
707
           inc ebx
-
 
708
           dec ecx
-
 
709
           jnz @B
-
 
710
 
-
 
711
           pop eax
-
 
712
           mov [eax+UART.rcvr_rp], ebx
-
 
713
.done:
-
 
714
           xor eax, eax
-
 
715
           rep
-
 
716
.fail:
-
 
717
           or eax, -1
-
 
718
           ret
-
 
719
 
-
 
720
; param
-
 
721
;  esi=  input buffer
-
 
722
;        +0 connection
-
 
723
;        +4 src buffer
-
 
724
;        +8 src size
-
 
725
;
-
 
726
; retval
-
 
727
;  eax= error code
-
 
728
 
-
 
729
align 4
-
 
730
uart_write:
-
 
731
           mov eax, [esi]
-
 
732
           cmp [eax+APPOBJ.magic], 'CNCT'
-
 
733
           jne .fail
-
 
734
 
-
 
735
           cmp [eax+APPOBJ.destroy], uart_close.destroy
-
 
736
           jne .fail
-
 
737
 
-
 
738
           mov eax, [eax+CONNECTION.uart]
567
           popfd
739
           test eax, eax
568
           pop ebp
740
           jz .fail
569
           pop edi
741
 
570
           pop esi
742
           mov ebx, [esi+4]
Line 571... Line 743...
571
           ret
743
           mov edx, [esi+8]
572
 
744
 
573
; param
745
; param
574
;  eax= uart
746
;  eax= uart
575
;  ebx= src
-
 
576
;  edx= count
747
;  ebx= src
577
 
748
;  edx= count
578
align 4
749
 
579
uart_write:
750
align 4
580
           mov esi, ebx
751
.internal:
581
           mov edi, [eax+UART.xmit_wp]
752
           mov esi, ebx
Line 582... Line 753...
582
           lea ebx, [eax+UART.xmit_buffer]
753
           mov edi, [eax+UART.xmit_wp]
Line 594... Line 765...
594
           push edx
765
           push edx
595
           call transmit
766
           call transmit
596
           pop edx
767
           pop edx
597
           mov eax, ebx
768
           mov eax, ebx
598
           lea ebx, [ebx+UART.xmit_buffer]
769
           jmp .write
599
           jmp .write
-
 
600
.fill:
770
.fill:
601
           mov ecx, 128
771
           mov ecx, [eax+UART.xmit_free]
602
           sub ecx, edi
-
 
603
           jz .clip
-
 
604
           cmp ecx, [eax+UART.xmit_free]
-
 
605
           jbe @F
-
 
606
 
-
 
607
           mov ecx, [eax+UART.xmit_free]
-
 
608
@@:
772
           cmp ecx, edx
609
           cmp ecx, edx
-
 
610
           jbe @F
773
           jbe @F
611
           mov ecx, edx
774
           mov ecx, edx
612
@@:
775
@@:
613
           sub [eax+UART.xmit_free], ecx
776
           push ecx
614
           sub edx, ecx
-
 
615
 
777
           cld
616
           add edi, ebx
-
 
617
           cld
-
 
618
           rep movsb
778
           rep movsb
619
 
779
           pop ecx
620
           sub edi, ebx
-
 
621
.clip:
780
           sub [eax+UART.xmit_free], ecx
622
           and edi, 127
781
           add [eax+UART.xmit_count], ecx
-
 
782
           sub edx, ecx
623
           jmp .write
783
           jnz .wait
624
.done:
784
.done:
625
           mov [eax+UART.xmit_wp], edi
785
           cmp edi, [eax+UART.xmit_top]
-
 
786
           jb @F
-
 
787
           sub edi, 8192
-
 
788
@@:
-
 
789
           mov [eax+UART.xmit_wp], edi
626
           cmp [eax+UART.state], UART_TRANSMIT
790
           cmp [eax+UART.state], UART_TRANSMIT
627
           je @F
791
           je @F
628
           mov ebx, eax
792
           mov ebx, eax
629
           call transmit
793
           call transmit
630
@@:
794
@@:
631
           ret
795
           xor eax, eax
-
 
796
           ret
632
 
797
.fail:
-
 
798
           or eax, -1
-
 
799
           ret
-
 
800
 
-
 
801
 
Line 633... Line 802...
633
align 4
802
align 4
634
com_2_isr:
803
com_2_isr:
635
           mov ebx, [com2]
804
           mov ebx, [com2]
636
           jmp com_1_isr.get_info
805
           jmp com_1_isr.get_info
637
align 4
806
align 4
638
com_1_isr:
807
com_1_isr:
639
           mov ebx, [com1]
808
           mov ebx, [com1]
640
 
-
 
641
.get_info:
809
.get_info:
642
           mov edx, [ebx+UART.base]
810
           mov edx, [ebx+UART.base]
643
           add edx, IIR_REG
811
           add edx, IIR_REG
644
           in  al, dx
812
           in  al, dx
Line 682... Line 850...
682
align 4
850
align 4
683
uart_func   dd 0                ;SRV_GETVERSION
851
uart_func   dd 0                ;SRV_GETVERSION
684
            dd 0                ;PORT_OPEN
852
            dd 0                ;PORT_OPEN
685
            dd uart_close       ;PORT_CLOSE
853
            dd uart_close       ;PORT_CLOSE
686
            dd 0                ;PORT_RESET
854
            dd uart_reset       ;PORT_RESET
687
            dd uart_set_mode    ;PORT_SETMODE
855
            dd uart_set_mode    ;PORT_SETMODE
688
;            dd uart.get_mode    ;PORT_GETMODE
856
            dd 0                ;PORT_GETMODE
689
;            dd uart.set_mcr     ;PORT_SETMCR
857
            dd uart_set_mcr     ;PORT_SETMODEM
690
;PORT_GETMCR     equ 7
858
            dd 0                ;PORT_GETMODEM
691
;PORT_READ       equ 8
859
            dd uart_read        ;PORT_READ
692
;PORT_WRITE      equ 9
860
            dd uart_write       ;PORT_WRITE
693
 
-
 
694
 
-
 
695
 
-
 
Line 696... Line 861...
696
 
861
 
697
isr_action  dd isr_modem
862
isr_action  dd isr_modem
698
            dd transmit
863
            dd transmit
699
            dd isr_recieve
864
            dd isr_recieve