124,6 → 124,7 |
bitbangEnabled db ? |
readBufChunkSize dd ? |
writeBufChunkSize dd ? |
maxPacketSize dd ? |
interface dd ? |
index dd ? |
inEP dd ? |
181,14 → 182,13 |
endp |
|
|
proc AddDevice stdcall uses ebx esi, .config_pipe:DWORD, .config_descr:DWORD, .interface:DWORD |
proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD, .interface:DWORD |
|
stdcall USBGetParam, [.config_pipe], 0 |
mov edx, eax |
DEBUGF 1,'K : Device detected Vendor: %x\n', [eax+usb_descr.idVendor] |
DEBUGF 1,'K : Detected device vendor: %x\n', [eax+usb_descr.idVendor] |
cmp word[eax+usb_descr.idVendor], 0x0403 |
jnz .notftdi |
DEBUGF 1,'K : FTDI USB device detected\n' |
movi eax, sizeof.ftdi_context |
call Kmalloc |
test eax, eax |
204,44 → 204,57 |
mov [eax + ftdi_context.nullP], ebx |
mov [eax + ftdi_context.index], 0 |
mov [eax + ftdi_context.lockPID], 0 |
mov [eax + ftdi_context.maxPacketSize], 64 |
mov [eax + ftdi_context.readBufChunkSize], 64 |
mov [eax + ftdi_context.writeBufChunkSize], 64 |
|
cmp [edx+usb_descr.bcdDevice], 0x400 |
mov cx, [edx+usb_descr.bcdDevice] |
cmp cx, 0x400 |
jnz @f |
mov [eax + ftdi_context.chipType], TYPE_BM |
jmp .slow |
@@: |
cmp [edx+usb_descr.bcdDevice], 0x200 |
cmp cx, 0x200 |
jnz @f |
mov [eax + ftdi_context.chipType], TYPE_AM |
jmp .slow |
@@: |
cmp [edx+usb_descr.bcdDevice], 0x500 |
cmp cx, 0x500 |
jnz @f |
mov [eax + ftdi_context.chipType], TYPE_2232C |
jmp .slow |
@@: |
cmp [edx+usb_descr.bcdDevice], 0x600 |
cmp cx, 0x600 |
jnz @f |
mov [eax + ftdi_context.chipType], TYPE_R |
jmp .slow |
@@: |
cmp [edx+usb_descr.bcdDevice], 0x700 |
cmp cx, 0x700 |
jnz @f |
mov [eax + ftdi_context.chipType], TYPE_2232H |
jmp .fast |
@@: |
cmp [edx+usb_descr.bcdDevice], 0x900 |
cmp cx, 0x900 |
jnz @f |
mov [eax + ftdi_context.chipType], TYPE_232H |
jmp .fast |
@@: |
cmp [edx+usb_descr.bcdDevice], 0x1000 |
jnz @f |
mov [eax + ftdi_context.chipType], TYPE_BM |
@@: |
cmp cx, 0x1000 |
jnz .slow |
mov [eax + ftdi_context.chipType], TYPE_230X |
jmp .fast |
|
DEBUGF 1,'K : Open first pipe\n' |
.fast: |
add [eax + ftdi_context.maxPacketSize], 512-64 |
.slow: |
mov ebx, eax |
stdcall USBOpenPipe, [.config_pipe], 0x81, 0x40, BULK_PIPE, 0 |
stdcall USBOpenPipe, [.config_pipe], 0x81, [ebx + ftdi_context.maxPacketSize], BULK_PIPE, 0 |
test eax, eax |
jz .nothing |
mov [ebx + ftdi_context.inEP], eax |
DEBUGF 1,'K : Open second pipe\n' |
stdcall USBOpenPipe, [.config_pipe], 0x02, 0x40, BULK_PIPE, 0 |
stdcall USBOpenPipe, [.config_pipe], 0x02, [ebx + ftdi_context.maxPacketSize], BULK_PIPE, 0 |
test eax, eax |
jz .nothing |
mov [ebx + ftdi_context.outEP], eax |
mov eax, ebx |
ret |
297,6 → 310,18 |
jmp .endswitch |
|
.pid_ok: |
dec eax |
jz .ftdi_get_wchunksize ;5 |
dec eax |
jz .ftdi_get_rchunksize ;7 |
|
mov edi, [edi+input] |
|
dec eax |
jz .ftdi_set_rchunksize ;6 |
dec eax |
jz .ftdi_set_wchunksize ;4 |
|
push eax edi |
mov ecx, 0x80000000 |
cmp eax, 17 |
311,52 → 336,67 |
mov [EventData+4], edx |
pop edi eax |
|
dec eax ;4 |
dec eax ;8 |
jz .ftdi_set_bitmode |
dec eax ;5 |
dec eax ;9 |
jz .ftdi_setrtshigh |
dec eax ;6 |
dec eax ;10 |
jz .ftdi_setrtslow |
dec eax ;7 |
dec eax ;11 |
jz .ftdi_setdtrhigh |
dec eax ;8 |
dec eax ;12 |
jz .ftdi_setdtrlow |
dec eax ;9 |
dec eax ;13 |
jz .ftdi_usb_reset |
dec eax ;10 |
dec eax ;14 |
jz .ftdi_setflowctrl |
dec eax ;11 |
dec eax ;15 |
jz .ftdi_set_event_char |
dec eax ;12 |
dec eax ;16 |
jz .ftdi_set_error_char |
dec eax ;13 |
dec eax ;17 |
jz .ftdi_set_latency_timer |
dec eax ;14 |
dec eax ;18 |
jz .ftdi_get_latency_timer |
dec eax ;15 |
dec eax ;19 |
jz .ftdi_read_pins |
dec eax ;16 |
dec eax ;20 |
jz .ftdi_poll_modem_status |
dec eax ;17 |
dec eax ;21 |
jz .ftdi_write_data |
dec eax ;18 |
dec eax ;22 |
jz .ftdi_read_data |
dec eax ;19 |
dec eax ;23 |
jz .ftdi_set_baudrate |
dec eax ;20 |
dec eax ;24 |
jz .ftdi_set_line_property |
dec eax ;21 |
dec eax ;25 |
jz .ftdi_purge_rx_buf |
dec eax ;22 |
dec eax ;26 |
jz .ftdi_purge_tx_buf |
jmp .error |
|
.version: |
jmp .endswitch |
.error: |
mov esi, [edi+output] |
mov [esi], dword 'ERR0' |
or [esi], eax |
.endswitch: |
xor eax, eax |
ret |
|
.ftdi_out_control_transfer: |
mov ebx, [edi] |
.eventdestroy: |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call DestroyEvent |
jmp .endswitch |
|
.ftdi_out_control_transfer_withinp: |
mov dx, word[edi+8] |
mov word[ConfPacket+2], dx |
.ftdi_out_control_transfer_noinp: |
mov ebx, [edi+4] |
mov cx, word[ebx + ftdi_context.index] |
mov word[ConfPacket+4], cx |
xor cx, cx |
367,219 → 407,70 |
lea esi, [ConfPacket] |
lea edi, [EventData] |
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, 0, 0, control_callback, edi, 0 |
DEBUGF 1, 'K : Returned value is %d\n', eax |
test eax, eax |
jz .error |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call WaitEvent |
jmp .endswitch |
|
.ftdi_set_bitmode: |
DEBUGF 1,'K : FTDI Seting bitmode\n' |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BITMODE_REQUEST shl 8) |
mov edi, [edi+input] |
mov dx, word[edi+8] |
mov word[ConfPacket+2], dx |
jmp .ftdi_out_control_transfer |
|
.ftdi_setrtshigh: |
DEBUGF 1,'K : FTDI Setting RTS pin HIGH\n' |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_HIGH shl 16) |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_noinp |
|
.ftdi_setrtslow: |
DEBUGF 1,'K : FTDI Setting RTS pin LOW\n' |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_LOW shl 16) |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_noinp |
|
.ftdi_setdtrhigh: |
DEBUGF 1,'K : FTDI Setting DTR pin HIGH\n' |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_DTR_HIGH shl 16) |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_noinp |
|
.ftdi_setdtrlow: |
DEBUGF 1,'K : FTDI Setting DTR pin LOW\n' |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_DTR_LOW shl 16) |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_noinp |
|
.ftdi_usb_reset: |
DEBUGF 1,'K : FTDI Reseting\n' |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_SIO shl 16) |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_noinp |
|
.ftdi_purge_rx_buf: |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_RX shl 16) |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_noinp |
|
.ftdi_purge_tx_buf: |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_TX shl 16) |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_noinp |
|
H_CLK = 120000000 |
C_CLK = 48000000 |
.ftdi_set_baudrate: |
mov edi, [edi+input] |
mov ebx, [edi] |
cmp [ebx + ftdi_context.chipType], TYPE_2232H |
jl .c_clk |
imul eax, [edi+8], 10 |
cmp eax, H_CLK / 0x3FFF |
jle .c_clk |
.h_clk: |
cmp dword[edi+8], H_CLK/10 |
jl .h_nextbaud1 |
xor edx, edx |
mov ecx, H_CLK/10 |
jmp .calcend |
.ftdi_set_bitmode: |
DEBUGF 1,'K : FTDI Seting bitmode\n' |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BITMODE_REQUEST shl 8) |
jmp .ftdi_out_control_transfer_withinp |
|
.c_clk: |
cmp dword[edi+8], C_CLK/10 |
jl .c_nextbaud1 |
xor edx, edx |
mov ecx, C_CLK/10 |
jmp .calcend |
|
.h_nextbaud1: |
cmp dword[edi+8], H_CLK/(10 + 10/2) |
jl .h_nextbaud2 |
mov edx, 1 |
mov ecx, H_CLK/(10 + 10/2) |
jmp .calcend |
|
.c_nextbaud1: |
cmp dword[edi+8], C_CLK/(10 + 10/2) |
jl .c_nextbaud2 |
mov edx, 1 |
mov ecx, C_CLK/(10 + 10/2) |
jmp .calcend |
|
.h_nextbaud2: |
cmp dword[edi+8], H_CLK/(2*10) |
jl .h_nextbaud3 |
mov edx, 2 |
mov ecx, H_CLK/(2*10) |
jmp .calcend |
|
.c_nextbaud2: |
cmp dword[edi+8], C_CLK/(2*10) |
jl .c_nextbaud3 |
mov edx, 2 |
mov ecx, C_CLK/(2*10) |
jmp .calcend |
|
.h_nextbaud3: |
mov eax, H_CLK*16/10 ; eax - best_divisor |
div dword[edi+8] ; [edi+8] - baudrate |
push eax |
and eax, 1 |
pop eax |
shr eax, 1 |
jz .h_rounddowndiv ; jump by result of and eax, 1 |
inc eax |
.h_rounddowndiv: |
cmp eax, 0x20000 |
jle .h_best_divok |
mov eax, 0x1FFFF |
.h_best_divok: |
mov ecx, eax |
mov eax, H_CLK*16/10 |
div ecx |
xchg ecx, eax ; ecx - best_baud |
push ecx |
and ecx, 1 |
pop ecx |
shr ecx, 1 |
jz .rounddownbaud |
inc ecx |
jmp .rounddownbaud |
|
.c_nextbaud3: |
mov eax, C_CLK*16/10 ; eax - best_divisor |
div dword[edi+8] ; [edi+8] - baudrate |
push eax |
and eax, 1 |
pop eax |
shr eax, 1 |
jz .c_rounddowndiv ; jump by result of and eax, 1 |
inc eax |
.c_rounddowndiv: |
cmp eax, 0x20000 |
jle .c_best_divok |
mov eax, 0x1FFFF |
.c_best_divok: |
mov ecx, eax |
mov eax, C_CLK*16/10 |
div ecx |
xchg ecx, eax ; ecx - best_baud |
push ecx |
and ecx, 1 |
pop ecx |
shr ecx, 1 |
jz .rounddownbaud |
inc ecx |
|
.rounddownbaud: |
mov edx, eax ; edx - encoded_divisor |
shr edx, 3 |
and eax, 0x7 |
push esp |
push 7 6 5 1 4 2 3 0 |
mov eax, [esp+eax*4] |
shl eax, 14 |
or edx, eax |
mov esp, [esp+36] |
|
.calcend: |
mov eax, edx ; eax - *value |
mov ecx, edx ; ecx - *index |
and eax, 0xFFFF |
cmp [ebx + ftdi_context.chipType], TYPE_2232H |
jge .foxyindex |
shr ecx, 16 |
jmp .preparepacket |
.foxyindex: |
shr ecx, 8 |
and ecx, 0xFF00 |
or ecx, [ebx + ftdi_context.index] |
|
.preparepacket: |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BAUDRATE_REQUEST shl 8) |
mov word[ConfPacket+2], ax |
mov word[ConfPacket+4], cx |
mov word[ConfPacket+6], 0 |
jmp .own_index |
|
.ftdi_set_line_property: |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_DATA_REQUEST shl 8) |
mov edi, [edi+input] |
mov dx, word[edi+8] |
mov word[ConfPacket+2], dx |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_withinp |
|
.ftdi_set_latency_timer: |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_LATENCY_TIMER_REQUEST shl 8) |
mov edi, [edi+input] |
mov dx, word[edi+8] |
mov word[ConfPacket+2], dx |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_withinp |
|
.ftdi_set_event_char: |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_EVENT_CHAR_REQUEST shl 8) |
mov edi, [edi+input] |
mov dx, word[edi+8] |
mov word[ConfPacket+2], dx |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_withinp |
|
.ftdi_set_error_char: |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_ERROR_CHAR_REQUEST shl 8) |
mov edi, [edi+input] |
mov dx, word[edi+8] |
mov word[ConfPacket+2], dx |
jmp .ftdi_out_control_transfer |
jmp .ftdi_out_control_transfer_withinp |
|
.ftdi_setflowctrl: |
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_FLOW_CTRL_REQUEST shl 8) + (0 shl 16) |
mov edi, [edi+input] |
mov ebx, [edi] |
mov ebx, [edi+4] |
mov cx, word[edi+8] |
or ecx, [ebx + ftdi_context.index] |
mov word[ConfPacket+4], cx |
588,8 → 479,6 |
jmp .own_index |
|
.ftdi_read_pins: |
DEBUGF 1,'K : FTDI Reading pins\n' |
mov edi, [edi+input] |
mov ebx, [edi] |
mov dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_READ_PINS_REQUEST shl 8) + (0 shl 16) |
mov ecx, [ebx + ftdi_context.index] |
600,41 → 489,75 |
mov ecx, [ioctl] |
mov ecx, [ecx+output] |
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, ecx, 1, control_callback, edi, 0 |
DEBUGF 1, 'K : Returned value is %d\n', eax |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call WaitEvent |
jmp .endswitch |
|
.ftdi_write_data: |
.ftdi_set_wchunksize: |
mov ebx, [edi+4] |
mov ecx, [edi+8] |
cmp [ebx + ftdi_context.maxPacketSize], ecx |
jg .error |
mov [ebx + ftdi_context.writeBufChunkSize], ecx |
jmp .endswitch |
|
.ftdi_get_wchunksize: |
mov esi, [edi+output] |
mov edi, [edi+input] |
mov ebx, [edi+4] |
mov ecx, [ebx + ftdi_context.writeBufChunkSize] |
mov [esi], ecx |
jmp .endswitch |
|
.ftdi_set_rchunksize: |
mov ebx, [edi+4] |
mov ecx, [edi+8] |
cmp [ebx + ftdi_context.maxPacketSize], ecx |
jg .error |
mov [ebx + ftdi_context.readBufChunkSize], ecx |
jmp .endswitch |
|
.ftdi_get_rchunksize: |
mov esi, [edi+output] |
mov edi, [edi+input] |
mov ebx, [edi+4] |
mov ecx, [ebx + ftdi_context.readBufChunkSize] |
mov [esi], ecx |
jmp .endswitch |
|
.ftdi_write_data: |
mov esi, edi |
add esi, 12 |
mov ebx, [edi+4] |
xor ecx, ecx ; ecx - offset |
.dataleft: |
mov edx, [ebx + ftdi_context.writeBufChunkSize] ; edx - write_size |
push ecx |
add ecx, edx |
cmp ecx, [edi+8] ; [edi+8] - size |
pop ecx |
jle .morethanchunk_write |
mov edx, [edi+8] |
.write_loop: |
mov edx, [edi+8] ; edx - write_size |
sub edx, ecx |
.morethanchunk_write: |
cmp edx, [ebx + ftdi_context.writeBufChunkSize] |
jle .lessthanchunk_write |
mov edx, [ebx + ftdi_context.writeBufChunkSize] |
.lessthanchunk_write: |
add esi, ecx |
lea eax, [EventData] |
stdcall USBNormalTransferAsync, [ebx + ftdi_context.inEP], [edi+12+ecx], edx, bulk_callback, eax, 1 |
push ebx edi edx ecx |
push ecx ebx esi edi |
stdcall USBNormalTransferAsync, [ebx + ftdi_context.inEP], esi, edx, bulk_callback, eax, 1 |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call WaitEvent |
pop ecx edx edi ebx |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call ClearEvent |
pop edi esi ebx ecx |
cmp [EventData+8], -1 |
jz .endswitch;jz .error |
jz .error |
add ecx, [EventData+8] |
cmp ecx, [edi+8] |
jl .dataleft |
jmp .endswitch |
jge .eventdestroy |
jmp .write_loop |
|
.ftdi_read_data: |
mov edi, [ioctl] |
mov esi, [edi+input] |
mov edi, [edi+output] |
mov ebx, [esi+4] |
641,27 → 564,30 |
xor ecx, ecx |
.read_loop: |
mov edx, [esi+8] |
cmp ecx, edx |
jge .eventdestroy ;!!! |
sub edx, ecx |
test edx, edx |
jz .endswitch |
cmp edx, [ebx + ftdi_context.readBufChunkSize] |
jl .lessthanchunk_read |
mov edx, [ebx + ftdi_context.readBufChunkSize] |
.lessthanchunk_read: |
lea eax, [EventData] |
stdcall USBNormalTransferAsync, [ebx + ftdi_context.outEP], [edi+ecx], edx, bulk_callback, eax, 1 |
add edi, ecx |
push esi edi ecx ebx |
stdcall USBNormalTransferAsync, [ebx + ftdi_context.outEP], edi, edx, bulk_callback, eax, 1 |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call WaitEvent |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call ClearEvent |
pop ebx ecx edi esi |
cmp [EventData+8], -1 |
jz .endswitch;jz .error |
jz .error |
add ecx, [EventData+8] |
jmp .read_loop |
|
.ftdi_poll_modem_status: |
mov edi, [edi+input] |
mov ebx, [edi+4] |
mov dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_POLL_MODEM_STATUS_REQUEST shl 8) + (0 shl 16) |
mov ecx, [ebx + ftdi_context.index] |
672,7 → 598,6 |
mov ecx, [ioctl] |
mov ecx, [ecx+output] |
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, ecx, 2, control_callback, edi, 0 |
DEBUGF 1, 'K : Returned value is %d\n', eax |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call WaitEvent |
683,7 → 608,6 |
jmp .endswitch |
|
.ftdi_get_latency_timer: |
mov edi, [edi+input] |
mov ebx, [edi+4] |
mov dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE + (SIO_GET_LATENCY_TIMER_REQUEST shl 8) + (0 shl 16) |
mov ecx, [ebx + ftdi_context.index] |
694,7 → 618,6 |
mov ecx, [ioctl] |
mov ecx, [ecx+output] |
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, ecx, 2, control_callback, edi, 0 |
DEBUGF 1, 'K : Returned value is %d\n', eax |
mov eax, [EventData] |
mov ebx, [EventData+4] |
call WaitEvent |
702,6 → 625,8 |
|
.ftdi_get_list: |
call linkedlist_gethead |
test eax, eax |
jz .endswitch |
mov edi, [edi+output] |
push edi |
add edi, 4 |
755,6 → 680,139 |
mov [edi], eax |
jmp .endswitch |
|
H_CLK = 120000000 |
C_CLK = 48000000 |
.ftdi_set_baudrate: |
mov ebx, [edi+4] |
cmp [ebx + ftdi_context.chipType], TYPE_2232H |
jl .c_clk |
imul eax, [edi+8], 10 |
cmp eax, H_CLK / 0x3FFF |
jle .c_clk |
.h_clk: |
cmp dword[edi+8], H_CLK/10 |
jl .h_nextbaud1 |
xor edx, edx |
mov ecx, H_CLK/10 |
jmp .calcend |
|
.c_clk: |
cmp dword[edi+8], C_CLK/10 |
jl .c_nextbaud1 |
xor edx, edx |
mov ecx, C_CLK/10 |
jmp .calcend |
|
.h_nextbaud1: |
cmp dword[edi+8], H_CLK/(10 + 10/2) |
jl .h_nextbaud2 |
mov edx, 1 |
mov ecx, H_CLK/(10 + 10/2) |
jmp .calcend |
|
.c_nextbaud1: |
cmp dword[edi+8], C_CLK/(10 + 10/2) |
jl .c_nextbaud2 |
mov edx, 1 |
mov ecx, C_CLK/(10 + 10/2) |
jmp .calcend |
|
.h_nextbaud2: |
cmp dword[edi+8], H_CLK/(2*10) |
jl .h_nextbaud3 |
mov edx, 2 |
mov ecx, H_CLK/(2*10) |
jmp .calcend |
|
.c_nextbaud2: |
cmp dword[edi+8], C_CLK/(2*10) |
jl .c_nextbaud3 |
mov edx, 2 |
mov ecx, C_CLK/(2*10) |
jmp .calcend |
|
.h_nextbaud3: |
mov eax, H_CLK*16/10 ; eax - best_divisor |
div dword[edi+8] ; [edi+8] - baudrate |
push eax |
and eax, 1 |
pop eax |
shr eax, 1 |
jz .h_rounddowndiv ; jump by result of and eax, 1 |
inc eax |
.h_rounddowndiv: |
cmp eax, 0x20000 |
jle .h_best_divok |
mov eax, 0x1FFFF |
.h_best_divok: |
mov ecx, eax |
mov eax, H_CLK*16/10 |
div ecx |
xchg ecx, eax ; ecx - best_baud |
push ecx |
and ecx, 1 |
pop ecx |
shr ecx, 1 |
jz .rounddownbaud |
inc ecx |
jmp .rounddownbaud |
|
.c_nextbaud3: |
mov eax, C_CLK*16/10 ; eax - best_divisor |
div dword[edi+8] ; [edi+8] - baudrate |
push eax |
and eax, 1 |
pop eax |
shr eax, 1 |
jz .c_rounddowndiv ; jump by result of and eax, 1 |
inc eax |
.c_rounddowndiv: |
cmp eax, 0x20000 |
jle .c_best_divok |
mov eax, 0x1FFFF |
.c_best_divok: |
mov ecx, eax |
mov eax, C_CLK*16/10 |
div ecx |
xchg ecx, eax ; ecx - best_baud |
push ecx |
and ecx, 1 |
pop ecx |
shr ecx, 1 |
jz .rounddownbaud |
inc ecx |
|
.rounddownbaud: |
mov edx, eax ; edx - encoded_divisor |
shr edx, 3 |
and eax, 0x7 |
push esp |
push 7 6 5 1 4 2 3 0 |
mov eax, [esp+eax*4] |
shl eax, 14 |
or edx, eax |
mov esp, [esp+36] |
|
.calcend: |
mov eax, edx ; eax - *value |
mov ecx, edx ; ecx - *index |
and eax, 0xFFFF |
cmp [ebx + ftdi_context.chipType], TYPE_2232H |
jge .foxyindex |
shr ecx, 16 |
jmp .preparepacket |
.foxyindex: |
shr ecx, 8 |
and ecx, 0xFF00 |
or ecx, [ebx + ftdi_context.index] |
|
.preparepacket: |
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BAUDRATE_REQUEST shl 8) |
mov word[ConfPacket+2], ax |
mov word[ConfPacket+4], cx |
mov word[ConfPacket+6], 0 |
jmp .own_index |
|
endp |
restore handle |
restore io_code |
786,10 → 844,10 |
mov eax, [ecx] |
mov ebx, [ecx+4] |
cmp [.status], 0 |
jg .error? |
.error?: |
jz .normal |
cmp [.status], 9 |
jne .error |
.normal: |
mov edx, [.length] |
mov [ecx+8], edx |
jmp .ok |
798,7 → 856,6 |
.ok: |
xor esi, esi |
xor edx, edx |
;mov edx, 0x80000000 |
call RaiseEvent |
ret |
endp |