diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig index fd74fee3692..36fed534161 100644 --- a/drivers/virtio/Kconfig +++ b/drivers/virtio/Kconfig @@ -33,6 +33,11 @@ config DRIVERS_VIRTIO_GPU depends on VIDEO_FB select FB_UPDATE +config DRIVERS_VIRTIO_INPUT + bool "Virtio input support" + default n + depends on INPUT + config DRIVERS_VIRTIO_NET bool "Virtio network support" depends on NETDEVICES diff --git a/drivers/virtio/Make.defs b/drivers/virtio/Make.defs index fd257163ba2..fc7bd8f4a77 100644 --- a/drivers/virtio/Make.defs +++ b/drivers/virtio/Make.defs @@ -36,6 +36,10 @@ ifeq ($(CONFIG_DRIVERS_VIRTIO_GPU),y) CSRCS += virtio-gpu.c endif +ifeq ($(CONFIG_DRIVERS_VIRTIO_INPUT),y) + CSRCS += virtio-input.c +endif + ifeq ($(CONFIG_DRIVERS_VIRTIO_NET),y) CSRCS += virtio-net.c endif diff --git a/drivers/virtio/virtio-input-event-codes.h b/drivers/virtio/virtio-input-event-codes.h new file mode 100644 index 00000000000..7bd7ee16497 --- /dev/null +++ b/drivers/virtio/virtio-input-event-codes.h @@ -0,0 +1,817 @@ +/**************************************************************************** + * drivers/virtio/virtio-input-event-codes.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ + +#ifndef _UAPI_INPUT_EVENT_CODES_H +#define _UAPI_INPUT_EVENT_CODES_H +#define INPUT_PROP_POINTER 0x00 +#define INPUT_PROP_DIRECT 0x01 +#define INPUT_PROP_BUTTONPAD 0x02 +#define INPUT_PROP_SEMI_MT 0x03 +#define INPUT_PROP_TOPBUTTONPAD 0x04 +#define INPUT_PROP_POINTING_STICK 0x05 +#define INPUT_PROP_ACCELEROMETER 0x06 +#define INPUT_PROP_MAX 0x1f +#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) +#define EV_SYN 0x00 +#define EV_KEY 0x01 +#define EV_REL 0x02 +#define EV_ABS 0x03 +#define EV_MSC 0x04 +#define EV_SW 0x05 +#define EV_LED 0x11 +#define EV_SND 0x12 +#define EV_REP 0x14 +#define EV_FF 0x15 +#define EV_PWR 0x16 +#define EV_FF_STATUS 0x17 +#define EV_MAX 0x1f +#define EV_CNT (EV_MAX + 1) +#define SYN_REPORT 0 +#define SYN_CONFIG 1 +#define SYN_MT_REPORT 2 +#define SYN_DROPPED 3 +#define SYN_MAX 0xf +#define SYN_CNT (SYN_MAX + 1) +#define KEY_RESERVED 0 +#define KEY_ESC 1 +#define KEY_1 2 +#define KEY_2 3 +#define KEY_3 4 +#define KEY_4 5 +#define KEY_5 6 +#define KEY_6 7 +#define KEY_7 8 +#define KEY_8 9 +#define KEY_9 10 +#define KEY_0 11 +#define KEY_MINUS 12 +#define KEY_EQUAL 13 +#define KEY_BACKSPACE 14 +#define KEY_TAB 15 +#define KEY_Q 16 +#define KEY_W 17 +#define KEY_E 18 +#define KEY_R 19 +#define KEY_T 20 +#define KEY_Y 21 +#define KEY_U 22 +#define KEY_I 23 +#define KEY_O 24 +#define KEY_P 25 +#define KEY_LEFTBRACE 26 +#define KEY_RIGHTBRACE 27 +#define KEY_ENTER 28 +#define KEY_LEFTCTRL 29 +#define KEY_A 30 +#define KEY_S 31 +#define KEY_D 32 +#define KEY_F 33 +#define KEY_G 34 +#define KEY_H 35 +#define KEY_J 36 +#define KEY_K 37 +#define KEY_L 38 +#define KEY_SEMICOLON 39 +#define KEY_APOSTROPHE 40 +#define KEY_GRAVE 41 +#define KEY_LEFTSHIFT 42 +#define KEY_BACKSLASH 43 +#define KEY_Z 44 +#define KEY_X 45 +#define KEY_C 46 +#define KEY_V 47 +#define KEY_B 48 +#define KEY_N 49 +#define KEY_M 50 +#define KEY_COMMA 51 +#define KEY_DOT 52 +#define KEY_SLASH 53 +#define KEY_RIGHTSHIFT 54 +#define KEY_KPASTERISK 55 +#define KEY_LEFTALT 56 +#define KEY_SPACE 57 +#define KEY_CAPSLOCK 58 +#define KEY_F1 59 +#define KEY_F2 60 +#define KEY_F3 61 +#define KEY_F4 62 +#define KEY_F5 63 +#define KEY_F6 64 +#define KEY_F7 65 +#define KEY_F8 66 +#define KEY_F9 67 +#define KEY_F10 68 +#define KEY_NUMLOCK 69 +#define KEY_SCROLLLOCK 70 +#define KEY_KP7 71 +#define KEY_KP8 72 +#define KEY_KP9 73 +#define KEY_KPMINUS 74 +#define KEY_KP4 75 +#define KEY_KP5 76 +#define KEY_KP6 77 +#define KEY_KPPLUS 78 +#define KEY_KP1 79 +#define KEY_KP2 80 +#define KEY_KP3 81 +#define KEY_KP0 82 +#define KEY_KPDOT 83 +#define KEY_ZENKAKUHANKAKU 85 +#define KEY_102ND 86 +#define KEY_F11 87 +#define KEY_F12 88 +#define KEY_RO 89 +#define KEY_KATAKANA 90 +#define KEY_HIRAGANA 91 +#define KEY_HENKAN 92 +#define KEY_KATAKANAHIRAGANA 93 +#define KEY_MUHENKAN 94 +#define KEY_KPJPCOMMA 95 +#define KEY_KPENTER 96 +#define KEY_RIGHTCTRL 97 +#define KEY_KPSLASH 98 +#define KEY_SYSRQ 99 +#define KEY_RIGHTALT 100 +#define KEY_LINEFEED 101 +#define KEY_HOME 102 +#define KEY_UP 103 +#define KEY_PAGEUP 104 +#define KEY_LEFT 105 +#define KEY_RIGHT 106 +#define KEY_END 107 +#define KEY_DOWN 108 +#define KEY_PAGEDOWN 109 +#define KEY_INSERT 110 +#define KEY_DELETE 111 +#define KEY_MACRO 112 +#define KEY_MUTE 113 +#define KEY_VOLUMEDOWN 114 +#define KEY_VOLUMEUP 115 +#define KEY_POWER 116 +#define KEY_KPEQUAL 117 +#define KEY_KPPLUSMINUS 118 +#define KEY_PAUSE 119 +#define KEY_SCALE 120 +#define KEY_KPCOMMA 121 +#define KEY_HANGEUL 122 +#define KEY_HANGUEL KEY_HANGEUL +#define KEY_HANJA 123 +#define KEY_YEN 124 +#define KEY_LEFTMETA 125 +#define KEY_RIGHTMETA 126 +#define KEY_COMPOSE 127 +#define KEY_STOP 128 +#define KEY_AGAIN 129 +#define KEY_PROPS 130 +#define KEY_UNDO 131 +#define KEY_FRONT 132 +#define KEY_COPY 133 +#define KEY_OPEN 134 +#define KEY_PASTE 135 +#define KEY_FIND 136 +#define KEY_CUT 137 +#define KEY_HELP 138 +#define KEY_MENU 139 +#define KEY_CALC 140 +#define KEY_SETUP 141 +#define KEY_SLEEP 142 +#define KEY_WAKEUP 143 +#define KEY_FILE 144 +#define KEY_SENDFILE 145 +#define KEY_DELETEFILE 146 +#define KEY_XFER 147 +#define KEY_PROG1 148 +#define KEY_PROG2 149 +#define KEY_WWW 150 +#define KEY_MSDOS 151 +#define KEY_COFFEE 152 +#define KEY_SCREENLOCK KEY_COFFEE +#define KEY_ROTATE_DISPLAY 153 +#define KEY_DIRECTION KEY_ROTATE_DISPLAY +#define KEY_CYCLEWINDOWS 154 +#define KEY_MAIL 155 +#define KEY_BOOKMARKS 156 +#define KEY_COMPUTER 157 +#define KEY_BACK 158 +#define KEY_FORWARD 159 +#define KEY_CLOSECD 160 +#define KEY_EJECTCD 161 +#define KEY_EJECTCLOSECD 162 +#define KEY_NEXTSONG 163 +#define KEY_PLAYPAUSE 164 +#define KEY_PREVIOUSSONG 165 +#define KEY_STOPCD 166 +#define KEY_RECORD 167 +#define KEY_REWIND 168 +#define KEY_PHONE 169 +#define KEY_ISO 170 +#define KEY_CONFIG 171 +#define KEY_HOMEPAGE 172 +#define KEY_REFRESH 173 +#define KEY_EXIT 174 +#define KEY_MOVE 175 +#define KEY_EDIT 176 +#define KEY_SCROLLUP 177 +#define KEY_SCROLLDOWN 178 +#define KEY_KPLEFTPAREN 179 +#define KEY_KPRIGHTPAREN 180 +#define KEY_NEW 181 +#define KEY_REDO 182 +#define KEY_F13 183 +#define KEY_F14 184 +#define KEY_F15 185 +#define KEY_F16 186 +#define KEY_F17 187 +#define KEY_F18 188 +#define KEY_F19 189 +#define KEY_F20 190 +#define KEY_F21 191 +#define KEY_F22 192 +#define KEY_F23 193 +#define KEY_F24 194 +#define KEY_PLAYCD 200 +#define KEY_PAUSECD 201 +#define KEY_PROG3 202 +#define KEY_PROG4 203 +#define KEY_ALL_APPLICATIONS 204 +#define KEY_DASHBOARD KEY_ALL_APPLICATIONS +#define KEY_SUSPEND 205 +#define KEY_CLOSE 206 +#define KEY_PLAY 207 +#define KEY_FASTFORWARD 208 +#define KEY_BASSBOOST 209 +#define KEY_PRINT 210 +#define KEY_HP 211 +#define KEY_CAMERA 212 +#define KEY_SOUND 213 +#define KEY_QUESTION 214 +#define KEY_EMAIL 215 +#define KEY_CHAT 216 +#define KEY_SEARCH 217 +#define KEY_CONNECT 218 +#define KEY_FINANCE 219 +#define KEY_SPORT 220 +#define KEY_SHOP 221 +#define KEY_ALTERASE 222 +#define KEY_CANCEL 223 +#define KEY_BRIGHTNESSDOWN 224 +#define KEY_BRIGHTNESSUP 225 +#define KEY_MEDIA 226 +#define KEY_SWITCHVIDEOMODE 227 +#define KEY_KBDILLUMTOGGLE 228 +#define KEY_KBDILLUMDOWN 229 +#define KEY_KBDILLUMUP 230 +#define KEY_SEND 231 +#define KEY_REPLY 232 +#define KEY_FORWARDMAIL 233 +#define KEY_SAVE 234 +#define KEY_DOCUMENTS 235 +#define KEY_BATTERY 236 +#define KEY_BLUETOOTH 237 +#define KEY_WLAN 238 +#define KEY_UWB 239 +#define KEY_UNKNOWN 240 +#define KEY_VIDEO_NEXT 241 +#define KEY_VIDEO_PREV 242 +#define KEY_BRIGHTNESS_CYCLE 243 +#define KEY_BRIGHTNESS_AUTO 244 +#define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO +#define KEY_DISPLAY_OFF 245 +#define KEY_WWAN 246 +#define KEY_WIMAX KEY_WWAN +#define KEY_RFKILL 247 +#define KEY_MICMUTE 248 +#define BTN_MISC 0x100 +#define BTN_0 0x100 +#define BTN_1 0x101 +#define BTN_2 0x102 +#define BTN_3 0x103 +#define BTN_4 0x104 +#define BTN_5 0x105 +#define BTN_6 0x106 +#define BTN_7 0x107 +#define BTN_8 0x108 +#define BTN_9 0x109 +#define BTN_MOUSE 0x110 +#define BTN_LEFT 0x110 +#define BTN_RIGHT 0x111 +#define BTN_MIDDLE 0x112 +#define BTN_SIDE 0x113 +#define BTN_EXTRA 0x114 +#define BTN_FORWARD 0x115 +#define BTN_BACK 0x116 +#define BTN_TASK 0x117 +#define BTN_JOYSTICK 0x120 +#define BTN_TRIGGER 0x120 +#define BTN_THUMB 0x121 +#define BTN_THUMB2 0x122 +#define BTN_TOP 0x123 +#define BTN_TOP2 0x124 +#define BTN_PINKIE 0x125 +#define BTN_BASE 0x126 +#define BTN_BASE2 0x127 +#define BTN_BASE3 0x128 +#define BTN_BASE4 0x129 +#define BTN_BASE5 0x12a +#define BTN_BASE6 0x12b +#define BTN_DEAD 0x12f +#define BTN_GAMEPAD 0x130 +#define BTN_SOUTH 0x130 +#define BTN_A BTN_SOUTH +#define BTN_EAST 0x131 +#define BTN_B BTN_EAST +#define BTN_C 0x132 +#define BTN_NORTH 0x133 +#define BTN_X BTN_NORTH +#define BTN_WEST 0x134 +#define BTN_Y BTN_WEST +#define BTN_Z 0x135 +#define BTN_TL 0x136 +#define BTN_TR 0x137 +#define BTN_TL2 0x138 +#define BTN_TR2 0x139 +#define BTN_SELECT 0x13a +#define BTN_START 0x13b +#define BTN_MODE 0x13c +#define BTN_THUMBL 0x13d +#define BTN_THUMBR 0x13e +#define BTN_DIGI 0x140 +#define BTN_TOOL_PEN 0x140 +#define BTN_TOOL_RUBBER 0x141 +#define BTN_TOOL_BRUSH 0x142 +#define BTN_TOOL_PENCIL 0x143 +#define BTN_TOOL_AIRBRUSH 0x144 +#define BTN_TOOL_FINGER 0x145 +#define BTN_TOOL_MOUSE 0x146 +#define BTN_TOOL_LENS 0x147 +#define BTN_TOOL_QUINTTAP 0x148 +#define BTN_STYLUS3 0x149 +#define BTN_TOUCH 0x14a +#define BTN_STYLUS 0x14b +#define BTN_STYLUS2 0x14c +#define BTN_TOOL_DOUBLETAP 0x14d +#define BTN_TOOL_TRIPLETAP 0x14e +#define BTN_TOOL_QUADTAP 0x14f +#define BTN_WHEEL 0x150 +#define BTN_GEAR_DOWN 0x150 +#define BTN_GEAR_UP 0x151 +#define KEY_OK 0x160 +#define KEY_SELECT 0x161 +#define KEY_GOTO 0x162 +#define KEY_CLEAR 0x163 +#define KEY_POWER2 0x164 +#define KEY_OPTION 0x165 +#define KEY_INFO 0x166 +#define KEY_TIME 0x167 +#define KEY_VENDOR 0x168 +#define KEY_ARCHIVE 0x169 +#define KEY_PROGRAM 0x16a +#define KEY_CHANNEL 0x16b +#define KEY_FAVORITES 0x16c +#define KEY_EPG 0x16d +#define KEY_PVR 0x16e +#define KEY_MHP 0x16f +#define KEY_LANGUAGE 0x170 +#define KEY_TITLE 0x171 +#define KEY_SUBTITLE 0x172 +#define KEY_ANGLE 0x173 +#define KEY_FULL_SCREEN 0x174 +#define KEY_ZOOM KEY_FULL_SCREEN +#define KEY_MODE 0x175 +#define KEY_KEYBOARD 0x176 +#define KEY_ASPECT_RATIO 0x177 +#define KEY_SCREEN KEY_ASPECT_RATIO +#define KEY_PC 0x178 +#define KEY_TV 0x179 +#define KEY_TV2 0x17a +#define KEY_VCR 0x17b +#define KEY_VCR2 0x17c +#define KEY_SAT 0x17d +#define KEY_SAT2 0x17e +#define KEY_CD 0x17f +#define KEY_TAPE 0x180 +#define KEY_RADIO 0x181 +#define KEY_TUNER 0x182 +#define KEY_PLAYER 0x183 +#define KEY_TEXT 0x184 +#define KEY_DVD 0x185 +#define KEY_AUX 0x186 +#define KEY_MP3 0x187 +#define KEY_AUDIO 0x188 +#define KEY_VIDEO 0x189 +#define KEY_DIRECTORY 0x18a +#define KEY_LIST 0x18b +#define KEY_MEMO 0x18c +#define KEY_CALENDAR 0x18d +#define KEY_RED 0x18e +#define KEY_GREEN 0x18f +#define KEY_YELLOW 0x190 +#define KEY_BLUE 0x191 +#define KEY_CHANNELUP 0x192 +#define KEY_CHANNELDOWN 0x193 +#define KEY_FIRST 0x194 +#define KEY_LAST 0x195 +#define KEY_AB 0x196 +#define KEY_NEXT 0x197 +#define KEY_RESTART 0x198 +#define KEY_SLOW 0x199 +#define KEY_SHUFFLE 0x19a +#define KEY_BREAK 0x19b +#define KEY_PREVIOUS 0x19c +#define KEY_DIGITS 0x19d +#define KEY_TEEN 0x19e +#define KEY_TWEN 0x19f +#define KEY_VIDEOPHONE 0x1a0 +#define KEY_GAMES 0x1a1 +#define KEY_ZOOMIN 0x1a2 +#define KEY_ZOOMOUT 0x1a3 +#define KEY_ZOOMRESET 0x1a4 +#define KEY_WORDPROCESSOR 0x1a5 +#define KEY_EDITOR 0x1a6 +#define KEY_SPREADSHEET 0x1a7 +#define KEY_GRAPHICSEDITOR 0x1a8 +#define KEY_PRESENTATION 0x1a9 +#define KEY_DATABASE 0x1aa +#define KEY_NEWS 0x1ab +#define KEY_VOICEMAIL 0x1ac +#define KEY_ADDRESSBOOK 0x1ad +#define KEY_MESSENGER 0x1ae +#define KEY_DISPLAYTOGGLE 0x1af +#define KEY_BRIGHTNESS_TOGGLE KEY_DISPLAYTOGGLE +#define KEY_SPELLCHECK 0x1b0 +#define KEY_LOGOFF 0x1b1 +#define KEY_DOLLAR 0x1b2 +#define KEY_EURO 0x1b3 +#define KEY_FRAMEBACK 0x1b4 +#define KEY_FRAMEFORWARD 0x1b5 +#define KEY_CONTEXT_MENU 0x1b6 +#define KEY_MEDIA_REPEAT 0x1b7 +#define KEY_10CHANNELSUP 0x1b8 +#define KEY_10CHANNELSDOWN 0x1b9 +#define KEY_IMAGES 0x1ba +#define KEY_NOTIFICATION_CENTER 0x1bc +#define KEY_PICKUP_PHONE 0x1bd +#define KEY_HANGUP_PHONE 0x1be +#define KEY_DEL_EOL 0x1c0 +#define KEY_DEL_EOS 0x1c1 +#define KEY_INS_LINE 0x1c2 +#define KEY_DEL_LINE 0x1c3 +#define KEY_FN 0x1d0 +#define KEY_FN_ESC 0x1d1 +#define KEY_FN_F1 0x1d2 +#define KEY_FN_F2 0x1d3 +#define KEY_FN_F3 0x1d4 +#define KEY_FN_F4 0x1d5 +#define KEY_FN_F5 0x1d6 +#define KEY_FN_F6 0x1d7 +#define KEY_FN_F7 0x1d8 +#define KEY_FN_F8 0x1d9 +#define KEY_FN_F9 0x1da +#define KEY_FN_F10 0x1db +#define KEY_FN_F11 0x1dc +#define KEY_FN_F12 0x1dd +#define KEY_FN_1 0x1de +#define KEY_FN_2 0x1df +#define KEY_FN_D 0x1e0 +#define KEY_FN_E 0x1e1 +#define KEY_FN_F 0x1e2 +#define KEY_FN_S 0x1e3 +#define KEY_FN_B 0x1e4 +#define KEY_FN_RIGHT_SHIFT 0x1e5 +#define KEY_BRL_DOT1 0x1f1 +#define KEY_BRL_DOT2 0x1f2 +#define KEY_BRL_DOT3 0x1f3 +#define KEY_BRL_DOT4 0x1f4 +#define KEY_BRL_DOT5 0x1f5 +#define KEY_BRL_DOT6 0x1f6 +#define KEY_BRL_DOT7 0x1f7 +#define KEY_BRL_DOT8 0x1f8 +#define KEY_BRL_DOT9 0x1f9 +#define KEY_BRL_DOT10 0x1fa +#define KEY_NUMERIC_0 0x200 +#define KEY_NUMERIC_1 0x201 +#define KEY_NUMERIC_2 0x202 +#define KEY_NUMERIC_3 0x203 +#define KEY_NUMERIC_4 0x204 +#define KEY_NUMERIC_5 0x205 +#define KEY_NUMERIC_6 0x206 +#define KEY_NUMERIC_7 0x207 +#define KEY_NUMERIC_8 0x208 +#define KEY_NUMERIC_9 0x209 +#define KEY_NUMERIC_STAR 0x20a +#define KEY_NUMERIC_POUND 0x20b +#define KEY_NUMERIC_A 0x20c +#define KEY_NUMERIC_B 0x20d +#define KEY_NUMERIC_C 0x20e +#define KEY_NUMERIC_D 0x20f +#define KEY_CAMERA_FOCUS 0x210 +#define KEY_WPS_BUTTON 0x211 +#define KEY_TOUCHPAD_TOGGLE 0x212 +#define KEY_TOUCHPAD_ON 0x213 +#define KEY_TOUCHPAD_OFF 0x214 +#define KEY_CAMERA_ZOOMIN 0x215 +#define KEY_CAMERA_ZOOMOUT 0x216 +#define KEY_CAMERA_UP 0x217 +#define KEY_CAMERA_DOWN 0x218 +#define KEY_CAMERA_LEFT 0x219 +#define KEY_CAMERA_RIGHT 0x21a +#define KEY_ATTENDANT_ON 0x21b +#define KEY_ATTENDANT_OFF 0x21c +#define KEY_ATTENDANT_TOGGLE 0x21d +#define KEY_LIGHTS_TOGGLE 0x21e +#define BTN_DPAD_UP 0x220 +#define BTN_DPAD_DOWN 0x221 +#define BTN_DPAD_LEFT 0x222 +#define BTN_DPAD_RIGHT 0x223 +#define KEY_ALS_TOGGLE 0x230 +#define KEY_ROTATE_LOCK_TOGGLE 0x231 +#define KEY_BUTTONCONFIG 0x240 +#define KEY_TASKMANAGER 0x241 +#define KEY_JOURNAL 0x242 +#define KEY_CONTROLPANEL 0x243 +#define KEY_APPSELECT 0x244 +#define KEY_SCREENSAVER 0x245 +#define KEY_VOICECOMMAND 0x246 +#define KEY_ASSISTANT 0x247 +#define KEY_KBD_LAYOUT_NEXT 0x248 +#define KEY_EMOJI_PICKER 0x249 +#define KEY_DICTATE 0x24a +#define KEY_CAMERA_ACCESS_ENABLE 0x24b +#define KEY_CAMERA_ACCESS_DISABLE 0x24c +#define KEY_CAMERA_ACCESS_TOGGLE 0x24d +#define KEY_BRIGHTNESS_MIN 0x250 +#define KEY_BRIGHTNESS_MAX 0x251 +#define KEY_KBDINPUTASSIST_PREV 0x260 +#define KEY_KBDINPUTASSIST_NEXT 0x261 +#define KEY_KBDINPUTASSIST_PREVGROUP 0x262 +#define KEY_KBDINPUTASSIST_NEXTGROUP 0x263 +#define KEY_KBDINPUTASSIST_ACCEPT 0x264 +#define KEY_KBDINPUTASSIST_CANCEL 0x265 +#define KEY_RIGHT_UP 0x266 +#define KEY_RIGHT_DOWN 0x267 +#define KEY_LEFT_UP 0x268 +#define KEY_LEFT_DOWN 0x269 +#define KEY_ROOT_MENU 0x26a +#define KEY_MEDIA_TOP_MENU 0x26b +#define KEY_NUMERIC_11 0x26c +#define KEY_NUMERIC_12 0x26d +#define KEY_AUDIO_DESC 0x26e +#define KEY_3D_MODE 0x26f +#define KEY_NEXT_FAVORITE 0x270 +#define KEY_STOP_RECORD 0x271 +#define KEY_PAUSE_RECORD 0x272 +#define KEY_VOD 0x273 +#define KEY_UNMUTE 0x274 +#define KEY_FASTREVERSE 0x275 +#define KEY_SLOWREVERSE 0x276 +#define KEY_DATA 0x277 +#define KEY_ONSCREEN_KEYBOARD 0x278 +#define KEY_PRIVACY_SCREEN_TOGGLE 0x279 +#define KEY_SELECTIVE_SCREENSHOT 0x27a +#define KEY_NEXT_ELEMENT 0x27b +#define KEY_PREVIOUS_ELEMENT 0x27c +#define KEY_AUTOPILOT_ENGAGE_TOGGLE 0x27d +#define KEY_MARK_WAYPOINT 0x27e +#define KEY_SOS 0x27f +#define KEY_NAV_CHART 0x280 +#define KEY_FISHING_CHART 0x281 +#define KEY_SINGLE_RANGE_RADAR 0x282 +#define KEY_DUAL_RANGE_RADAR 0x283 +#define KEY_RADAR_OVERLAY 0x284 +#define KEY_TRADITIONAL_SONAR 0x285 +#define KEY_CLEARVU_SONAR 0x286 +#define KEY_SIDEVU_SONAR 0x287 +#define KEY_NAV_INFO 0x288 +#define KEY_BRIGHTNESS_MENU 0x289 +#define KEY_MACRO1 0x290 +#define KEY_MACRO2 0x291 +#define KEY_MACRO3 0x292 +#define KEY_MACRO4 0x293 +#define KEY_MACRO5 0x294 +#define KEY_MACRO6 0x295 +#define KEY_MACRO7 0x296 +#define KEY_MACRO8 0x297 +#define KEY_MACRO9 0x298 +#define KEY_MACRO10 0x299 +#define KEY_MACRO11 0x29a +#define KEY_MACRO12 0x29b +#define KEY_MACRO13 0x29c +#define KEY_MACRO14 0x29d +#define KEY_MACRO15 0x29e +#define KEY_MACRO16 0x29f +#define KEY_MACRO17 0x2a0 +#define KEY_MACRO18 0x2a1 +#define KEY_MACRO19 0x2a2 +#define KEY_MACRO20 0x2a3 +#define KEY_MACRO21 0x2a4 +#define KEY_MACRO22 0x2a5 +#define KEY_MACRO23 0x2a6 +#define KEY_MACRO24 0x2a7 +#define KEY_MACRO25 0x2a8 +#define KEY_MACRO26 0x2a9 +#define KEY_MACRO27 0x2aa +#define KEY_MACRO28 0x2ab +#define KEY_MACRO29 0x2ac +#define KEY_MACRO30 0x2ad +#define KEY_MACRO_RECORD_START 0x2b0 +#define KEY_MACRO_RECORD_STOP 0x2b1 +#define KEY_MACRO_PRESET_CYCLE 0x2b2 +#define KEY_MACRO_PRESET1 0x2b3 +#define KEY_MACRO_PRESET2 0x2b4 +#define KEY_MACRO_PRESET3 0x2b5 +#define KEY_KBD_LCD_MENU1 0x2b8 +#define KEY_KBD_LCD_MENU2 0x2b9 +#define KEY_KBD_LCD_MENU3 0x2ba +#define KEY_KBD_LCD_MENU4 0x2bb +#define KEY_KBD_LCD_MENU5 0x2bc +#define BTN_TRIGGER_HAPPY 0x2c0 +#define BTN_TRIGGER_HAPPY1 0x2c0 +#define BTN_TRIGGER_HAPPY2 0x2c1 +#define BTN_TRIGGER_HAPPY3 0x2c2 +#define BTN_TRIGGER_HAPPY4 0x2c3 +#define BTN_TRIGGER_HAPPY5 0x2c4 +#define BTN_TRIGGER_HAPPY6 0x2c5 +#define BTN_TRIGGER_HAPPY7 0x2c6 +#define BTN_TRIGGER_HAPPY8 0x2c7 +#define BTN_TRIGGER_HAPPY9 0x2c8 +#define BTN_TRIGGER_HAPPY10 0x2c9 +#define BTN_TRIGGER_HAPPY11 0x2ca +#define BTN_TRIGGER_HAPPY12 0x2cb +#define BTN_TRIGGER_HAPPY13 0x2cc +#define BTN_TRIGGER_HAPPY14 0x2cd +#define BTN_TRIGGER_HAPPY15 0x2ce +#define BTN_TRIGGER_HAPPY16 0x2cf +#define BTN_TRIGGER_HAPPY17 0x2d0 +#define BTN_TRIGGER_HAPPY18 0x2d1 +#define BTN_TRIGGER_HAPPY19 0x2d2 +#define BTN_TRIGGER_HAPPY20 0x2d3 +#define BTN_TRIGGER_HAPPY21 0x2d4 +#define BTN_TRIGGER_HAPPY22 0x2d5 +#define BTN_TRIGGER_HAPPY23 0x2d6 +#define BTN_TRIGGER_HAPPY24 0x2d7 +#define BTN_TRIGGER_HAPPY25 0x2d8 +#define BTN_TRIGGER_HAPPY26 0x2d9 +#define BTN_TRIGGER_HAPPY27 0x2da +#define BTN_TRIGGER_HAPPY28 0x2db +#define BTN_TRIGGER_HAPPY29 0x2dc +#define BTN_TRIGGER_HAPPY30 0x2dd +#define BTN_TRIGGER_HAPPY31 0x2de +#define BTN_TRIGGER_HAPPY32 0x2df +#define BTN_TRIGGER_HAPPY33 0x2e0 +#define BTN_TRIGGER_HAPPY34 0x2e1 +#define BTN_TRIGGER_HAPPY35 0x2e2 +#define BTN_TRIGGER_HAPPY36 0x2e3 +#define BTN_TRIGGER_HAPPY37 0x2e4 +#define BTN_TRIGGER_HAPPY38 0x2e5 +#define BTN_TRIGGER_HAPPY39 0x2e6 +#define BTN_TRIGGER_HAPPY40 0x2e7 +#define KEY_MIN_INTERESTING KEY_MUTE +#define KEY_MAX 0x2ff +#define KEY_CNT (KEY_MAX + 1) +#define REL_X 0x00 +#define REL_Y 0x01 +#define REL_Z 0x02 +#define REL_RX 0x03 +#define REL_RY 0x04 +#define REL_RZ 0x05 +#define REL_HWHEEL 0x06 +#define REL_DIAL 0x07 +#define REL_WHEEL 0x08 +#define REL_MISC 0x09 +#define REL_RESERVED 0x0a +#define REL_WHEEL_HI_RES 0x0b +#define REL_HWHEEL_HI_RES 0x0c +#define REL_MAX 0x0f +#define REL_CNT (REL_MAX + 1) +#define ABS_X 0x00 +#define ABS_Y 0x01 +#define ABS_Z 0x02 +#define ABS_RX 0x03 +#define ABS_RY 0x04 +#define ABS_RZ 0x05 +#define ABS_THROTTLE 0x06 +#define ABS_RUDDER 0x07 +#define ABS_WHEEL 0x08 +#define ABS_GAS 0x09 +#define ABS_BRAKE 0x0a +#define ABS_HAT0X 0x10 +#define ABS_HAT0Y 0x11 +#define ABS_HAT1X 0x12 +#define ABS_HAT1Y 0x13 +#define ABS_HAT2X 0x14 +#define ABS_HAT2Y 0x15 +#define ABS_HAT3X 0x16 +#define ABS_HAT3Y 0x17 +#define ABS_PRESSURE 0x18 +#define ABS_DISTANCE 0x19 +#define ABS_TILT_X 0x1a +#define ABS_TILT_Y 0x1b +#define ABS_TOOL_WIDTH 0x1c +#define ABS_VOLUME 0x20 +#define ABS_PROFILE 0x21 +#define ABS_MISC 0x28 +#define ABS_RESERVED 0x2e +#define ABS_MT_SLOT 0x2f +#define ABS_MT_TOUCH_MAJOR 0x30 +#define ABS_MT_TOUCH_MINOR 0x31 +#define ABS_MT_WIDTH_MAJOR 0x32 +#define ABS_MT_WIDTH_MINOR 0x33 +#define ABS_MT_ORIENTATION 0x34 +#define ABS_MT_POSITION_X 0x35 +#define ABS_MT_POSITION_Y 0x36 +#define ABS_MT_TOOL_TYPE 0x37 +#define ABS_MT_BLOB_ID 0x38 +#define ABS_MT_TRACKING_ID 0x39 +#define ABS_MT_PRESSURE 0x3a +#define ABS_MT_DISTANCE 0x3b +#define ABS_MT_TOOL_X 0x3c +#define ABS_MT_TOOL_Y 0x3d +#define ABS_MAX 0x3f +#define ABS_CNT (ABS_MAX + 1) +#define SW_LID 0x00 +#define SW_TABLET_MODE 0x01 +#define SW_HEADPHONE_INSERT 0x02 +#define SW_RFKILL_ALL 0x03 +#define SW_RADIO SW_RFKILL_ALL +#define SW_MICROPHONE_INSERT 0x04 +#define SW_DOCK 0x05 +#define SW_LINEOUT_INSERT 0x06 +#define SW_JACK_PHYSICAL_INSERT 0x07 +#define SW_VIDEOOUT_INSERT 0x08 +#define SW_CAMERA_LENS_COVER 0x09 +#define SW_KEYPAD_SLIDE 0x0a +#define SW_FRONT_PROXIMITY 0x0b +#define SW_ROTATE_LOCK 0x0c +#define SW_LINEIN_INSERT 0x0d +#define SW_MUTE_DEVICE 0x0e +#define SW_PEN_INSERTED 0x0f +#define SW_MACHINE_COVER 0x10 +#define SW_MAX 0x10 +#define SW_CNT (SW_MAX + 1) +#define MSC_SERIAL 0x00 +#define MSC_PULSELED 0x01 +#define MSC_GESTURE 0x02 +#define MSC_RAW 0x03 +#define MSC_SCAN 0x04 +#define MSC_TIMESTAMP 0x05 +#define MSC_MAX 0x07 +#define MSC_CNT (MSC_MAX + 1) +#define LED_NUML 0x00 +#define LED_CAPSL 0x01 +#define LED_SCROLLL 0x02 +#define LED_COMPOSE 0x03 +#define LED_KANA 0x04 +#define LED_SLEEP 0x05 +#define LED_SUSPEND 0x06 +#define LED_MUTE 0x07 +#define LED_MISC 0x08 +#define LED_MAIL 0x09 +#define LED_CHARGING 0x0a +#define LED_MAX 0x0f +#define LED_CNT (LED_MAX + 1) +#define REP_DELAY 0x00 +#define REP_PERIOD 0x01 +#define REP_MAX 0x01 +#define REP_CNT (REP_MAX + 1) +#define SND_CLICK 0x00 +#define SND_BELL 0x01 +#define SND_TONE 0x02 +#define SND_MAX 0x07 +#define SND_CNT (SND_MAX + 1) +#endif diff --git a/drivers/virtio/virtio-input.c b/drivers/virtio/virtio-input.c new file mode 100644 index 00000000000..605674a8fc1 --- /dev/null +++ b/drivers/virtio/virtio-input.c @@ -0,0 +1,530 @@ +/**************************************************************************** + * drivers/virtio/virtio-input.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "virtio-input.h" +#include "virtio-input-event-codes.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define VIRTIO_INPUT_EVENT 0 +#define VIRTIO_INPUT_NUM 1 +#define VIRTIO_INPUT_EVT_NUM 8 + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct virtio_input_priv; +typedef void (*virtio_send_event_handler)(FAR struct virtio_input_priv *, + FAR struct virtio_input_event *); + +struct virtio_input_priv +{ + FAR struct virtio_device *vdev; + char name[NAME_MAX]; /* Device name */ + struct virtio_input_event evt[VIRTIO_INPUT_EVT_NUM]; + size_t evtnum; /* Input event number */ + struct work_s work; /* Supports the interrupt handling "bottom half" */ + virtio_send_event_handler eventhandler; + + union + { + struct mouse_lowerhalf_s mouselower; /* Mouse device lowerhalf instance */ + struct keyboard_lowerhalf_s keyboardlower; /* Keyboard device lowerhalf instance */ + struct touch_lowerhalf_s touchlower; /* Touchpad device lowerhalf instance */ + }; + + union + { + struct mouse_report_s mousesample; /* Mouse event */ + struct keyboard_event_s keyboardsample; /* Keyboard event */ + struct touch_sample_s touchsample; /* Touchpad event */ + }; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int virtio_input_probe(FAR struct virtio_device *vdev); +static void virtio_input_remove(FAR struct virtio_device *vdev); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static struct virtio_driver g_virtio_input_driver = +{ + .node = LIST_INITIAL_VALUE(g_virtio_input_driver.node), /* node */ + .device = VIRTIO_ID_INPUT, /* device id */ + .probe = virtio_input_probe, /* probe */ + .remove = virtio_input_remove, /* remove */ +}; + +static int g_virtio_mouse_idx = 0; +static int g_virtio_touch_idx = 0; +static int g_virtio_keyboard_idx = 0; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: virtio_input_translate_keycode + ****************************************************************************/ + +static uint32_t virtio_input_translate_keycode(uint16_t keycode) +{ + switch (keycode) + { + case KEY_DELETE: + return KEYCODE_FWDDEL; + case KEY_BACKSPACE: + return KEYCODE_BACKDEL; + case KEY_HOME: + return KEYCODE_HOME; + case KEY_END: + return KEYCODE_END; + case KEY_LEFT: + return KEYCODE_LEFT; + case KEY_RIGHT: + return KEYCODE_RIGHT; + case KEY_UP: + return KEYCODE_UP; + case KEY_DOWN: + return KEYCODE_DOWN; + case KEY_PAGEUP: + return KEYCODE_PAGEUP; + case KEY_PAGEDOWN: + return KEYCODE_PAGEDOWN; + case KEY_ENTER: + return KEYCODE_ENTER; + case KEY_CAPSLOCK: + return KEYCODE_CAPSLOCK; + case KEY_SCROLLLOCK: + return KEYCODE_SCROLLLOCK; + case KEY_NUMLOCK: + return KEYCODE_NUMLOCK; + case KEY_SYSRQ: + return KEYCODE_PRTSCRN; + case KEY_F1: + return KEYCODE_F1; + case KEY_F2: + return KEYCODE_F2; + case KEY_F3: + return KEYCODE_F3; + case KEY_F4: + return KEYCODE_F4; + case KEY_F5: + return KEYCODE_F5; + case KEY_F6: + return KEYCODE_F6; + case KEY_F7: + return KEYCODE_F7; + case KEY_F8: + return KEYCODE_F8; + case KEY_F9: + return KEYCODE_F9; + case KEY_F10: + return KEYCODE_F10; + case KEY_F11: + return KEYCODE_F11; + case KEY_F12: + return KEYCODE_F12; + case KEY_F13: + return KEYCODE_F13; + case KEY_F14: + return KEYCODE_F14; + case KEY_F15: + return KEYCODE_F15; + case KEY_F16: + return KEYCODE_F16; + case KEY_F17: + return KEYCODE_F17; + case KEY_F18: + return KEYCODE_F18; + case KEY_F19: + return KEYCODE_F19; + case KEY_F20: + return KEYCODE_F20; + case KEY_F21: + return KEYCODE_F21; + case KEY_F22: + return KEYCODE_F22; + case KEY_F23: + return KEYCODE_F23; + case KEY_F24: + return KEYCODE_F24; + default: + return keycode; + } +} + +/**************************************************************************** + * Name: virtio_input_send_keyboard_event + ****************************************************************************/ + +static void +virtio_input_send_keyboard_event(FAR struct virtio_input_priv *priv, + FAR struct virtio_input_event *event) +{ + if (event->type == EV_KEY) + { + priv->keyboardsample.code = + virtio_input_translate_keycode(event->code); + priv->keyboardsample.type = event->value; + } + else if (event->type == EV_SYN && event->code == SYN_REPORT) + { + keyboard_event(&(priv->keyboardlower), + priv->keyboardsample.code, + priv->keyboardsample.type); + memset(&priv->keyboardsample, 0, sizeof(priv->keyboardsample)); + } +} + +/**************************************************************************** + * Name: virtio_input_send_mouse_event + ****************************************************************************/ + +static void +virtio_input_send_mouse_event(FAR struct virtio_input_priv *priv, + FAR struct virtio_input_event *event) +{ + if (event->type == EV_REL) + { + switch (event->code) + { + case REL_X: + priv->mousesample.x = event->value; + break; + + case REL_Y: + priv->mousesample.y = event->value; + break; + + #ifdef CONFIG_INPUT_MOUSE_WHEEL + case REL_WHEEL: + priv->mousesample.wheel = event->value; + break; + #endif + } + } + else if (event->type == EV_KEY) + { + switch (event->code) + { + case BTN_LEFT: + if (event->value) + { + priv->mousesample.buttons |= MOUSE_BUTTON_1; + } + break; + + case BTN_RIGHT: + if (event->value) + { + priv->mousesample.buttons |= MOUSE_BUTTON_2; + } + break; + + case BTN_MIDDLE: + if (event->value) + { + priv->mousesample.buttons |= MOUSE_BUTTON_3; + } + break; + } + } + else if (event->type == EV_SYN && event->code == SYN_REPORT) + { + mouse_event(priv->mouselower.priv, &priv->mousesample); + memset(&priv->mousesample, 0, sizeof(priv->mousesample)); + } +} + +/**************************************************************************** + * Name: virtio_input_send_touch_event + ****************************************************************************/ + +static void +virtio_input_send_touch_event(FAR struct virtio_input_priv *priv, + FAR struct virtio_input_event *event) +{ + if (event->type == EV_ABS) + { + switch (event->code) + { + case ABS_PRESSURE: + priv->touchsample.point[0].flags |= TOUCH_PRESSURE_VALID; + priv->touchsample.point[0].pressure = event->value; + break; + + case ABS_X: + priv->touchsample.point[0].flags |= TOUCH_POS_VALID; + priv->touchsample.point[0].x = event->value; + break; + + case ABS_Y: + priv->touchsample.point[0].flags |= TOUCH_POS_VALID; + priv->touchsample.point[0].y = event->value; + break; + } + } + else if (event->type == EV_SYN && event->code == SYN_REPORT) + { + priv->touchsample.npoints = 1; + priv->touchsample.point[0].timestamp = touch_get_time(); + + touch_event(priv->touchlower.priv, &priv->touchsample); + memset(&priv->touchsample, 0, sizeof(priv->touchsample)); + } +} + +/**************************************************************************** + * Name: virtio_input_worker + ****************************************************************************/ + +static void virtio_input_worker(FAR void *arg) +{ + FAR struct virtio_input_priv *priv = (FAR struct virtio_input_priv *)arg; + FAR struct virtqueue *vq = priv->vdev->vrings_info[VIRTIO_INPUT_EVENT].vq; + FAR struct virtio_input_event *evt; + FAR struct virtqueue_buf vb; + uint32_t len; + + while ((evt = (FAR struct virtio_input_event *) + virtqueue_get_buffer(vq, &len, NULL)) != NULL) + { + vrtinfo("virtio_input_worker (type,code,value) - (%d,%d,%d).\n", + evt->type, evt->code, evt->value); + + priv->eventhandler(priv, evt); + + vb.buf = evt; + vb.len = len; + virtqueue_add_buffer(vq, &vb, 0, 1, vb.buf); + } + + virtqueue_kick(vq); +} + +/**************************************************************************** + * Name: virtio_input_recv_events + ****************************************************************************/ + +static void virtio_input_recv_events(FAR struct virtqueue *vq) +{ + FAR struct virtio_input_priv *priv = vq->vq_dev->priv; + int ret; + + ret = work_queue(HPWORK, &priv->work, virtio_input_worker, priv, 0); + if (ret != 0) + { + vrterr("ERROR: Failed to queue work: %d\n", ret); + } + + return; +} + +/**************************************************************************** + * Name: virtio_input_fill_event + ****************************************************************************/ + +static void virtio_input_fill_event(FAR struct virtio_input_priv *priv) +{ + FAR struct virtqueue *vq = priv->vdev->vrings_info[VIRTIO_INPUT_EVENT].vq; + FAR struct virtqueue_buf vb; + int i; + + for (i = 0; i < priv->evtnum; i++) + { + vb.buf = &priv->evt[i]; + vb.len = sizeof(struct virtio_input_event); + virtqueue_add_buffer(vq, &vb, 0, 1, vb.buf); + } + + virtqueue_kick(vq); +} + +/**************************************************************************** + * Name: virtio_input_select_cfg + ****************************************************************************/ + +static uint8_t virtio_input_select_cfg(FAR struct virtio_input_priv *priv, + uint8_t select, uint8_t subsel) +{ + uint8_t cfg_size = 0; + virtio_write_config(priv->vdev, offsetof(struct virtio_input_config, + select), &select, sizeof(uint8_t)); + virtio_write_config(priv->vdev, offsetof(struct virtio_input_config, + subsel), &subsel, sizeof(uint8_t)); + virtio_read_config(priv->vdev, offsetof(struct virtio_input_config, + size), &cfg_size, sizeof(uint8_t)); + return cfg_size; +} + +/**************************************************************************** + * Name: virtio_input_register + ****************************************************************************/ + +static void virtio_input_register(FAR struct virtio_input_priv *priv) +{ + if (virtio_input_select_cfg(priv, VIRTIO_INPUT_CFG_EV_BITS, EV_ABS)) + { + priv->touchlower.maxpoint = 1; + snprintf(priv->name, NAME_MAX, "/dev/virtinput%d", + g_virtio_touch_idx++); + touch_register(&(priv->touchlower), + priv->name, + priv->evtnum); + priv->eventhandler = virtio_input_send_touch_event; + } + else if (virtio_input_select_cfg(priv, VIRTIO_INPUT_CFG_EV_BITS, EV_REL)) + { + snprintf(priv->name, NAME_MAX, "/dev/virtmouse%d", + g_virtio_mouse_idx++); + mouse_register(&(priv->mouselower), + priv->name, + priv->evtnum); + priv->eventhandler = virtio_input_send_mouse_event; + } + else if (virtio_input_select_cfg(priv, VIRTIO_INPUT_CFG_EV_BITS, EV_KEY)) + { + snprintf(priv->name, NAME_MAX, "/dev/virtkbd%d", + g_virtio_keyboard_idx++); + keyboard_register(&(priv->keyboardlower), + priv->name, + priv->evtnum); + priv->eventhandler = virtio_input_send_keyboard_event; + } +} + +/**************************************************************************** + * Name: virtio_input_probe + ****************************************************************************/ + +static int virtio_input_probe(FAR struct virtio_device *vdev) +{ + FAR struct virtio_input_priv *priv; + FAR const char *vqnames[VIRTIO_INPUT_NUM]; + vq_callback callbacks[VIRTIO_INPUT_NUM]; + int ret; + + priv = kmm_zalloc(sizeof(*priv)); + if (priv == NULL) + { + vrterr("No enough memory\n"); + return -ENOMEM; + } + + priv->vdev = vdev; + vdev->priv = priv; + + /* Initialize the virtio device */ + + virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER); + virtio_set_features(vdev, 0); + virtio_set_status(vdev, VIRTIO_CONFIG_FEATURES_OK); + + vqnames[VIRTIO_INPUT_EVENT] = "virtio_input_event"; + callbacks[VIRTIO_INPUT_EVENT] = virtio_input_recv_events; + ret = virtio_create_virtqueues(vdev, 0, VIRTIO_INPUT_NUM, vqnames, + callbacks); + if (ret < 0) + { + vrterr("virtio_device_create_virtqueue failed, ret=%d\n", ret); + virtio_reset_device(vdev); + kmm_free(priv); + return ret; + } + + virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_DRIVER_OK); + virtqueue_enable_cb(vdev->vrings_info[VIRTIO_INPUT_EVENT].vq); + priv->evtnum = MIN(vdev->vrings_info[VIRTIO_INPUT_EVENT].info.num_descs, + VIRTIO_INPUT_EVT_NUM); + + /* register lower half drivers */ + + virtio_input_register(priv); + + virtio_input_fill_event(priv); + + return ret; +} + +/**************************************************************************** + * Name: virtio_input_remove + ****************************************************************************/ + +static void virtio_input_remove(FAR struct virtio_device *vdev) +{ + FAR struct virtio_input_priv *priv = vdev->priv; + + if (priv->eventhandler == virtio_input_send_keyboard_event) + { + keyboard_unregister(&(priv->keyboardlower), priv->name); + } + else if (priv->eventhandler == virtio_input_send_mouse_event) + { + mouse_unregister(&(priv->mouselower), priv->name); + } + else if (priv->eventhandler == virtio_input_send_touch_event) + { + touch_unregister(&(priv->touchlower), priv->name); + } + + virtio_reset_device(vdev); + virtio_delete_virtqueues(vdev); + kmm_free(priv); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: virtio_register_input_driver + ****************************************************************************/ + +int virtio_register_input_driver(void) +{ + return virtio_register_driver(&g_virtio_input_driver); +} diff --git a/drivers/virtio/virtio-input.h b/drivers/virtio/virtio-input.h new file mode 100644 index 00000000000..c99b63bce95 --- /dev/null +++ b/drivers/virtio/virtio-input.h @@ -0,0 +1,112 @@ +/**************************************************************************** + * drivers/virtio/virtio-input.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __DRIVERS_VIRTIO_VIRTIO_INPUT_H +#define __DRIVERS_VIRTIO_VIRTIO_INPUT_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#ifdef CONFIG_DRIVERS_VIRTIO_INPUT + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define VIRTIO_INPUT_CFG_UNSET 0x00 +#define VIRTIO_INPUT_CFG_ID_NAME 0x01 +#define VIRTIO_INPUT_CFG_ID_SERIAL 0x02 +#define VIRTIO_INPUT_CFG_ID_DEVIDS 0x03 +#define VIRTIO_INPUT_CFG_PROP_BITS 0x10 +#define VIRTIO_INPUT_CFG_EV_BITS 0x11 +#define VIRTIO_INPUT_CFG_ABS_INFO 0x12 + +#define VIRTIO_INPUT_CHUNK_SIZE 128 /* 128 bytes per chunk */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +begin_packed_struct struct virtio_input_absinfo +{ + uint32_t min; + uint32_t max; + uint32_t fuzz; + uint32_t flat; + uint32_t res; +} end_packed_struct; + +begin_packed_struct struct virtio_input_devids +{ + uint16_t bustype; + uint16_t vendor; + uint16_t product; + uint16_t version; +} end_packed_struct; + +begin_packed_struct struct virtio_input_config +{ + uint8_t select; + uint8_t subsel; + uint8_t size; + uint8_t reserved[5]; + union + { + char string[VIRTIO_INPUT_CHUNK_SIZE]; + uint8_t bitmap[VIRTIO_INPUT_CHUNK_SIZE]; + struct virtio_input_absinfo abs; + struct virtio_input_devids ids; + } u; +} end_packed_struct; + +begin_packed_struct struct virtio_input_event +{ + uint16_t type; + uint16_t code; + uint32_t value; +} end_packed_struct; + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +int virtio_register_input_driver(void); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* CONFIG_DRIVERS_VIRTIO_INPUT */ + +#endif /* __DRIVERS_VIRTIO_VIRTIO_INPUT_H */ diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c index 2508267be14..85b218d077d 100644 --- a/drivers/virtio/virtio.c +++ b/drivers/virtio/virtio.c @@ -30,6 +30,7 @@ #include "virtio-blk.h" #include "virtio-gpu.h" +#include "virtio-input.h" #include "virtio-net.h" #include "virtio-rng.h" #include "virtio-serial.h" @@ -135,6 +136,14 @@ void virtio_register_drivers(void) } #endif +#ifdef CONFIG_DRIVERS_VIRTIO_INPUT + ret = virtio_register_input_driver(); + if (ret < 0) + { + vrterr("virtio_register_input_driver failed, ret=%d\n", ret); + } +#endif + #ifdef CONFIG_DRIVERS_VIRTIO_NET ret = virtio_register_net_driver(); if (ret < 0)