1 /* 2 * v4l-test: Test environment for Video For Linux Two API 3 * 4 * 18 Apr 2009 0.4 More cleanup in frequency scan test case 5 * 28 Mar 2009 0.3 Clean up ret and errno variable names and dprintf() output 6 * 1 Feb 2009 0.2 Added test cases for VIDIOC_S_FREQUENCY 7 * 31 Jan 2009 0.1 First release 8 * 9 * Written by Mrton Nmeth <nm127 (at) freemail.hu> 10 * Released under GPL 11 */ 12 13 #include <stdio.h> 14 #include <sys/types.h> 15 #include <sys/stat.h> 16 #include <fcntl.h> 17 #include <unistd.h> 18 #include <sys/ioctl.h> 19 #include <errno.h> 20 #include <string.h> 21 22 #include <linux/videodev2.h> 23 #include <linux/errno.h> 24 25 #include <CUnit/CUnit.h> 26 27 #include "v4l2_test.h" 28 #include "dev_video.h" 29 #include "video_limits.h" 30 31 #include "test_VIDIOC_FREQUENCY.h" 32 33 void test_VIDIOC_G_FREQUENCY() 34 { 35 int ret_get, errno_get; 36 __u32 tuner; 37 struct v4l2_frequency freq; 38 39 tuner = 0; 40 41 memset(&freq, 0xff, sizeof(freq)); 42 freq.tuner = tuner; 43 ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq); 44 errno_get = errno; 45 46 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 47 __FILE__, __LINE__, ret_get, errno_get); 48 49 if (ret_get == 0) { 50 CU_ASSERT_EQUAL(ret_get, 0); 51 52 CU_ASSERT_EQUAL(freq.tuner, tuner); 53 54 //CU_ASSERT(freq.type, ???); 55 //CU_ASSERT_EQUAL(freq.frequency, ???); 56 57 CU_ASSERT_EQUAL(freq.reserved[0], 0); 58 CU_ASSERT_EQUAL(freq.reserved[1], 0); 59 CU_ASSERT_EQUAL(freq.reserved[2], 0); 60 CU_ASSERT_EQUAL(freq.reserved[3], 0); 61 CU_ASSERT_EQUAL(freq.reserved[4], 0); 62 CU_ASSERT_EQUAL(freq.reserved[5], 0); 63 CU_ASSERT_EQUAL(freq.reserved[6], 0); 64 CU_ASSERT_EQUAL(freq.reserved[7], 0); 65 66 dprintf("\tfreq = { " 67 ".tuner = %u, " 68 ".type = 0x%X, " 69 ".frequency = %u " 70 ".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X } }\n", 71 freq.tuner, 72 freq.type, 73 freq.frequency, 74 freq.reserved[0], 75 freq.reserved[1], 76 freq.reserved[2], 77 freq.reserved[3], 78 freq.reserved[4], 79 freq.reserved[5], freq.reserved[6], freq.reserved[7] 80 ); 81 } else { 82 CU_ASSERT_EQUAL(ret_get, -1); 83 CU_ASSERT_EQUAL(errno_get, EINVAL); 84 } 85 86 } 87 88 void test_VIDIOC_G_FREQUENCY_S32_MAX() 89 { 90 int ret_get, errno_get; 91 __u32 tuner; 92 struct v4l2_frequency freq; 93 94 tuner = (__u32) S32_MAX; 95 96 memset(&tuner, 0xff, sizeof(tuner)); 97 freq.tuner = tuner; 98 ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq); 99 errno_get = errno; 100 101 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 102 __FILE__, __LINE__, ret_get, errno_get); 103 104 CU_ASSERT_EQUAL(ret_get, -1); 105 CU_ASSERT_EQUAL(errno_get, EINVAL); 106 } 107 108 void test_VIDIOC_G_FREQUENCY_S32_MAX_1() 109 { 110 int ret_get, errno_get; 111 __u32 tuner; 112 struct v4l2_frequency freq; 113 114 tuner = (__u32) S32_MAX + 1; 115 116 memset(&tuner, 0xff, sizeof(tuner)); 117 freq.tuner = tuner; 118 ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq); 119 errno_get = errno; 120 121 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 122 __FILE__, __LINE__, ret_get, errno_get); 123 124 CU_ASSERT_EQUAL(ret_get, -1); 125 CU_ASSERT_EQUAL(errno_get, EINVAL); 126 } 127 128 void test_VIDIOC_G_FREQUENCY_U32_MAX() 129 { 130 int ret_get, errno_get; 131 __u32 tuner; 132 struct v4l2_frequency freq; 133 134 tuner = U32_MAX; 135 136 memset(&tuner, 0xff, sizeof(tuner)); 137 freq.tuner = tuner; 138 ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq); 139 errno_get = errno; 140 141 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 142 __FILE__, __LINE__, ret_get, errno_get); 143 144 CU_ASSERT_EQUAL(ret_get, -1); 145 CU_ASSERT_EQUAL(errno_get, EINVAL); 146 } 147 148 void test_VIDIOC_G_FREQUENCY_NULL() 149 { 150 int ret_get, errno_get; 151 int ret_null, errno_null; 152 struct v4l2_frequency freq; 153 __u32 tuner; 154 155 tuner = 0; 156 157 memset(&freq, 0xff, sizeof(freq)); 158 freq.tuner = tuner; 159 freq.type = V4L2_TUNER_ANALOG_TV; 160 ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq); 161 errno_get = errno; 162 163 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 164 __FILE__, __LINE__, ret_get, errno_get); 165 166 ret_null = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, NULL); 167 errno_null = errno; 168 169 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_null=%i, errno_null=%i\n", 170 __FILE__, __LINE__, ret_null, errno_null); 171 172 /* check if VIDIOC_G_FREQUENCY is supported at all or not */ 173 if (ret_get == 0) { 174 /* VIDIOC_G_FREQUENCY is supported, the parameter should be checked */ 175 CU_ASSERT_EQUAL(ret_null, -1); 176 CU_ASSERT_EQUAL(errno_null, EFAULT); 177 } else { 178 /* VIDIOC_G_FREQUENCY not supported at all, the parameter should not be evaluated */ 179 CU_ASSERT_EQUAL(ret_null, -1); 180 CU_ASSERT_EQUAL(errno_null, EINVAL); 181 } 182 } 183 184 void test_VIDIOC_S_FREQUENCY() 185 { 186 int ret_get, errno_get; 187 int ret_set, errno_set; 188 __u32 tuner; 189 struct v4l2_frequency orig_freq; 190 struct v4l2_frequency freq; 191 struct v4l2_frequency new_freq; 192 193 tuner = 0; 194 195 /* fetch the current frequency setting */ 196 memset(&orig_freq, 0xff, sizeof(orig_freq)); 197 orig_freq.tuner = tuner; 198 ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &orig_freq); 199 errno_get = errno; 200 201 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 202 __FILE__, __LINE__, ret_get, errno_get); 203 204 if (ret_get == 0) { 205 CU_ASSERT_EQUAL(orig_freq.tuner, tuner); 206 207 /* try to set the frequency again to the actual value */ 208 memset(&freq, 0xff, sizeof(freq)); 209 freq.tuner = tuner; 210 freq.frequency = orig_freq.frequency; 211 freq.type = V4L2_TUNER_ANALOG_TV; 212 ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &orig_freq); 213 errno_set = errno; 214 215 dprintf 216 ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i\n", 217 __FILE__, __LINE__, ret_set, errno_set); 218 219 CU_ASSERT_EQUAL(ret_set, 0); 220 if (ret_set == 0) { 221 222 /* check wheteher the frequency has not been changed */ 223 memset(&new_freq, 0xff, sizeof(new_freq)); 224 new_freq.tuner = tuner; 225 ret_get = 226 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 227 &new_freq); 228 errno_get = errno; 229 230 dprintf 231 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 232 __FILE__, __LINE__, ret_get, errno_get); 233 234 CU_ASSERT_EQUAL(ret_get, 0); 235 if (ret_get == 0) { 236 dprintf 237 ("\t%s:%u: current frequency=%u (expected %u)\n", 238 __FILE__, __LINE__, new_freq.frequency, 239 orig_freq.frequency); 240 CU_ASSERT_EQUAL(new_freq.frequency, 241 orig_freq.frequency); 242 } 243 244 } 245 246 } else { 247 CU_ASSERT_EQUAL(ret_get, -1); 248 CU_ASSERT_EQUAL(errno_get, EINVAL); 249 250 /* VIDIOC_G_FREQUENCY not supported, so shall be VIDIOC_S_FREQUENCY */ 251 252 memset(&freq, 0, sizeof(freq)); 253 freq.tuner = tuner; 254 freq.type = V4L2_TUNER_ANALOG_TV; 255 freq.frequency = 0; 256 ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 257 errno_set = errno; 258 259 dprintf 260 ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i\n", 261 __FILE__, __LINE__, ret_set, errno_set); 262 263 CU_ASSERT_EQUAL(ret_set, -1); 264 CU_ASSERT_EQUAL(errno_set, EINVAL); 265 266 } 267 268 } 269 270 void test_VIDIOC_S_FREQUENCY_boundaries() 271 { 272 int ret_g_tuner = 0; 273 int ret_g_freq = 0; 274 int errno_g_tuner = 0; 275 int errno_g_freq = 0; 276 int ret; 277 __u32 index; 278 struct v4l2_frequency orig_freq; 279 struct v4l2_frequency freq; 280 struct v4l2_frequency new_freq; 281 struct v4l2_tuner tuner; 282 283 /* this test case depends on working VIDIOC_G_TUNER and VIDIOC_G_FREQUENCY commands */ 284 285 index = 0; 286 287 /* fetch the minimum (tuner.rangelow) and maximum (tuner.rangehigh) frequency */ 288 memset(&tuner, 0xff, sizeof(tuner)); 289 tuner.index = index; 290 ret_g_tuner = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner); 291 errno_g_tuner = errno; 292 293 dprintf 294 ("\t%s:%u: VIDIOC_G_TUNER, ret=%i, tuner.rangelow=%u, tuner.rangehigh=%u\n", 295 __FILE__, __LINE__, ret_g_tuner, tuner.rangelow, tuner.rangehigh); 296 CU_ASSERT_EQUAL(tuner.index, index); 297 298 /* fetch the current frequency setting */ 299 memset(&orig_freq, 0xff, sizeof(orig_freq)); 300 orig_freq.tuner = index; 301 ret_g_freq = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &orig_freq); 302 errno_g_freq = errno; 303 304 dprintf 305 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_g_freq=%i, orig_freq.frequency=%u\n", 306 __FILE__, __LINE__, ret_g_freq, orig_freq.frequency); 307 CU_ASSERT_EQUAL(orig_freq.tuner, index); 308 309 if (ret_g_tuner == 0 && ret_g_freq == 0) { 310 CU_ASSERT_EQUAL(orig_freq.tuner, index); 311 312 /* try to set the frequency to zero */ 313 memset(&freq, 0xff, sizeof(freq)); 314 freq.tuner = index; 315 freq.type = orig_freq.type; 316 freq.frequency = 0; 317 ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 318 dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n", 319 __FILE__, __LINE__, 0, ret); 320 321 CU_ASSERT_EQUAL(ret, 0); 322 if (ret == 0) { 323 324 /* check wheteher the frequency has been changed to the lowest 325 * possible value 326 */ 327 memset(&new_freq, 0xff, sizeof(new_freq)); 328 new_freq.tuner = index; 329 ret = 330 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 331 &new_freq); 332 333 dprintf 334 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n", 335 __FILE__, __LINE__, ret, new_freq.frequency); 336 337 CU_ASSERT_EQUAL(ret, 0); 338 if (ret == 0) { 339 CU_ASSERT_EQUAL(new_freq.frequency, 340 tuner.rangelow); 341 } 342 } 343 344 /* try to set the frequency to tuner.rangelow-1, if applicable */ 345 if (0 < tuner.rangelow) { 346 memset(&freq, 0xff, sizeof(freq)); 347 freq.tuner = index; 348 freq.type = orig_freq.type; 349 freq.frequency = tuner.rangelow - 1; 350 ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 351 352 dprintf 353 ("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n", 354 __FILE__, __LINE__, tuner.rangelow - 1, ret); 355 356 CU_ASSERT_EQUAL(ret, 0); 357 if (ret == 0) { 358 359 /* check wheteher the frequency has been changed to the lowest 360 * possible value 361 */ 362 memset(&new_freq, 0xff, sizeof(new_freq)); 363 new_freq.tuner = index; 364 ret = 365 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 366 &new_freq); 367 368 dprintf 369 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n", 370 __FILE__, __LINE__, ret, 371 new_freq.frequency); 372 CU_ASSERT_EQUAL(ret, 0); 373 if (ret == 0) { 374 dprintf 375 ("\t%s:%u: current frequency=%u (expected %u)\n", 376 __FILE__, __LINE__, 377 new_freq.frequency, 378 tuner.rangelow); 379 CU_ASSERT_EQUAL(new_freq.frequency, 380 tuner.rangelow); 381 } 382 } 383 } 384 385 /* try to set the frequency to tuner.rangelow */ 386 memset(&freq, 0xff, sizeof(freq)); 387 freq.tuner = index; 388 freq.type = orig_freq.type; 389 freq.frequency = tuner.rangelow; 390 ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 391 392 dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n", 393 __FILE__, __LINE__, tuner.rangelow, ret); 394 395 CU_ASSERT_EQUAL(ret, 0); 396 if (ret == 0) { 397 398 /* check wheteher the frequency has been changed to the lowest 399 * possible value 400 */ 401 memset(&new_freq, 0xff, sizeof(new_freq)); 402 new_freq.tuner = index; 403 ret = 404 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 405 &new_freq); 406 407 dprintf 408 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n", 409 __FILE__, __LINE__, ret, new_freq.frequency); 410 411 CU_ASSERT_EQUAL(ret, 0); 412 if (ret == 0) { 413 dprintf 414 ("\t%s:%u: current frequency=%u (expected %u)\n", 415 __FILE__, __LINE__, new_freq.frequency, 416 tuner.rangelow); 417 CU_ASSERT_EQUAL(new_freq.frequency, 418 tuner.rangelow); 419 } 420 } 421 422 /* try to set the frequency to tuner.rangehigh */ 423 memset(&freq, 0xff, sizeof(freq)); 424 freq.tuner = index; 425 freq.type = orig_freq.type; 426 freq.frequency = tuner.rangehigh; 427 ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 428 429 dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n", 430 __FILE__, __LINE__, tuner.rangehigh, ret); 431 432 CU_ASSERT_EQUAL(ret, 0); 433 if (ret == 0) { 434 435 /* check wheteher the frequency has been changed to the highest 436 * possible value 437 */ 438 memset(&new_freq, 0xff, sizeof(new_freq)); 439 new_freq.tuner = index; 440 ret = 441 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 442 &new_freq); 443 444 dprintf 445 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n", 446 __FILE__, __LINE__, ret, new_freq.frequency); 447 448 CU_ASSERT_EQUAL(ret, 0); 449 if (ret == 0) { 450 dprintf 451 ("\t%s:%u: current frequency=%u (expected %u)\n", 452 __FILE__, __LINE__, new_freq.frequency, 453 tuner.rangehigh); 454 CU_ASSERT_EQUAL(new_freq.frequency, 455 tuner.rangehigh); 456 } 457 } 458 459 /* try to set the frequency to tuner.rangehigh+1, if applicable */ 460 if (tuner.rangehigh < U32_MAX) { 461 memset(&freq, 0xff, sizeof(freq)); 462 freq.tuner = index; 463 freq.type = orig_freq.type; 464 freq.frequency = tuner.rangehigh + 1; 465 ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 466 467 dprintf 468 ("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n", 469 __FILE__, __LINE__, tuner.rangehigh + 1, ret); 470 471 CU_ASSERT_EQUAL(ret, 0); 472 if (ret == 0) { 473 474 /* check wheteher the frequency has been changed to the highest 475 * possible value 476 */ 477 memset(&new_freq, 0xff, sizeof(new_freq)); 478 new_freq.tuner = index; 479 ret = 480 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 481 &new_freq); 482 483 dprintf 484 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n", 485 __FILE__, __LINE__, ret, 486 new_freq.frequency); 487 488 CU_ASSERT_EQUAL(ret, 0); 489 if (ret == 0) { 490 dprintf 491 ("\t%s:%u: current frequency=%u (expected %u)\n", 492 __FILE__, __LINE__, 493 new_freq.frequency, 494 tuner.rangehigh); 495 CU_ASSERT_EQUAL(new_freq.frequency, 496 tuner.rangehigh); 497 } 498 } 499 } 500 501 /* try to set the frequency to U32_MAX */ 502 memset(&freq, 0xff, sizeof(freq)); 503 freq.tuner = index; 504 freq.type = orig_freq.type; 505 freq.frequency = U32_MAX; 506 ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 507 508 dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n", 509 __FILE__, __LINE__, U32_MAX, ret); 510 CU_ASSERT_EQUAL(ret, 0); 511 if (ret == 0) { 512 513 /* check wheteher the frequency has been changed to the highest 514 * possible value 515 */ 516 memset(&new_freq, 0xff, sizeof(new_freq)); 517 new_freq.tuner = index; 518 ret = 519 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 520 &new_freq); 521 522 dprintf 523 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n", 524 __FILE__, __LINE__, ret, new_freq.frequency); 525 526 CU_ASSERT_EQUAL(ret, 0); 527 if (ret == 0) { 528 dprintf 529 ("\t%s:%u: current frequency=%u (expected %u)\n", 530 __FILE__, __LINE__, new_freq.frequency, 531 tuner.rangehigh); 532 CU_ASSERT_EQUAL(new_freq.frequency, 533 tuner.rangehigh); 534 } 535 } 536 537 /* try restore the original frequency settings */ 538 memset(&freq, 0xff, sizeof(freq)); 539 freq.tuner = index; 540 freq.type = orig_freq.type; 541 freq.frequency = orig_freq.frequency; 542 ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 543 544 dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n", 545 __FILE__, __LINE__, orig_freq.frequency, ret); 546 547 CU_ASSERT_EQUAL(ret, 0); 548 if (ret == 0) { 549 550 /* check wheteher the frequency has been restored */ 551 memset(&new_freq, 0xff, sizeof(new_freq)); 552 new_freq.tuner = index; 553 ret = 554 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 555 &new_freq); 556 557 dprintf 558 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n", 559 __FILE__, __LINE__, ret, new_freq.frequency); 560 561 CU_ASSERT_EQUAL(ret, 0); 562 if (ret == 0) { 563 dprintf 564 ("\t%s:%u: current frequency=%u (expected %u)\n", 565 __FILE__, __LINE__, new_freq.frequency, 566 orig_freq.frequency); 567 CU_ASSERT_EQUAL(new_freq.frequency, 568 orig_freq.frequency); 569 } 570 } 571 } 572 573 if (ret_g_freq != 0) { 574 dprintf("\t%s:%u: ret_g_freq=%d (expected %d)\n", __FILE__, 575 __LINE__, ret_g_freq, -1); 576 dprintf("\t%s:%u: errno_g_freq=%d (expected %d)\n", __FILE__, 577 __LINE__, errno_g_freq, EINVAL); 578 CU_ASSERT_EQUAL(ret_g_freq, -1); 579 CU_ASSERT_EQUAL(errno, EINVAL); 580 } 581 582 if (ret_g_tuner != 0) { 583 dprintf("\t%s:%u: ret_g_tuner=%d (expected %d)\n", __FILE__, 584 __LINE__, ret_g_tuner, -1); 585 dprintf("\t%s:%u: errno_g_tuner=%d (expected %d)\n", __FILE__, 586 __LINE__, errno_g_tuner, EINVAL); 587 CU_ASSERT_EQUAL(ret_g_tuner, -1); 588 CU_ASSERT_EQUAL(errno, EINVAL); 589 } 590 591 } 592 593 void test_VIDIOC_S_FREQUENCY_scan() 594 { 595 int ret_g_tuner, errno_g_tuner; 596 int ret_g_freq, errno_g_freq; 597 int ret_get, errno_get; 598 int ret_set, errno_set; 599 __u32 index; 600 struct v4l2_frequency orig_freq; 601 struct v4l2_frequency freq; 602 struct v4l2_frequency new_freq; 603 struct v4l2_frequency prev_freq; 604 struct v4l2_tuner tuner; 605 __u32 i; 606 607 /* this test case depends on working VIDIOC_G_FREQUENCY command */ 608 609 index = 0; 610 611 /* fetch the minimum (tuner.rangelow) and maximum (tuner.rangehigh) frequency */ 612 memset(&tuner, 0xff, sizeof(tuner)); 613 tuner.index = index; 614 ret_g_tuner = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner); 615 errno_g_tuner = errno; 616 617 dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_g_tuner=%i, errno_g_tuner=%i\n", 618 __FILE__, __LINE__, ret_g_tuner, errno_g_tuner); 619 CU_ASSERT_EQUAL(tuner.index, index); 620 621 /* fetch the current frequency setting */ 622 memset(&orig_freq, 0xff, sizeof(orig_freq)); 623 orig_freq.tuner = index; 624 ret_g_freq = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &orig_freq); 625 errno_g_freq = errno; 626 627 dprintf 628 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_g_freq=%i, errno_g_freq=%i, orig_freq.frequency=%u\n", 629 __FILE__, __LINE__, ret_g_freq, errno_g_freq, orig_freq.frequency); 630 CU_ASSERT_EQUAL(orig_freq.tuner, index); 631 632 if (ret_g_freq == 0) { 633 CU_ASSERT_EQUAL(orig_freq.tuner, index); 634 635 dprintf("\t%s:%u: tuner.rangelow=%u, tuner.rangehigh=%u\n", 636 __FILE__, __LINE__, tuner.rangelow, tuner.rangehigh); 637 638 i = tuner.rangelow; 639 prev_freq.frequency = 0; 640 do { 641 /* try to set the frequency */ 642 memset(&freq, 0xff, sizeof(freq)); 643 freq.tuner = index; 644 freq.type = orig_freq.type; 645 646 freq.frequency = i; 647 ret_set = 648 ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 649 errno_set = errno; 650 dprintf 651 ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i, freq.frequency=%u\n", 652 __FILE__, __LINE__, ret_set, errno_set, i); 653 654 CU_ASSERT_EQUAL(ret_set, 0); 655 if (ret_set == 0) { 656 657 memset(&new_freq, 0xff, sizeof(new_freq)); 658 new_freq.tuner = index; 659 ret_get = 660 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 661 &new_freq); 662 errno_get = errno; 663 664 dprintf 665 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i, new_freq.frequency=%u\n", 666 __FILE__, __LINE__, ret_get, errno_get, 667 new_freq.frequency); 668 669 CU_ASSERT_EQUAL(ret_get, 0); 670 if (ret_get == 0) { 671 CU_ASSERT(prev_freq.frequency <= 672 new_freq.frequency); 673 CU_ASSERT(tuner.rangelow <= 674 new_freq.frequency); 675 CU_ASSERT(new_freq.frequency <= 676 tuner.rangehigh); 677 prev_freq = new_freq; 678 } 679 } else { 680 printf("\tError %i while setting to %u\n", 681 errno_set, i); 682 } 683 i++; 684 } while (i <= tuner.rangehigh); 685 686 /* try restore the original frequency settings */ 687 memset(&freq, 0xff, sizeof(freq)); 688 freq.tuner = index; 689 freq.type = orig_freq.type; 690 freq.frequency = orig_freq.frequency; 691 ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq); 692 errno_set = errno; 693 694 dprintf 695 ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i\n", 696 __FILE__, __LINE__, ret_set, errno_set); 697 698 CU_ASSERT_EQUAL(ret_set, 0); 699 if (ret_set == 0) { 700 701 /* check wheteher the frequency has been restored */ 702 memset(&new_freq, 0xff, sizeof(new_freq)); 703 new_freq.tuner = index; 704 ret_get = 705 ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, 706 &new_freq); 707 errno_get = errno; 708 709 dprintf 710 ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i, new_freq.frequency=%u\n", 711 __FILE__, __LINE__, ret_get, errno_get, 712 new_freq.frequency); 713 714 CU_ASSERT_EQUAL(ret_get, 0); 715 if (ret_get == 0) { 716 CU_ASSERT_EQUAL(new_freq.frequency, 717 orig_freq.frequency); 718 } 719 } 720 } 721 722 if (ret_g_freq != 0) { 723 CU_ASSERT_EQUAL(ret_g_freq, -1); 724 CU_ASSERT_EQUAL(errno, EINVAL); 725 } 726 727 if (ret_g_tuner != 0) { 728 CU_ASSERT_EQUAL(ret_g_tuner, -1); 729 CU_ASSERT_EQUAL(errno, EINVAL); 730 } 731 732 } 733 734 void test_VIDIOC_S_FREQUENCY_NULL() 735 { 736 int ret_get, errno_get; 737 int ret_set, errno_set; 738 int ret_null, errno_null; 739 struct v4l2_frequency freq_orig; 740 struct v4l2_frequency freq; 741 __u32 tuner; 742 743 tuner = 0; 744 745 memset(&freq_orig, 0, sizeof(freq_orig)); 746 freq_orig.tuner = tuner; 747 freq_orig.type = V4L2_TUNER_ANALOG_TV; 748 ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq_orig); 749 errno_get = errno; 750 751 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n", 752 __FILE__, __LINE__, ret_get, errno_get); 753 754 memset(&freq, 0, sizeof(freq)); 755 freq.tuner = 0; 756 freq.type = V4L2_TUNER_ANALOG_TV; 757 freq.frequency = freq_orig.frequency; 758 ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq_orig); 759 errno_set = errno; 760 761 dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_set=%i, errno_set=%i\n", 762 __FILE__, __LINE__, ret_set, errno_set); 763 764 ret_null = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, NULL); 765 errno_null = errno; 766 767 dprintf("\t%s:%u: VIDIOC_S_FREQUENCY, ret_null=%i, errno_null=%i\n", 768 __FILE__, __LINE__, ret_null, errno_null); 769 770 /* Check whether any of VIDIOC_S_FREQUENCY or VIDIOC_G_FREQUENCY 771 * is supported at all or not 772 */ 773 if (ret_get == 0 || ret_set == 0) { 774 /* VIDIOC_G_FREQUENCY or VIDIOC_S_FREQUENCY is supported, so 775 * the parameter of VIDIOC_S_FREQUENCY should be checked 776 */ 777 CU_ASSERT_EQUAL(ret_null, -1); 778 CU_ASSERT_EQUAL(errno_null, EFAULT); 779 } else { 780 /* none of VIDIOC_G_FREQUENCY and VIDIOC_S_FREQUENCY is supported, 781 * the parameter should not be evaluated 782 */ 783 CU_ASSERT_EQUAL(ret_get, -1); 784 CU_ASSERT_EQUAL(errno_get, EINVAL); 785 CU_ASSERT_EQUAL(ret_set, -1); 786 CU_ASSERT_EQUAL(errno_set, EINVAL); 787 CU_ASSERT_EQUAL(ret_null, -1); 788 CU_ASSERT_EQUAL(errno_null, EINVAL); 789 } 790 791 } 792