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:
gtament 2014-08-08 18:00:40 +00:00
parent d22ed6d387
commit c0acbd793f
2 changed files with 115 additions and 55 deletions

View File

@ -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]

View File

@ -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: