Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. ;OS_BASE         equ 0x80000000
  3. ;new_app_base    equ 0x60400000
  4. ;PROC_BASE       equ OS_BASE+0x0080000
  5.  
  6. struc IOCTL
  7. {  .handle      dd ?
  8.    .io_code     dd ?
  9.    .input       dd ?
  10.    .inp_size    dd ?
  11.    .output      dd ?
  12.    .out_size    dd ?
  13. }
  14.  
  15.  
  16. ;public START
  17. ;public service_proc
  18. ;public version
  19.  
  20. DEBUG            equ   1
  21.  
  22. DRV_ENTRY        equ   1
  23. DRV_EXIT         equ  -1
  24.  
  25.  
  26. LCR_5BIT         equ  0x00
  27. LCR_6BIT         equ  0x01
  28. LCR_7BIT         equ  0x02
  29. LCR_8BIT         equ  0x03
  30. LCR_STOP_1       equ  0x00
  31. LCR_STOP_2       equ  0x04
  32. LCR_PARITY       equ  0x08
  33. LCR_EVEN         equ  0x10
  34. LCR_STICK        equ  0x20
  35. LCR_BREAK        equ  0x40
  36. LCR_DLAB         equ  0x80
  37.  
  38. LSR_DR           equ  0x01     ;data ready
  39. LSR_OE           equ  0x02     ;overrun error
  40. LSR_PE           equ  0x04     ;parity error
  41. LSR_FE           equ  0x08     ;framing error
  42. LSR_BI           equ  0x10     ;break interrupt
  43. LSR_THRE         equ  0x20     ;transmitter holding empty
  44. LSR_TEMT         equ  0x40     ;transmitter empty
  45. LSR_FER          equ  0x80     ;FIFO error
  46.  
  47. FCR_EFIFO        equ  0x01     ;enable FIFO
  48. FCR_CRB          equ  0x02     ;clear reciever FIFO
  49. FCR_CXMIT        equ  0x04     ;clear transmitter FIFO
  50. FCR_RDY          equ  0x08     ;set RXRDY and TXRDY pins
  51. FCR_FIFO_1       equ  0x00     ;1  byte trigger
  52. FCR_FIFO_4       equ  0x40     ;4  bytes trigger
  53. FCR_FIFO_8       equ  0x80     ;8  bytes trigger
  54. FCR_FIFO_14      equ  0xC0     ;14 bytes trigger
  55.  
  56. IIR_INTR         equ  0x01     ;1= no interrupts
  57.  
  58. IER_RDAI         equ  0x01     ;reciever data interrupt
  59. IER_THRI         equ  0x02     ;transmitter empty interrupt
  60. IER_LSI          equ  0x04     ;line status interrupt
  61. IER_MSI          equ  0x08     ;modem status interrupt
  62.  
  63. MCR_DTR          equ  0x01     ;0-> DTR=1, 1-> DTR=0
  64. MCR_RTS          equ  0x02     ;0-> RTS=1, 1-> RTS=0
  65. MCR_OUT_1        equ  0x04     ;0-> OUT1=1, 1-> OUT1=0
  66. MCR_OUT_2        equ  0x08     ;0-> OUT2=1, 1-> OUT2=0
  67. MCR_LOOP         equ  0x10     ;lopback mode
  68.  
  69. MSR_DCTS         equ  0x01     ;delta clear to send
  70. MSR_DDSR         equ  0x02     ;delta data set redy
  71. MSR_TERI         equ  0x04     ;trailinh edge of ring
  72. MSR_DDCD         equ  0x08     ;delta carrier detect
  73.  
  74. COM_THR          equ 0x3f8     ;transtitter/reciever
  75. COM_IER          equ 0x3f9     ;interrupt enable
  76. COM_IIR          equ 0x3fA     ;interrupt info
  77. COM_LCR          equ 0x3FB     ;line control
  78. COM_MCR          equ 0x3FC     ;modem control
  79. COM_LSR          equ 0x3FD     ;line status
  80. COM_MSR          equ 0x3FE     ;modem status
  81.  
  82. RATE_50          equ  0
  83. RATE_75          equ  1
  84. RATE_110         equ  2
  85. RATE_134         equ  3
  86. RATE_150         equ  4
  87. RATE_300         equ  5
  88. RATE_600         equ  6
  89. RATE_1200        equ  7
  90. RATE_1800        equ  8
  91. RATE_2000        equ  9
  92. RATE_2400        equ 10
  93. RATE_3600        equ 11
  94. RATE_4800        equ 12
  95. RATE_7200        equ 13
  96. RATE_9600        equ 14
  97. RATE_19200       equ 15
  98. RATE_38400       equ 16
  99. RATE_57600       equ 17
  100. RATE_115200      equ 18
  101.  
  102. COM_1            equ  0
  103. COM_2            equ  1
  104. COM_3            equ  2
  105. COM_4            equ  3
  106.  
  107. COM_1_IRQ        equ  4
  108. COM_2_IRQ        equ  3
  109. TRANSMIT         equ  1
  110.  
  111.  
  112. struc COMPORT
  113. {
  114.    .base         dd ?
  115.    .lcr_reg      dd ?
  116.    .mcr_reg      dd ?
  117.    .rate         dd ?
  118.    .mode         dd ?
  119.    .state        dd ?
  120.    .connection   dd ?
  121.  
  122.    .rcvr_rp      dd ?
  123.    .rcvr_wp      dd ?
  124.    .rcvr_free    dd ?
  125.    .rcvr_count   dd ?
  126.  
  127.    .xmit_rp      dd ?
  128.    .xmit_wp      dd ?
  129.    .xmit_free    dd ?
  130.    .xmit_count   dd ?
  131.    .xmit_buffer  rb 128
  132.    .rcvr_buffer  rb 128
  133. }
  134. virtual at 0
  135.   COMPORT COMPORT
  136. end virtual
  137.  
  138. COMPORT_SIZE  equ 256+15*4
  139.  
  140. UART_VERSION  equ 0x00000000
  141.  
  142. init_com:
  143.            mov eax, COMPORT_SIZE
  144.            call malloc
  145.            test eax, eax
  146.            jz .fail
  147.  
  148.            mov [com1], eax
  149.            mov edi, eax
  150.            mov ecx, COMPORT_SIZE/4
  151.            xor eax, eax
  152.            cld
  153.            rep stosd
  154.  
  155.            call reset
  156.  
  157.            stdcall attach_int_handler, COM_1_IRQ, com_isr
  158.            stdcall reg_service, sz_uart_srv, uart_proc
  159.            ret
  160. .fail:
  161.            xor eax, eax
  162.            ret
  163.  
  164. handle     equ  IOCTL.handle
  165. io_code    equ  IOCTL.io_code
  166. input      equ  IOCTL.input
  167. inp_size   equ  IOCTL.inp_size
  168. output     equ  IOCTL.output
  169. out_size   equ  IOCTL.out_size
  170.  
  171. SRV_GETVERSION  equ 0
  172. PORT_OPEN       equ 1
  173. PORT_CLOSE      equ 2
  174. PORT_RESET      equ 3
  175. PORT_SETMODE    equ 4
  176. PORT_GETMODE    equ 5
  177. PORT_SETMCR     equ 6
  178. PORT_GETMCR     equ 7
  179. PORT_READ       equ 8
  180. PORT_WRITE      equ 9
  181.  
  182. align 4
  183. proc uart_proc stdcall, ioctl:dword
  184.  
  185.            mov ebx, [ioctl]
  186.            mov eax, [ebx+io_code]
  187.            cmp eax, PORT_WRITE
  188.            ja .fail
  189.  
  190.            cmp eax, SRV_GETVERSION
  191.            jne @F
  192.  
  193.            mov eax, [ebx+output]
  194.            mov eax, [eax]
  195.            mov [eax], dword UART_VERSION
  196.            xor eax, eax
  197.            ret
  198. @@:
  199.            cmp eax, PORT_OPEN
  200.            jne @F
  201.            call open_port
  202.            ret
  203.  
  204.  
  205.            mov esi, [ebx+input]
  206.            mov ecx, [esi]
  207.            mov edx, [com1]
  208.            cmp [edx+COMPORT.connection], ecx
  209.            je @F
  210.            mov edx, [com2]
  211.            cmp [edx+COMPORT.connection], ecx
  212.            jne .fail
  213.  
  214.            mov edi, [ebx+output]
  215.            call [uart_func+eax*4]  ;edx, esi, edi
  216.            ret
  217.  
  218. .fail:
  219.            or eax, -1
  220.            ret
  221.  
  222. endp
  223.  
  224. restore   handle
  225. restore   io_code
  226. restore   input
  227. restore   inp_size
  228. restore   output
  229. restore   out_size
  230.  
  231.  
  232. open_port:
  233.            ret
  234.  
  235. ; param
  236. ;  edx= port
  237. ;  esi= input data
  238. ;  edi= output data
  239. ;
  240. ; retval
  241. ;  eax=0 success
  242. ;  eax <>0 error
  243.  
  244. align 4
  245. close_port:
  246.  
  247.            call reset
  248.            mov [edx+COMPORT.connection], 0
  249.            xor eax, eax
  250.            ret
  251.  
  252.  
  253. ; set mode 2400 bod 8-bit
  254. ; clear FIFO
  255. ; clear pending interrupts
  256.  
  257. align 4
  258. reset:
  259.            mov eax, RATE_2400
  260.            mov ebx, LCR_8BIT+LCR_STOP_1
  261.            call set_mode
  262.  
  263.            mov eax,FCR_EFIFO+FCR_CRB+FCR_CXMIT+FCR_FIFO_14
  264.            mov edx, COM_IIR
  265.            out dx, al
  266.  
  267. .clear_RB:
  268.            mov edx, COM_LSR
  269.            in al, dx
  270.            test eax, LSR_DR
  271.            jz @F
  272.  
  273.            mov edx, COM_THR
  274.            in al, dx
  275.            jmp .clear_RB
  276. @@:
  277.            mov eax,IER_RDAI+IER_THRI+IER_LSI
  278.            mov edx, COM_IER
  279.            out dx, al
  280.  
  281. .clear_IIR:
  282.            mov edx, COM_IIR
  283.            in al, dx
  284.            test al, IIR_INTR
  285.            jnz .done
  286.  
  287.            shr eax, 1
  288.            and eax, 3
  289.            jnz @F
  290.  
  291.            mov edx, COM_MSR
  292.            in al, dx
  293.            jmp .clear_IIR
  294. @@:
  295.            cmp eax, 1
  296.            je .clear_IIR
  297.  
  298.            cmp eax, 2
  299.            jne @F
  300.  
  301.            mov edx, COM_THR
  302.            in al, dx
  303.            jmp .clear_IIR
  304. @@:
  305.            mov edx, COM_LSR
  306.            in al, dx
  307.            jmp .clear_IIR
  308.  
  309. .done:
  310.            mov edi, rcvr_buff
  311.            xor eax, eax
  312.            mov ecx, 256/4
  313.  
  314.            mov [rcvr_rp], edi
  315.            mov [rcvr_wp], edi
  316.            mov [rcvr_free], 128
  317. ;;           mov [rcvr_count], 16
  318.  
  319.            mov [xmit_rp], xmit_buff
  320.            mov [xmit_wp], xmit_buff
  321.            mov [xmit_free], 128
  322.            mov [xmit_count], 16       ;FIFO free
  323.  
  324.            cld
  325.            rep stosd
  326.            ret
  327.  
  328. ; param
  329. ;  eax= rate constant
  330. ;  ebx= mode bits
  331.  
  332. align 4
  333. set_mode:
  334.            cmp eax, RATE_115200
  335.            ja .fail
  336.  
  337.            cmp ebx, LCR_BREAK
  338.            jae .fail
  339.  
  340.            mov [rate], eax
  341.            mov [mode], ebx
  342.  
  343.            mov cx, [divisor+eax*2]
  344.  
  345.            mov dx, COM_LCR
  346.            in al, dx
  347.            or al, 0x80
  348.            out dx, al
  349.  
  350.            mov dx, COM_THR
  351.            mov al, cl
  352.            out dx, al
  353.  
  354.            inc dx
  355.            mov al, ch
  356.            out dx, al
  357.  
  358.            mov dx, COM_LCR
  359.            mov eax, ebx
  360.            out dx, al
  361. .fail:
  362.            ret
  363.  
  364. ; param
  365. ;  eax= rate constant
  366.  
  367. align 4
  368. set_rate:
  369.            cmp eax, RATE_115200
  370.            ja .fail
  371.  
  372.            mov [rate], eax
  373.            mov bx, [divisor+eax*2]
  374.  
  375.            mov dx, COM_LCR
  376.            in al, dx
  377.            or al, 0x80
  378.            out dx, al
  379.  
  380.            mov dx, COM_THR
  381.            mov al, bl
  382.            out dx, al
  383.  
  384.            inc dx
  385.            mov al, bh
  386.            out dx, al
  387.  
  388.            mov dx, COM_LCR
  389.            mov eax, [lcr_reg]
  390.            out dx, al
  391. .fail:
  392.            ret
  393.  
  394. align 4
  395. transmit:
  396.            push esi
  397.            mov edx, COM_THR
  398.  
  399.            mov [xmit_count], 16
  400.  
  401.            pushfd
  402.            cli
  403.  
  404.            mov esi, [xmit_rp]
  405.            mov ecx, [xmit_free]
  406.  
  407.            cmp ecx, 128
  408.            je .exit
  409. @@:
  410.            and esi, 127
  411.            mov al, [xmit_buff+esi]
  412.            inc esi
  413.  
  414.            out dx, al
  415.            inc ecx
  416.            dec [xmit_count]
  417.            jz .done
  418.  
  419.            cmp ecx, 128
  420.            jne @B
  421. .done:
  422.            add esi, xmit_buff
  423.            mov [xmit_rp], esi
  424.            mov [xmit_free], ecx
  425.            mov [com_state], TRANSMIT
  426. .exit:
  427.            popfd
  428.            pop esi
  429.            ret
  430.  
  431.  
  432. ; eax= src
  433. ; ebx= count
  434.  
  435. align 4
  436. comm_send:
  437.            mov edi, [xmit_wp]
  438.            mov esi, eax
  439. .write:
  440.            test ebx, ebx
  441.            jz .done
  442. .wait:
  443.            cmp [xmit_free], 0
  444.            jne .fill
  445.  
  446.            cmp [com_state], TRANSMIT
  447.            je .wait
  448.  
  449.            call transmit
  450.            jmp .write
  451. .fill:
  452.            mov ecx, xmit_buff+128
  453.            sub ecx, edi
  454.            cmp ecx, [xmit_free]
  455.            jb @F
  456.  
  457.            mov ecx, [xmit_free]
  458. @@:
  459.            cmp ecx, ebx
  460.            jb @F
  461.            mov ecx, ebx
  462. @@:
  463.            sub [xmit_free], ecx
  464.            sub ebx, ecx
  465.  
  466.            cld
  467.            rep movsb
  468.  
  469.            cmp edi, xmit_buff+128
  470.            jb .write
  471.            sub edi, 128
  472.            jmp .write
  473.  
  474. .done:
  475.            cmp [com_state], TRANSMIT
  476.            je @F
  477.            call transmit
  478. @@:
  479.            ret
  480.  
  481. align 4
  482. com_isr:
  483.  
  484. .get_info:
  485.            mov dx, COM_IIR
  486.            in  al, dx
  487.  
  488.            test al, IIR_INTR
  489.            jnz .done
  490.  
  491.            shr eax, 1
  492.            and eax, 3
  493.  
  494.            call [isr_action+eax*4]
  495.            jmp .get_info
  496. .done:
  497.            ret
  498.  
  499. align 4
  500. isr_line:
  501.            mov edx, COM_LSR
  502.            in al, dx
  503.            ret
  504.  
  505. align 4
  506. isr_recieve:
  507.            mov edx, COM_THR
  508.            in al, dx
  509.            ret
  510.  
  511. align 4
  512. isr_modem:
  513.             mov edx, COM_MSR
  514.             in al, dx
  515.             ret
  516.  
  517.  
  518.  
  519. align 4
  520. uart_func   dd 0            ;get version
  521.             dd 0            ;open port
  522.             dd close_port
  523.  
  524.  
  525. isr_action  dd isr_modem
  526.             dd transmit
  527.             dd isr_recieve
  528.             dd isr_line
  529.  
  530.  
  531. divisor     dw 2304, 1536, 1047, 857, 768, 384
  532.             dw  192,   96,   64,  58,  48,  32
  533.             dw   24,   16,   12,   6,   3,   2, 1
  534.  
  535.  
  536.  
  537. sz_uart_srv db 'UART',0
  538.  
  539. ;version      dd 0x00040000
  540.  
  541.  
  542. align 4
  543.  
  544. com1        dd ?
  545. com2        dd ?
  546.  
  547. rcvr_rp     dd ?
  548. rcvr_wp     dd ?
  549. rcvr_free   dd ?
  550. rcvr_count  dd ?
  551.  
  552. xmit_rp     dd ?
  553. xmit_wp     dd ?
  554. xmit_free   dd ?
  555. xmit_count  dd ?
  556.  
  557. lcr_reg     dd ?
  558. mcr_reg     dd ?
  559. rate        dd ?
  560. mode        dd ?
  561. com_state   dd ?
  562.  
  563. connection  dd ?
  564.  
  565. align 128
  566. rcvr_buff   rb 128
  567. xmit_buff   rb 128
  568.  
  569.