keyboard.cc revision 12656:335489e574f3
111250Sradhika.jagtap@ARM.com/* 211250Sradhika.jagtap@ARM.com * Copyright (c) 2017-2018 ARM Limited 311250Sradhika.jagtap@ARM.com * All rights reserved 411250Sradhika.jagtap@ARM.com * 511250Sradhika.jagtap@ARM.com * The license below extends only to copyright in the software and shall 611250Sradhika.jagtap@ARM.com * not be construed as granting a license to any other intellectual 711250Sradhika.jagtap@ARM.com * property including but not limited to intellectual property relating 811250Sradhika.jagtap@ARM.com * to a hardware implementation of the functionality of the software 911250Sradhika.jagtap@ARM.com * licensed hereunder. You may use the software subject to the license 1011250Sradhika.jagtap@ARM.com * terms below provided that you ensure that this notice is replicated 1111250Sradhika.jagtap@ARM.com * unmodified and in its entirety in all distributions of the software, 1211250Sradhika.jagtap@ARM.com * modified or unmodified, in source code or in binary form. 1311250Sradhika.jagtap@ARM.com * 1411250Sradhika.jagtap@ARM.com * Copyright (c) 2008 The Regents of The University of Michigan 1511250Sradhika.jagtap@ARM.com * All rights reserved. 1611250Sradhika.jagtap@ARM.com * 1711250Sradhika.jagtap@ARM.com * Redistribution and use in source and binary forms, with or without 1811250Sradhika.jagtap@ARM.com * modification, are permitted provided that the following conditions are 1911250Sradhika.jagtap@ARM.com * met: redistributions of source code must retain the above copyright 2011250Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer; 2111250Sradhika.jagtap@ARM.com * redistributions in binary form must reproduce the above copyright 2211250Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer in the 2311250Sradhika.jagtap@ARM.com * documentation and/or other materials provided with the distribution; 2411250Sradhika.jagtap@ARM.com * neither the name of the copyright holders nor the names of its 2511250Sradhika.jagtap@ARM.com * contributors may be used to endorse or promote products derived from 2611250Sradhika.jagtap@ARM.com * this software without specific prior written permission. 2711250Sradhika.jagtap@ARM.com * 2811250Sradhika.jagtap@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2911250Sradhika.jagtap@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3011250Sradhika.jagtap@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3111250Sradhika.jagtap@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3211250Sradhika.jagtap@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3311250Sradhika.jagtap@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3411250Sradhika.jagtap@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3511250Sradhika.jagtap@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3611250Sradhika.jagtap@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3711250Sradhika.jagtap@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3811250Sradhika.jagtap@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3911250Sradhika.jagtap@ARM.com * 4011250Sradhika.jagtap@ARM.com * Authors: Gabe Black 4111250Sradhika.jagtap@ARM.com * Andreas Sandberg 4211250Sradhika.jagtap@ARM.com */ 4311250Sradhika.jagtap@ARM.com 4411250Sradhika.jagtap@ARM.com#include "dev/ps2/keyboard.hh" 4511250Sradhika.jagtap@ARM.com 4611250Sradhika.jagtap@ARM.com#include "base/logging.hh" 4711250Sradhika.jagtap@ARM.com#include "debug/PS2.hh" 4811250Sradhika.jagtap@ARM.com#include "dev/ps2.hh" 4911250Sradhika.jagtap@ARM.com#include "params/PS2Keyboard.hh" 5011250Sradhika.jagtap@ARM.com 5111250Sradhika.jagtap@ARM.comconst uint8_t PS2Keyboard::ID[] = {0xab, 0x83}; 5211250Sradhika.jagtap@ARM.com 5311250Sradhika.jagtap@ARM.comPS2Keyboard::PS2Keyboard(const PS2KeyboardParams *p) 5411250Sradhika.jagtap@ARM.com : PS2Device(p), 5511250Sradhika.jagtap@ARM.com shiftDown(false), 5611250Sradhika.jagtap@ARM.com enabled(false) 5711250Sradhika.jagtap@ARM.com{ 5811250Sradhika.jagtap@ARM.com if (p->vnc) 5911250Sradhika.jagtap@ARM.com p->vnc->setKeyboard(this); 6011250Sradhika.jagtap@ARM.com} 6111250Sradhika.jagtap@ARM.com 6211250Sradhika.jagtap@ARM.comvoid 6311250Sradhika.jagtap@ARM.comPS2Keyboard::serialize(CheckpointOut &cp) const 6411250Sradhika.jagtap@ARM.com{ 6511250Sradhika.jagtap@ARM.com PS2Device::serialize(cp); 6611250Sradhika.jagtap@ARM.com SERIALIZE_SCALAR(shiftDown); 6711250Sradhika.jagtap@ARM.com SERIALIZE_SCALAR(enabled); 6811250Sradhika.jagtap@ARM.com} 6911250Sradhika.jagtap@ARM.com 7011250Sradhika.jagtap@ARM.comvoid 7111250Sradhika.jagtap@ARM.comPS2Keyboard::unserialize(CheckpointIn &cp) 7211250Sradhika.jagtap@ARM.com{ 7311250Sradhika.jagtap@ARM.com PS2Device::unserialize(cp); 7411252Sradhika.jagtap@ARM.com UNSERIALIZE_SCALAR(shiftDown); 7511253Sradhika.jagtap@ARM.com UNSERIALIZE_SCALAR(enabled); 7611250Sradhika.jagtap@ARM.com} 7711250Sradhika.jagtap@ARM.com 7811250Sradhika.jagtap@ARM.combool 7911250Sradhika.jagtap@ARM.comPS2Keyboard::recv(const std::vector<uint8_t> &data) 8011253Sradhika.jagtap@ARM.com{ 8111250Sradhika.jagtap@ARM.com switch (data[0]) { 8211252Sradhika.jagtap@ARM.com case LEDWrite: 8311252Sradhika.jagtap@ARM.com if (data.size() == 1) { 8411252Sradhika.jagtap@ARM.com DPRINTF(PS2, "Got LED write command.\n"); 8511252Sradhika.jagtap@ARM.com sendAck(); 8611252Sradhika.jagtap@ARM.com return false; 8711252Sradhika.jagtap@ARM.com } else { 8811252Sradhika.jagtap@ARM.com DPRINTF(PS2, "Setting LEDs: " 8911252Sradhika.jagtap@ARM.com "caps lock %s, num lock %s, scroll lock %s\n", 9011252Sradhika.jagtap@ARM.com bits(data[1], 2) ? "on" : "off", 9111250Sradhika.jagtap@ARM.com bits(data[1], 1) ? "on" : "off", 9211250Sradhika.jagtap@ARM.com bits(data[1], 0) ? "on" : "off"); 9311250Sradhika.jagtap@ARM.com sendAck(); 9411250Sradhika.jagtap@ARM.com return true; 9511250Sradhika.jagtap@ARM.com } 9611250Sradhika.jagtap@ARM.com case DiagnosticEcho: 9711250Sradhika.jagtap@ARM.com panic("Keyboard diagnostic echo unimplemented.\n"); 9811250Sradhika.jagtap@ARM.com case AlternateScanCodes: 9911250Sradhika.jagtap@ARM.com panic("Accessing alternate scan codes unimplemented.\n"); 10011250Sradhika.jagtap@ARM.com case ReadID: 10111250Sradhika.jagtap@ARM.com DPRINTF(PS2, "Got keyboard read ID command.\n"); 10211250Sradhika.jagtap@ARM.com sendAck(); 10311250Sradhika.jagtap@ARM.com send((uint8_t *)&ID, sizeof(ID)); 10411250Sradhika.jagtap@ARM.com return true; 10511250Sradhika.jagtap@ARM.com case TypematicInfo: 10611250Sradhika.jagtap@ARM.com if (data.size() == 1) { 10711250Sradhika.jagtap@ARM.com DPRINTF(PS2, "Setting typematic info.\n"); 10811250Sradhika.jagtap@ARM.com sendAck(); 10911250Sradhika.jagtap@ARM.com return false; 11011250Sradhika.jagtap@ARM.com } else { 11111250Sradhika.jagtap@ARM.com DPRINTF(PS2, "Setting typematic info to %#02x.\n", data[1]); 11211252Sradhika.jagtap@ARM.com sendAck(); 11311252Sradhika.jagtap@ARM.com return true; 11411250Sradhika.jagtap@ARM.com } 11511250Sradhika.jagtap@ARM.com case Enable: 11611250Sradhika.jagtap@ARM.com DPRINTF(PS2, "Enabling the keyboard.\n"); 11711250Sradhika.jagtap@ARM.com enabled = true; 11811250Sradhika.jagtap@ARM.com sendAck(); 11911250Sradhika.jagtap@ARM.com return true; 12011250Sradhika.jagtap@ARM.com case Disable: 12111250Sradhika.jagtap@ARM.com DPRINTF(PS2, "Disabling the keyboard.\n"); 12211250Sradhika.jagtap@ARM.com enabled = false; 12311250Sradhika.jagtap@ARM.com sendAck(); 12411250Sradhika.jagtap@ARM.com return true; 12511250Sradhika.jagtap@ARM.com case DefaultsAndDisable: 12611250Sradhika.jagtap@ARM.com DPRINTF(PS2, "Disabling and resetting the keyboard.\n"); 12711250Sradhika.jagtap@ARM.com enabled = false; 12811250Sradhika.jagtap@ARM.com sendAck(); 12911250Sradhika.jagtap@ARM.com return true; 13011250Sradhika.jagtap@ARM.com case AllKeysToTypematic: 13111250Sradhika.jagtap@ARM.com panic("Setting all keys to typemantic unimplemented.\n"); 13211250Sradhika.jagtap@ARM.com case AllKeysToMakeRelease: 13311250Sradhika.jagtap@ARM.com panic("Setting all keys to make/release unimplemented.\n"); 13411250Sradhika.jagtap@ARM.com case AllKeysToMake: 13511250Sradhika.jagtap@ARM.com panic("Setting all keys to make unimplemented.\n"); 13611250Sradhika.jagtap@ARM.com case AllKeysToTypematicMakeRelease: 13711250Sradhika.jagtap@ARM.com panic("Setting all keys to " 13811250Sradhika.jagtap@ARM.com "typematic/make/release unimplemented.\n"); 13911250Sradhika.jagtap@ARM.com case KeyToTypematic: 14011250Sradhika.jagtap@ARM.com panic("Setting a key to typematic unimplemented.\n"); 14111252Sradhika.jagtap@ARM.com case KeyToMakeRelease: 14211252Sradhika.jagtap@ARM.com panic("Setting a key to make/release unimplemented.\n"); 14311252Sradhika.jagtap@ARM.com case KeyToMakeOnly: 14411252Sradhika.jagtap@ARM.com panic("Setting key to make only unimplemented.\n"); 14511252Sradhika.jagtap@ARM.com case Resend: 14611252Sradhika.jagtap@ARM.com panic("Keyboard resend unimplemented.\n"); 14711250Sradhika.jagtap@ARM.com case Reset: 14811250Sradhika.jagtap@ARM.com panic("Keyboard reset unimplemented.\n"); 14911250Sradhika.jagtap@ARM.com default: 15011250Sradhika.jagtap@ARM.com panic("Unknown keyboard command %#02x.\n", data[0]); 15111250Sradhika.jagtap@ARM.com } 15211250Sradhika.jagtap@ARM.com} 15311252Sradhika.jagtap@ARM.com 15411250Sradhika.jagtap@ARM.comvoid 15511250Sradhika.jagtap@ARM.comPS2Keyboard::keyPress(uint32_t key, bool down) 15611250Sradhika.jagtap@ARM.com{ 15711250Sradhika.jagtap@ARM.com std::list<uint8_t> keys; 15811252Sradhika.jagtap@ARM.com 15911252Sradhika.jagtap@ARM.com // convert the X11 keysym into ps2 codes and update the shift 16011252Sradhika.jagtap@ARM.com // state (shiftDown) 16111252Sradhika.jagtap@ARM.com Ps2::keySymToPs2(key, down, shiftDown, keys); 16211252Sradhika.jagtap@ARM.com 16311252Sradhika.jagtap@ARM.com // Drop key presses if the keyboard hasn't been enabled by the 16411252Sradhika.jagtap@ARM.com // host. We do that after translating the key code to ensure that 16511252Sradhika.jagtap@ARM.com // we keep track of the shift state. 16611252Sradhika.jagtap@ARM.com if (!enabled) 16711252Sradhika.jagtap@ARM.com return; 16811252Sradhika.jagtap@ARM.com 16911250Sradhika.jagtap@ARM.com // Insert into our queue of characters 17011253Sradhika.jagtap@ARM.com for (uint8_t c : keys) 17111253Sradhika.jagtap@ARM.com send(c); 17211252Sradhika.jagtap@ARM.com} 17311253Sradhika.jagtap@ARM.com 17411253Sradhika.jagtap@ARM.com 17511250Sradhika.jagtap@ARM.comPS2Keyboard * 17611250Sradhika.jagtap@ARM.comPS2KeyboardParams::create() 17711250Sradhika.jagtap@ARM.com{ 17811252Sradhika.jagtap@ARM.com return new PS2Keyboard(this); 17911250Sradhika.jagtap@ARM.com} 18011250Sradhika.jagtap@ARM.com