出處:http://url.blog.163.com/blog/static/23197521201011703452914/
买了个手柄玩PS2,却不能震动,也不知道是手柄不支持还是模拟器不支持。。特别写了一个程序来测试:
/** jstest.c** joystick test for linux, with force feedback.* no copyright for this, u can free for use.** Created on: 2010-10-3* Author: ArLi Weng <[email protected]>*/#include <stdio.h>#include <stdlib.h>#include <dirent.h>#include <unistd.h>#include <fcntl.h>#include <linux/input.h>#include <linux/joystick.h>void fftest(char *dvc) { //kernel/Documentation/input/ff.txtint fd_event = open(dvc, O_RDWR);if (fd_event < 0) {printf("can't open fd: %sn", dvc);return;}unsigned long req[4];if (ioctl(fd_event, EVIOCGBIT(EV_FF, sizeof(req)), req) == -1) {printf("ff io failed: %sn", dvc);close(fd_event);} else {struct ff_effect ffe;ffe.type = FF_RUMBLE;ffe.u.rumble.strong_magnitude = 0xffff; //强力度ffe.u.rumble.weak_magnitude = 0xffff; //弱力度ffe.replay.length = 3000; //keep timeffe.replay.delay = 0;ffe.id = -1;if (ioctl(fd_event, EVIOCSFF, &ffe) == -1) {close(fd_event);printf("not ff supportn");return;}struct input_event ie;ie.type = EV_FF;ie.code = ffe.id;ie.value = 1;if (write(fd_event, (const void*) &ie, sizeof(ie)) == -1) {close(fd_event);printf("ff start errorn");} else {usleep((ffe.replay.length + 1) * 1000);close(fd_event);}}}void loopevent(char *dvc) { //kernel/Documentation/input/joystick-api.txtint fd_js = open(dvc, O_RDONLY | O_NONBLOCK);if (fd_js < 0) {printf("can't open fd: %sn", dvc);return;}struct js_event jse;int sz_jse = sizeof(jse);while (1) {usleep(1000);if (read(fd_js, &jse, sz_jse) == sz_jse) {jse.type &= ~JS_EVENT_INIT;if (jse.type == JS_EVENT_AXIS) {/* incompatible, maybe my problem, drvier by dragonrise.*if ((jse.number & 1) == 1) {printf("axis y%d releasen", jse.number / 2);} else {printf("axis x%d releasen", jse.number / 2);}*/printf("axis: %d, value: %dn", jse.number, jse.value);} else if (jse.type == JS_EVENT_BUTTON) {if (0 == jse.value) {printf("button: %d releasen", jse.number);} else if (1 == jse.value) {printf("button: %d pressn", jse.number);}}}}close(fd_js);}int main(int argc, char *argv[]) {int jsn = 0;if (argc > 1) {jsn = atoi(argv[1]);}printf("number: %in", jsn);char dvc[128];DIR *dir;sprintf(dvc, "/sys/class/input/js%d", jsn);dir = opendir(dvc);if (dir == NULL) {printf("not exist: %s", dvc);return EXIT_FAILURE;} else {closedir(dir);}int ie;for (ie = 0; ie <= 64; ie++) {sprintf(dvc, "/sys/class/input/js%d/device/event%d", jsn, ie);dir = opendir(dvc);if (dir != NULL) {closedir(dir);break;}}printf("found event: %sn", dvc);sprintf(dvc, "/dev/input/event%d", ie);fftest(dvc);sprintf(dvc, "/dev/input/js%d", jsn);loopevent(dvc);return EXIT_SUCCESS;}