Subversion Repositories Kolibri OS

Rev

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

Rev 4997 Rev 5014
Line 120... Line 120...
120
; Structures
120
; Structures
121
struct ftdi_context
121
struct ftdi_context
122
chipType                db      ?
122
chipType                db      ?
123
baudrate                dd      ?
123
baudrate                dd      ?
124
bitbangEnabled          db      ?
124
bitbangEnabled          db      ?
125
readBufPtr              dd      ?
-
 
126
readBufOffs             dd      ?
-
 
127
readBufChunkSize        dd      ?
125
readBufChunkSize        dd      ?
128
writeBufChunkSize       dd      ?
126
writeBufChunkSize       dd      ?
129
interface               dd      ?
127
interface               dd      ?
130
index                   dd      ?
128
index                   dd      ?
131
inEP                    dd      ?
129
inEP                    dd      ?
Line 204... Line 202...
204
        
202
        
205
        mov     ebx, [.config_pipe]
203
        mov     ebx, [.config_pipe]
206
        mov     [eax + ftdi_context.nullP], ebx
204
        mov     [eax + ftdi_context.nullP], ebx
207
        mov     [eax + ftdi_context.index], 0
205
        mov     [eax + ftdi_context.index], 0
-
 
206
        mov     [eax + ftdi_context.lockPID], 0
-
 
207
        mov     [eax + ftdi_context.readBufChunkSize], 64
Line 208... Line 208...
208
        mov     [eax + ftdi_context.lockPID], 0
208
        mov     [eax + ftdi_context.writeBufChunkSize], 64
209
        
209
        
210
        cmp     [edx+usb_descr.bcdDevice], 0x400
210
        cmp     [edx+usb_descr.bcdDevice], 0x400
211
        jnz     @f
211
        jnz     @f
Line 241... Line 241...
241
        stdcall USBOpenPipe, [.config_pipe],  0x81,  0x40,  BULK_PIPE, 0
241
        stdcall USBOpenPipe, [.config_pipe],  0x81,  0x40,  BULK_PIPE, 0
242
        mov     [ebx + ftdi_context.inEP], eax
242
        mov     [ebx + ftdi_context.inEP], eax
243
        DEBUGF 1,'K : Open second pipe\n'
243
        DEBUGF 1,'K : Open second pipe\n'
244
        stdcall USBOpenPipe, [.config_pipe],  0x02,  0x40,  BULK_PIPE, 0
244
        stdcall USBOpenPipe, [.config_pipe],  0x02,  0x40,  BULK_PIPE, 0
245
        mov     [ebx + ftdi_context.outEP], eax        
245
        mov     [ebx + ftdi_context.outEP], eax
-
 
246
        mov     eax, ebx
-
 
247
        ret        
Line 246... Line 248...
246
           
248
           
247
  .notftdi:
249
  .notftdi:
248
        DEBUGF 1,'K : Skipping not FTDI device\n'
250
        DEBUGF 1,'K : Skipping not FTDI device\n'
249
  .nothing:        
251
  .nothing:        
Line 261... Line 263...
261
 
263
 
262
align 4
264
align 4
263
proc service_proc stdcall uses ebx esi edi, ioctl:DWORD
265
proc service_proc stdcall uses ebx esi edi, ioctl:DWORD
264
locals
266
locals
265
ConfPacket  rb  8
267
ConfPacket  rb  8
266
EventData   rd  2
268
EventData   rd  3
267
endl
269
endl
268
        mov     edi, [ioctl]
270
        mov     edi, [ioctl]
269
        mov     eax, [edi+io_code]
271
        mov     eax, [edi+io_code]
270
        DEBUGF 1,'K : FTDI got the request: %d\n', eax
272
        DEBUGF 1,'K : FTDI got the request: %d\n', eax
Line 294... Line 296...
294
        mov     dword[esi], 'LCKD'
296
        mov     dword[esi], 'LCKD'
295
        jmp     .endswitch
297
        jmp     .endswitch
Line 296... Line 298...
296
        
298
        
297
  .pid_ok:  
299
  .pid_ok:  
-
 
300
        push    eax edi
-
 
301
        mov     ecx, 0x80000000
-
 
302
        cmp     eax, 17
-
 
303
        je     .bulkevent
-
 
304
        cmp     eax, 18
298
        push    eax edi
305
        je      .bulkevent
-
 
306
        xor     ecx, ecx
299
        xor     ecx, ecx
307
  .bulkevent:                
300
        xor     esi, esi
308
        xor     esi, esi
301
        call    CreateEvent        
309
        call    CreateEvent        
302
        mov     [EventData], eax
310
        mov     [EventData], eax
303
        mov     [EventData+4], edx
311
        mov     [EventData+4], edx
Line 307... Line 315...
307
        jz      .ftdi_set_bitmode
315
        jz      .ftdi_set_bitmode
308
        dec     eax                 ;5
316
        dec     eax                 ;5
309
        jz      .ftdi_setrtshigh   
317
        jz      .ftdi_setrtshigh   
310
        dec     eax                 ;6
318
        dec     eax                 ;6
311
        jz      .ftdi_setrtslow  
319
        jz      .ftdi_setrtslow  
312
        dec     eax
320
        dec     eax                 ;7
313
        jz      .ftdi_setdtrhigh
321
        jz      .ftdi_setdtrhigh
314
        dec     eax
322
        dec     eax                 ;8
315
        jz      .ftdi_setdtrlow
323
        jz      .ftdi_setdtrlow
316
        dec     eax
324
        dec     eax                 ;9
317
        jz      .ftdi_usb_reset
325
        jz      .ftdi_usb_reset
318
        dec     eax
326
        dec     eax                 ;10
319
        jz      .ftdi_setflowctrl
327
        jz      .ftdi_setflowctrl
320
        dec     eax
328
        dec     eax                 ;11
321
        jz      .ftdi_set_event_char
329
        jz      .ftdi_set_event_char
322
        dec     eax
330
        dec     eax                 ;12
323
        jz      .ftdi_set_error_char
331
        jz      .ftdi_set_error_char
324
        dec     eax
332
        dec     eax                 ;13
325
        jz      .ftdi_set_latency_timer
333
        jz      .ftdi_set_latency_timer
326
        dec     eax
334
        dec     eax                 ;14
327
        jz      .ftdi_get_latency_timer
335
        jz      .ftdi_get_latency_timer
328
        dec     eax
336
        dec     eax                 ;15
329
        jz      .ftdi_read_pins
337
        jz      .ftdi_read_pins
330
        dec     eax
338
        dec     eax                 ;16
331
        jz      .ftdi_poll_modem_status
339
        jz      .ftdi_poll_modem_status
332
        dec     eax
340
        dec     eax                 ;17
333
        jz      .ftdi_write_data
341
        jz      .ftdi_write_data
-
 
342
        dec     eax                 ;18
334
        dec     eax
343
        jz      .ftdi_read_data
-
 
344
        dec     eax                 ;19
335
        jz      .ftdi_set_baudrate
345
        jz      .ftdi_set_baudrate
336
        dec     eax
346
        dec     eax                 ;20
337
        jz      .ftdi_set_line_property
347
        jz      .ftdi_set_line_property
338
        dec     eax
348
        dec     eax                 ;21
339
        jz      .ftdi_purge_rx_buf
349
        jz      .ftdi_purge_rx_buf
340
        dec     eax
350
        dec     eax                 ;22
341
        jz      .ftdi_purge_tx_buf
351
        jz      .ftdi_purge_tx_buf
Line 342... Line 352...
342
        
352
                
343
  .version:     
353
  .version:     
344
  .endswitch:
354
  .endswitch:
Line 597... Line 607...
597
        jmp     .endswitch
607
        jmp     .endswitch
Line 598... Line 608...
598
 
608
 
599
  .ftdi_write_data:
609
  .ftdi_write_data:
600
        mov     edi, [edi+input]
610
        mov     edi, [edi+input]        
601
        mov     ebx, [edi+4]
-
 
602
        mov     eax, [edi+8]
611
        mov     ebx, [edi+4]
603
        xor     ecx, ecx        ; ecx - offset     
612
        xor     ecx, ecx        ; ecx - offset     
604
  .dataleft:
613
  .dataleft:        
605
        mov     edx, [ebx + ftdi_context.writeBufChunkSize] ; edx - write_size
614
        mov     edx, [ebx + ftdi_context.writeBufChunkSize] ; edx - write_size
606
        push    ecx
615
        push    ecx
607
        add     ecx, edx
616
        add     ecx, edx
608
        cmp     ecx, [edi+8]
617
        cmp     ecx, [edi+8]    ; [edi+8] - size
609
        pop     ecx
618
        pop     ecx
610
        jle     .morethanchunk
619
        jle     .morethanchunk_write
611
        mov     edx, [edi+8]           
620
        mov     edx, [edi+8]           
612
        sub     edx, ecx
621
        sub     edx, ecx
-
 
622
  .morethanchunk_write:
613
  .morethanchunk:
623
        lea     eax, [EventData]
-
 
624
        stdcall USBNormalTransferAsync, [ebx + ftdi_context.inEP], [edi+12+ecx], edx, bulk_callback, eax, 1
614
        stdcall USBNormalTransferAsync, [ebx + ftdi_context.inEP], [edi+12+ecx], edx, bulk_callback, edx, 1
625
        push    ebx edi edx ecx
615
        mov     eax, [EventData]
626
        mov     eax, [EventData]
616
        mov     ebx, [EventData+4]
627
        mov     ebx, [EventData+4]
-
 
628
        call    WaitEvent
-
 
629
        pop     ecx edx edi ebx
-
 
630
        cmp     [EventData+8], -1
617
        call    WaitEvent        
631
        jz      .endswitch;jz      .error
618
        add     ecx, [EventData]
632
        add     ecx, [EventData+8]
619
        cmp     ecx, [edi+8]
633
        cmp     ecx, [edi+8]
620
        jl      .dataleft
634
        jl      .dataleft
Line -... Line 635...
-
 
635
        jmp     .endswitch
-
 
636
        
-
 
637
  .ftdi_read_data:
-
 
638
        mov     esi, [edi+input]
-
 
639
        mov     edi, [edi+output]
-
 
640
        mov     ebx, [esi+4]        
-
 
641
        xor     ecx, ecx
-
 
642
  .read_loop:
-
 
643
        mov     edx, [esi+8]
-
 
644
        sub     edx, ecx
-
 
645
        test    edx, edx
-
 
646
        jz      .endswitch
-
 
647
        cmp     edx, [ebx + ftdi_context.readBufChunkSize]
-
 
648
        jl      .lessthanchunk_read
-
 
649
        mov     edx, [ebx + ftdi_context.readBufChunkSize]     
-
 
650
  .lessthanchunk_read:
-
 
651
        lea     eax, [EventData]
-
 
652
        stdcall USBNormalTransferAsync, [ebx + ftdi_context.outEP], [edi+ecx], edx, bulk_callback, eax, 1        
-
 
653
        push    esi edi ecx ebx
-
 
654
        mov     eax, [EventData]
-
 
655
        mov     ebx, [EventData+4]        
-
 
656
        call    WaitEvent
-
 
657
        pop     ebx ecx edi esi
-
 
658
        cmp     [EventData+8], -1
-
 
659
        jz      .endswitch;jz      .error
-
 
660
        add     ecx, [EventData+8]
621
        jmp     .endswitch
661
        jmp     .read_loop 
622
        
662
        
623
  .ftdi_poll_modem_status:
663
  .ftdi_poll_modem_status:
624
        mov     edi, [edi+input]                                  
664
        mov     edi, [edi+input]                                  
625
        mov     ebx, [edi+4] 
665
        mov     ebx, [edi+4] 
Line 661... Line 701...
661
        jmp     .endswitch
701
        jmp     .endswitch
Line 662... Line 702...
662
                
702
                
663
  .ftdi_get_list:
703
  .ftdi_get_list:
664
        call    linkedlist_gethead                        
704
        call    linkedlist_gethead                        
-
 
705
        mov     edi, [edi+output]
-
 
706
        push    edi
-
 
707
        add     edi, 4
665
        mov     edi, [edi+output]
708
        xor     ecx, ecx
-
 
709
  .nextdev:
666
  .nextdev:
710
        inc     ecx
667
        cmp     [eax + ftdi_context.lockPID], 0
711
        cmp     [eax + ftdi_context.lockPID], 0
668
        jnz      .dev_is_locked        
712
        jnz      .dev_is_locked        
669
        mov     dword[edi], 'NLKD'
713
        mov     dword[edi], 'NLKD'
670
        jmp     .nextfields
714
        jmp     .nextfields
Line 676... Line 720...
676
        mov     [edi+8], eax
720
        mov     [edi+8], eax
677
        add     edi, 12
721
        add     edi, 12
678
        mov     eax, [eax + ftdi_context.next_context]
722
        mov     eax, [eax + ftdi_context.next_context]
679
        test    eax, eax
723
        test    eax, eax
680
        jnz     .nextdev
724
        jnz     .nextdev
-
 
725
        pop     edi
-
 
726
        mov     [edi], ecx
681
        jmp     .endswitch
727
        jmp     .endswitch
Line 682... Line 728...
682
        	   
728
        	   
-
 
729
  .ftdi_lock:
683
  .ftdi_lock:
730
        DEBUGF 1, 'K : FTDI lock attempt\n'
684
        mov     esi, [edi+input]
731
        mov     esi, [edi+input]
685
        mov     ebx, [esi+4]
732
        mov     ebx, [esi+4]
686
        mov     eax, [ebx + ftdi_context.lockPID]
733
        mov     eax, [ebx + ftdi_context.lockPID]
687
        test    eax, eax
734
        test    eax, eax
-
 
735
        jnz     .lockedby
688
        jnz     .lockedby
736
        DEBUGF 1, 'K : Lock success\n'
689
        mov     eax, [esi]
737
        mov     eax, [esi]
690
        mov     [ebx + ftdi_context.lockPID], eax
738
        mov     [ebx + ftdi_context.lockPID], eax
691
  .lockedby:
739
  .lockedby:
692
        mov     edi, [edi+output]
740
        mov     edi, [edi+output]
Line 721... Line 769...
721
   
769
   
722
        DEBUGF 1, 'K : status is %d\n', [.status] 
770
        DEBUGF 1, 'K : status is %d\n', [.status] 
723
        mov     ecx, [.calldata]
771
        mov     ecx, [.calldata]
724
        mov     eax, [ecx]
772
        mov     eax, [ecx]
-
 
773
        mov     ebx, [ecx+4]
-
 
774
        mov     edx, [.status]
725
        mov     ebx, [ecx+4]
775
        mov     [ecx+8], edx
726
        xor     esi, esi
776
        xor     esi, esi
727
        xor     edx, edx
777
        xor     edx, edx
728
        call    RaiseEvent
-
 
729
              
778
        call    RaiseEvent              
730
        ret
779
        ret
Line 731... Line 780...
731
endp
780
endp
Line 732... Line 781...
732
 
781
 
733
proc bulk_callback stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, .buffer:DWORD, .length:DWORD, .calldata:DWORD
782
proc bulk_callback stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, .buffer:DWORD, .length:DWORD, .calldata:DWORD
734
 
783
 
735
        DEBUGF 1, 'K : status is %d\n', [.status] 
784
        DEBUGF 1, 'K : status is %d\n', [.status]        
-
 
785
        mov     ecx, [.calldata]
-
 
786
        mov     eax, [ecx]
-
 
787
        mov     ebx, [ecx+4]
-
 
788
        cmp     [.status], 0
-
 
789
        jg      .error?
736
        mov     ecx, [.calldata]
790
  .error?:
737
        mov     eax, [ecx]
791
        cmp     [.status], 9
-
 
792
        jne     .error
-
 
793
        mov     edx, [.length]
738
        mov     ebx, [ecx+4]
794
        mov     [ecx+8], edx
-
 
795
        jmp     .ok
739
        mov     edx, [.length]
796
  .error:
740
        mov     edx, [edx]
797
        mov     [ecx+8], dword -1
-
 
798
  .ok:
741
        mov     [ecx], edx
799
        xor     esi, esi
742
        xor     esi, esi
-
 
743
        xor     edx, edx          
800
        xor     edx, edx
744
        call    RaiseEvent
-
 
745
              
801
        ;mov     edx, 0x80000000
Line 746... Line 802...
746
        ret
802
        call    RaiseEvent            
Line 747... Line 803...
747
 
803
        ret
748
endp
804
endp
749
 
805
 
750
proc DeviceDisconnected stdcall uses  ebx esi edi, .device_data:DWORD
806
proc DeviceDisconnected stdcall uses  ebx esi edi, .device_data:DWORD
751
 
807