From d74bb8406b6268951f6bea7d580de77f944603cc Mon Sep 17 00:00:00 2001 From: Zan Peng Date: Mon, 27 Nov 2017 02:59:51 +0000 Subject: PD#154561: ir-tools: add remotecfg v1.1.0 ir-tools: add remotecfg v1.1.0 1. finish setting keymap 2. finish setting remote mouse 3. finish setting config file Usage: remotecfg -t remote.tab -d -c remote.cfg -t add (scancode, keycode)keymap -d enable debug -c add remote config(set protocol release time...) Change-Id: I17f62e2be3d4add7963fc470cd5834a0b7bf9b99 Signed-off-by: Zan Peng --- diff --git a/remotecfg/Android.mk b/remotecfg/Android.mk new file mode 100644 index 0000000..1b71b2d --- a/dev/null +++ b/remotecfg/Android.mk @@ -0,0 +1,19 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= \ + main.c \ + parse.c \ + device.c \ + +LOCAL_SHARED_LIBRARIES:= \ + libcutils \ + libc \ + liblog \ + +LOCAL_C_INCLUDES += \ + bionic/libc/include \ + +LOCAL_MODULE:= remotecfg + +include $(BUILD_EXECUTABLE) \ No newline at end of file diff --git a/remotecfg/Makefile b/remotecfg/Makefile new file mode 100644 index 0000000..d8f11fe --- a/dev/null +++ b/remotecfg/Makefile @@ -0,0 +1,25 @@ +DEPS = rc_common.h keydefine.h +OBJ = main.o device.o parse.o + +%.o: %.c $(DEPS) + $(CC) -c -o $@ $< $(CFLAGS) + +remotecfg: $(OBJ) + $(CC) -o $@ $^ $(CFLAGS) + +.PHONY: clean + +clean: + rm -f *.o *~ remotecfg + +.PHONY: install + +install: + cp -f remotecfg $(TARGET_DIR)/usr/bin/ + cp -f remote.tab $(TARGET_DIR)/etc + cp -f remote-mouse.tab $(TARGET_DIR)/etc + +.PHONY: uninstall + +uninstall: + rm -f $(TARGET_DIR)/usr/bin/remotecfg diff --git a/remotecfg/common.h b/remotecfg/common.h new file mode 100644 index 0000000..8498889 --- a/dev/null +++ b/remotecfg/common.h @@ -0,0 +1,64 @@ +#ifndef _COMMON_H_ +#define _COMMON_H_ + +#include +#include +#include +#include +#include "keydefine.h" +#include "rc_common.h" + +#define MAX_LINE_LEN 1024 + +#define MAPCODE(scancode, keycode)\ + ((((scancode) & 0xFFFF)<<16) | ((keycode) & 0xFFFF)) + +#define MATCH(s,d) (strcasecmp(s, d) == 0) + +#define IS_NULL(s) (strlen(s) == 0) + +extern unsigned char dbg_flag; + +#define prDbg(fmt, ...) \ +{ \ + if (dbg_flag) \ + fprintf(stdout, fmt, ##__VA_ARGS__); \ +} + +enum { + SUCC = 0, + FAIL = -1, +}; + +enum { + CONFIG_LEVEL, + KEYMAP_LEVEL, + MOUSEMAP_LEVEL, + ADCMAP_LEVEL, +}; + +typedef int (*pfileHandle)(char *, char *, void *); + +typedef struct { + struct ir_map_tab tab; +}S_TAB_FILE_T; + +typedef struct { + unsigned int workMode; + unsigned int repeatEnable; + unsigned int debugEnable; + /*software decode*/ + struct ir_sw_decode_para sw_data; +} S_CFG_FILE_T; + + +int SetTabPara(int devFd, S_TAB_FILE_T *tabFile); +int SetCfgPara(int devFd, const char *sysDir, S_CFG_FILE_T *cfgFile); +int ParseFile(const char *file, pfileHandle handler, void *data); +int CheckVersion(int fd); +int OpenDevice(char *filename); +int CloseDevice(int fd); + + + +#endif diff --git a/remotecfg/device.c b/remotecfg/device.c new file mode 100644 index 0000000..000cb6e --- a/dev/null +++ b/remotecfg/device.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "common.h" + +int CheckVersion(int fd) +{ + char verBuf[64]; + + if (ioctl(fd, REMOTE_IOC_GET_DATA_VERSION, verBuf) < 0) { + fprintf(stderr, "get driver version error=%s\n", + strerror(errno)); + return FAIL; + } + /*check share data version info*/ + if (0 != strcasecmp(verBuf, SHARE_DATA_VERSION)) { + fprintf(stderr, "interface version not match:"\ + "user[%s] unequal to kernel[%s]\n", + SHARE_DATA_VERSION, verBuf); + return FAIL; + } + return SUCC; +} + +static int WriteSysFile(const char *dir, const char *fileName, unsigned int val) +{ + int fd; + int len; + char fileBuf[MAX_LINE_LEN]; + char wBuf[32]; + + snprintf(fileBuf, MAX_LINE_LEN, "%s%s", dir, fileName); + if ((fd = open(fileBuf, O_RDWR)) < 0) { + fprintf(stderr, "open %s: %s\n", fileBuf, strerror(errno)); + return FAIL; + } + + len = snprintf(wBuf, 32, "%u", val); + if (write(fd, (void *)wBuf, len+1) < 0) { + fprintf(stderr, "write %s: %s\n", fileBuf, strerror(errno)); + close(fd); + return FAIL; + } + + close(fd); + return SUCC; +} + +int SetCfgPara(int devFd, const char *sysDir, S_CFG_FILE_T *cfgFile) +{ + WriteSysFile(sysDir, "protocol", cfgFile->workMode); + WriteSysFile(sysDir, "repeat_enable", cfgFile->repeatEnable); + WriteSysFile(sysDir, "debug_enable", cfgFile->debugEnable); + + if (ioctl(devFd, REMOTE_IOC_SET_SW_DECODE_PARA, + &cfgFile->sw_data) < 0) { + fprintf(stderr, "failed to set software decode paras: %s\n", + strerror(errno)); + return FAIL; + } + + return SUCC; +} + +int SetTabPara(int devFd, S_TAB_FILE_T *tabFile) +{ + if (ioctl(devFd, REMOTE_IOC_SET_KEY_NUMBER, + &tabFile->tab.map_size) < 0 ) { + fprintf(stderr, "failed to set key number: %s\n", + strerror(errno)); + return FAIL; + } + + if (ioctl(devFd, REMOTE_IOC_SET_KEY_MAPPING_TAB, + &tabFile->tab) < 0 ) { + fprintf(stderr, "failed to set map table: %s\n", + strerror(errno)); + return FAIL; + } + + return SUCC; +} + +int OpenDevice(char *filename) +{ + int fd; + + if ((fd = open(filename, O_RDWR)) < 0) + fprintf(stderr, "open %s:%s\n", filename, strerror(errno)); + return fd; +} + +int CloseDevice(int fd) +{ + if (fd >= 0) + close(fd); + return 0; +} diff --git a/remotecfg/keydefine.h b/remotecfg/keydefine.h new file mode 100644 index 0000000..378dcf2 --- a/dev/null +++ b/remotecfg/keydefine.h @@ -0,0 +1,529 @@ +#ifndef _KEY_DEFINE_H +#define _KEY_DEFINE_H + +#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 /* SC System Power Down */ +#define KEY_KPEQUAL 117 +#define KEY_KPPLUSMINUS 118 +#define KEY_PAUSE 119 +#define KEY_SCALE 120 /* AL Compiz Scale (Expose) */ + +#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 /* AC Stop */ +#define KEY_AGAIN 129 +#define KEY_PROPS 130 /* AC Properties */ +#define KEY_UNDO 131 /* AC Undo */ +#define KEY_FRONT 132 +#define KEY_COPY 133 /* AC Copy */ +#define KEY_OPEN 134 /* AC Open */ +#define KEY_PASTE 135 /* AC Paste */ +#define KEY_FIND 136 /* AC Search */ +#define KEY_CUT 137 /* AC Cut */ +#define KEY_HELP 138 /* AL Integrated Help Center */ +#define KEY_MENU 139 /* Menu (show menu) */ +#define KEY_CALC 140 /* AL Calculator */ +#define KEY_SETUP 141 +#define KEY_SLEEP 142 /* SC System Sleep */ +#define KEY_WAKEUP 143 /* System Wake Up */ +#define KEY_FILE 144 /* AL Local Machine Browser */ +#define KEY_SENDFILE 145 +#define KEY_DELETEFILE 146 +#define KEY_XFER 147 +#define KEY_PROG1 148 +#define KEY_PROG2 149 +#define KEY_WWW 150 /* AL Internet Browser */ +#define KEY_MSDOS 151 +#define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */ +#define KEY_SCREENLOCK KEY_COFFEE +#define KEY_DIRECTION 153 +#define KEY_CYCLEWINDOWS 154 +#define KEY_MAIL 155 +#define KEY_BOOKMARKS 156 /* AC Bookmarks */ +#define KEY_COMPUTER 157 +#define KEY_BACK 158 /* AC Back */ +#define KEY_FORWARD 159 /* AC Forward */ +#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 /* Media Select Telephone */ +#define KEY_ISO 170 +#define KEY_CONFIG 171 /* AL Consumer Control Configuration */ +#define KEY_HOMEPAGE 172 /* AC Home */ +#define KEY_REFRESH 173 /* AC Refresh */ +#define KEY_EXIT 174 /* AC Exit */ +#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 /* AC New */ +#define KEY_REDO 182 /* AC Redo/Repeat */ + +#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_DASHBOARD 204 /* AL Dashboard */ +#define KEY_SUSPEND 205 +#define KEY_CLOSE 206 /* AC Close */ +#define KEY_PLAY 207 +#define KEY_FASTFORWARD 208 +#define KEY_BASSBOOST 209 +#define KEY_PRINT 210 /* AC Print */ +#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 /* AL Checkbook/Finance */ +#define KEY_SPORT 220 +#define KEY_SHOP 221 +#define KEY_ALTERASE 222 +#define KEY_CANCEL 223 /* AC Cancel */ +#define KEY_BRIGHTNESSDOWN 224 +#define KEY_BRIGHTNESSUP 225 +#define KEY_MEDIA 226 + +#define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video + outputs (Monitor/LCD/TV-out/etc) */ +#define KEY_KBDILLUMTOGGLE 228 +#define KEY_KBDILLUMDOWN 229 +#define KEY_KBDILLUMUP 230 + +#define KEY_SEND 231 /* AC Send */ +#define KEY_REPLY 232 /* AC Reply */ +#define KEY_FORWARDMAIL 233 /* AC Forward Msg */ +#define KEY_SAVE 234 /* AC Save */ +#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 /* drive next video source */ +#define KEY_VIDEO_PREV 242 /* drive previous video source */ +#define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */ +#define KEY_BRIGHTNESS_ZERO 244 /* brightness off, use ambient */ +#define KEY_DISPLAY_OFF 245 /* display device to off state */ + +#define KEY_WIMAX 246 +#define KEY_RFKILL 247 /* Key that controls all radios */ + +/* Code 255 is reserved for special needs of AT keyboard driver */ + +#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_A 0x130 +#define BTN_B 0x131 +#define BTN_C 0x132 +#define BTN_X 0x133 +#define BTN_Y 0x134 +#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_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 /* Four fingers on trackpad */ + +#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 /* AL OEM Features/Tips/Tutorial */ +#define KEY_TIME 0x167 +#define KEY_VENDOR 0x168 +#define KEY_ARCHIVE 0x169 +#define KEY_PROGRAM 0x16a /* Media Select Program Guide */ +#define KEY_CHANNEL 0x16b +#define KEY_FAVORITES 0x16c +#define KEY_EPG 0x16d +#define KEY_PVR 0x16e /* Media Select Home */ +#define KEY_MHP 0x16f +#define KEY_LANGUAGE 0x170 +#define KEY_TITLE 0x171 +#define KEY_SUBTITLE 0x172 +#define KEY_ANGLE 0x173 +#define KEY_ZOOM 0x174 +#define KEY_MODE 0x175 +#define KEY_KEYBOARD 0x176 +#define KEY_SCREEN 0x177 +#define KEY_PC 0x178 /* Media Select Computer */ +#define KEY_TV 0x179 /* Media Select TV */ +#define KEY_TV2 0x17a /* Media Select Cable */ +#define KEY_VCR 0x17b /* Media Select VCR */ +#define KEY_VCR2 0x17c /* VCR Plus */ +#define KEY_SAT 0x17d /* Media Select Satellite */ +#define KEY_SAT2 0x17e +#define KEY_CD 0x17f /* Media Select CD */ +#define KEY_TAPE 0x180 /* Media Select Tape */ +#define KEY_RADIO 0x181 +#define KEY_TUNER 0x182 /* Media Select Tuner */ +#define KEY_PLAYER 0x183 +#define KEY_TEXT 0x184 +#define KEY_DVD 0x185 /* Media Select DVD */ +#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 /* Media Select Messages */ +#define KEY_CALENDAR 0x18d +#define KEY_RED 0x18e +#define KEY_GREEN 0x18f +#define KEY_YELLOW 0x190 +#define KEY_BLUE 0x191 +#define KEY_CHANNELUP 0x192 /* Channel Increment */ +#define KEY_CHANNELDOWN 0x193 /* Channel Decrement */ +#define KEY_FIRST 0x194 +#define KEY_LAST 0x195 /* Recall Last */ +#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 /* Media Select Video Phone */ +#define KEY_GAMES 0x1a1 /* Media Select Games */ +#define KEY_ZOOMIN 0x1a2 /* AC Zoom In */ +#define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */ +#define KEY_ZOOMRESET 0x1a4 /* AC Zoom */ +#define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */ +#define KEY_EDITOR 0x1a6 /* AL Text Editor */ +#define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */ +#define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */ +#define KEY_PRESENTATION 0x1a9 /* AL Presentation App */ +#define KEY_DATABASE 0x1aa /* AL Database App */ +#define KEY_NEWS 0x1ab /* AL Newsreader */ +#define KEY_VOICEMAIL 0x1ac /* AL Voicemail */ +#define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */ +#define KEY_MESSENGER 0x1ae /* AL Instant Messaging */ +#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */ +#define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */ +#define KEY_LOGOFF 0x1b1 /* AL Logoff */ + +#define KEY_DOLLAR 0x1b2 +#define KEY_EURO 0x1b3 + +#define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */ +#define KEY_FRAMEFORWARD 0x1b5 +#define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */ +#define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */ + +#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_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 /* used by phones, remote controls, */ +#define KEY_NUMERIC_1 0x201 /* and other keypads */ +#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_CAMERA_FOCUS 0x210 +#define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */ + +#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 + +/* We avoid low common keys in module aliases so they don't get huge. */ +#define KEY_MIN_INTERESTING KEY_MUTE +#define KEY_MAX 0x2ff + +#endif diff --git a/remotecfg/main.c b/remotecfg/main.c new file mode 100644 index 0000000..799bcd6 --- a/dev/null +++ b/remotecfg/main.c @@ -0,0 +1,205 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" + +#define DEVICE_FILE "/dev/amremote" +#define SYSDIR "/sys/class/remote/amremote/" + +unsigned char dbg_flag = 0; + +static void usage(char *name) +{ + fprintf(stderr,"Usage: %s [-c cfg_file] [-t tab_file] [-d]\n", name); + exit(EXIT_FAILURE); +} + +static void printTabFile(S_TAB_FILE_T *tabFile) +{ + int i; + + prDbg("custom_name = %s\n", tabFile->tab.custom_name); + prDbg("fn_key_scancode = 0x%x\n", tabFile->tab.cursor_code.fn_key_scancode); + prDbg("cursor_left_scancode = 0x%x\n", tabFile->tab.cursor_code.cursor_left_scancode); + prDbg("cursor_right_scancode = 0x%x\n", tabFile->tab.cursor_code.cursor_right_scancode); + prDbg("cursor_up_scancode = 0x%x\n", tabFile->tab.cursor_code.cursor_up_scancode); + prDbg("cursor_down_scancode = 0x%x\n", tabFile->tab.cursor_code.cursor_down_scancode); + prDbg("cursor_ok_scancode = 0x%x\n", tabFile->tab.cursor_code.cursor_ok_scancode); + prDbg("custom_code = 0x%x\n", tabFile->tab.custom_code); + prDbg("release_delay = %d\n", tabFile->tab.release_delay); + prDbg("map_size = %d\n", tabFile->tab.map_size); + for (i = 0; i < tabFile->tab.map_size; i++) + prDbg("key[%d] = 0x%x\n", i, tabFile->tab.codemap[i].code); + +} + +static void printCfgFile(S_CFG_FILE_T *cfgFile) +{ + prDbg("work_mode = %d\n", cfgFile->workMode); + prDbg("repeat_enable = %d\n", cfgFile->repeatEnable); + prDbg("debug_enable = %d\n", cfgFile->debugEnable); + prDbg("max_frame_time = %d\n", cfgFile->sw_data.max_frame_time); +} + +static int handleCfgFile(char *name, char *val, void *data) +{ + S_CFG_FILE_T *cfgFile = (S_CFG_FILE_T *)data; + + if (MATCH("work_mode", name)) + cfgFile->workMode = strtoul(val, NULL, 0); + else if (MATCH("repeat_enable", name)) + cfgFile->repeatEnable = strtoul(val, NULL, 0); + else if (MATCH("debug_enable", name)) + cfgFile->debugEnable = strtoul(val, NULL, 0); + else if (MATCH("max_frame_time", name)) + cfgFile->sw_data.max_frame_time = strtoul(val, NULL, 0); + else + return FAIL; + + return SUCC; + +} + +static int handleTabFile(char *name, char *val, void *data) +{ + S_TAB_FILE_T *tabFile = (S_TAB_FILE_T *)data; + + if (MATCH("custom_name", name)) + strncpy(tabFile->tab.custom_name, val, CUSTOM_NAME_LEN); + else if (MATCH("fn_key_scancode", name)) + tabFile->tab.cursor_code.fn_key_scancode = strtoul(val, NULL, 0); + else if (MATCH("cursor_left_scancode", name)) + tabFile->tab.cursor_code.cursor_left_scancode = strtoul(val, NULL, 0); + else if (MATCH("cursor_right_scancode", name)) + tabFile->tab.cursor_code.cursor_right_scancode = strtoul(val, NULL, 0); + else if (MATCH("cursor_up_scancode", name)) + tabFile->tab.cursor_code.cursor_up_scancode = strtoul(val, NULL, 0); + else if (MATCH("cursor_down_scancode", name)) + tabFile->tab.cursor_code.cursor_down_scancode = strtoul(val, NULL, 0); + else if (MATCH("cursor_ok_scancode", name)) + tabFile->tab.cursor_code.cursor_ok_scancode = strtoul(val, NULL, 0); + else if (MATCH("custom_code", name)) + tabFile->tab.custom_code = strtoul(val, NULL, 0); + else if (MATCH("release_delay", name)) + tabFile->tab.release_delay = strtoul(val, NULL, 0); + else if (MATCH("mapcode", name)) { + tabFile->tab.codemap[tabFile->tab.map_size].code = atoi(val); + tabFile->tab.map_size ++; + } + else + return FAIL; + + return SUCC; +} + +int SetConfigFile(int devfd, char *cfgdir) +{ + int ret = 0; + S_CFG_FILE_T *cfgFile = NULL; + + prDbg("cfgdir = %s\n", cfgdir); + cfgFile = malloc(sizeof(S_CFG_FILE_T)); + if (!cfgFile) { + fprintf(stderr, "failed to allocate memory: %s\n", + strerror(errno)); + ret = -1; + goto err; + } + memset(cfgFile, 0, sizeof(S_CFG_FILE_T)); + if (ParseFile((const char *)cfgdir, + handleCfgFile, (void *)cfgFile) < 0) { + fprintf(stderr, "failed to parse file: %s\n", cfgdir); + ret = -1; + goto err; + } + printCfgFile(cfgFile); + SetCfgPara(devfd, SYSDIR, cfgFile); + free(cfgFile); +err: + if (cfgFile) + free(cfgFile); + return ret; +} + +int SetTabFile(int devfd, char *tabdir) +{ + int ret = 0; + S_TAB_FILE_T *tabFile = NULL; + + prDbg("tabdir = %s\n", tabdir); + tabFile = (S_TAB_FILE_T *)malloc(sizeof(S_TAB_FILE_T) + (MAX_KEYMAP_SIZE << 2)); + if (!tabFile) + { + fprintf(stderr, "failed to allocate memory: %s\n", strerror(errno)); + ret = -1; + goto err; + } + memset(tabFile, 0, sizeof(S_TAB_FILE_T) + (MAX_KEYMAP_SIZE << 2)); + memset(&tabFile->tab.cursor_code, 0xff, sizeof(struct cursor_codemap)); + if (ParseFile((const char *)tabdir, handleTabFile, (void *)tabFile) < 0) + { + fprintf(stderr, "failed to parse file: %s\n", tabdir); + ret = -1; + goto err; + } + printTabFile(tabFile); + SetTabPara(devfd, tabFile); +err: + if (tabFile) + free(tabFile); + return ret; +} + +int main(int argc, char *argv[]) +{ + int ch; + int devfd = -1; + int ret; + char *cfgfile = NULL; + char *tabfile = NULL; + + opterr = 0; /*disable the 'getopt' debug info*/ + while ((ch = getopt(argc, argv, "dc:t:")) != -1) { + switch (ch) { + case 'd': + dbg_flag = 1; + break; + case 'c': + cfgfile = optarg; + break; + case 't': + tabfile = optarg; + break; + case '?': + usage(basename(argv[0])); + break; + } + + } + + devfd = OpenDevice(DEVICE_FILE); + if (devfd< 0) + return FAIL; + + if (CheckVersion(devfd) < 0) + goto err; + + if (cfgfile) + if (SetConfigFile(devfd, cfgfile)) + goto err; + + if (tabfile) + if (SetTabFile(devfd, tabfile)) + goto err; +err: + CloseDevice(devfd); + return 0; +} diff --git a/remotecfg/parse.c b/remotecfg/parse.c new file mode 100644 index 0000000..fdeb31c --- a/dev/null +++ b/remotecfg/parse.c @@ -0,0 +1,183 @@ +#include +#include +#include +#include +#include +#include +#include "common.h" + +/* +remove head and tail blank in string +*/ +static void StrTrim(char **s) +{ + int i; + int len = strlen(*s); + + for (i = len - 1; i >= 0; i--) { + if ((*s)[i] <= ' ') + (*s)[i] = 0; + else + break; + } + + while (**s) { + if (**s <= ' ') + (*s)++; + else + break; + } +} + +static void StrLineTrim(char *line, int length) +{ + char *tmp_ptr = line; + + if (line == NULL) + return; + /*trim comment string*/ + while (*tmp_ptr && ((tmp_ptr - line) <= length)) { + if (*tmp_ptr == '#' || *tmp_ptr == ';') { + *tmp_ptr = '\0'; + break; + } + tmp_ptr++; + } +} + +static int StrEmpty(char *str) +{ + int len = strlen(str); + return (len == 0); +} + +/* +Mapcode in file: +key_begin + 0x47 11 + 0x13 2 + ...... +key_end +*/ +static int GetMapCode(char *line, int *code) +{ + char *p2; + char *p1 = line; + int ircode; + + /*remove head and tail blank in string*/ + StrTrim(&line); + + /*get second data point in line*/ + p2 = strchr(line, ' '); + if (p2) { + *p2++ = 0; + StrTrim(&p2); + } + if (!p2 || !*p2) + return -1; + StrTrim(&p1); + if (!*p1) + return -1; + ircode = strtoul(p1, NULL, 0); + if (ircode > 0xff) { + fprintf(stderr, "invalid ircode: 0x%x\n", ircode); + return -1; + } + + *code = MAPCODE(ircode, strtoul(p2, NULL, 0)); + return 0; +} + +int GetKeyValue(char *line, char **key, char **value) +{ + char *p1, *p2; + + p1 = line; + p2 = strchr(line, '='); + if (p2) { + *p2++ = 0; + StrTrim(&p2); + } + if (!p2 || !*p2) + return -1; + StrTrim(&p1); + if (!p1 || !*p1) + return -1; + *value = p2; + *key = p1; + return 0; +} + +static int ReadFile(FILE *fp, pfileHandle handler, void *data) +{ + char *key; + char *value; + unsigned int mapcode; + unsigned char parse_flag = CONFIG_LEVEL; + char *line; + char *savep; + int ret; + + line = (char*)malloc(MAX_LINE_LEN + 1); + if (!line) { + fprintf(stderr, "malloc line failed\n"); + return -1; + } + savep = line; + while (fgets(savep, MAX_LINE_LEN, fp)) { + line = savep; + StrLineTrim(line, MAX_LINE_LEN); /*jump comment*/ + if (StrEmpty(line)) + continue; + StrTrim(&line); + switch (parse_flag) { + case CONFIG_LEVEL: + if ((strcasecmp(line, "key_begin")) == 0) { + parse_flag = KEYMAP_LEVEL; + continue; + } + if (!!GetKeyValue(line, &key, &value)) + continue; + if ((*handler)(key, value, data) < 0) { + fprintf(stderr, "invalid line:%s=%s\n", + line, value); + continue; + } + break; + case KEYMAP_LEVEL: + if ((strcasecmp(line, "key_end")) == 0) { + parse_flag = CONFIG_LEVEL; + continue; + } + if (!!GetMapCode(line, &mapcode)) + continue; + snprintf(line, 128, "%u", mapcode); + if ((*handler)("mapcode", line, data) < 0) { + fprintf(stderr, "invalid line:%s=%s\n", + "mapcode", line); + continue; + } + break; + } + + } + if (savep) + free(savep); + return 0; +} + + +int ParseFile(const char *file, pfileHandle handler, void *data) +{ + FILE *cfgFp; + + if (NULL == (cfgFp = fopen(file, "r"))) { + fprintf(stderr, "fopen %s: %s\n", file, strerror(errno)); + return FAIL; + } + + ReadFile(cfgFp, handler, data); + fclose(cfgFp); + return SUCC; +} diff --git a/remotecfg/rc_common.h b/remotecfg/rc_common.h new file mode 100644 index 0000000..991f163 --- a/dev/null +++ b/remotecfg/rc_common.h @@ -0,0 +1,80 @@ +/* + * include/uapi/linux/rc_common.h from the kernel directory, but it can be used + * in kernel and user space. + * + * Written by Amlogic + * + */ +#ifndef _UAPI_RC_COMMON_H_ +#define _UAPI_RC_COMMON_H_ + +#include + +#define MAX_KEYMAP_SIZE 256 +#define CUSTOM_NAME_LEN 64 + +/*to ensure kernel and user spase use the same header file*/ +#define SHARE_DATA_VERSION "v1.1.0" + +union _codemap { + struct ir_key_map { + __u16 keycode; + __u16 scancode; + } map; + __u32 code; +}; + +/* + *struct cursor_codemap - codemap for mouse mode + * + *@fn_key_scancode: scancode of fn key which used to swith mode + *@cursor_left_scancode: scancode of left key + *@cursor_right_scancode: scancode of right key + *@cursor_up_scancode: scancode of up key + *@cursor_down_scancode: scancode of down key + *@cursor_ok_scancode: scancode of ok key + */ +struct cursor_codemap { + __u16 fn_key_scancode; + __u16 cursor_left_scancode; + __u16 cursor_right_scancode; + __u16 cursor_up_scancode; + __u16 cursor_down_scancode; + __u16 cursor_ok_scancode; +}; + +/** + *struct ir_map_table - the IR key map table for different remote-control + * + *@custom_name: table name + *@cursor_code: mouse mode need + *@map_size: number of IR key + *@custom_code: custom code, identify different key mapping table + *@release_delay: release delay time + *@codemap[0]: code for IR key + */ +struct ir_map_tab { + char custom_name[CUSTOM_NAME_LEN]; + struct cursor_codemap cursor_code; + __u16 map_size; + __u32 custom_code; + __u32 release_delay; + union _codemap codemap[0]; +}; + +/** + *struct ir_sw_decode_para - configuration parameters for software decode + * + *@max_frame_time: maximum frame time + */ +struct ir_sw_decode_para { + unsigned int max_frame_time; +}; + +/*IOCTL commands*/ +#define REMOTE_IOC_SET_KEY_NUMBER _IOW('I', 3, __u32) +#define REMOTE_IOC_SET_KEY_MAPPING_TAB _IOW('I', 4, __u32) +#define REMOTE_IOC_SET_SW_DECODE_PARA _IOW('I', 5, __u32) +#define REMOTE_IOC_GET_DATA_VERSION _IOR('I', 121, __u32) + +#endif diff --git a/remotecfg/remote-mouse.tab b/remotecfg/remote-mouse.tab new file mode 100644 index 0000000..5ea29c7 --- a/dev/null +++ b/remotecfg/remote-mouse.tab @@ -0,0 +1,71 @@ +#********************************************************************************************************* +#this file is used to store key map table +# custom_name: name of map table +# custom_code: custom code for remote device +# release_delay unit:ms.release will report from kernel to user layer after this period of time +# from press or repeat triggered. +###PARAS FOR MOUSE MODE: +# fn_key_scancode: scancode of fn key which used to swith mode +# cursor_left_scancode: scancode of left key +# cursor_right_scancode: scancode of right key +# cursor_up_scancode: scancode of up key +# cursor_down_scancode: scancode of down key +# cursor_ok_scancode: scancode of ok key +#************************************************************************************************************* +custom_name = nec-cursor-test +custom_code = 0xfb04 +release_delay = 80 + +fn_key_scancode = 0x15 +cursor_left_scancode = 0x1c +cursor_right_scancode = 0x48 +cursor_up_scancode = 0x44 +cursor_down_scancode = 0x1d +cursor_ok_scancode = 0x5c + +key_begin + 0x47 11 + 0x13 2 + 0x10 3 + 0x11 4 + 0x0F 5 + 0x0C 6 + 0x0D 7 + 0x0B 8 + 0x08 9 + 0x09 10 + 0x5C 97 + 0x51 65 + 0x49 14 + 0x06 130 + 0x14 131 + 0x44 103 + 0x1D 108 + 0x1C 105 + 0x48 106 + 0x53 125 + 0x45 104 + 0x19 109 + 0x16 102 + 0x52 119 + 0x05 122 + 0x59 123 + 0x1b 120 + 0x04 121 + 0x1A 116 + 0x0A 15 + 0x0e 113 + 0x15 63 + 0x1F 102 + 0x1e 132 + 0x07 133 + 0x12 134 + 0x54 135 + 0x02 136 + 0x4f 30 + 0x42 48 + 0x5d 46 + 0x4c 32 + 0x58 137 + 0x55 140 +key_end diff --git a/remotecfg/remote.cfg b/remotecfg/remote.cfg new file mode 100644 index 0000000..1e1f9ba --- a/dev/null +++ b/remotecfg/remote.cfg @@ -0,0 +1,16 @@ +#********************************************************************************************************* +#this file is used to config the remote driver +# work_mode: set work mode for IR, refer to the include/dt-bindings/input/meson_rc.h +# debug_enable: 0 :disable 1:enable +# repeat_enable: 0 :disable 1:enable +# +# SW MODE: +# max_frame_time maximum frame time + +#************************************************************************************************************* +work_mode = 0x1 +repeat_enable = 0 +debug_enable = 0 + +#sw decode parameters +max_frame_time = 1000 diff --git a/remotecfg/remote.tab b/remotecfg/remote.tab new file mode 100644 index 0000000..e8a542a --- a/dev/null +++ b/remotecfg/remote.tab @@ -0,0 +1,64 @@ +#********************************************************************************************************* +#this file is used to store key map table +# custom_name: name of map table +# custom_code: custom code for remote device +# release_delay unit:ms.release will report from kernel to user layer after this period of time +# from press or repeat triggered. +###PARAS FOR MOUSE MODE: +# fn_key_scancode: scancode of fn key which used to swith mode +# cursor_left_scancode: scancode of left key +# cursor_right_scancode: scancode of right key +# cursor_up_scancode: scancode of up key +# cursor_down_scancode: scancode of down key +# cursor_ok_scancode: scancode of ok key +#************************************************************************************************************* +custom_name = nec-test +custom_code = 0xfb04 +release_delay = 80 + +key_begin + 0x47 11 + 0x13 2 + 0x10 3 + 0x11 4 + 0x0F 5 + 0x0C 6 + 0x0D 7 + 0x0B 8 + 0x08 9 + 0x09 10 + 0x5C 97 + 0x51 65 + 0x49 14 + 0x06 130 + 0x14 131 + 0x44 103 + 0x1D 108 + 0x1C 105 + 0x48 106 + 0x53 125 + 0x45 104 + 0x19 109 + 0x16 102 + 0x52 119 + 0x05 122 + 0x59 123 + 0x1b 120 + 0x04 121 + 0x1A 116 + 0x0A 15 + 0x0e 113 + 0x15 63 + 0x1F 102 + 0x1e 132 + 0x07 133 + 0x12 134 + 0x54 135 + 0x02 136 + 0x4f 30 + 0x42 48 + 0x5d 46 + 0x4c 32 + 0x58 137 + 0x55 140 +key_end -- cgit