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 |