types.cc revision 12660:c5caca5f7d68
15661Sgblack@eecs.umich.edu/* 25661Sgblack@eecs.umich.edu * Copyright (c) 2011, 2018 ARM Limited 35661Sgblack@eecs.umich.edu * All rights reserved 47087Snate@binkert.org * 57087Snate@binkert.org * The license below extends only to copyright in the software and shall 67087Snate@binkert.org * not be construed as granting a license to any other intellectual 77087Snate@binkert.org * property including but not limited to intellectual property relating 87087Snate@binkert.org * to a hardware implementation of the functionality of the software 97087Snate@binkert.org * licensed hereunder. You may use the software subject to the license 107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated 117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software, 125661Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 137087Snate@binkert.org * 147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 157087Snate@binkert.org * modification, are permitted provided that the following conditions are 167087Snate@binkert.org * met: redistributions of source code must retain the above copyright 177087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 187087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 197087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 207087Snate@binkert.org * documentation and/or other materials provided with the distribution; 215661Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 227087Snate@binkert.org * contributors may be used to endorse or promote products derived from 235661Sgblack@eecs.umich.edu * this software without specific prior written permission. 245661Sgblack@eecs.umich.edu * 255661Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 265661Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 275661Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 285661Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 295661Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 305661Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 315661Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 325661Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 335661Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 345661Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 355661Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 365661Sgblack@eecs.umich.edu * 375661Sgblack@eecs.umich.edu * Authors: Ali Saidi 385661Sgblack@eecs.umich.edu */ 395661Sgblack@eecs.umich.edu 405661Sgblack@eecs.umich.edu#include "dev/ps2/types.hh" 415661Sgblack@eecs.umich.edu 425661Sgblack@eecs.umich.edu#include <list> 435661Sgblack@eecs.umich.edu 445661Sgblack@eecs.umich.edu#include "base/logging.hh" 455661Sgblack@eecs.umich.edu#include "x11keysym/keysym.h" 465661Sgblack@eecs.umich.edu 477620Sgblack@eecs.umich.educonst std::vector<uint8_t> Ps2::Keyboard::ID{0xAB, 0x83}; 485661Sgblack@eecs.umich.educonst std::vector<uint8_t> Ps2::Mouse::ID{0x00}; 495661Sgblack@eecs.umich.edu 505661Sgblack@eecs.umich.edunamespace Ps2 { 515661Sgblack@eecs.umich.edu 525661Sgblack@eecs.umich.edu/** Table to convert simple key symbols (0x00XX) into ps2 bytes. Lower byte 535661Sgblack@eecs.umich.edu * is the scan code to send and upper byte is if a modifier is required to 545661Sgblack@eecs.umich.edu * generate it. The table generates us keyboard codes, (e.g. the guest is 555661Sgblack@eecs.umich.edu * supposed to recognize the keyboard as en_US). A new table would be required 565661Sgblack@eecs.umich.edu * for another locale. 575661Sgblack@eecs.umich.edu */ 585661Sgblack@eecs.umich.edu 595661Sgblack@eecs.umich.edustatic const uint16_t keySymToPs2Byte[128] = { 605661Sgblack@eecs.umich.edu// 0 / 8 1 / 9 2 / A 3 / B 4 / C 5 / D 6 / E 7 / F 615661Sgblack@eecs.umich.edu 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00-0x07 625661Sgblack@eecs.umich.edu 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x08-0x0f 635661Sgblack@eecs.umich.edu 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x10-0x17 647620Sgblack@eecs.umich.edu 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x18-0x1f 655661Sgblack@eecs.umich.edu 0x0029, 0x0116, 0x0152, 0x0126, 0x0125, 0x012e, 0x013d, 0x0052, // 0x20-0x27 665661Sgblack@eecs.umich.edu 0x0146, 0x0145, 0x013e, 0x0155, 0x0041, 0x004e, 0x0049, 0x004a, // 0x28-0x2f 675661Sgblack@eecs.umich.edu 0x0045, 0x0016, 0x001e, 0x0026, 0x0025, 0x002e, 0x0036, 0x003d, // 0x30-0x37 685661Sgblack@eecs.umich.edu 0x003e, 0x0046, 0x014c, 0x004c, 0x0141, 0x0055, 0x0149, 0x014a, // 0x38-0x3f 695661Sgblack@eecs.umich.edu 0x011e, 0x011c, 0x0132, 0x0121, 0x0123, 0x0124, 0x012b, 0x0134, // 0x40-0x47 705661Sgblack@eecs.umich.edu 0x0133, 0x0143, 0x013b, 0x0142, 0x014b, 0x013a, 0x0131, 0x0144, // 0x48-0x4f 715661Sgblack@eecs.umich.edu 0x014d, 0x0115, 0x012d, 0x011b, 0x012c, 0x013c, 0x012a, 0x011d, // 0x50-0x57 725661Sgblack@eecs.umich.edu 0x0122, 0x0135, 0x011a, 0x0054, 0x005d, 0x005b, 0x0136, 0x014e, // 0x58-0x5f 735661Sgblack@eecs.umich.edu 0x000e, 0x001c, 0x0032, 0x0021, 0x0023, 0x0024, 0x002b, 0x0034, // 0x60-0x67 745661Sgblack@eecs.umich.edu 0x0033, 0x0043, 0x003b, 0x0042, 0x004b, 0x003a, 0x0031, 0x0044, // 0x68-0x6f 755661Sgblack@eecs.umich.edu 0x004d, 0x0015, 0x002d, 0x001b, 0x002c, 0x003c, 0x002a, 0x001d, // 0x70-0x77 765661Sgblack@eecs.umich.edu 0x0022, 0x0035, 0x001a, 0x0154, 0x015d, 0x015b, 0x010e, 0x0000 // 0x78-0x7f 775661Sgblack@eecs.umich.edu}; 785661Sgblack@eecs.umich.edu 795661Sgblack@eecs.umich.educonst uint8_t ShiftKey = 0x12; 805661Sgblack@eecs.umich.educonst uint8_t BreakKey = 0xf0; 815661Sgblack@eecs.umich.educonst uint8_t ExtendedKey = 0xe0; 825661Sgblack@eecs.umich.educonst uint32_t UpperKeys = 0xff00; 835661Sgblack@eecs.umich.edu 845661Sgblack@eecs.umich.eduvoid 855661Sgblack@eecs.umich.edukeySymToPs2(uint32_t key, bool down, bool &cur_shift, 865661Sgblack@eecs.umich.edu std::list<uint8_t> &keys) 875661Sgblack@eecs.umich.edu{ 885661Sgblack@eecs.umich.edu if (key <= XK_asciitilde) { 897620Sgblack@eecs.umich.edu uint16_t tmp = keySymToPs2Byte[key]; 907620Sgblack@eecs.umich.edu uint8_t code = tmp & 0xff; 915661Sgblack@eecs.umich.edu bool shift = tmp >> 8; 925661Sgblack@eecs.umich.edu 935661Sgblack@eecs.umich.edu if (down) { 945661Sgblack@eecs.umich.edu if (!cur_shift && shift) { 955661Sgblack@eecs.umich.edu keys.push_back(ShiftKey); 965661Sgblack@eecs.umich.edu cur_shift = true; 975661Sgblack@eecs.umich.edu } 985661Sgblack@eecs.umich.edu keys.push_back(code); 997620Sgblack@eecs.umich.edu } else { 1005661Sgblack@eecs.umich.edu if (cur_shift && !shift) { 1017620Sgblack@eecs.umich.edu keys.push_back(BreakKey); 1025661Sgblack@eecs.umich.edu keys.push_back(ShiftKey); 1037626Sgblack@eecs.umich.edu cur_shift = false; 1047894SBrad.Beckmann@amd.com } 1055661Sgblack@eecs.umich.edu keys.push_back(BreakKey); 1065661Sgblack@eecs.umich.edu keys.push_back(code); 1075661Sgblack@eecs.umich.edu } 1085661Sgblack@eecs.umich.edu } else { 1095661Sgblack@eecs.umich.edu if ((key & UpperKeys) == UpperKeys) { 1105661Sgblack@eecs.umich.edu bool extended = false; 1115661Sgblack@eecs.umich.edu switch (key) { 1125661Sgblack@eecs.umich.edu case XK_BackSpace: 1135661Sgblack@eecs.umich.edu keys.push_back(0x66); 1145661Sgblack@eecs.umich.edu break; 1155661Sgblack@eecs.umich.edu case XK_Tab: 1165661Sgblack@eecs.umich.edu keys.push_back(0x0d); 1175661Sgblack@eecs.umich.edu break; 1185661Sgblack@eecs.umich.edu case XK_Return: 1195661Sgblack@eecs.umich.edu keys.push_back(0x5a); 1205661Sgblack@eecs.umich.edu break; 1215661Sgblack@eecs.umich.edu case XK_Escape: 1225662Sgblack@eecs.umich.edu keys.push_back(0x76); 1235661Sgblack@eecs.umich.edu break; 1245661Sgblack@eecs.umich.edu case XK_Delete: 1255661Sgblack@eecs.umich.edu extended = true; 1265661Sgblack@eecs.umich.edu keys.push_back(0x71); 1275661Sgblack@eecs.umich.edu break; 1285661Sgblack@eecs.umich.edu case XK_Home: 1295661Sgblack@eecs.umich.edu extended = true; 1305661Sgblack@eecs.umich.edu keys.push_back(0x6c); 1315661Sgblack@eecs.umich.edu break; 1325661Sgblack@eecs.umich.edu case XK_Left: 1337620Sgblack@eecs.umich.edu extended = true; 1347620Sgblack@eecs.umich.edu keys.push_back(0x6b); 1355661Sgblack@eecs.umich.edu break; 1365661Sgblack@eecs.umich.edu case XK_Right: 1375661Sgblack@eecs.umich.edu extended = true; 1385661Sgblack@eecs.umich.edu keys.push_back(0x74); 1395661Sgblack@eecs.umich.edu break; 1405661Sgblack@eecs.umich.edu case XK_Down: 1415661Sgblack@eecs.umich.edu extended = true; 1425662Sgblack@eecs.umich.edu keys.push_back(0x72); 1435662Sgblack@eecs.umich.edu break; 1445662Sgblack@eecs.umich.edu case XK_Up: 1457620Sgblack@eecs.umich.edu extended = true; 1467620Sgblack@eecs.umich.edu keys.push_back(0x75); 1477620Sgblack@eecs.umich.edu break; 1487620Sgblack@eecs.umich.edu case XK_Page_Up: 1497620Sgblack@eecs.umich.edu extended = true; 1507620Sgblack@eecs.umich.edu keys.push_back(0x7d); 1515662Sgblack@eecs.umich.edu break; 1525663Sgblack@eecs.umich.edu case XK_Page_Down: 1535663Sgblack@eecs.umich.edu extended = true; 1545663Sgblack@eecs.umich.edu keys.push_back(0x7a); 1555663Sgblack@eecs.umich.edu break; 1565663Sgblack@eecs.umich.edu case XK_End: 1575663Sgblack@eecs.umich.edu extended = true; 1585663Sgblack@eecs.umich.edu keys.push_back(0x69); 1595663Sgblack@eecs.umich.edu break; 1605663Sgblack@eecs.umich.edu case XK_Shift_L: 1615663Sgblack@eecs.umich.edu keys.push_back(0x12); 1625663Sgblack@eecs.umich.edu if (down) 1635663Sgblack@eecs.umich.edu cur_shift = true; 1645663Sgblack@eecs.umich.edu else 1657620Sgblack@eecs.umich.edu cur_shift = false; 1667620Sgblack@eecs.umich.edu break; 1677620Sgblack@eecs.umich.edu case XK_Shift_R: 1687620Sgblack@eecs.umich.edu keys.push_back(0x59); 1697620Sgblack@eecs.umich.edu if (down) 1707620Sgblack@eecs.umich.edu cur_shift = true; 1715663Sgblack@eecs.umich.edu else 1725661Sgblack@eecs.umich.edu cur_shift = false; 1737789Sgblack@eecs.umich.edu break; 1747789Sgblack@eecs.umich.edu case XK_Control_L: 1759010Snilay@cs.wisc.edu keys.push_back(0x14); 1769010Snilay@cs.wisc.edu break; 1777894SBrad.Beckmann@amd.com case XK_Control_R: 1785661Sgblack@eecs.umich.edu extended = true; 1795661Sgblack@eecs.umich.edu keys.push_back(0x14); 1805661Sgblack@eecs.umich.edu break; 1815661Sgblack@eecs.umich.edu case XK_Alt_L: 1827789Sgblack@eecs.umich.edu keys.push_back(0x11); 1837789Sgblack@eecs.umich.edu break; 1847894SBrad.Beckmann@amd.com case XK_Alt_R: 1857894SBrad.Beckmann@amd.com extended = true; 1865661Sgblack@eecs.umich.edu keys.push_back(0x11); 1875661Sgblack@eecs.umich.edu break; 1885661Sgblack@eecs.umich.edu default: 1895661Sgblack@eecs.umich.edu warn("Unknown extended key %#x\n", key); 1905663Sgblack@eecs.umich.edu return; 1915663Sgblack@eecs.umich.edu } 1925663Sgblack@eecs.umich.edu 1939010Snilay@cs.wisc.edu if (extended) { 1949010Snilay@cs.wisc.edu if (down) { 1957894SBrad.Beckmann@amd.com keys.push_front(ExtendedKey); 1965663Sgblack@eecs.umich.edu } else { 1975663Sgblack@eecs.umich.edu keys.push_front(BreakKey); 1985663Sgblack@eecs.umich.edu keys.push_front(ExtendedKey); 1995663Sgblack@eecs.umich.edu } 2005663Sgblack@eecs.umich.edu } else { 2017894SBrad.Beckmann@amd.com if (!down) 2027894SBrad.Beckmann@amd.com keys.push_front(BreakKey); 2035663Sgblack@eecs.umich.edu } 2045663Sgblack@eecs.umich.edu } // upper keys 2055663Sgblack@eecs.umich.edu } // extended keys 2065663Sgblack@eecs.umich.edu return; 2075661Sgblack@eecs.umich.edu} 208 209} /* namespace Ps2 */ 210 211