HelloWord-Keyboard icon indicating copy to clipboard operation
HelloWord-Keyboard copied to clipboard

MUTE,VOLUME_UP,VOLUME_DOWN这类功能键不起作用

Open joey-wang97 opened this issue 1 year ago • 3 comments

请教一下,为什么 MUTE,VOLUME_UP,VOLUME_DOWN这类按键不起作用呢? 普通按键都是可以映射的,类似A-Z, F1-F12都是可以的。但是从键盘枚举的某一个位置开始之后所有的按键都没用了. 请看代码的注释:

enum KeyCode_t {
	/*------------------------- HID report data -------------------------*/
	LEFT_CTRL = -8,
	LEFT_SHIFT = -7,
	LEFT_ALT = -6,
	LEFT_GUI = -5,
	RIGHT_CTRL = -4,
	RIGHT_SHIFT = -3,
	RIGHT_ALT = -2,
	RIGHT_GUI = -1,

	RESERVED = 0,
	ERROR_ROLL_OVER,
	POST_FAIL,
	ERROR_UNDEFINED,
	A,
	B,
	C,
	D,
	E,
	F,
	G,
	H,
	I,
	J,
	K,
	L,
	M,
	N,
	O,
	P,
	Q,
	R,
	S,
	T,
	U,
	V,
	W,
	X,
	Y,
	Z,
	NUM_1/*1!*/,
	NUM_2/*2@*/,
	NUM_3/*3#*/,
	NUM_4/*4$*/,
	NUM_5/*5%*/,
	NUM_6/*6^*/,
	NUM_7/*7&*/,
	NUM_8/*8**/,
	NUM_9/*9(*/,
	NUM_0/*0)*/,
	ENTER,
	ESC,
	BACKSPACE,
	TAB,
	SPACE,
	MINUS/*-_*/,
	EQUAL/*=+*/,
	LEFT_U_BRACE/*[{*/,
	RIGHT_U_BRACE/*]}*/,
	BACKSLASH/*\|*/,
	NONE_US/**/,
	SEMI_COLON/*;:*/,
	QUOTE/*'"*/,
	GRAVE_ACCENT/*`~*/,
	COMMA/*,<*/,
	PERIOD/*.>*/,
	SLASH/*/?*/,
	CAP_LOCK,
	F1,
	F2,
	F3,
	F4,
	F5,
	F6,
	F7,
	F8,
	F9,
	F10,
	F11,
	F12,
	PRINT,
	SCROLL_LOCK,
	PAUSE,
	INSERT,
	HOME,
	PAGE_UP,
	DELETE,
	END,
	PAGE_DOWN,
	RIGHT_ARROW,
	LEFT_ARROW,
	DOWN_ARROW,
	UP_ARROW,
	PAD_NUM_LOCK,
	PAD_SLASH,
	PAD_ASTERISK,
	PAD_MINUS,
	PAD_PLUS,
	PAD_ENTER,
	PAD_NUM_1,
	PAD_NUM_2,
	PAD_NUM_3,
	PAD_NUM_4,
	PAD_NUM_5,
	PAD_NUM_6,
	PAD_NUM_7,
	PAD_NUM_8,
	PAD_NUM_9,
	PAD_NUM_0,
	PAD_PERIOD,
	NONUS_BACKSLASH, // 大概从这个位置开始,下面的按键都没用
	APPLICATION, 
	POWER,
	PAD_EQUAL,
	F13,
	F14,
	F15,
	F16,
	F17,
	F18,
	F19,
	F20,
	F21,
	F22,
	F23,
	F24,
	EXECUTE,
	HELP,
	MENU,
	SELECT,
	STOP,
	AGAIN,
	UNDO,
	CUT,
	COPY,
	PASTE,
	FIND,
	MUTE,
	VOLUME_UP,
	VOLUME_DOWN,
	FN = 1000
/*------------------------- HID report data -------------------------*/
};

joey-wang97 avatar Apr 02 '23 07:04 joey-wang97

同上,媒体功能按键无效

yr785444662 avatar Apr 17 '23 11:04 yr785444662

Windows 好像 HID Usage ID 好像到101就没有了,想要实现音量控制需要使用 Consumer Page (0x0c)中的 Volume Control 才可以实现。我也在尝试中。

BrianLChen avatar May 14 '23 17:05 BrianLChen

可以在原先的report desc中加入一个新的collection, Report ID = 2; report buffer 的第1个字节用于声明report ID(我记得我在代码里看到有这部分的了)。

    /* Volume */ \
    0x05, 0x0c,  /* Usage Page (Consumer) */ \
    0x09, 0x01,  /* USAGE Consumer Control */ \
    0xa1, 0x01,  /* COLLECTION (Application)                       */ \
    0x85, 0x02,  /* Report ID = 2 */ \
    0x05, 0x0c,  /* Usage Page (Consumer) */ \
    0x15, 0x00,  /* logic min */ \
    0x25, 0x01,  /* logic max */ \
    0x75, 0x01,  /* rep size 1 */ \
    0x95, 0x08,  /* rep count (07) */ \
    0x09, 0xe9,  /* usage volume increase */ \
    0x09, 0xea,  /* usage volume decrease */ \
    0x09, 0xe2,  /* usage mute */ \
    0x09, 0xcd,  /* uasge play/pause */ \
    0x09, 0xb5,  /* uasge next track */ \
    0x09, 0xb6,  /* uasge Previous track */ \
    0x09, 0xb7,  /* uasge stop */ \
    0x0a, 0x92, 0x01, /* Open Application: Calculator */ \
    0x81, 0x02,  /* output */ \
    \
    0xc0,                           /* END_COLLECTION                                 */\

需要对原本代码中的remap的结构进行修改,对 report ID = 1 和 report ID = 2 的两个 report buff 进行分开计算。优先对 report ID = 1 的report buffer进行报表(考虑到键盘时更加重要的功能)。当 report ID=1 所对应的 report buffer 没有改动时,对report ID = 2 的 report buffer 进行报表,所以需要两个不同的 report buffer。

所以需要额外的判断,判断2个report buffer 是否较之前有所变化。

两个不同report ID只能进行分开的报表。而键盘的usage type时keyboard,音量控制的usage type 时consumer control, 不同的usage type也不能放在同一个collection中。

好像还有一种方法就是重新声明一个USB HID 设备,使用不同的endpoint。目前并没有对这个方法进行深入的研究

BrianLChen avatar Jun 18 '23 21:06 BrianLChen