Home | History | Annotate | Download | only in user_space
      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