int main (int argc, char *argv[]) { static const char *args = "/dev/hidrawX"; HIDPP::DeviceIndex device_index = HIDPP::DefaultDevice; bool do_write_tests = false; std::vector<Option> options = { DeviceIndexOption (device_index), VerboseOption (), Option ('w', "write", Option::NoArgument, "", "Also do write tests with HID++ 1.0 devices.", [&do_write_tests] (const char *optarg) -> bool { do_write_tests = true; return true; }) }; Option help = HelpOption (argv[0], args, &options); options.push_back (help); int first_arg; if (!Option::processOptions (argc, argv, options, first_arg)) return EXIT_FAILURE; if (argc-first_arg != 1) { fprintf (stderr, "%s", getUsage (argv[0], args, &options).c_str ()); return EXIT_FAILURE; } const char *path = argv[first_arg]; /* * Check protocol version */ unsigned int major, minor; try { HIDPP::Device dev (path, device_index); dev.getProtocolVersion (major, minor); printf ("%s (%04hx:%04hx) is a HID++ %d.%d device\n", dev.name ().c_str (), dev.vendorID (), dev.productID (), major, minor); } catch (HIDPP::Device::NoHIDPPReportException e) { printf ("%s is not a HID++ device\n", path); return EXIT_FAILURE; } catch (std::system_error e) { fprintf (stderr, "Failed to open %s: %s\n", path, e.what ()); return EXIT_FAILURE; } /* * HID++ 1.0 */ if (major == 1 && minor == 0) { HIDPP10::Device dev (path, device_index); for (unsigned int address = 0; address < 256; ++address) { testRegister (&dev, HIDPP::ShortParamLength, static_cast<uint8_t> (address), do_write_tests); testRegister (&dev, HIDPP::LongParamLength, static_cast<uint8_t> (address), do_write_tests); } if (do_write_tests) { try { HIDPP10::IIndividualFeatures iif (&dev); unsigned int old_flags = iif.flags (); iif.setFlags (0x00FFFFFF); unsigned int flags = iif.flags (); iif.setFlags (old_flags); printf ("Individual features: %06x\n", flags); if (flags & HIDPP10::IIndividualFeatures::SpecialButtonFunction) { printf (" - Special Button Function\n"); } if (flags & HIDPP10::IIndividualFeatures::EnhancedKeyUsage) { printf (" - Enhanced Key Usage\n"); } if (flags & HIDPP10::IIndividualFeatures::FastForwardRewind) { printf (" - Fast Forward/Rewind\n"); } if (flags & HIDPP10::IIndividualFeatures::ScrollingAcceleration) { printf (" - Scrolling Acceleration\n"); } if (flags & HIDPP10::IIndividualFeatures::ButtonsControlResolution) { printf (" - Buttons Control Resolution\n"); } if (flags & HIDPP10::IIndividualFeatures::InhibitLockKeySound) { printf (" - Inhibit Lock KeyS ound\n"); } if (flags & HIDPP10::IIndividualFeatures::MXAir3DEngine) { printf (" - 3D Engine\n"); } if (flags & HIDPP10::IIndividualFeatures::LEDControl) { printf (" - LED Control\n"); } } catch (HIDPP10::Error e) { printf ("Individual features: %s\n", e.what ()); } } } /* * HID++ 2.0 and later */ else if (major >= 2) { HIDPP20::Device dev (path, device_index); HIDPP20::IFeatureSet ifeatureset (&dev); unsigned int feature_count = ifeatureset.getCount (); for (unsigned int i = 1; i <= feature_count; ++i) { uint8_t feature_index = i; uint16_t feature_id; bool obsolete, hidden; feature_id = ifeatureset.getFeatureID (feature_index, &obsolete, &hidden); printf ("Feature 0x%02hhx: [0x%04hx]", feature_index, feature_id); if (obsolete) printf (" obsolete"); if (hidden) printf (" hidden"); printf ("\n"); } } else { fprintf (stderr, "Unsupported HID++ protocol version.\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
static int32_t testHookInterface(OMRPortLibrary *portLib, uintptr_t *passCount, uintptr_t *failCount, J9HookInterface **hookInterface) { int32_t rc = 0; uintptr_t agent1, agent2, agent2andAHalf, agent3; /* all events should be enabled initially */ testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE); /* disable event1 */ testDisable(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, 0); testReserve(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, -1); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, FALSE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE); /* reserve event2 */ testReserve(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, 0); testDisable(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, -1); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, FALSE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE); /* register event3 */ testRegister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, 0); testDisable(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, -1); testReserve(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, 0); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT1, FALSE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, TRUE); testEnabled(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, TRUE); /* register event2 (which was previously reserved) twice */ /* (the second register should have no effect) */ testRegister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, 0); testRegister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2, 0); /* trigger an event */ testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT1, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT2, 1); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 1); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 0); /* unregister the twice hooked event */ testUnregister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT2); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT1, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT2, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 1); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 0); /* unregister the once hooked event */ testUnregister(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT1, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT2, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 0); /* allocate some agent IDs */ agent1 = testAllocateAgentID(portLib, passCount, failCount, hookInterface); agent2 = testAllocateAgentID(portLib, passCount, failCount, hookInterface); agent2andAHalf = testAllocateAgentID(portLib, passCount, failCount, hookInterface); agent3 = testAllocateAgentID(portLib, passCount, failCount, hookInterface); /* register the agents in order */ testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, agent1, 1, 0); testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, agent2, 2, 0); testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT4, agent3, 3, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT4, 3); /* register the agents in reverse order */ testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent3, 3, 0); testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent2, 2, 0); testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent1, 1, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 3); /* unregister an agent */ testUnregisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, 2); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 2); /* register it again with another agent in the same list position*/ testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent2andAHalf, 2, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 3); /* register a first chance istener */ testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, J9HOOK_AGENTID_FIRST, 0, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 4); /* and a last chance listener */ testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, J9HOOK_AGENTID_LAST, 4, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 5); /* registering a duplicate listener should have no effect, even if it's a different agent */ testRegisterWithAgent(portLib, passCount, failCount, hookInterface, TESTHOOK_EVENT3, agent2, 3, 0); testDispatch(portLib, passCount, failCount, TESTHOOK_EVENT3, 5); return rc; }
int main(int argc, char **argv) { int i; struct node node = { -1 }; struct node video_node = { -1 }; struct node video_node2 = { -1 }; struct node radio_node = { -1, true }; struct node radio_node2 = { -1, true }; struct node vbi_node = { -1 }; struct node vbi_node2 = { -1 }; /* command args */ int ch; const char *device = NULL; const char *video_device = NULL; /* -d device */ const char *radio_device = NULL; /* -r device */ const char *vbi_device = NULL; /* -V device */ struct v4l2_capability vcap; /* list_cap */ char short_options[26 * 2 * 2 + 1]; int idx = 0; for (i = 0; long_options[i].name; i++) { if (!isalpha(long_options[i].val)) continue; short_options[idx++] = long_options[i].val; if (long_options[i].has_arg == required_argument) short_options[idx++] = ':'; } while (1) { int option_index = 0; short_options[idx] = 0; ch = getopt_long(argc, argv, short_options, long_options, &option_index); if (ch == -1) break; options[(int)ch] = 1; switch (ch) { case OptHelp: usage(); return 0; case OptSetDevice: video_device = optarg; if (video_device[0] >= '0' && video_device[0] <= '9' && strlen(video_device) <= 3) { static char newdev[20]; sprintf(newdev, "/dev/video%s", video_device); video_device = newdev; } break; case OptSetRadioDevice: radio_device = optarg; if (radio_device[0] >= '0' && radio_device[0] <= '9' && strlen(radio_device) <= 3) { static char newdev[20]; sprintf(newdev, "/dev/radio%s", radio_device); radio_device = newdev; } break; case OptSetVbiDevice: vbi_device = optarg; if (vbi_device[0] >= '0' && vbi_device[0] <= '9' && strlen(vbi_device) <= 3) { static char newdev[20]; sprintf(newdev, "/dev/vbi%s", vbi_device); vbi_device = newdev; } break; case OptNoWarnings: show_warnings = false; break; case OptVerbose: show_info = true; break; case ':': fprintf(stderr, "Option `%s' requires a value\n", argv[optind]); usage(); return 1; case '?': fprintf(stderr, "Unknown argument `%s'\n", argv[optind]); usage(); return 1; } } if (optind < argc) { printf("unknown arguments: "); while (optind < argc) printf("%s ", argv[optind++]); printf("\n"); usage(); return 1; } wrapper = options[OptUseWrapper]; struct utsname uts; int v1, v2, v3; uname(&uts); sscanf(uts.release, "%d.%d.%d", &v1, &v2, &v3); if (v1 == 2 && v2 == 6) kernel_version = v3; if (!video_device && !radio_device && !vbi_device) video_device = "/dev/video0"; if (video_device && (video_node.fd = test_open(video_device, O_RDWR)) < 0) { fprintf(stderr, "Failed to open %s: %s\n", video_device, strerror(errno)); exit(1); } if (radio_device && (radio_node.fd = test_open(radio_device, O_RDWR)) < 0) { fprintf(stderr, "Failed to open %s: %s\n", radio_device, strerror(errno)); exit(1); } if (vbi_device && (vbi_node.fd = test_open(vbi_device, O_RDWR)) < 0) { fprintf(stderr, "Failed to open %s: %s\n", vbi_device, strerror(errno)); exit(1); } if (video_node.fd >= 0) { node.fd = video_node.fd; device = video_device; node.is_video = true; } else if (radio_node.fd >= 0) { node.fd = radio_node.fd; device = radio_device; node.is_radio = true; printf("is radio\n"); } else if (vbi_node.fd >= 0) { node.fd = vbi_node.fd; device = vbi_device; node.is_vbi = true; } node.device = device; doioctl(&node, VIDIOC_QUERYCAP, &vcap); if (vcap.capabilities & V4L2_CAP_DEVICE_CAPS) node.caps = vcap.device_caps; else node.caps = vcap.capabilities; if (node.caps & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE | V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_SLICED_VBI_CAPTURE | V4L2_CAP_RDS_CAPTURE | V4L2_CAP_RADIO | V4L2_CAP_TUNER)) node.has_inputs = true; if (node.caps & (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VBI_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_SLICED_VBI_OUTPUT | V4L2_CAP_RDS_OUTPUT | V4L2_CAP_MODULATOR)) node.has_outputs = true; if (node.caps & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VBI_CAPTURE | V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_CAP_SLICED_VBI_CAPTURE | V4L2_CAP_RDS_CAPTURE)) node.can_capture = true; if (node.caps & (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VBI_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_CAP_SLICED_VBI_OUTPUT | V4L2_CAP_RDS_OUTPUT)) node.can_output = true; /* Information Opts */ if (kernel_version) printf("Running on 2.6.%d\n\n", kernel_version); printf("Driver Info:\n"); printf("\tDriver name : %s\n", vcap.driver); printf("\tCard type : %s\n", vcap.card); printf("\tBus info : %s\n", vcap.bus_info); printf("\tDriver version: %d.%d.%d\n", vcap.version >> 16, (vcap.version >> 8) & 0xff, vcap.version & 0xff); printf("\tCapabilities : 0x%08X\n", vcap.capabilities); printf("%s", cap2s(vcap.capabilities).c_str()); if (vcap.capabilities & V4L2_CAP_DEVICE_CAPS) { printf("\tDevice Caps : 0x%08X\n", vcap.device_caps); printf("%s", cap2s(vcap.device_caps).c_str()); } printf("\nCompliance test for device %s (%susing libv4l2):\n\n", device, wrapper ? "" : "not "); /* Required ioctls */ printf("Required ioctls:\n"); printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&node))); printf("\n"); /* Multiple opens */ printf("Allow for multiple opens:\n"); if (video_device) { video_node2 = node; printf("\ttest second video open: %s\n", ok((video_node2.fd = test_open(video_device, O_RDWR)) < 0)); if (video_node2.fd >= 0) { printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&video_node2))); printf("\ttest VIDIOC_G/S_PRIORITY: %s\n", ok(testPrio(&node, &video_node2))); node.node2 = &video_node2; } } if (radio_device) { radio_node2 = node; printf("\ttest second radio open: %s\n", ok((radio_node2.fd = test_open(radio_device, O_RDWR)) < 0)); if (radio_node2.fd >= 0) { printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&radio_node2))); printf("\ttest VIDIOC_G/S_PRIORITY: %s\n", ok(testPrio(&node, &radio_node2))); node.node2 = &video_node2; } } if (vbi_device) { vbi_node2 = node; printf("\ttest second vbi open: %s\n", ok((vbi_node2.fd = test_open(vbi_device, O_RDWR)) < 0)); if (vbi_node2.fd >= 0) { printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&vbi_node2))); printf("\ttest VIDIOC_G/S_PRIORITY: %s\n", ok(testPrio(&node, &vbi_node2))); node.node2 = &video_node2; } } printf("\n"); /* Debug ioctls */ printf("Debug ioctls:\n"); printf("\ttest VIDIOC_DBG_G/S_REGISTER: %s\n", ok(testRegister(&node))); printf("\ttest VIDIOC_LOG_STATUS: %s\n", ok(testLogStatus(&node))); printf("\n"); /* Input ioctls */ printf("Input ioctls:\n"); printf("\ttest VIDIOC_G/S_TUNER: %s\n", ok(testTuner(&node))); printf("\ttest VIDIOC_G/S_FREQUENCY: %s\n", ok(testTunerFreq(&node))); printf("\ttest VIDIOC_S_HW_FREQ_SEEK: %s\n", ok(testTunerHwSeek(&node))); printf("\ttest VIDIOC_ENUMAUDIO: %s\n", ok(testEnumInputAudio(&node))); printf("\ttest VIDIOC_G/S/ENUMINPUT: %s\n", ok(testInput(&node))); printf("\ttest VIDIOC_G/S_AUDIO: %s\n", ok(testInputAudio(&node))); printf("\tInputs: %d Audio Inputs: %d Tuners: %d\n", node.inputs, node.audio_inputs, node.tuners); printf("\n"); /* Output ioctls */ printf("Output ioctls:\n"); printf("\ttest VIDIOC_G/S_MODULATOR: %s\n", ok(testModulator(&node))); printf("\ttest VIDIOC_G/S_FREQUENCY: %s\n", ok(testModulatorFreq(&node))); printf("\ttest VIDIOC_ENUMAUDOUT: %s\n", ok(testEnumOutputAudio(&node))); printf("\ttest VIDIOC_G/S/ENUMOUTPUT: %s\n", ok(testOutput(&node))); printf("\ttest VIDIOC_G/S_AUDOUT: %s\n", ok(testOutputAudio(&node))); printf("\tOutputs: %d Audio Outputs: %d Modulators: %d\n", node.outputs, node.audio_outputs, node.modulators); printf("\n"); /* Control ioctls */ printf("Control ioctls:\n"); printf("\ttest VIDIOC_QUERYCTRL/MENU: %s\n", ok(testQueryControls(&node))); printf("\ttest VIDIOC_G/S_CTRL: %s\n", ok(testSimpleControls(&node))); printf("\ttest VIDIOC_G/S/TRY_EXT_CTRLS: %s\n", ok(testExtendedControls(&node))); printf("\ttest VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: %s\n", ok(testControlEvents(&node))); printf("\ttest VIDIOC_G/S_JPEGCOMP: %s\n", ok(testJpegComp(&node))); printf("\tStandard Controls: %d Private Controls: %d\n", node.std_controls, node.priv_controls); printf("\n"); /* I/O configuration ioctls */ printf("Input/Output configuration ioctls:\n"); printf("\ttest VIDIOC_ENUM/G/S/QUERY_STD: %s\n", ok(testStd(&node))); printf("\ttest VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: %s\n", ok(testTimings(&node))); printf("\ttest VIDIOC_DV_TIMINGS_CAP: %s\n", ok(testTimingsCap(&node))); printf("\n"); /* Format ioctls */ printf("Format ioctls:\n"); printf("\ttest VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: %s\n", ok(testEnumFormats(&node))); printf("\ttest VIDIOC_G/S_PARM: %s\n", ok(testParm(&node))); printf("\ttest VIDIOC_G_FBUF: %s\n", ok(testFBuf(&node))); printf("\ttest VIDIOC_G_FMT: %s\n", ok(testGetFormats(&node))); printf("\ttest VIDIOC_TRY_FMT: %s\n", ok(testTryFormats(&node))); printf("\ttest VIDIOC_S_FMT: %s\n", ok(testSetFormats(&node))); printf("\ttest VIDIOC_G_SLICED_VBI_CAP: %s\n", ok(testSlicedVBICap(&node))); printf("\n"); /* Codec ioctls */ printf("Codec ioctls:\n"); printf("\ttest VIDIOC_(TRY_)ENCODER_CMD: %s\n", ok(testEncoder(&node))); printf("\ttest VIDIOC_G_ENC_INDEX: %s\n", ok(testEncIndex(&node))); printf("\ttest VIDIOC_(TRY_)DECODER_CMD: %s\n", ok(testDecoder(&node))); printf("\n"); /* Buffer ioctls */ printf("Buffer ioctls:\n"); printf("\ttest VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: %s\n", ok(testReqBufs(&node))); //printf("\ttest read/write: %s\n", ok(testReadWrite(&node))); printf("\n"); /* TODO: VIDIOC_CROPCAP, VIDIOC_G/S_CROP, VIDIOC_G/S_SELECTION VIDIOC_S_FBUF/OVERLAY VIDIOC_QBUF/DQBUF/QUERYBUF/PREPARE_BUFS/EXPBUF VIDIOC_STREAMON/OFF */ /* Final test report */ test_close(node.fd); if (node.node2) test_close(node.node2->fd); printf("Total: %d, Succeeded: %d, Failed: %d, Warnings: %d\n", tests_total, tests_ok, tests_total - tests_ok, warnings); exit(app_result); }