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