kolibrios/drivers/serial/common.inc
Alexey Ryabov 5593d344cd Add serial ports driver
This commit adds a new serial port driver that allows other drivers to add or remove ports dynamically and allows applications to use a single serial ports API. It also modifies the usbftdi driver to support the new serial ports API.

The driver may conflict with kernel if it is compiled with debug_com_base.

Topic on forum https://board.kolibrios.org/viewtopic.php?p=78764

Reviewed-on: #94
Reviewed-by: Gleb Zaharov <sweetbread@coders-squad.com>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Co-authored-by: Alexey Ryabov <alex@b00bl1k.ru>
Co-committed-by: Alexey Ryabov <alex@b00bl1k.ru>
2025-01-12 14:28:42 +01:00

273 lines
7.0 KiB
PHP
Executable File

SERIAL_API_GET_VERSION = 0
SERIAL_API_SRV_ADD_PORT = 1
SERIAL_API_SRV_REMOVE_PORT = 2
SERIAL_API_SRV_HANDLE_EVENT = 3
SERIAL_API_OPEN_PORT = 4
SERIAL_API_CLOSE_PORT = 5
SERIAL_API_SETUP_PORT = 6
SERIAL_API_READ = 7
SERIAL_API_WRITE = 8
SERIAL_API_ERR_PORT_INVALID = 1
SERIAL_API_ERR_PORT_BUSY = 2
SERIAL_API_ERR_CONF = 3
SERIAL_EVT_TXE = 1 ; tx fifo or register is empty, all data has been sent
SERIAL_EVT_RXNE = 2 ; rx fifo or register is not empty
SERIAL_CONF_PARITY_NONE = 0
SERIAL_CONF_PARITY_EVEN = 1
SERIAL_CONF_PARITY_ODD = 2
SERIAL_CONF_PARITY_MARK = 3
SERIAL_CONF_PARITY_SPACE = 4
SERIAL_CONF_FLOW_CTRL_NONE = 0
struct SP_DRIVER
size dd ? ; size of this struct
startup dd ? ; void __stdcall (*startup)(void *drv_data, const struct serial_conf *conf);
shutdown dd ? ; void __stdcall (*shutdown)(void *drv_data);
reconf dd ? ; void __stdcall (*reconf)(void *drv_data, const struct serial_conf *conf);
tx dd ? ; void __stdcall (*tx)(void *drv_data);
ends
struct SP_CONF
size dd ? ; size of this struct
baudrate dd ?
word_size db ?
stop_bits db ?
parity db ?
flow_ctrl db ?
ends
proc serial_add_port stdcall, drv:dword, drv_data:dword
locals
handler dd ?
io_code dd ?
input dd ?
inp_size dd ?
output dd ?
out_size dd ?
endl
mov eax, [serial_drv_entry]
mov [handler], eax
mov [io_code], SERIAL_API_SRV_ADD_PORT
lea eax, [drv]
mov [input], eax
mov [inp_size], 8
xor eax, eax
mov [output], eax
mov [out_size], eax
lea eax, [handler]
push esi edi
invoke ServiceHandler, eax
pop edi esi
ret
endp
proc serial_remove_port stdcall, port:dword
locals
handler dd ?
io_code dd ?
input dd ?
inp_size dd ?
output dd ?
out_size dd ?
endl
mov eax, [serial_drv_entry]
mov [handler], eax
mov [io_code], SERIAL_API_SRV_REMOVE_PORT
lea eax, [port]
mov [input], eax
mov [inp_size], 4
xor eax, eax
mov [output], eax
mov [out_size], eax
lea eax, [handler]
push esi edi
invoke ServiceHandler, eax
pop edi esi
ret
endp
; see SERIAL_EVT_*
proc serial_handle_event stdcall, port:dword, event:dword, count:dword, buff:dword
locals
handler dd ?
io_code dd ?
input dd ?
inp_size dd ?
output dd ?
out_size dd ?
endl
mov eax, [serial_drv_entry]
mov [handler], eax
mov [io_code], SERIAL_API_SRV_HANDLE_EVENT
lea eax, [port]
mov [input], eax
mov [inp_size], 16
xor eax, eax
mov [output], eax
mov [out_size], eax
lea eax, [handler]
push esi edi
invoke ServiceHandler, eax
pop edi esi
ret
endp
proc serial_port_init
lea ecx, [serial_drv_name]
mcall SF_SYS_MISC, SSF_LOAD_DRIVER
mov [serial_drv_handle], eax
ret
endp
proc serial_port_open stdcall uses ebx, port_id:dword, conf:dword, handle:dword
locals
.handler dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
endl
push [conf]
push [port_id]
mov eax, [serial_drv_handle]
mov [.handler], eax
mov dword [.io_code], SERIAL_API_OPEN_PORT
mov [.input], esp
mov dword [.inp_size], 8
mov eax, [handle]
mov [.output], eax
mov dword [.out_size], 4
lea ecx, [.handler]
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
add esp, 8
ret
endp
proc serial_port_close stdcall uses ebx, handle:dword
locals
.handler dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
endl
push [handle]
mov eax, [serial_drv_handle]
mov [.handler], eax
mov dword [.io_code], SERIAL_API_CLOSE_PORT
mov [.input], esp
mov dword [.inp_size], 4
mov dword [.output], 0
mov dword [.out_size], 0
lea ecx, [.handler]
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
add esp, 4
ret
endp
proc serial_port_setup stdcall uses ebx, handle:dword, conf:dword
locals
.handler dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
endl
push [conf]
push [handle]
mov eax, [serial_drv_handle]
mov [.handler], eax
mov dword [.io_code], SERIAL_API_SETUP_PORT
mov [.input], esp
mov dword [.inp_size], 8
sub esp, 4
mov [.output], esp
mov dword [.out_size], 4
lea ecx, [.handler]
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
pop eax
add esp, 8
ret
endp
proc serial_port_read stdcall uses ebx, handle:dword, dest:dword, count_ptr:dword
locals
.handler dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
endl
mov eax, [count_ptr]
push dword [eax]
push [dest]
push [handle]
mov eax, [serial_drv_handle]
mov [.handler], eax
mov dword [.io_code], SERIAL_API_READ
mov [.input], esp
mov dword [.inp_size], 12
sub esp, 4
mov [.output], esp
mov [.out_size], 4
lea ecx, [.handler]
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
pop ecx
mov edx, [count_ptr]
mov [edx], ecx
add esp, 12
ret
endp
proc serial_port_write stdcall uses ebx, handle:dword, src:dword, count_ptr:dword
locals
.handler dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
endl
mov eax, [count_ptr]
push dword [eax]
push [src]
push [handle]
mov eax, [serial_drv_handle]
mov [.handler], eax
mov dword [.io_code], SERIAL_API_WRITE
mov [.input], esp
mov dword [.inp_size], 12
sub esp, 4
mov dword [.output], esp
mov dword [.out_size], 4
lea ecx, [.handler]
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
pop ecx
mov edx, [count_ptr]
mov [edx], ecx
add esp, 12
ret
endp
align 4
serial_drv_name db "SERIAL", 0
serial_drv_handle dd ?