forked from KolibriOS/kolibrios
Fixed baudrate. Added dirty hack to read\write procs because of some mistake in kernel. Added lines in linkedlist_isvalid just in case eax=0
git-svn-id: svn://kolibrios.org@5023 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
d22ed6d387
commit
c0acbd793f
@ -45,7 +45,10 @@ linkedlist_delete:
|
|||||||
pop ecx ebx
|
pop ecx ebx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
linkedlist_isvalid:
|
linkedlist_isvalid: ;eax - pointer to check; returns zero if valid
|
||||||
|
inc ecx
|
||||||
|
test eax, eax
|
||||||
|
jz .valid_pointer ;actually, poiner is not valid
|
||||||
push ebx ecx
|
push ebx ecx
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
mov ebx, [head]
|
mov ebx, [head]
|
||||||
|
@ -124,6 +124,10 @@ baudrate dd ?
|
|||||||
bitbangEnabled db ?
|
bitbangEnabled db ?
|
||||||
readBufChunkSize dd ?
|
readBufChunkSize dd ?
|
||||||
writeBufChunkSize dd ?
|
writeBufChunkSize dd ?
|
||||||
|
readBufPtr dd ?
|
||||||
|
writeBufPtr dd ?
|
||||||
|
readBufSize dd ?
|
||||||
|
writeBufSize dd ?
|
||||||
maxPacketSize dd ?
|
maxPacketSize dd ?
|
||||||
interface dd ?
|
interface dd ?
|
||||||
index dd ?
|
index dd ?
|
||||||
@ -189,7 +193,7 @@ proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD
|
|||||||
DEBUGF 1,'K : Detected device 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
|
||||||
movi eax, sizeof.ftdi_context
|
mov eax, sizeof.ftdi_context
|
||||||
call Kmalloc
|
call Kmalloc
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jnz @f
|
jnz @f
|
||||||
@ -208,7 +212,11 @@ proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD
|
|||||||
mov [eax + ftdi_context.readBufChunkSize], 64
|
mov [eax + ftdi_context.readBufChunkSize], 64
|
||||||
mov [eax + ftdi_context.writeBufChunkSize], 64
|
mov [eax + ftdi_context.writeBufChunkSize], 64
|
||||||
|
|
||||||
|
mov [eax + ftdi_context.chipType], TYPE_R
|
||||||
|
jmp .slow
|
||||||
|
|
||||||
mov cx, [edx+usb_descr.bcdDevice]
|
mov cx, [edx+usb_descr.bcdDevice]
|
||||||
|
DEBUGF 1, 'K : Chip type %x\n', ecx
|
||||||
cmp cx, 0x400
|
cmp cx, 0x400
|
||||||
jnz @f
|
jnz @f
|
||||||
mov [eax + ftdi_context.chipType], TYPE_BM
|
mov [eax + ftdi_context.chipType], TYPE_BM
|
||||||
@ -311,22 +319,22 @@ endl
|
|||||||
|
|
||||||
.pid_ok:
|
.pid_ok:
|
||||||
dec eax
|
dec eax
|
||||||
jz .ftdi_get_wchunksize ;5
|
jz .ftdi_get_wchunksize ;4
|
||||||
dec eax
|
dec eax
|
||||||
jz .ftdi_get_rchunksize ;7
|
jz .ftdi_get_rchunksize ;5
|
||||||
|
|
||||||
mov edi, [edi+input]
|
mov edi, [edi+input]
|
||||||
|
|
||||||
dec eax
|
dec eax
|
||||||
jz .ftdi_set_rchunksize ;6
|
jz .ftdi_set_rchunksize ;6
|
||||||
dec eax
|
dec eax
|
||||||
jz .ftdi_set_wchunksize ;4
|
jz .ftdi_set_wchunksize ;7
|
||||||
|
|
||||||
push eax edi
|
push eax edi
|
||||||
mov ecx, 0x80000000
|
mov ecx, 0x80000000
|
||||||
cmp eax, 21
|
cmp eax, 8-7
|
||||||
je .bulkevent
|
je .bulkevent
|
||||||
cmp eax, 22
|
cmp eax, 9-7
|
||||||
je .bulkevent
|
je .bulkevent
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
.bulkevent:
|
.bulkevent:
|
||||||
@ -337,37 +345,37 @@ endl
|
|||||||
pop edi eax
|
pop edi eax
|
||||||
|
|
||||||
dec eax ;8
|
dec eax ;8
|
||||||
jz .ftdi_set_bitmode
|
|
||||||
dec eax ;9
|
|
||||||
jz .ftdi_setrtshigh
|
|
||||||
dec eax ;10
|
|
||||||
jz .ftdi_setrtslow
|
|
||||||
dec eax ;11
|
|
||||||
jz .ftdi_setdtrhigh
|
|
||||||
dec eax ;12
|
|
||||||
jz .ftdi_setdtrlow
|
|
||||||
dec eax ;13
|
|
||||||
jz .ftdi_usb_reset
|
|
||||||
dec eax ;14
|
|
||||||
jz .ftdi_setflowctrl
|
|
||||||
dec eax ;15
|
|
||||||
jz .ftdi_set_event_char
|
|
||||||
dec eax ;16
|
|
||||||
jz .ftdi_set_error_char
|
|
||||||
dec eax ;17
|
|
||||||
jz .ftdi_set_latency_timer
|
|
||||||
dec eax ;18
|
|
||||||
jz .ftdi_get_latency_timer
|
|
||||||
dec eax ;19
|
|
||||||
jz .ftdi_read_pins
|
|
||||||
dec eax ;20
|
|
||||||
jz .ftdi_poll_modem_status
|
|
||||||
dec eax ;21
|
|
||||||
jz .ftdi_write_data
|
jz .ftdi_write_data
|
||||||
dec eax ;22
|
dec eax ;9
|
||||||
jz .ftdi_read_data
|
jz .ftdi_read_data
|
||||||
dec eax ;23
|
dec eax ;10
|
||||||
jz .ftdi_set_baudrate
|
jz .ftdi_set_baudrate
|
||||||
|
dec eax ;11
|
||||||
|
jz .ftdi_set_bitmode
|
||||||
|
dec eax ;12
|
||||||
|
jz .ftdi_setrtshigh
|
||||||
|
dec eax ;13
|
||||||
|
jz .ftdi_setrtslow
|
||||||
|
dec eax ;14
|
||||||
|
jz .ftdi_setdtrhigh
|
||||||
|
dec eax ;15
|
||||||
|
jz .ftdi_setdtrlow
|
||||||
|
dec eax ;16
|
||||||
|
jz .ftdi_usb_reset
|
||||||
|
dec eax ;17
|
||||||
|
jz .ftdi_setflowctrl
|
||||||
|
dec eax ;18
|
||||||
|
jz .ftdi_set_event_char
|
||||||
|
dec eax ;19
|
||||||
|
jz .ftdi_set_error_char
|
||||||
|
dec eax ;20
|
||||||
|
jz .ftdi_set_latency_timer
|
||||||
|
dec eax ;21
|
||||||
|
jz .ftdi_get_latency_timer
|
||||||
|
dec eax ;22
|
||||||
|
jz .ftdi_read_pins
|
||||||
|
dec eax ;23
|
||||||
|
jz .ftdi_poll_modem_status
|
||||||
dec eax ;24
|
dec eax ;24
|
||||||
jz .ftdi_set_line_property
|
jz .ftdi_set_line_property
|
||||||
dec eax ;25
|
dec eax ;25
|
||||||
@ -387,6 +395,13 @@ endl
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
.eventdestroy:
|
.eventdestroy:
|
||||||
|
;---Dirty hack begin
|
||||||
|
test eax, eax
|
||||||
|
jz @f
|
||||||
|
mov eax, dword[ConfPacket]
|
||||||
|
call Kfree
|
||||||
|
@@:
|
||||||
|
;---Dirty hack end
|
||||||
mov eax, [EventData]
|
mov eax, [EventData]
|
||||||
mov ebx, [EventData+4]
|
mov ebx, [EventData+4]
|
||||||
call DestroyEvent
|
call DestroyEvent
|
||||||
@ -530,6 +545,22 @@ endl
|
|||||||
mov esi, edi
|
mov esi, edi
|
||||||
add esi, 12
|
add esi, 12
|
||||||
mov ebx, [edi+4]
|
mov ebx, [edi+4]
|
||||||
|
;---Dirty hack begin
|
||||||
|
mov eax, [edi+8]
|
||||||
|
call Kmalloc
|
||||||
|
test eax, eax
|
||||||
|
jnz @f
|
||||||
|
mov esi, nomemory_msg
|
||||||
|
call SysMsgBoardStr
|
||||||
|
jmp .eventdestroy
|
||||||
|
@@:
|
||||||
|
mov dword[ConfPacket], eax
|
||||||
|
mov ecx, [edi+8]
|
||||||
|
push edi esi
|
||||||
|
mov edi, eax
|
||||||
|
rep movsb
|
||||||
|
pop esi edi
|
||||||
|
;---Dirty hack end
|
||||||
xor ecx, ecx ; ecx - offset
|
xor ecx, ecx ; ecx - offset
|
||||||
.write_loop:
|
.write_loop:
|
||||||
mov edx, [edi+8] ; edx - write_size
|
mov edx, [edi+8] ; edx - write_size
|
||||||
@ -561,11 +592,23 @@ endl
|
|||||||
mov esi, [edi+input]
|
mov esi, [edi+input]
|
||||||
mov edi, [edi+output]
|
mov edi, [edi+output]
|
||||||
mov ebx, [esi+4]
|
mov ebx, [esi+4]
|
||||||
|
;---Dirty hack begin
|
||||||
|
mov eax, [esi+8]
|
||||||
|
call Kmalloc
|
||||||
|
test eax, eax
|
||||||
|
jnz @f
|
||||||
|
mov esi, nomemory_msg
|
||||||
|
call SysMsgBoardStr
|
||||||
|
jmp .eventdestroy
|
||||||
|
@@:
|
||||||
|
mov edi, eax
|
||||||
|
mov dword[ConfPacket], eax
|
||||||
|
;---Dirty hack end
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
.read_loop:
|
.read_loop:
|
||||||
mov edx, [esi+8]
|
mov edx, [esi+8]
|
||||||
cmp ecx, edx
|
cmp ecx, edx
|
||||||
jge .eventdestroy ;!!!
|
jge .read_end;jge .eventdestroy ;part of Dirty hack
|
||||||
sub edx, ecx
|
sub edx, ecx
|
||||||
cmp edx, [ebx + ftdi_context.readBufChunkSize]
|
cmp edx, [ebx + ftdi_context.readBufChunkSize]
|
||||||
jl .lessthanchunk_read
|
jl .lessthanchunk_read
|
||||||
@ -586,6 +629,16 @@ endl
|
|||||||
jz .error
|
jz .error
|
||||||
add ecx, [EventData+8]
|
add ecx, [EventData+8]
|
||||||
jmp .read_loop
|
jmp .read_loop
|
||||||
|
;---Dirty hack begin
|
||||||
|
.read_end:
|
||||||
|
mov esi, dword[ConfPacket]
|
||||||
|
mov edi, [ioctl]
|
||||||
|
mov ecx, [edi+input]
|
||||||
|
mov ecx, [ecx+8]
|
||||||
|
mov edi, [edi+output]
|
||||||
|
rep movsb
|
||||||
|
jmp .eventdestroy
|
||||||
|
;---Dirty hack end
|
||||||
|
|
||||||
.ftdi_poll_modem_status:
|
.ftdi_poll_modem_status:
|
||||||
mov ebx, [edi+4]
|
mov ebx, [edi+4]
|
||||||
@ -697,10 +750,10 @@ C_CLK = 48000000
|
|||||||
jmp .calcend
|
jmp .calcend
|
||||||
|
|
||||||
.c_clk:
|
.c_clk:
|
||||||
cmp dword[edi+8], C_CLK/10
|
cmp dword[edi+8], C_CLK/16
|
||||||
jl .c_nextbaud1
|
jl .c_nextbaud1
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
mov ecx, C_CLK/10
|
mov ecx, C_CLK/16
|
||||||
jmp .calcend
|
jmp .calcend
|
||||||
|
|
||||||
.h_nextbaud1:
|
.h_nextbaud1:
|
||||||
@ -711,10 +764,10 @@ C_CLK = 48000000
|
|||||||
jmp .calcend
|
jmp .calcend
|
||||||
|
|
||||||
.c_nextbaud1:
|
.c_nextbaud1:
|
||||||
cmp dword[edi+8], C_CLK/(10 + 10/2)
|
cmp dword[edi+8], C_CLK/(16 + 16/2)
|
||||||
jl .c_nextbaud2
|
jl .c_nextbaud2
|
||||||
mov edx, 1
|
mov edx, 1
|
||||||
mov ecx, C_CLK/(10 + 10/2)
|
mov ecx, C_CLK/(16 + 16/2)
|
||||||
jmp .calcend
|
jmp .calcend
|
||||||
|
|
||||||
.h_nextbaud2:
|
.h_nextbaud2:
|
||||||
@ -725,14 +778,15 @@ C_CLK = 48000000
|
|||||||
jmp .calcend
|
jmp .calcend
|
||||||
|
|
||||||
.c_nextbaud2:
|
.c_nextbaud2:
|
||||||
cmp dword[edi+8], C_CLK/(2*10)
|
cmp dword[edi+8], C_CLK/(2*16)
|
||||||
jl .c_nextbaud3
|
jl .c_nextbaud3
|
||||||
mov edx, 2
|
mov edx, 2
|
||||||
mov ecx, C_CLK/(2*10)
|
mov ecx, C_CLK/(2*16)
|
||||||
jmp .calcend
|
jmp .calcend
|
||||||
|
|
||||||
.h_nextbaud3:
|
.h_nextbaud3:
|
||||||
mov eax, H_CLK*16/10 ; eax - best_divisor
|
mov eax, H_CLK*16/10 ; eax - best_divisor
|
||||||
|
xor edx, edx
|
||||||
div dword[edi+8] ; [edi+8] - baudrate
|
div dword[edi+8] ; [edi+8] - baudrate
|
||||||
push eax
|
push eax
|
||||||
and eax, 1
|
and eax, 1
|
||||||
@ -747,6 +801,7 @@ C_CLK = 48000000
|
|||||||
.h_best_divok:
|
.h_best_divok:
|
||||||
mov ecx, eax
|
mov ecx, eax
|
||||||
mov eax, H_CLK*16/10
|
mov eax, H_CLK*16/10
|
||||||
|
xor edx, edx
|
||||||
div ecx
|
div ecx
|
||||||
xchg ecx, eax ; ecx - best_baud
|
xchg ecx, eax ; ecx - best_baud
|
||||||
push ecx
|
push ecx
|
||||||
@ -758,13 +813,14 @@ C_CLK = 48000000
|
|||||||
jmp .rounddownbaud
|
jmp .rounddownbaud
|
||||||
|
|
||||||
.c_nextbaud3:
|
.c_nextbaud3:
|
||||||
mov eax, C_CLK*16/10 ; eax - best_divisor
|
mov eax, C_CLK ; eax - best_divisor
|
||||||
|
xor edx, edx
|
||||||
div dword[edi+8] ; [edi+8] - baudrate
|
div dword[edi+8] ; [edi+8] - baudrate
|
||||||
push eax
|
push eax
|
||||||
and eax, 1
|
and eax, 1
|
||||||
pop eax
|
pop eax
|
||||||
shr eax, 1
|
shr eax, 1
|
||||||
jz .c_rounddowndiv ; jump by result of and eax, 1
|
jnz .c_rounddowndiv ; jump by result of and eax, 1
|
||||||
inc eax
|
inc eax
|
||||||
.c_rounddowndiv:
|
.c_rounddowndiv:
|
||||||
cmp eax, 0x20000
|
cmp eax, 0x20000
|
||||||
@ -772,14 +828,15 @@ C_CLK = 48000000
|
|||||||
mov eax, 0x1FFFF
|
mov eax, 0x1FFFF
|
||||||
.c_best_divok:
|
.c_best_divok:
|
||||||
mov ecx, eax
|
mov ecx, eax
|
||||||
mov eax, C_CLK*16/10
|
mov eax, C_CLK
|
||||||
|
xor edx, edx
|
||||||
div ecx
|
div ecx
|
||||||
xchg ecx, eax ; ecx - best_baud
|
xchg ecx, eax ; ecx - best_baud
|
||||||
push ecx
|
push ecx
|
||||||
and ecx, 1
|
and ecx, 1
|
||||||
pop ecx
|
pop ecx
|
||||||
shr ecx, 1
|
shr ecx, 1
|
||||||
jz .rounddownbaud
|
jnz .rounddownbaud
|
||||||
inc ecx
|
inc ecx
|
||||||
|
|
||||||
.rounddownbaud:
|
.rounddownbaud:
|
||||||
|
Loading…
Reference in New Issue
Block a user