int get_signal_strength(int fd, struct v4l2_tuner *vt){ int totsig, rate, i; float perc; totsig=0; for (i = 0; i < TRIES; i++) { if (i>0) usleep(SAMPLEDELAY); if (get_v4l2_tuner(fd, vt) < 0) { return -1; } totsig += vt->signal; perc = (totsig / (65535.0 * i)); //ALOGI("checking: %3.1f%% (%d/%d), vt.signal %d \n", perc * 100.0, i, TRIES, vt->signal); } perc = (totsig / (65535.0 * TRIES)); rate = perc * 1000.0; // changed in 0 - 1000 scale ALOGI("signal strenght in SE scale %d \n", rate); return rate; }
float get_fact(int fd, struct v4l2_tuner *vt){ if (get_v4l2_tuner(fd, vt)<0) return -1; if ((vt->capability & V4L2_TUNER_CAP_LOW) == 0) return 0.016; else return 16.; return -1; }
static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { union { #ifdef CONFIG_VIDEO_V4L1_COMPAT struct video_tuner vt; struct video_buffer vb; struct video_window vw; struct video_code vc; struct video_audio va; #endif struct v4l2_format v2f; struct v4l2_buffer v2b; struct v4l2_framebuffer v2fb; struct v4l2_standard v2s; struct v4l2_input v2i; struct v4l2_tuner v2t; unsigned long vx; } karg; void __user *up = compat_ptr(arg); int compatible_arg = 1; int err = 0; int realcmd = cmd; /* First, convert the command. */ switch(cmd) { #ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGTUNER32: realcmd = cmd = VIDIOCGTUNER; break; case VIDIOCSTUNER32: realcmd = cmd = VIDIOCSTUNER; break; case VIDIOCGWIN32: realcmd = cmd = VIDIOCGWIN; break; case VIDIOCGFBUF32: realcmd = cmd = VIDIOCGFBUF; break; case VIDIOCSFBUF32: realcmd = cmd = VIDIOCSFBUF; break; case VIDIOCGFREQ32: realcmd = cmd = VIDIOCGFREQ; break; case VIDIOCSFREQ32: realcmd = cmd = VIDIOCSFREQ; break; case VIDIOCSMICROCODE32: realcmd = cmd = VIDIOCSMICROCODE; break; #endif case VIDIOC_G_FMT32: realcmd = cmd = VIDIOC_G_FMT; break; case VIDIOC_S_FMT32: realcmd = cmd = VIDIOC_S_FMT; break; case VIDIOC_QUERYBUF32: realcmd = cmd = VIDIOC_QUERYBUF; break; case VIDIOC_QBUF32: realcmd = cmd = VIDIOC_QBUF; break; case VIDIOC_DQBUF32: realcmd = cmd = VIDIOC_DQBUF; break; case VIDIOC_STREAMON32: realcmd = cmd = VIDIOC_STREAMON; break; case VIDIOC_STREAMOFF32: realcmd = cmd = VIDIOC_STREAMOFF; break; case VIDIOC_G_FBUF32: realcmd = cmd = VIDIOC_G_FBUF; break; case VIDIOC_S_FBUF32: realcmd = cmd = VIDIOC_S_FBUF; break; case VIDIOC_OVERLAY32: realcmd = cmd = VIDIOC_OVERLAY; break; case VIDIOC_ENUMSTD32: realcmd = VIDIOC_ENUMSTD; break; case VIDIOC_ENUMINPUT32: realcmd = VIDIOC_ENUMINPUT; break; case VIDIOC_S_CTRL32: realcmd = cmd = VIDIOC_S_CTRL; break; case VIDIOC_G_INPUT32: realcmd = cmd = VIDIOC_G_INPUT; break; case VIDIOC_S_INPUT32: realcmd = cmd = VIDIOC_S_INPUT; break; case VIDIOC_TRY_FMT32: realcmd = cmd = VIDIOC_TRY_FMT; break; }; switch(cmd) { #ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCSTUNER: case VIDIOCGTUNER: err = get_video_tuner32(&karg.vt, up); compatible_arg = 0; break; case VIDIOCSFBUF: err = get_video_buffer32(&karg.vb, up); compatible_arg = 0; break; case VIDIOCSFREQ: #endif case VIDIOC_S_INPUT: case VIDIOC_OVERLAY: case VIDIOC_STREAMON: case VIDIOC_STREAMOFF: err = get_user(karg.vx, (u32 __user *)up); compatible_arg = 1; break; case VIDIOC_S_FBUF: err = get_v4l2_framebuffer32(&karg.v2fb, up); compatible_arg = 0; break; case VIDIOC_G_FMT: case VIDIOC_S_FMT: case VIDIOC_TRY_FMT: err = get_v4l2_format32(&karg.v2f, up); compatible_arg = 0; break; case VIDIOC_QUERYBUF: case VIDIOC_QBUF: case VIDIOC_DQBUF: err = get_v4l2_buffer32(&karg.v2b, up); compatible_arg = 0; break; case VIDIOC_ENUMSTD: err = get_v4l2_standard(&karg.v2s, up); compatible_arg = 0; break; case VIDIOC_ENUMSTD32: err = get_v4l2_standard32(&karg.v2s, up); compatible_arg = 0; break; case VIDIOC_ENUMINPUT: err = get_v4l2_input(&karg.v2i, up); compatible_arg = 0; break; case VIDIOC_ENUMINPUT32: err = get_v4l2_input32(&karg.v2i, up); compatible_arg = 0; break; case VIDIOC_G_TUNER: case VIDIOC_S_TUNER: err = get_v4l2_tuner(&karg.v2t, up); compatible_arg = 0; break; #ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGWIN: case VIDIOCGFBUF: case VIDIOCGFREQ: #endif case VIDIOC_G_FBUF: case VIDIOC_G_INPUT: compatible_arg = 0; break; #ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCSMICROCODE: err = microcode32(&karg.vc, up); compatible_arg = 0; break; #endif }; if(err) goto out; if(compatible_arg) err = native_ioctl(file, realcmd, (unsigned long)up); else { mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); err = native_ioctl(file, realcmd, (unsigned long) &karg); set_fs(old_fs); } if(err == 0) { switch(cmd) { #ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGTUNER: err = put_video_tuner32(&karg.vt, up); break; case VIDIOCGWIN: err = put_video_window32(&karg.vw, up); break; case VIDIOCGFBUF: err = put_video_buffer32(&karg.vb, up); break; #endif case VIDIOC_G_FBUF: err = put_v4l2_framebuffer32(&karg.v2fb, up); break; case VIDIOC_G_FMT: case VIDIOC_S_FMT: case VIDIOC_TRY_FMT: err = put_v4l2_format32(&karg.v2f, up); break; case VIDIOC_QUERYBUF: case VIDIOC_QBUF: case VIDIOC_DQBUF: err = put_v4l2_buffer32(&karg.v2b, up); break; case VIDIOC_ENUMSTD: err = put_v4l2_standard(&karg.v2s, up); break; case VIDIOC_ENUMSTD32: err = put_v4l2_standard32(&karg.v2s, up); break; case VIDIOC_G_TUNER: case VIDIOC_S_TUNER: err = put_v4l2_tuner(&karg.v2t, up); break; case VIDIOC_ENUMINPUT: err = put_v4l2_input(&karg.v2i, up); break; case VIDIOC_ENUMINPUT32: err = put_v4l2_input32(&karg.v2i, up); break; #ifdef CONFIG_VIDEO_V4L1_COMPAT case VIDIOCGFREQ: #endif case VIDIOC_G_INPUT: err = put_user(((u32)karg.vx), (u32 __user *)up); break; }; } out: return err; }
static int v4l2_rx_start_func (void **data, int low_freq, int high_freq, int default_freq, int grid) { char *dev = DEFAULT_DEVICE; fm_v4l2_data* session; ALOGI("%s:\n", __FUNCTION__); ALOGI("low_freq %d, high_freq %d, default_freq %d, grid %d\n", low_freq, high_freq, default_freq, grid); session = malloc(sizeof(fm_v4l2_data)); if (session== NULL){ ALOGE("error on malloc"); return -1; } memset(session, 0, sizeof(fm_v4l2_data)); *data = session; session->fd = open_dev(dev); if (session->fd < 0){ ALOGE("error on open dev\n"); return -1; } if (get_tun_radio_cap(session->fd) !=1) { ALOGE("error on check tunner radio capability"); return -1; } session->vt.index=0; if ( get_v4l2_tuner(session->fd, &session->vt) <0 ){ ALOGE("error on get V4L tuner\n"); return -1; } session->fact = get_fact(session->fd, &session->vt); if ( session->fact < 0) { ALOGE("error on get fact\n"); return -1; } session->freq = get_proprietary_freq(default_freq, session->fact); session->low_freq = get_proprietary_freq(low_freq, session->fact); session->high_freq = get_proprietary_freq(high_freq, session->fact); session->grid = get_proprietary_freq(grid, session->fact); session->threshold = DEFAULT_THRESHOLD; if (set_freq(session->fd, session->freq) < 0 ){ ALOGE("error on set freq\n"); return -1; } if (set_volume(session->fd, DEFAULT_VOLUME)<0){ ALOGE("error on set volume\n"); return -1; } if (set_mute(session->fd, MUTE_OFF) <0){ ALOGE("error on mute\n"); return -1; } return 0; }
int get_stereo(int fd, struct v4l2_tuner *vt){ if (get_v4l2_tuner(fd, vt)<0) return -1; return ((vt->audmode & V4L2_TUNER_MODE_STEREO) ==1); }