forked from KolibriOS/kolibrios
Added getters and setter for chunksizes. Some optimizations. Added some checks and errors notification (work in progress).
git-svn-id: svn://kolibrios.org@5018 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
098f10ccbc
commit
8297a4020c
@ -124,6 +124,7 @@ baudrate dd ?
|
|||||||
bitbangEnabled db ?
|
bitbangEnabled db ?
|
||||||
readBufChunkSize dd ?
|
readBufChunkSize dd ?
|
||||||
writeBufChunkSize dd ?
|
writeBufChunkSize dd ?
|
||||||
|
maxPacketSize dd ?
|
||||||
interface dd ?
|
interface dd ?
|
||||||
index dd ?
|
index dd ?
|
||||||
inEP dd ?
|
inEP dd ?
|
||||||
@ -181,14 +182,13 @@ proc START stdcall, .reason:DWORD
|
|||||||
endp
|
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
|
stdcall USBGetParam, [.config_pipe], 0
|
||||||
mov edx, eax
|
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
|
cmp word[eax+usb_descr.idVendor], 0x0403
|
||||||
jnz .notftdi
|
jnz .notftdi
|
||||||
DEBUGF 1,'K : FTDI USB device detected\n'
|
|
||||||
movi eax, sizeof.ftdi_context
|
movi eax, sizeof.ftdi_context
|
||||||
call Kmalloc
|
call Kmalloc
|
||||||
test eax, eax
|
test eax, eax
|
||||||
@ -204,44 +204,57 @@ proc AddDevice stdcall uses ebx esi, .config_pipe:DWORD, .config_descr:DWORD, .i
|
|||||||
mov [eax + ftdi_context.nullP], ebx
|
mov [eax + ftdi_context.nullP], ebx
|
||||||
mov [eax + ftdi_context.index], 0
|
mov [eax + ftdi_context.index], 0
|
||||||
mov [eax + ftdi_context.lockPID], 0
|
mov [eax + ftdi_context.lockPID], 0
|
||||||
|
mov [eax + ftdi_context.maxPacketSize], 64
|
||||||
mov [eax + ftdi_context.readBufChunkSize], 64
|
mov [eax + ftdi_context.readBufChunkSize], 64
|
||||||
mov [eax + ftdi_context.writeBufChunkSize], 64
|
mov [eax + ftdi_context.writeBufChunkSize], 64
|
||||||
|
|
||||||
cmp [edx+usb_descr.bcdDevice], 0x400
|
mov cx, [edx+usb_descr.bcdDevice]
|
||||||
|
cmp cx, 0x400
|
||||||
jnz @f
|
jnz @f
|
||||||
mov [eax + ftdi_context.chipType], TYPE_BM
|
mov [eax + ftdi_context.chipType], TYPE_BM
|
||||||
|
jmp .slow
|
||||||
@@:
|
@@:
|
||||||
cmp [edx+usb_descr.bcdDevice], 0x200
|
cmp cx, 0x200
|
||||||
jnz @f
|
jnz @f
|
||||||
mov [eax + ftdi_context.chipType], TYPE_AM
|
mov [eax + ftdi_context.chipType], TYPE_AM
|
||||||
|
jmp .slow
|
||||||
@@:
|
@@:
|
||||||
cmp [edx+usb_descr.bcdDevice], 0x500
|
cmp cx, 0x500
|
||||||
jnz @f
|
jnz @f
|
||||||
mov [eax + ftdi_context.chipType], TYPE_2232C
|
mov [eax + ftdi_context.chipType], TYPE_2232C
|
||||||
|
jmp .slow
|
||||||
@@:
|
@@:
|
||||||
cmp [edx+usb_descr.bcdDevice], 0x600
|
cmp cx, 0x600
|
||||||
jnz @f
|
jnz @f
|
||||||
mov [eax + ftdi_context.chipType], TYPE_R
|
mov [eax + ftdi_context.chipType], TYPE_R
|
||||||
|
jmp .slow
|
||||||
@@:
|
@@:
|
||||||
cmp [edx+usb_descr.bcdDevice], 0x700
|
cmp cx, 0x700
|
||||||
jnz @f
|
jnz @f
|
||||||
mov [eax + ftdi_context.chipType], TYPE_2232H
|
mov [eax + ftdi_context.chipType], TYPE_2232H
|
||||||
|
jmp .fast
|
||||||
@@:
|
@@:
|
||||||
cmp [edx+usb_descr.bcdDevice], 0x900
|
cmp cx, 0x900
|
||||||
jnz @f
|
jnz @f
|
||||||
mov [eax + ftdi_context.chipType], TYPE_232H
|
mov [eax + ftdi_context.chipType], TYPE_232H
|
||||||
|
jmp .fast
|
||||||
@@:
|
@@:
|
||||||
cmp [edx+usb_descr.bcdDevice], 0x1000
|
cmp cx, 0x1000
|
||||||
jnz @f
|
jnz .slow
|
||||||
mov [eax + ftdi_context.chipType], TYPE_BM
|
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
|
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
|
mov [ebx + ftdi_context.inEP], eax
|
||||||
DEBUGF 1,'K : Open second pipe\n'
|
stdcall USBOpenPipe, [.config_pipe], 0x02, [ebx + ftdi_context.maxPacketSize], BULK_PIPE, 0
|
||||||
stdcall USBOpenPipe, [.config_pipe], 0x02, 0x40, BULK_PIPE, 0
|
test eax, eax
|
||||||
|
jz .nothing
|
||||||
mov [ebx + ftdi_context.outEP], eax
|
mov [ebx + ftdi_context.outEP], eax
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
ret
|
ret
|
||||||
@ -296,11 +309,23 @@ endl
|
|||||||
mov dword[esi], 'LCKD'
|
mov dword[esi], 'LCKD'
|
||||||
jmp .endswitch
|
jmp .endswitch
|
||||||
|
|
||||||
.pid_ok:
|
.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
|
push eax edi
|
||||||
mov ecx, 0x80000000
|
mov ecx, 0x80000000
|
||||||
cmp eax, 17
|
cmp eax, 17
|
||||||
je .bulkevent
|
je .bulkevent
|
||||||
cmp eax, 18
|
cmp eax, 18
|
||||||
je .bulkevent
|
je .bulkevent
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
@ -309,116 +334,356 @@ endl
|
|||||||
call CreateEvent
|
call CreateEvent
|
||||||
mov [EventData], eax
|
mov [EventData], eax
|
||||||
mov [EventData+4], edx
|
mov [EventData+4], edx
|
||||||
pop edi eax
|
pop edi eax
|
||||||
|
|
||||||
dec eax ;4
|
|
||||||
jz .ftdi_set_bitmode
|
|
||||||
dec eax ;5
|
|
||||||
jz .ftdi_setrtshigh
|
|
||||||
dec eax ;6
|
|
||||||
jz .ftdi_setrtslow
|
|
||||||
dec eax ;7
|
|
||||||
jz .ftdi_setdtrhigh
|
|
||||||
dec eax ;8
|
dec eax ;8
|
||||||
jz .ftdi_setdtrlow
|
jz .ftdi_set_bitmode
|
||||||
dec eax ;9
|
dec eax ;9
|
||||||
jz .ftdi_usb_reset
|
jz .ftdi_setrtshigh
|
||||||
dec eax ;10
|
dec eax ;10
|
||||||
jz .ftdi_setflowctrl
|
jz .ftdi_setrtslow
|
||||||
dec eax ;11
|
dec eax ;11
|
||||||
jz .ftdi_set_event_char
|
jz .ftdi_setdtrhigh
|
||||||
dec eax ;12
|
dec eax ;12
|
||||||
jz .ftdi_set_error_char
|
jz .ftdi_setdtrlow
|
||||||
dec eax ;13
|
dec eax ;13
|
||||||
jz .ftdi_set_latency_timer
|
jz .ftdi_usb_reset
|
||||||
dec eax ;14
|
dec eax ;14
|
||||||
jz .ftdi_get_latency_timer
|
jz .ftdi_setflowctrl
|
||||||
dec eax ;15
|
dec eax ;15
|
||||||
jz .ftdi_read_pins
|
jz .ftdi_set_event_char
|
||||||
dec eax ;16
|
dec eax ;16
|
||||||
jz .ftdi_poll_modem_status
|
jz .ftdi_set_error_char
|
||||||
dec eax ;17
|
dec eax ;17
|
||||||
jz .ftdi_write_data
|
jz .ftdi_set_latency_timer
|
||||||
dec eax ;18
|
dec eax ;18
|
||||||
jz .ftdi_read_data
|
jz .ftdi_get_latency_timer
|
||||||
dec eax ;19
|
dec eax ;19
|
||||||
jz .ftdi_set_baudrate
|
jz .ftdi_read_pins
|
||||||
dec eax ;20
|
dec eax ;20
|
||||||
jz .ftdi_set_line_property
|
jz .ftdi_poll_modem_status
|
||||||
dec eax ;21
|
dec eax ;21
|
||||||
jz .ftdi_purge_rx_buf
|
jz .ftdi_write_data
|
||||||
dec eax ;22
|
dec eax ;22
|
||||||
|
jz .ftdi_read_data
|
||||||
|
dec eax ;23
|
||||||
|
jz .ftdi_set_baudrate
|
||||||
|
dec eax ;24
|
||||||
|
jz .ftdi_set_line_property
|
||||||
|
dec eax ;25
|
||||||
|
jz .ftdi_purge_rx_buf
|
||||||
|
dec eax ;26
|
||||||
jz .ftdi_purge_tx_buf
|
jz .ftdi_purge_tx_buf
|
||||||
|
jmp .error
|
||||||
|
|
||||||
.version:
|
.version:
|
||||||
|
jmp .endswitch
|
||||||
|
.error:
|
||||||
|
mov esi, [edi+output]
|
||||||
|
mov [esi], dword 'ERR0'
|
||||||
|
or [esi], eax
|
||||||
.endswitch:
|
.endswitch:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.ftdi_out_control_transfer:
|
.eventdestroy:
|
||||||
mov ebx, [edi]
|
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 cx, word[ebx + ftdi_context.index]
|
||||||
mov word[ConfPacket+4], cx
|
mov word[ConfPacket+4], cx
|
||||||
xor cx, cx
|
xor cx, cx
|
||||||
mov word[ConfPacket+6], cx
|
mov word[ConfPacket+6], cx
|
||||||
.own_index:
|
.own_index:
|
||||||
mov ebx, [edi+4]
|
mov ebx, [edi+4]
|
||||||
DEBUGF 1,'K : ConfPacket %x %x\n', [ConfPacket], [ConfPacket+4]
|
DEBUGF 1,'K : ConfPacket %x %x\n', [ConfPacket], [ConfPacket+4]
|
||||||
lea esi, [ConfPacket]
|
lea esi, [ConfPacket]
|
||||||
lea edi, [EventData]
|
lea edi, [EventData]
|
||||||
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, 0, 0, control_callback, edi, 0
|
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 eax, [EventData]
|
||||||
mov ebx, [EventData+4]
|
mov ebx, [EventData+4]
|
||||||
call WaitEvent
|
call WaitEvent
|
||||||
jmp .endswitch
|
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:
|
.ftdi_setrtshigh:
|
||||||
DEBUGF 1,'K : FTDI Setting RTS pin HIGH\n'
|
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)
|
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:
|
.ftdi_setrtslow:
|
||||||
DEBUGF 1,'K : FTDI Setting RTS pin LOW\n'
|
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)
|
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:
|
.ftdi_setdtrhigh:
|
||||||
DEBUGF 1,'K : FTDI Setting DTR pin HIGH\n'
|
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)
|
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:
|
.ftdi_setdtrlow:
|
||||||
DEBUGF 1,'K : FTDI Setting DTR pin LOW\n'
|
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)
|
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:
|
.ftdi_usb_reset:
|
||||||
DEBUGF 1,'K : FTDI Reseting\n'
|
DEBUGF 1,'K : FTDI Reseting\n'
|
||||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_SIO shl 16)
|
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:
|
.ftdi_purge_rx_buf:
|
||||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_RX shl 16)
|
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:
|
.ftdi_purge_tx_buf:
|
||||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_RESET_REQUEST shl 8) + (SIO_RESET_PURGE_TX shl 16)
|
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
|
||||||
|
|
||||||
|
.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
|
||||||
|
|
||||||
|
.ftdi_set_line_property:
|
||||||
|
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_DATA_REQUEST shl 8)
|
||||||
|
jmp .ftdi_out_control_transfer_withinp
|
||||||
|
|
||||||
|
.ftdi_set_latency_timer:
|
||||||
|
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_LATENCY_TIMER_REQUEST shl 8)
|
||||||
|
jmp .ftdi_out_control_transfer_withinp
|
||||||
|
|
||||||
|
.ftdi_set_event_char:
|
||||||
|
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_EVENT_CHAR_REQUEST shl 8)
|
||||||
|
jmp .ftdi_out_control_transfer_withinp
|
||||||
|
|
||||||
|
.ftdi_set_error_char:
|
||||||
|
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_ERROR_CHAR_REQUEST shl 8)
|
||||||
|
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 ebx, [edi+4]
|
||||||
|
mov cx, word[edi+8]
|
||||||
|
or ecx, [ebx + ftdi_context.index]
|
||||||
|
mov word[ConfPacket+4], cx
|
||||||
|
xor cx, cx
|
||||||
|
mov word[ConfPacket+6], cx
|
||||||
|
jmp .own_index
|
||||||
|
|
||||||
|
.ftdi_read_pins:
|
||||||
|
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]
|
||||||
|
mov word[ConfPacket+4], cx
|
||||||
|
mov word[ConfPacket+6], 1
|
||||||
|
lea esi, [ConfPacket]
|
||||||
|
lea edi, [EventData]
|
||||||
|
mov ecx, [ioctl]
|
||||||
|
mov ecx, [ecx+output]
|
||||||
|
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, ecx, 1, control_callback, edi, 0
|
||||||
|
mov eax, [EventData]
|
||||||
|
mov ebx, [EventData+4]
|
||||||
|
call WaitEvent
|
||||||
|
jmp .endswitch
|
||||||
|
|
||||||
|
.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
|
||||||
|
.write_loop:
|
||||||
|
mov edx, [edi+8] ; edx - write_size
|
||||||
|
sub edx, ecx
|
||||||
|
cmp edx, [ebx + ftdi_context.writeBufChunkSize]
|
||||||
|
jle .lessthanchunk_write
|
||||||
|
mov edx, [ebx + ftdi_context.writeBufChunkSize]
|
||||||
|
.lessthanchunk_write:
|
||||||
|
add esi, ecx
|
||||||
|
lea eax, [EventData]
|
||||||
|
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
|
||||||
|
mov eax, [EventData]
|
||||||
|
mov ebx, [EventData+4]
|
||||||
|
call ClearEvent
|
||||||
|
pop edi esi ebx ecx
|
||||||
|
cmp [EventData+8], -1
|
||||||
|
jz .error
|
||||||
|
add ecx, [EventData+8]
|
||||||
|
cmp ecx, [edi+8]
|
||||||
|
jge .eventdestroy
|
||||||
|
jmp .write_loop
|
||||||
|
|
||||||
|
.ftdi_read_data:
|
||||||
|
mov edi, [ioctl]
|
||||||
|
mov esi, [edi+input]
|
||||||
|
mov edi, [edi+output]
|
||||||
|
mov ebx, [esi+4]
|
||||||
|
xor ecx, ecx
|
||||||
|
.read_loop:
|
||||||
|
mov edx, [esi+8]
|
||||||
|
cmp ecx, edx
|
||||||
|
jge .eventdestroy ;!!!
|
||||||
|
sub edx, ecx
|
||||||
|
cmp edx, [ebx + ftdi_context.readBufChunkSize]
|
||||||
|
jl .lessthanchunk_read
|
||||||
|
mov edx, [ebx + ftdi_context.readBufChunkSize]
|
||||||
|
.lessthanchunk_read:
|
||||||
|
lea eax, [EventData]
|
||||||
|
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 .error
|
||||||
|
add ecx, [EventData+8]
|
||||||
|
jmp .read_loop
|
||||||
|
|
||||||
|
.ftdi_poll_modem_status:
|
||||||
|
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]
|
||||||
|
mov word[ConfPacket+4], cx
|
||||||
|
mov word[ConfPacket+6], 1
|
||||||
|
lea esi, [ConfPacket]
|
||||||
|
lea edi, [EventData]
|
||||||
|
mov ecx, [ioctl]
|
||||||
|
mov ecx, [ecx+output]
|
||||||
|
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, ecx, 2, control_callback, edi, 0
|
||||||
|
mov eax, [EventData]
|
||||||
|
mov ebx, [EventData+4]
|
||||||
|
call WaitEvent
|
||||||
|
mov ax, word[ecx]
|
||||||
|
xchg ah, al
|
||||||
|
and ah, 0xFF
|
||||||
|
mov word[ecx], ax
|
||||||
|
jmp .endswitch
|
||||||
|
|
||||||
|
.ftdi_get_latency_timer:
|
||||||
|
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]
|
||||||
|
mov word[ConfPacket+4], cx
|
||||||
|
mov word[ConfPacket+6], 1
|
||||||
|
lea esi, [ConfPacket]
|
||||||
|
lea edi, [EventData]
|
||||||
|
mov ecx, [ioctl]
|
||||||
|
mov ecx, [ecx+output]
|
||||||
|
stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, ecx, 2, control_callback, edi, 0
|
||||||
|
mov eax, [EventData]
|
||||||
|
mov ebx, [EventData+4]
|
||||||
|
call WaitEvent
|
||||||
|
jmp .endswitch
|
||||||
|
|
||||||
|
.ftdi_get_list:
|
||||||
|
call linkedlist_gethead
|
||||||
|
test eax, eax
|
||||||
|
jz .endswitch
|
||||||
|
mov edi, [edi+output]
|
||||||
|
push edi
|
||||||
|
add edi, 4
|
||||||
|
xor ecx, ecx
|
||||||
|
.nextdev:
|
||||||
|
inc ecx
|
||||||
|
cmp [eax + ftdi_context.lockPID], 0
|
||||||
|
jnz .dev_is_locked
|
||||||
|
mov dword[edi], 'NLKD'
|
||||||
|
jmp .nextfields
|
||||||
|
.dev_is_locked:
|
||||||
|
mov dword[edi], 'LCKD'
|
||||||
|
.nextfields:
|
||||||
|
mov bl, [eax + ftdi_context.chipType]
|
||||||
|
mov [edi+4], ebx
|
||||||
|
mov [edi+8], eax
|
||||||
|
add edi, 12
|
||||||
|
mov eax, [eax + ftdi_context.next_context]
|
||||||
|
test eax, eax
|
||||||
|
jnz .nextdev
|
||||||
|
pop edi
|
||||||
|
mov [edi], ecx
|
||||||
|
jmp .endswitch
|
||||||
|
|
||||||
|
.ftdi_lock:
|
||||||
|
DEBUGF 1, 'K : FTDI lock attempt\n'
|
||||||
|
mov esi, [edi+input]
|
||||||
|
mov ebx, [esi+4]
|
||||||
|
mov eax, [ebx + ftdi_context.lockPID]
|
||||||
|
test eax, eax
|
||||||
|
jnz .lockedby
|
||||||
|
DEBUGF 1, 'K : Lock success\n'
|
||||||
|
mov eax, [esi]
|
||||||
|
mov [ebx + ftdi_context.lockPID], eax
|
||||||
|
.lockedby:
|
||||||
|
mov edi, [edi+output]
|
||||||
|
mov [edi], eax
|
||||||
|
jmp .endswitch
|
||||||
|
|
||||||
|
.ftdi_unlock:
|
||||||
|
mov esi, [edi+input]
|
||||||
|
mov edi, [edi+output]
|
||||||
|
mov ebx, [esi+4]
|
||||||
|
mov eax, [ebx + ftdi_context.lockPID]
|
||||||
|
cmp eax, [esi]
|
||||||
|
jnz .unlockimp
|
||||||
|
mov [ebx + ftdi_context.lockPID], 0
|
||||||
|
mov dword[edi], 0
|
||||||
|
jmp .endswitch
|
||||||
|
.unlockimp:
|
||||||
|
mov [edi], eax
|
||||||
|
jmp .endswitch
|
||||||
|
|
||||||
H_CLK = 120000000
|
H_CLK = 120000000
|
||||||
C_CLK = 48000000
|
C_CLK = 48000000
|
||||||
.ftdi_set_baudrate:
|
.ftdi_set_baudrate:
|
||||||
mov edi, [edi+input]
|
mov ebx, [edi+4]
|
||||||
mov ebx, [edi]
|
|
||||||
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
||||||
jl .c_clk
|
jl .c_clk
|
||||||
imul eax, [edi+8], 10
|
imul eax, [edi+8], 10
|
||||||
@ -546,214 +811,7 @@ C_CLK = 48000000
|
|||||||
mov word[ConfPacket+2], ax
|
mov word[ConfPacket+2], ax
|
||||||
mov word[ConfPacket+4], cx
|
mov word[ConfPacket+4], cx
|
||||||
mov word[ConfPacket+6], 0
|
mov word[ConfPacket+6], 0
|
||||||
jmp .own_index
|
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
|
|
||||||
|
|
||||||
.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
|
|
||||||
|
|
||||||
.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
|
|
||||||
|
|
||||||
.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
|
|
||||||
|
|
||||||
.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 cx, word[edi+8]
|
|
||||||
or ecx, [ebx + ftdi_context.index]
|
|
||||||
mov word[ConfPacket+4], cx
|
|
||||||
xor cx, cx
|
|
||||||
mov word[ConfPacket+6], cx
|
|
||||||
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]
|
|
||||||
mov word[ConfPacket+4], cx
|
|
||||||
mov word[ConfPacket+6], 1
|
|
||||||
lea esi, [ConfPacket]
|
|
||||||
lea edi, [EventData]
|
|
||||||
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:
|
|
||||||
mov edi, [edi+input]
|
|
||||||
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]
|
|
||||||
sub edx, ecx
|
|
||||||
.morethanchunk_write:
|
|
||||||
lea eax, [EventData]
|
|
||||||
stdcall USBNormalTransferAsync, [ebx + ftdi_context.inEP], [edi+12+ecx], edx, bulk_callback, eax, 1
|
|
||||||
push ebx edi edx ecx
|
|
||||||
mov eax, [EventData]
|
|
||||||
mov ebx, [EventData+4]
|
|
||||||
call WaitEvent
|
|
||||||
pop ecx edx edi ebx
|
|
||||||
cmp [EventData+8], -1
|
|
||||||
jz .endswitch;jz .error
|
|
||||||
add ecx, [EventData+8]
|
|
||||||
cmp ecx, [edi+8]
|
|
||||||
jl .dataleft
|
|
||||||
jmp .endswitch
|
|
||||||
|
|
||||||
.ftdi_read_data:
|
|
||||||
mov esi, [edi+input]
|
|
||||||
mov edi, [edi+output]
|
|
||||||
mov ebx, [esi+4]
|
|
||||||
xor ecx, ecx
|
|
||||||
.read_loop:
|
|
||||||
mov edx, [esi+8]
|
|
||||||
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
|
|
||||||
push esi edi ecx ebx
|
|
||||||
mov eax, [EventData]
|
|
||||||
mov ebx, [EventData+4]
|
|
||||||
call WaitEvent
|
|
||||||
pop ebx ecx edi esi
|
|
||||||
cmp [EventData+8], -1
|
|
||||||
jz .endswitch;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]
|
|
||||||
mov word[ConfPacket+4], cx
|
|
||||||
mov word[ConfPacket+6], 1
|
|
||||||
lea esi, [ConfPacket]
|
|
||||||
lea edi, [EventData]
|
|
||||||
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
|
|
||||||
mov ax, word[ecx]
|
|
||||||
xchg ah, al
|
|
||||||
and ah, 0xFF
|
|
||||||
mov word[ecx], ax
|
|
||||||
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]
|
|
||||||
mov word[ConfPacket+4], cx
|
|
||||||
mov word[ConfPacket+6], 1
|
|
||||||
lea esi, [ConfPacket]
|
|
||||||
lea edi, [EventData]
|
|
||||||
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
|
|
||||||
jmp .endswitch
|
|
||||||
|
|
||||||
.ftdi_get_list:
|
|
||||||
call linkedlist_gethead
|
|
||||||
mov edi, [edi+output]
|
|
||||||
push edi
|
|
||||||
add edi, 4
|
|
||||||
xor ecx, ecx
|
|
||||||
.nextdev:
|
|
||||||
inc ecx
|
|
||||||
cmp [eax + ftdi_context.lockPID], 0
|
|
||||||
jnz .dev_is_locked
|
|
||||||
mov dword[edi], 'NLKD'
|
|
||||||
jmp .nextfields
|
|
||||||
.dev_is_locked:
|
|
||||||
mov dword[edi], 'LCKD'
|
|
||||||
.nextfields:
|
|
||||||
mov bl, [eax + ftdi_context.chipType]
|
|
||||||
mov [edi+4], ebx
|
|
||||||
mov [edi+8], eax
|
|
||||||
add edi, 12
|
|
||||||
mov eax, [eax + ftdi_context.next_context]
|
|
||||||
test eax, eax
|
|
||||||
jnz .nextdev
|
|
||||||
pop edi
|
|
||||||
mov [edi], ecx
|
|
||||||
jmp .endswitch
|
|
||||||
|
|
||||||
.ftdi_lock:
|
|
||||||
DEBUGF 1, 'K : FTDI lock attempt\n'
|
|
||||||
mov esi, [edi+input]
|
|
||||||
mov ebx, [esi+4]
|
|
||||||
mov eax, [ebx + ftdi_context.lockPID]
|
|
||||||
test eax, eax
|
|
||||||
jnz .lockedby
|
|
||||||
DEBUGF 1, 'K : Lock success\n'
|
|
||||||
mov eax, [esi]
|
|
||||||
mov [ebx + ftdi_context.lockPID], eax
|
|
||||||
.lockedby:
|
|
||||||
mov edi, [edi+output]
|
|
||||||
mov [edi], eax
|
|
||||||
jmp .endswitch
|
|
||||||
|
|
||||||
.ftdi_unlock:
|
|
||||||
mov esi, [edi+input]
|
|
||||||
mov edi, [edi+output]
|
|
||||||
mov ebx, [esi+4]
|
|
||||||
mov eax, [ebx + ftdi_context.lockPID]
|
|
||||||
cmp eax, [esi]
|
|
||||||
jnz .unlockimp
|
|
||||||
mov [ebx + ftdi_context.lockPID], 0
|
|
||||||
mov dword[edi], 0
|
|
||||||
jmp .endswitch
|
|
||||||
.unlockimp:
|
|
||||||
mov [edi], eax
|
|
||||||
jmp .endswitch
|
|
||||||
|
|
||||||
endp
|
endp
|
||||||
restore handle
|
restore handle
|
||||||
@ -786,19 +844,18 @@ proc bulk_callback stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, .buffer
|
|||||||
mov eax, [ecx]
|
mov eax, [ecx]
|
||||||
mov ebx, [ecx+4]
|
mov ebx, [ecx+4]
|
||||||
cmp [.status], 0
|
cmp [.status], 0
|
||||||
jg .error?
|
jz .normal
|
||||||
.error?:
|
|
||||||
cmp [.status], 9
|
cmp [.status], 9
|
||||||
jne .error
|
jne .error
|
||||||
|
.normal:
|
||||||
mov edx, [.length]
|
mov edx, [.length]
|
||||||
mov [ecx+8], edx
|
mov [ecx+8], edx
|
||||||
jmp .ok
|
jmp .ok
|
||||||
.error:
|
.error:
|
||||||
mov [ecx+8], dword -1
|
mov [ecx+8], dword -1
|
||||||
.ok:
|
.ok:
|
||||||
xor esi, esi
|
xor esi, esi
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
;mov edx, 0x80000000
|
|
||||||
call RaiseEvent
|
call RaiseEvent
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
Loading…
Reference in New Issue
Block a user