status_t ps2_service_init(void) { TRACE("ps2: ps2_service_init\n"); sServiceCmdBuffer = create_packet_buffer(sizeof(ps2_service_cmd) * 50); if (sServiceCmdBuffer == NULL) goto err1; sServiceSem = create_sem(0, "ps2 service"); if (sServiceSem < B_OK) goto err2; sServiceThread = spawn_kernel_thread(ps2_service_thread, "ps2 service", 20, NULL); if (sServiceThread < B_OK) goto err3; sServiceTerminate = false; resume_thread(sServiceThread); #ifdef DEBUG_PUBLISHING add_debugger_command("ps2republish", &ps2_republish, "republish a ps2 device (0-3 mouse, 4 keyb (default))"); #endif TRACE("ps2: ps2_service_init done\n"); return B_OK; err3: delete_sem(sServiceSem); err2: delete_packet_buffer(sServiceCmdBuffer); err1: TRACE("ps2: ps2_service_init failed\n"); return B_ERROR; }
void ps2_service_exit(void) { TRACE("ps2: ps2_service_exit enter\n"); sServiceTerminate = true; release_sem(sServiceSem); wait_for_thread(sServiceThread, NULL); delete_sem(sServiceSem); delete_packet_buffer(sServiceCmdBuffer); TRACE("ps2: ps2_service_exit done\n"); }
static status_t keyboard_close(void *cookie) { TRACE("ps2: keyboard_close enter\n"); delete_packet_buffer(sKeyBuffer); delete_sem(sKeyboardSem); atomic_and(&ps2_device[PS2_DEVICE_KEYB].flags, ~PS2_FLAG_ENABLED); atomic_and(&sKeyboardOpenMask, 0); TRACE("ps2: keyboard_close done\n"); return B_OK; }
static status_t keyboard_close(void *_cookie) { keyboard_cookie *cookie = (keyboard_cookie *)_cookie; TRACE("ps2: keyboard_close enter\n"); if (atomic_add(&sKeyboardOpenCount, -1) == 1) { delete_packet_buffer(sKeyBuffer); delete_sem(sKeyboardSem); atomic_and(&ps2_device[PS2_DEVICE_KEYB].flags, ~PS2_FLAG_ENABLED); if (cookie->is_reader) sHasKeyboardReader = false; if (cookie->is_debugger) sHasDebugReader = false; } TRACE("ps2: keyboard_close done\n"); return B_OK; }