完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目的: 在大屏触摸屏上点击一个位置,通过RK3568模拟出来的触摸屏能够在u***连接的主机上也点击相对的位置。 实现HID调通的办法: 首先先把HID调通,在kernel/drivers/u***/gadget/legacy/hid.c文件中修改添加一个HID键盘,使得通过OTG的u***口连接主机后,在主机上能够识别该OTG口为一个HID键盘; 添加相应代码后再编译烧录,成功在开发板上找到hidg0文件,随后通过 echo otg > /sys/devices/platform/fe8a0000.u***2-phy/otg_mode 命令把该u***口配置成otg模式,(可以先cat一下看看是不是otg模式,我这里是host模式所以要改),同时也要mask掉adba.service,随后连接主机,能够看到设备管理器中新添加了一个hid 键盘。 调试: 参考kernel/Documentation/u***/gadget_hid.txt中的测试例程,对HID键盘进行测试,结果成功在主机上写入字母或功能键; /* hid_gadget_test */ /*其中第一个参数是hidg0文件位置;第二个参数是m鼠标 k键盘*/ #include #include #include #include #include #include #include #include #include #define BUF_LEN 512 struct options { const char *opt; unsigned char val; }; static struct options kmod[] = { {.opt = "--left-ctrl", .val = 0x01}, {.opt = "--right-ctrl", .val = 0x10}, {.opt = "--left-shift", .val = 0x02}, {.opt = "--right-shift", .val = 0x20}, {.opt = "--left-alt", .val = 0x04}, {.opt = "--right-alt", .val = 0x40}, {.opt = "--left-meta", .val = 0x08}, {.opt = "--right-meta", .val = 0x80}, {.opt = NULL} }; static struct options kval[] = { {.opt = "--return", .val = 0x28}, {.opt = "--esc", .val = 0x29}, {.opt = "--bckspc", .val = 0x2a}, {.opt = "--tab", .val = 0x2b}, {.opt = "--spacebar", .val = 0x2c}, {.opt = "--caps-lock", .val = 0x39}, {.opt = "--f1", .val = 0x3a}, {.opt = "--f2", .val = 0x3b}, {.opt = "--f3", .val = 0x3c}, {.opt = "--f4", .val = 0x3d}, {.opt = "--f5", .val = 0x3e}, {.opt = "--f6", .val = 0x3f}, {.opt = "--f7", .val = 0x40}, {.opt = "--f8", .val = 0x41}, {.opt = "--f9", .val = 0x42}, {.opt = "--f10", .val = 0x43}, {.opt = "--f11", .val = 0x44}, {.opt = "--f12", .val = 0x45}, {.opt = "--insert", .val = 0x49}, {.opt = "--home", .val = 0x4a}, {.opt = "--pageup", .val = 0x4b}, {.opt = "--del", .val = 0x4c}, {.opt = "--end", .val = 0x4d}, {.opt = "--pagedown", .val = 0x4e}, {.opt = "--right", .val = 0x4f}, {.opt = "--left", .val = 0x50}, {.opt = "--down", .val = 0x51}, {.opt = "--kp-enter", .val = 0x58}, {.opt = "--up", .val = 0x52}, {.opt = "--num-lock", .val = 0x53}, {.opt = NULL} }; int keyboard_fill_report(char report[8], char buf[BUF_LEN], int *hold) { char *tok = strtok(buf, " "); int key = 0; int i = 0; for (; tok != NULL; tok = strtok(NULL, " ")) { if (strcmp(tok, "--quit") == 0) return -1; if (strcmp(tok, "--hold") == 0) { *hold = 1; continue; } if (key < 6) { for (i = 0; kval.opt != NULL; i++) if (strcmp(tok, kval.opt) == 0) { report[2 + key++] = kval.val; break; } if (kval.opt != NULL) continue; } if (key < 6) if (islower(tok[0])) { report[2 + key++] = (tok[0] - ('a' - 0x04)); continue; } for (i = 0; kmod.opt != NULL; i++) if (strcmp(tok, kmod.opt) == 0) { report[0] = report[0] | kmod.val; break; } if (kmod.opt != NULL) continue; if (key < 6) fprintf(stderr, "unknown option: %s ", tok); } return 8; } static struct options mmod[] = { {.opt = "--b1", .val = 0x01}, {.opt = "--b2", .val = 0x02}, {.opt = "--b3", .val = 0x04}, {.opt = NULL} }; int mouse_fill_report(char report[8], char buf[BUF_LEN], int *hold) { char *tok = strtok(buf, " "); int mvt = 0; int i = 0; for (; tok != NULL; tok = strtok(NULL, " ")) { if (strcmp(tok, "--quit") == 0) return -1; if (strcmp(tok, "--hold") == 0) { *hold = 1; continue; } for (i = 0; mmod.opt != NULL; i++) if (strcmp(tok, mmod.opt) == 0) { report[0] = report[0] | mmod.val; break; } if (mmod.opt != NULL) continue; if (!(tok[0] == '-' && tok[1] == '-') && mvt < 2) { errno = 0; report[1 + mvt++] = (char)strtol(tok, NULL, 0); if (errno != 0) { fprintf(stderr, "Bad value:'%s' ", tok); report[1 + mvt--] = 0; } continue; } fprintf(stderr, "unknown option: %s ", tok); } return 3; } static struct options jmod[] = { {.opt = "--b1", .val = 0x10}, {.opt = "--b2", .val = 0x20}, {.opt = "--b3", .val = 0x40}, {.opt = "--b4", .val = 0x80}, {.opt = "--hat1", .val = 0x00}, {.opt = "--hat2", .val = 0x01}, {.opt = "--hat3", .val = 0x02}, {.opt = "--hat4", .val = 0x03}, {.opt = "--hatneutral", .val = 0x04}, {.opt = NULL} }; int joystick_fill_report(char report[8], char buf[BUF_LEN], int *hold) { char *tok = strtok(buf, " "); int mvt = 0; int i = 0; *hold = 1; /* set default hat position: neutral */ report[3] = 0x04; for (; tok != NULL; tok = strtok(NULL, " ")) { if (strcmp(tok, "--quit") == 0) return -1; for (i = 0; jmod.opt != NULL; i++) if (strcmp(tok, jmod.opt) == 0) { report[3] = (report[3] & 0xF0) | jmod.val; break; } if (jmod.opt != NULL) continue; if (!(tok[0] == '-' && tok[1] == '-') && mvt < 3) { errno = 0; report[mvt++] = (char)strtol(tok, NULL, 0); if (errno != 0) { fprintf(stderr, "Bad value:'%s' ", tok); report[mvt--] = 0; } continue; } fprintf(stderr, "unknown option: %s ", tok); } return 4; } void print_options(char c) { int i = 0; if (c == 'k') { printf(" keyboard options: " " --hold "); for (i = 0; kmod.opt != NULL; i++) printf(" %s ", kmod.opt); printf(" keyboard values: " " [a-z] or "); for (i = 0; kval.opt != NULL; i++) printf(" %-8s%s", kval.opt, i % 2 ? " " : ""); printf(" "); } else if (c == 'm') { printf(" mouse options: " " --hold "); for (i = 0; mmod.opt != NULL; i++) printf(" %s ", mmod.opt); printf(" mouse values: " " Two signed numbers " "--quit to close "); } else { printf(" joystick options: "); for (i = 0; jmod.opt != NULL; i++) printf(" %s ", jmod.opt); printf(" joystick values: " " three signed numbers " "--quit to close "); } } int main(int argc, const char *argv[]) { const char *filename = NULL; int fd = 0; char buf[BUF_LEN]; int cmd_len; char report[8]; int to_send = 8; int hold = 0; fd_set rfds; int retval, i; if (argc < 3) { fprintf(stderr, "Usage: %s devname mouse|keyboard|joystick ", argv[0]); return 1; } if (argv[2][0] != 'k' && argv[2][0] != 'm' && argv[2][0] != 'j') return 2; filename = argv[1]; if ((fd = open(filename, O_RDWR, 0666)) == -1) { perror(filename); return 3; } print_options(argv[2][0]); while (42) { FD_ZERO(&rfds); FD_SET(STDIN_FILENO, &rfds); FD_SET(fd, &rfds); retval = select(fd + 1, &rfds, NULL, NULL, NULL); if (retval == -1 && errno == EINTR) continue; if (retval < 0) { perror("select()"); return 4; } if (FD_ISSET(fd, &rfds)) { cmd_len = read(fd, buf, BUF_LEN - 1); printf("recv report:"); for (i = 0; i < cmd_len; i++) printf(" %02x", buf); printf(" "); } if (FD_ISSET(STDIN_FILENO, &rfds)) { memset(report, 0x0, sizeof(report)); cmd_len = read(STDIN_FILENO, buf, BUF_LEN - 1); if (cmd_len == 0) break; buf[cmd_len - 1] = ' |