diff --git a/test/C/hid_gadget_test_select-keeplive.c b/test/C/hid_gadget_test_select-keeplive.c new file mode 100755 index 0000000..30608e7 --- /dev/null +++ b/test/C/hid_gadget_test_select-keeplive.c @@ -0,0 +1,446 @@ + /* hid_gadget_test */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SIZE 1024 + +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 = "---", .val = 0x2d}, + {.opt = "--=", .val = 0x2e}, + {.opt = "--[", .val = 0x2f}, + {.opt = "--]", .val = 0x30}, + {.opt = "--fx", .val = 0x31}, + {.opt = "--;", .val = 0x33}, + {.opt = "--'", .val = 0x34}, + {.opt = "--`", .val = 0x35}, + {.opt = "--,", .val = 0x36}, + {.opt = "--.", .val = 0x37}, + {.opt = "--/", .val = 0x38}, + {.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 = "--1", .val = 0x1e}, + {.opt = "--2", .val = 0x1f}, + {.opt = "--3", .val = 0x20}, + {.opt = "--4", .val = 0x21}, + {.opt = "--5", .val = 0x22}, + {.opt = "--6", .val = 0x23}, + {.opt = "--7", .val = 0x24}, + {.opt = "--8", .val = 0x25}, + {.opt = "--9", .val = 0x26}, + {.opt = "--0", .val = 0x27}, + {.opt = NULL} +}; + +int keyboard_fill_report(char report[8], char buf[SIZE], 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[i].opt != NULL; i++) + if (strcmp(tok, kval[i].opt) == 0) { + report[2 + key++] = kval[i].val; + break; + } + if (kval[i].opt != NULL) + continue; + } + + if (key < 6) + if (islower(tok[0])) { + report[2 + key++] = (tok[0] - ('a' - 0x04)); + continue; + } + + for (i = 0; kmod[i].opt != NULL; i++) + if (strcmp(tok, kmod[i].opt) == 0) { + report[0] = report[0] | kmod[i].val; + break; + } + if (kmod[i].opt != NULL) + continue; + + if (key < 6) + fprintf(stderr, "unknown option: %s\n", 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[SIZE], 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[i].opt != NULL; i++) + if (strcmp(tok, mmod[i].opt) == 0) { + report[0] = report[0] | mmod[i].val; + break; + } + if (mmod[i].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'\n", tok); + report[1 + mvt--] = 0; + } + continue; + } + + fprintf(stderr, "unknown option: %s\n", 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[SIZE], 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[i].opt != NULL; i++) + if (strcmp(tok, jmod[i].opt) == 0) { + report[3] = (report[3] & 0xF0) | jmod[i].val; + break; + } + if (jmod[i].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'\n", tok); + report[mvt--] = 0; + } + continue; + } + + fprintf(stderr, "unknown option: %s\n", tok); + } + return 4; +} + +void print_options(char c) +{ + int i = 0; + + if (c == 'k') { + printf(" keyboard options:\n" + " --hold\n"); + for (i = 0; kmod[i].opt != NULL; i++) + printf("\t\t%s\n", kmod[i].opt); + printf("\n keyboard values:\n" + " [a-z] or\n"); + for (i = 0; kval[i].opt != NULL; i++) + printf("\t\t%-8s%s", kval[i].opt, i % 2 ? "\n" : ""); + printf("\n"); + } else if (c == 'm') { + printf(" mouse options:\n" + " --hold\n"); + for (i = 0; mmod[i].opt != NULL; i++) + printf("\t\t%s\n", mmod[i].opt); + printf("\n mouse values:\n" + " Two signed numbers\n" + "--quit to close\n"); + } else { + printf(" joystick options:\n"); + for (i = 0; jmod[i].opt != NULL; i++) + printf("\t\t%s\n", jmod[i].opt); + printf("\n joystick values:\n" + " three signed numbers\n" + "--quit to close\n"); + } +} + +int main(int argc, const char *argv[]) +{ + char *ip = "0.0.0.0"; + int port = 50009; + int e; + + int server_fd, client_fd; + struct sockaddr_in server_addr, client_addr; + char buffer[SIZE]; + + const char *filename = NULL; + int fd = 0; + char buf[SIZE]; + 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\n", + argv[0]); + return 1; + } + + if (argv[2][0] != 'k' && argv[2][0] != 'm' && argv[2][0] != 'j') + return 2; + + filename = argv[1]; + + + server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if(server_fd<0) + { + perror("[-]Error in socket"); + exit(1); + } + printf("[+]Server socket created. \n"); + + /* Set the option active */ + int optval = 1; + socklen_t optlen = sizeof(optval); + + if(setsockopt(server_fd, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) { + perror("[-]Error in TCP_KEEPCNT"); + exit(1); + } + printf("SO_KEEPALIVE set on socket\n"); + + /* Check the status again */ + if(getsockopt(server_fd, IPPROTO_TCP, TCP_KEEPIDLE, &optval, &optlen) < 0) { + perror("[-]Error in TCP_KEEPCNT"); + exit(1); + } + printf("TCP_KEEPIDLE is %d\n", optval ); + /* Check the status again */ + if(getsockopt(server_fd, IPPROTO_TCP, TCP_KEEPCNT, &optval, &optlen) < 0) { + perror("[-]Error in TCP_KEEPCNT"); + exit(1); + } + printf("TCP_KEEPCNT is %d\n", optval); + + /* Check the status again */ + if(getsockopt(server_fd, IPPROTO_TCP, TCP_KEEPINTVL, &optval, &optlen) < 0) { + perror("getsockopt()"); + close(server_fd); + exit(EXIT_FAILURE); + } + printf("TCP_KEEPINTVL is %d\n", optval ); + + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(port); + server_addr.sin_addr.s_addr = inet_addr(ip); + + e = bind(server_fd,(struct sockaddr*)&server_addr, sizeof(server_addr)); + if(e<0) + { + perror("[-]Error in Binding"); + exit(1); + } + printf("[+]Binding Successfull.\n"); + + e = listen(server_fd, 10); + if(e==0) + { + printf("[+]Listening...\n"); + } + else + { + perror("[-]Error in Binding"); + exit(1); + } + socklen_t addr_size = sizeof(client_addr); + client_fd = accept(server_fd,(struct sockaddr*)&client_addr, &addr_size); + if(client_fd < 0){ + perror("[-]Error in Accepting"); + exit(1); + }else{ + printf("[+]Connection accepted\n"); + system("ls /sys/class/udc > /sys/kernel/config/usb_gadget/g1/UDC"); + } + + + if ((fd = open(filename, O_RDWR, 0666)) == -1) { + perror(filename); + return 3; + } + + print_options(argv[2][0]); + + while (42) { + + FD_ZERO(&rfds); + FD_SET(client_fd, &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, SIZE - 1); + printf("recv report:"); + for (i = 0; i < cmd_len; i++) + printf(" %02x", buf[i]); + printf("\n"); + } + + if (FD_ISSET(client_fd, &rfds)) { + memset(report, 0x0, sizeof(report)); + bzero(buf,SIZE); + cmd_len = read(client_fd, buf, SIZE - 1); + + if (cmd_len == 0) + break; + + if(buf[cmd_len - 1] == '\n') + { + buf[cmd_len - 1] = '\0'; + } + fprintf(stdout, "buffer set: %s\n", buf); + fprintf(stdout, "cmd_len set: %d\n", cmd_len); + hold = 0; + + memset(report, 0x0, sizeof(report)); + const char *message = "receive"; + send(client_fd, message, strlen(message), 0); + if (argv[2][0] == 'k') + to_send = keyboard_fill_report(report, buf, &hold); + else if (argv[2][0] == 'm') + to_send = mouse_fill_report(report, buf, &hold); + else + to_send = joystick_fill_report(report, buf, &hold); + + if (to_send == -1) + break; + + if (write(fd, report, to_send) != to_send) { + perror(filename); + return 5; + } + if (!hold) { + memset(report, 0x0, sizeof(report)); + if (write(fd, report, to_send) != to_send) { + perror(filename); + return 6; + } + } + } + } + system("echo > /sys/kernel/config/usb_gadget/g1/UDC"); + close(fd); + return 0; +} \ No newline at end of file diff --git a/test/C/hid_gadget_test_select.c b/test/C/hid_gadget_test_select.c index 5b4215a..909fa28 100755 --- a/test/C/hid_gadget_test_select.c +++ b/test/C/hid_gadget_test_select.c @@ -1,8 +1,9 @@ /* hid_gadget_test */ - +//arm-linux-gnueabihf-gcc -o usr/bin/hid_gadget_test_select-tcpinfo test/C/hid_gadget_test_select.c #include #include #include +#include #include #include #include @@ -272,6 +273,8 @@ int main(int argc, const char *argv[]) int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; + struct tcp_info tcp_info; + char buffer[SIZE]; const char *filename = NULL; @@ -372,6 +375,18 @@ int main(int argc, const char *argv[]) bzero(buf,SIZE); cmd_len = read(client_fd, buf, SIZE - 1); + int error = sizeof(tcp_info); + getsockopt(client_fd, IPPROTO_TCP, TCP_INFO, &tcp_info, (socklen_t *)&error); + + if(tcp_info.tcpi_state == TCP_ESTABLISHED) + { + printf("connect ok \r\n"); + } + else + { + printf("connect error\r\n"); + return 7; + } if (cmd_len == 0) break; diff --git a/usr/bin/hid_gadget_test_select-keeplive b/usr/bin/hid_gadget_test_select-keeplive new file mode 100755 index 0000000..67b3d6a Binary files /dev/null and b/usr/bin/hid_gadget_test_select-keeplive differ diff --git a/usr/bin/hid_gadget_test_select-tcpinfo b/usr/bin/hid_gadget_test_select-tcpinfo new file mode 100755 index 0000000..a757bb3 Binary files /dev/null and b/usr/bin/hid_gadget_test_select-tcpinfo differ