forked from KolibriOS/kolibrios
API for external keyboards
git-svn-id: svn://kolibrios.org@2601 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
cb6e8e3fb9
commit
bf4cb45023
@ -72,6 +72,9 @@ iglobal
|
|||||||
szLoadFile db 'LoadFile',0
|
szLoadFile db 'LoadFile',0
|
||||||
szSendEvent db 'SendEvent',0
|
szSendEvent db 'SendEvent',0
|
||||||
szSetMouseData db 'SetMouseData',0
|
szSetMouseData db 'SetMouseData',0
|
||||||
|
szSetKeyboardData db 'SetKeyboardData',0
|
||||||
|
szRegKeyboard db 'RegKeyboard',0
|
||||||
|
szDelKeyboard db 'DelKeyboard',0
|
||||||
szSleep db 'Sleep',0
|
szSleep db 'Sleep',0
|
||||||
szGetTimerTicks db 'GetTimerTicks',0
|
szGetTimerTicks db 'GetTimerTicks',0
|
||||||
|
|
||||||
@ -154,6 +157,9 @@ kernel_export:
|
|||||||
dd szLoadFile , load_file ;retval eax, ebx
|
dd szLoadFile , load_file ;retval eax, ebx
|
||||||
dd szSendEvent , send_event ;see EVENT.inc for specification
|
dd szSendEvent , send_event ;see EVENT.inc for specification
|
||||||
dd szSetMouseData , set_mouse_data ;stdcall
|
dd szSetMouseData , set_mouse_data ;stdcall
|
||||||
|
dd szSetKeyboardData , set_keyboard_data
|
||||||
|
dd szRegKeyboard , register_keyboard
|
||||||
|
dd szDelKeyboard , delete_keyboard
|
||||||
dd szSleep , delay_ms
|
dd szSleep , delay_ms
|
||||||
dd szGetTimerTicks , get_timer_ticks
|
dd szGetTimerTicks , get_timer_ticks
|
||||||
|
|
||||||
|
@ -80,6 +80,9 @@ kernel_export \
|
|||||||
LoadFile,\
|
LoadFile,\
|
||||||
SendEvent,\
|
SendEvent,\
|
||||||
SetMouseData,\
|
SetMouseData,\
|
||||||
|
SetKeyboardData,\
|
||||||
|
RegKeyboard,\
|
||||||
|
DelKeyboard,\
|
||||||
Sleep,\
|
Sleep,\
|
||||||
GetTimerTicks,\
|
GetTimerTicks,\
|
||||||
\
|
\
|
||||||
|
@ -34,6 +34,7 @@ uglobal
|
|||||||
ctrl_alt_del db 0
|
ctrl_alt_del db 0
|
||||||
|
|
||||||
kb_lights db 0
|
kb_lights db 0
|
||||||
|
old_kb_lights db 0
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
hotkey_scancodes rd 256 ; we have 256 scancodes
|
hotkey_scancodes rd 256 ; we have 256 scancodes
|
||||||
@ -113,6 +114,83 @@ set_keyboard_data:
|
|||||||
pop ebp edi esi ebx
|
pop ebp edi esi ebx
|
||||||
ret
|
ret
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
|
struct KEYBOARD
|
||||||
|
next dd ?
|
||||||
|
prev dd ?
|
||||||
|
functions dd ?
|
||||||
|
userdata dd ?
|
||||||
|
ends
|
||||||
|
struct KBDFUNC
|
||||||
|
strucsize dd ?
|
||||||
|
close dd ?
|
||||||
|
setlights dd ?
|
||||||
|
ends
|
||||||
|
|
||||||
|
iglobal
|
||||||
|
keyboards:
|
||||||
|
dd keyboards
|
||||||
|
dd keyboards
|
||||||
|
endg
|
||||||
|
uglobal
|
||||||
|
keyboard_list_mutex MUTEX
|
||||||
|
endg
|
||||||
|
|
||||||
|
register_keyboard:
|
||||||
|
push ebx
|
||||||
|
push sizeof.KEYBOARD
|
||||||
|
pop eax
|
||||||
|
call malloc
|
||||||
|
test eax, eax
|
||||||
|
jz .nothing
|
||||||
|
mov ecx, [esp+4+4]
|
||||||
|
mov [eax+KEYBOARD.functions], ecx
|
||||||
|
mov ecx, [esp+8+4]
|
||||||
|
mov [eax+KEYBOARD.userdata], ecx
|
||||||
|
xchg eax, ebx
|
||||||
|
mov ecx, keyboard_list_mutex
|
||||||
|
call mutex_lock
|
||||||
|
mov ecx, keyboards
|
||||||
|
mov edx, [ecx+KEYBOARD.prev]
|
||||||
|
mov [ebx+KEYBOARD.next], ecx
|
||||||
|
mov [ebx+KEYBOARD.prev], edx
|
||||||
|
mov [edx+KEYBOARD.next], ebx
|
||||||
|
mov [ecx+KEYBOARD.prev], ebx
|
||||||
|
mov ecx, [ebx+KEYBOARD.functions]
|
||||||
|
cmp [ecx+KBDFUNC.strucsize], KBDFUNC.setlights
|
||||||
|
jbe .unlock
|
||||||
|
mov ecx, [ecx+KBDFUNC.setlights]
|
||||||
|
test ecx, ecx
|
||||||
|
jz .unlock
|
||||||
|
stdcall ecx, [ebx+KEYBOARD.userdata], dword [kb_lights]
|
||||||
|
.unlock:
|
||||||
|
mov ecx, keyboard_list_mutex
|
||||||
|
call mutex_unlock
|
||||||
|
xchg eax, ebx
|
||||||
|
.nothing:
|
||||||
|
pop ebx
|
||||||
|
ret 8
|
||||||
|
|
||||||
|
delete_keyboard:
|
||||||
|
push ebx
|
||||||
|
mov ebx, [esp+4+4]
|
||||||
|
mov ecx, keyboard_list_mutex
|
||||||
|
call mutex_lock
|
||||||
|
mov eax, [ebx+KEYBOARD.next]
|
||||||
|
mov edx, [ebx+KEYBOARD.prev]
|
||||||
|
mov [eax+KEYBOARD.prev], edx
|
||||||
|
mov [edx+KEYBOARD.next], eax
|
||||||
|
call mutex_unlock
|
||||||
|
mov ecx, [ebx+KEYBOARD.functions]
|
||||||
|
cmp [ecx+KBDFUNC.strucsize], KBDFUNC.close
|
||||||
|
jbe .nothing
|
||||||
|
mov ecx, [ecx+KBDFUNC.close]
|
||||||
|
test ecx, ecx
|
||||||
|
jz .nothing
|
||||||
|
stdcall ecx, [ebx+KEYBOARD.userdata]
|
||||||
|
.nothing:
|
||||||
|
pop ebx
|
||||||
|
ret 4
|
||||||
|
;---------------------------------------------------------------------
|
||||||
align 4
|
align 4
|
||||||
irq1:
|
irq1:
|
||||||
movzx eax, word[TASK_COUNT]; top window process
|
movzx eax, word[TASK_COUNT]; top window process
|
||||||
@ -281,7 +359,9 @@ send_scancode:
|
|||||||
|
|
||||||
xor [kb_state], eax
|
xor [kb_state], eax
|
||||||
xor [kb_lights], bl
|
xor [kb_lights], bl
|
||||||
|
push ecx
|
||||||
call set_lights
|
call set_lights
|
||||||
|
pop ecx
|
||||||
.writekey:
|
.writekey:
|
||||||
; test for system hotkeys
|
; test for system hotkeys
|
||||||
movzx eax, ch
|
movzx eax, ch
|
||||||
@ -384,10 +464,43 @@ send_scancode:
|
|||||||
ret
|
ret
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
set_lights:
|
set_lights:
|
||||||
|
push ebx esi
|
||||||
|
mov ecx, keyboard_list_mutex
|
||||||
|
call mutex_lock
|
||||||
|
mov esi, keyboards
|
||||||
|
.loop:
|
||||||
|
mov esi, [esi+KEYBOARD.next]
|
||||||
|
cmp esi, keyboards
|
||||||
|
jz .done
|
||||||
|
mov eax, [esi+KEYBOARD.functions]
|
||||||
|
cmp dword [eax], KBDFUNC.setlights
|
||||||
|
jbe .loop
|
||||||
|
mov eax, [eax+KBDFUNC.setlights]
|
||||||
|
test eax, eax
|
||||||
|
jz .loop
|
||||||
|
stdcall eax, [esi+KEYBOARD.userdata], dword [kb_lights]
|
||||||
|
jmp .loop
|
||||||
|
.done:
|
||||||
|
mov ecx, keyboard_list_mutex
|
||||||
|
call mutex_unlock
|
||||||
|
pop esi ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
ps2_set_lights:
|
||||||
mov al, 0xED
|
mov al, 0xED
|
||||||
call kb_write
|
call kb_write
|
||||||
mov al, [kb_lights]
|
mov al, [esp+8]
|
||||||
call kb_write
|
call kb_write
|
||||||
|
ret 8
|
||||||
|
|
||||||
|
;// mike.dld ]
|
||||||
|
check_lights_state:
|
||||||
|
mov al, [kb_lights]
|
||||||
|
cmp al, [old_kb_lights]
|
||||||
|
jz .nothing
|
||||||
|
mov [old_kb_lights], al
|
||||||
|
call set_lights
|
||||||
|
.nothing:
|
||||||
ret
|
ret
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
numlock_map:
|
numlock_map:
|
||||||
|
@ -332,6 +332,9 @@ high_code:
|
|||||||
mov ecx, disk_list_mutex
|
mov ecx, disk_list_mutex
|
||||||
call mutex_init
|
call mutex_init
|
||||||
|
|
||||||
|
mov ecx, keyboard_list_mutex
|
||||||
|
call mutex_init
|
||||||
|
|
||||||
mov ecx, unpack_mutex
|
mov ecx, unpack_mutex
|
||||||
call mutex_init
|
call mutex_init
|
||||||
|
|
||||||
@ -910,6 +913,8 @@ first_app_found:
|
|||||||
; SET KEYBOARD PARAMETERS
|
; SET KEYBOARD PARAMETERS
|
||||||
mov al, 0xf6 ; reset keyboard, scan enabled
|
mov al, 0xf6 ; reset keyboard, scan enabled
|
||||||
call kb_write
|
call kb_write
|
||||||
|
test ah, ah
|
||||||
|
jnz .no_keyboard
|
||||||
|
|
||||||
; wait until 8042 is ready
|
; wait until 8042 is ready
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
@ -918,6 +923,15 @@ first_app_found:
|
|||||||
and al, 00000010b
|
and al, 00000010b
|
||||||
loopnz @b
|
loopnz @b
|
||||||
|
|
||||||
|
iglobal
|
||||||
|
align 4
|
||||||
|
ps2_keyboard_functions:
|
||||||
|
dd .end - $
|
||||||
|
dd 0 ; no close
|
||||||
|
dd ps2_set_lights
|
||||||
|
.end:
|
||||||
|
endg
|
||||||
|
stdcall register_keyboard, ps2_keyboard_functions, 0
|
||||||
; mov al, 0xED ; Keyboard LEDs - only for testing!
|
; mov al, 0xED ; Keyboard LEDs - only for testing!
|
||||||
; call kb_write
|
; call kb_write
|
||||||
; call kb_read
|
; call kb_read
|
||||||
@ -935,6 +949,7 @@ first_app_found:
|
|||||||
call set_lights
|
call set_lights
|
||||||
;// mike.dld ]
|
;// mike.dld ]
|
||||||
stdcall attach_int_handler, 1, irq1, 0
|
stdcall attach_int_handler, 1, irq1, 0
|
||||||
|
.no_keyboard:
|
||||||
|
|
||||||
; SET MOUSE
|
; SET MOUSE
|
||||||
|
|
||||||
@ -1056,6 +1071,7 @@ osloop:
|
|||||||
call checkidle
|
call checkidle
|
||||||
call check_fdd_motor_status
|
call check_fdd_motor_status
|
||||||
call check_ATAPI_device_event
|
call check_ATAPI_device_event
|
||||||
|
call check_lights_state
|
||||||
call check_timers
|
call check_timers
|
||||||
jmp osloop
|
jmp osloop
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
Loading…
Reference in New Issue
Block a user