コード例 #1
0
int hdmi_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
    struct hdmi_device *hdev = sd_to_hdmi_dev(sd);
    struct device *dev = hdev->dev;
    int ret = 0;

    dev_dbg(dev, "%s start\n", __func__);

    switch (ctrl->id) {
    case V4L2_CID_TV_SET_DVI_MODE:
        hdev->dvi_mode = ctrl->value;
        break;
    case V4L2_CID_TV_SET_ASPECT_RATIO:
        hdev->aspect = ctrl->value;
        break;
    case V4L2_CID_TV_ENABLE_HDMI_AUDIO:
        mutex_lock(&hdev->mutex);
        hdev->audio_enable = !!ctrl->value;
        if (is_hdmi_streaming(hdev)) {
            hdmi_set_infoframe(hdev);
            hdmi_audio_enable(hdev, hdev->audio_enable);
        }
        mutex_unlock(&hdev->mutex);
        break;
    case V4L2_CID_TV_SET_NUM_CHANNELS:
        mutex_lock(&hdev->mutex);
        hdmi_audio_information(hdev, ctrl->value);
        if (is_hdmi_streaming(hdev)) {
            hdmi_audio_enable(hdev, 0);
            hdmi_set_infoframe(hdev);
            hdmi_reg_i2s_audio_init(hdev);
            hdmi_audio_enable(hdev, 1);
        }
        mutex_unlock(&hdev->mutex);
        break;
    case V4L2_CID_TV_SET_COLOR_RANGE:
        hdev->color_range = ctrl->value;
        break;
    case V4L2_CID_TV_HDCP_ENABLE:
        hdev->hdcp_info.hdcp_enable = ctrl->value;
        dev_dbg(hdev->dev, "HDCP %s\n",
                ctrl->value ? "enable" : "disable");
#ifdef CONFIG_SEC_MHL_HDCP
        hdev->hdcp_info.hdcp_enable = false;
        /*MHL8240 control the HDCP*/
        dev_dbg(hdev->dev, "MHL control the HDCP\n");
#endif
        break;
    default:
        dev_err(dev, "invalid control id\n");
        ret = -EINVAL;
        break;
    }

    return ret;
}
コード例 #2
0
int hdmi_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
	struct hdmi_device *hdev = sd_to_hdmi_dev(sd);
	struct device *dev = hdev->dev;
	int ret = 0;

	dev_dbg(dev, "%s start\n", __func__);

	switch (ctrl->id) {
	case V4L2_CID_TV_SET_DVI_MODE:
		hdev->dvi_mode = ctrl->value;
		break;
	case V4L2_CID_TV_SET_ASPECT_RATIO:
		hdev->aspect = ctrl->value;
		break;
	case V4L2_CID_TV_ENABLE_HDMI_AUDIO:
		mutex_lock(&hdev->mutex);
		hdev->audio_enable = !!ctrl->value;
		if (is_hdmi_streaming(hdev)) {
			hdmi_set_infoframe(hdev);
			hdmi_audio_enable(hdev, hdev->audio_enable);
		}
		mutex_unlock(&hdev->mutex);
		break;
	case V4L2_CID_TV_SET_NUM_CHANNELS:
		mutex_lock(&hdev->mutex);
		if ((ctrl->value == 2) || (ctrl->value == 6) ||
							(ctrl->value == 8)) {
			hdev->audio_channel_count = ctrl->value;
		} else {
			dev_err(dev, "invalid channel count\n");
			hdev->audio_channel_count = 2;
		}
		if (is_hdmi_streaming(hdev))
			hdmi_set_infoframe(hdev);
		mutex_unlock(&hdev->mutex);
		break;
	case V4L2_CID_TV_SET_COLOR_RANGE:
		hdev->color_range = ctrl->value;
		break;
	case V4L2_CID_TV_HDCP_ENABLE:
		hdev->hdcp_info.hdcp_enable = ctrl->value;
		dev_dbg(hdev->dev, "HDCP %s\n",
				ctrl->value ? "enable" : "disable");
		break;
	default:
		dev_err(dev, "invalid control id\n");
		ret = -EINVAL;
		break;
	}

	return ret;
}
コード例 #3
0
static int hdmi_streamon(struct hdmi_device *hdev)
{
	struct device *dev = hdev->dev;
	int ret;
	u32 val0, val1, val2;

	dev_dbg(dev, "%s\n", __func__);

	/* 3D test */
	hdmi_set_infoframe(hdev);

	/* set packets for audio */
	hdmi_set_packets(hdev);

	/* init audio */
#if defined(CONFIG_VIDEO_EXYNOS_HDMI_AUDIO_I2S)
	hdmi_reg_i2s_audio_init(hdev);
#elif defined(CONFIG_VIDEO_EXYNOS_HDMI_AUDIO_SPDIF)
	hdmi_reg_spdif_audio_init(hdev);
#endif
	/* enbale HDMI audio */
	if (hdev->audio_enable)
		hdmi_audio_enable(hdev, 1);

	hdmi_set_dvi_mode(hdev);

	/* controls the pixel value limitation */
	hdmi_reg_set_limits(hdev);

	/* enable HDMI and timing generator */
	hdmi_enable(hdev, 1);
	hdmi_tg_enable(hdev, 1);

	hdev->streaming = HDMI_STREAMING;

	/* change the HPD interrupt: External -> Internal */
	disable_irq(hdev->ext_irq);
	cancel_delayed_work_sync(&hdev->hpd_work_ext);
	hdmi_reg_set_int_hpd(hdev);
	enable_irq(hdev->int_irq);
	dev_info(hdev->dev, "HDMI interrupt changed to internal\n");

	/* start HDCP if enabled */
	if (hdev->hdcp_info.hdcp_enable) {
		ret = hdcp_start(hdev);
		if (ret)
			return ret;
	}

	val0 = hdmi_read(hdev, HDMI_ACR_MCTS0);
	val1 = hdmi_read(hdev, HDMI_ACR_MCTS1);
	val2 = hdmi_read(hdev, HDMI_ACR_MCTS2);
	dev_dbg(dev, "HDMI_ACR_MCTS0 : 0x%08x\n", val0);
	dev_dbg(dev, "HDMI_ACR_MCTS1 : 0x%08x\n", val1);
	dev_dbg(dev, "HDMI_ACR_MCTS2 : 0x%08x\n", val2);

	hdmi_dumpregs(hdev, "streamon");
	return 0;
}
コード例 #4
0
static int hdmi_streamon(struct hdmi_device *hdev)
{
	struct device *dev = hdev->dev;
	int ret;
	u32 val0, val1, val2;

	dev_dbg(dev, "%s\n", __func__);

	/* 3D test */
	hdmi_set_infoframe(hdev);

	/* set packets for audio */
	hdmi_set_packets(hdev);

	/* init audio */
#if defined(CONFIG_VIDEO_EXYNOS_HDMI_AUDIO_I2S)
	//printk("=============================> HDMI IIS\n");
	hdmi_reg_i2s_audio_init(hdev);
#elif defined(CONFIG_VIDEO_EXYNOS_HDMI_AUDIO_SPDIF)
	hdmi_reg_spdif_audio_init(hdev);
#endif
	/* enbale HDMI audio */
	if (hdev->audio_enable)
	{
	    //printk("<+++++++++++++++++++++++++++++++++++++++++++ HDMI  ENABLE\n");
		hdmi_audio_enable(hdev, 1);
	    //printk("<+++++++++++++++++++++++++++++++++++++++++++ HDMI  ENABLE\n");
	}

	hdmi_set_dvi_mode(hdev);

	/* controls the pixel value limitation */
	hdmi_reg_set_limits(hdev);

	/* enable HDMI and timing generator */
	hdmi_enable(hdev, 1);
	hdmi_tg_enable(hdev, 1);

	hdmi_reg_set_int_hpd(hdev);

	hdev->streaming = HDMI_STREAMING;

//	if (edid_supports_hdmi(hdev)) {
#if 1 
		/* start HDCP if enabled */
		if (hdev->hdcp_info.hdcp_enable) {
			ret = hdcp_start(hdev);
			if (ret)
				return ret;
		}
#endif
//	}

	val0 = hdmi_read(hdev, HDMI_ACR_MCTS0);
	val1 = hdmi_read(hdev, HDMI_ACR_MCTS1);
	val2 = hdmi_read(hdev, HDMI_ACR_MCTS2);
	dev_dbg(dev, "HDMI_ACR_MCTS0 : 0x%08x\n", val0);
	dev_dbg(dev, "HDMI_ACR_MCTS1 : 0x%08x\n", val1);
	dev_dbg(dev, "HDMI_ACR_MCTS2 : 0x%08x\n", val2);

	hdmi_dumpregs(hdev, "streamon");
	return 0;
}
コード例 #5
0
void egl_server_platform_display(uint32_t win, KHRN_IMAGE_T *image, uint32_t cb_arg)
{
#ifdef DISPLAY_IS_BROKEN
   egl_callback(cb_arg);
#else
   uint32_t display_width, display_height, display_zoom;

   VC_RECT_T dr;
   VC_IMAGE_T vc_image;

   khrn_image_fill_vcimage(image, &vc_image);
   if (vc_image.type == VC_IMAGE_RGBX32) vc_image.type = VC_IMAGE_RGBA32;      /* XXX scalerlib can't handle it! */

#ifdef ARTS_AUTOMATION
   arts_display_hook(&vc_image);
#endif

#ifdef BLOOM
   VC_IMAGE_T *bloom_image;
   vc_image.width &= ~63;
   vc_image.height &= ~63;
   bloom_i = (bloom_i + 1) % 3;
#endif

   if (!inited) {
      inited = 1;

      dispmanx_init();
      display = dispmanx_display_open(display_num);

#ifdef BLOOM
      vcos_assert(bloom_handle == 0);
      bloom_result[0] = vc_image_parmalloc(vc_image.type, "Bloom result", vc_image.width / 4, vc_image.height / 4);
      bloom_result[1] = vc_image_parmalloc(vc_image.type, "Bloom result", vc_image.width / 4, vc_image.height / 4);
      bloom_result[2] = vc_image_parmalloc(vc_image.type, "Bloom result", vc_image.width / 4, vc_image.height / 4);
      bloom_handle = vcbloom_genbloom(bloom_result[0]->type, vc_image.type, 25, /*0,1*/7, 29, 1, 4, 1, 0, 0);
      bloom_tmp = malloc(vcbloom_calctmpbuffersize(bloom_handle, bloom_result[0], &vc_image));
      vcos_assert(bloom_handle != 0 && bloom_tmp != 0 && bloom_result[0] != 0 && bloom_result[1] != 0 && bloom_result[2] != 0);
#endif
   }
#ifdef BLOOM
   vc_image_lock(&vc_image, &vc_image);
   vclib_obtain_VRF(1);
   vcbloom_do(bloom_handle, bloom_result[bloom_i], &vc_image, bloom_tmp);
   vclib_release_VRF();
   vc_image_unlock(&vc_image);

   bloom_image = bloom_result[bloom_i];
#endif

#ifdef ALWAYS_HDMI
   frame++;
   //hdmi_hotplug_checker(NULL);
   if (display_num == 0)
   {
#if 0
      dispmanx_display_close(display);
      vcos_assert(display_num == 0);
      display_num = 2;
      HDMI_RES_T hdmi_res = {HDMI_RES_GROUP_DMT, /*HDMI_DMT_SWXGAP_60*//*HDMI_DMT_SWXGAP_RB*/HDMI_DMT_UXGA_60};
      hdmi_hotplug_checker(NULL);
      //_vasm("bkpt");
      hdmi_power_on(HDMI_MODE_DVI/*HDMI*/, hdmi_res, display_num);
      vcos_sleep(1000);
#endif

      HDMI_RES_T best_res = {HDMI_RES_GROUP_DMT, HDMI_DMT_SWXGAP_60/*HDMI_DMT_SWXGAP_RB*/};
      HDMI_MODE_T mode = HDMI_MODE_HDMI;

      if (1/*hdmi_get_mode() != VC_HDMI_UNPLUGGED*/)
      {
         int32_t hdmi_support;

         //int result = hdmi_supported_modes(&mode, &preferred_res, cea_modes, dmt_modes);
         //assert(result == 0);
         get_hdmi_best_mode(&mode, &hdmi_support, &best_res.group, &best_res.mode);
#ifdef HDMI_14_3D
         best_res.group = HDMI_RES_GROUP_CEA;
         best_res.mode = HDMI_CEA_1080p60;
#endif

         dispmanx_display_close(display);

         uint32_t frame_rate, interlaced;
         hdmi_get_screen_size(best_res, &hdmi_width, &hdmi_height, &frame_rate, &interlaced);

         hdmi_power_on(mode, best_res, 2);
         vcos_sleep(100);

         display_num = 2;


         while ((display = dispmanx_display_open(display_num)) == 0)
         {
            vcos_sleep(1000);
            _vasm("bkpt");
         }
#ifdef HDMI_14_3D
         {
            /* Set the info frame to enable 3D using half-height, full-width packed signals */
            //uint8_t info_frame[HDMI_NUM_PACKET_BYTES] = {0x00, 0x03, 0x0c, 0x00, 0x40, 0x60, };
            /* Set the info frame to enable 3D using full-height, half-width packed signals */
            uint8_t info_frame[HDMI_NUM_PACKET_BYTES] = {0x00, 0x03, 0x0c, 0x00, 0x40, 0x80, 0x00, };
            hdmi_set_infoframe(HDMI_INFOFRAME_VS, info_frame, /*5*/ 6);
         }
#endif
      }
   }
   else
   {
      if (0/*hdmi_get_mode() == VC_HDMI_UNPLUGGED*/)
      {
         dispmanx_display_close(display);
         display_num = 0;
         display = dispmanx_display_open(display_num);
      }
   }
#endif

#ifdef PRESSING_E_PUTS_IT_ON_HDMI
   if (game_button_pressed(GAME_KEY_E))
   {
      dispmanx_display_close(display);
      display_num ^= 2;
      display = dispmanx_display_open(display_num);
   }
#endif
#ifdef __VIDEOCORE4__
   if (display_num)
   {
      display_width = hdmi_width;
      display_height = hdmi_height;
      display_zoom = 1;
   }
   else
   {
      display_width = 800;
      display_height = 480;
      display_zoom = 0;
   }
#else
   display_width = display_num ? 1280 : 800;
   display_height = display_num ? 720 : 480;
   display_zoom = display_num ? 1 : 0;
#endif

   DISPMANX_UPDATE_HANDLE_T update = dispmanx_update_start(0);

   remove_element(update, win);
   if (display) {
      uint32_t w,h;
      DISPMANX_ALPHA_T alpha = {DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, 255, 0};

      w = vc_image.width;
      h = vc_image.height;

#ifdef KHRN_SIMPLE_MULTISAMPLE
      w /= 2;
      h /= 2;
#endif

      if (display_zoom)
      {
         float zoom0 = (float)display_width / (float)w;
         float zoom1 = (float)display_height / (float)h;

         if (zoom0 < zoom1)
         {
            w = (int)(w * zoom0);
            h = (int)(h * zoom0);
         }
         else
         {
            w = (int)(w * zoom1);
            h = (int)(h * zoom1);
         }
      }

      dr.x = ((display_width - (UNPACK_NATIVE_WINDOW_N(win) * w)) >> 1) + (UNPACK_NATIVE_WINDOW_I(win) * w);
      dr.width = w;

      //VC_RECT_T sr = {0, 0, image->width<<8, image->height<<8};
      if (h > display_height) {
         dr.y               = 0;
         dr.height          = display_height;
      } else {
         dr.y               = display_height - h >> 1;
         dr.height          = h;
      }
#ifdef BLOOM
      add_element(dispmanx_element_add(update, display, 0, &dr, &vc_image, 0, DISPMANX_PROTECTION_NONE, &alpha, 0/*clamp*/,
         flip_it(&vc_image) ? DISPMANX_FLIP_VERT : DISPMANX_NO_ROTATE), win);
      if (bloom_amount)
      {
         alpha.opacity = bloom_amount;
         add_element(dispmanx_element_add(update, display, 0, &dr, bloom_image, 0, DISPMANX_PROTECTION_NONE, &alpha, 0/*clamp*/,
            DISPMANX_NO_ROTATE), win);
      }
#else
      add_element(dispmanx_element_add(update, display, 0, &dr, &vc_image, 0, DISPMANX_PROTECTION_NONE, &alpha, 0/*clamp*/,
         flip_it(&vc_image) ? DISPMANX_FLIP_VERT : DISPMANX_NO_ROTATE), win);
#endif
   }

   dispmanx_update_submit(update, our_callback, (void *)cb_arg);
#endif
}
コード例 #6
0
ファイル: nxp-hdmi.c プロジェクト: advx9600/kernel-4.4-RuiEr
static int nxp_hdmi_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
    struct nxp_hdmi_context *ctx;
    struct nxp_hdmi *me = subdev_to_nxp_hdmi(sd);
    ctx = &me->ctx;

    pr_debug("%s\n", __func__);

    switch (ctrl->id) {
    case V4L2_CID_HDMI_SET_DVI_MODE:
        mutex_lock(&ctx->mutex);
        ctx->is_dvi = !!ctrl->value;
        mutex_unlock(&ctx->mutex);
        break;

    case V4L2_CID_HDMI_SET_ASPECT_RATIO:
        mutex_lock(&ctx->mutex);
        ctx->aspect = ctrl->value;
        mutex_unlock(&ctx->mutex);
        break;

    case V4L2_CID_HDMI_ENABLE_HDMI_AUDIO:
        mutex_lock(&ctx->mutex);
        hdmi_enable_audio(ctx, !!ctrl->value);
        mutex_unlock(&ctx->mutex);
        break;

    case V4L2_CID_HDMI_SET_NUM_CHANNELS:
        mutex_lock(&ctx->mutex);
        if ((ctrl->value == 2) || (ctrl->value == 6) ||
            (ctrl->value == 8)) {
            ctx->audio_channel_count = ctrl->value;
        } else {
            pr_err("%s: invalid channel count(%d)\n", __func__, ctrl->value);
        }
        hdmi_set_infoframe(ctx);
        mutex_unlock(&ctx->mutex);
        break;

    case V4L2_CID_HDMI_SET_COLOR_RANGE:
        mutex_lock(&ctx->mutex);
        ctx->color_range = ctrl->value;
        mutex_unlock(&ctx->mutex);
        break;

    case V4L2_CID_HDMI_ON_OFF:
        printk("%s: V4L2_CID_HDMI_ON_OFF val %d\n", __func__, ctrl->value);
        if (ctrl->value > 0) {
            u32 regval = NX_HDMI_GetReg(0, HDMI_LINK_HDMI_CON_0);
            regval |= 0x01;
            NX_HDMI_SetReg(0, HDMI_LINK_HDMI_CON_0, regval);
        } else {
            u32 regval = NX_HDMI_GetReg(0, HDMI_LINK_HDMI_CON_0);
            regval &= ~0x01;
            NX_HDMI_SetReg(0, HDMI_LINK_HDMI_CON_0, regval);
        }
        break;

    default:
        pr_err("%s: invalid control id(0x%x)\n", __func__, ctrl->id);
        return -EINVAL;
    }

    return 0;
}
コード例 #7
0
ファイル: hdmi_drv.c プロジェクト: advx9600/kernel-4.4-RuiEr
static int hdmi_streamon(struct hdmi_device *hdev)
{
	struct device *dev = hdev->dev;
	struct hdmi_resources *res = &hdev->res;
	int ret, tries;
	u32 val0, val1, val2;

	dev_dbg(dev, "%s\n", __func__);

	hdev->streaming = 1;
	ret = v4l2_subdev_call(hdev->phy_sd, video, s_stream, 1);
	if (ret)
		return ret;

	/* waiting for HDMIPHY's PLL to get to steady state */
	for (tries = 100; tries; --tries) {
		if (is_hdmiphy_ready(hdev))
			break;

		mdelay(1);
	}
	/* steady state not achieved */
	if (tries == 0) {
		dev_err(dev, "hdmiphy's pll could not reach steady state.\n");
		v4l2_subdev_call(hdev->phy_sd, video, s_stream, 0);
		hdmi_dumpregs(hdev, "s_stream");
		return -EIO;
	}

	/* hdmiphy clock is used for HDMI in streaming mode */
	clk_disable(res->sclk_hdmi);
	clk_set_parent(res->sclk_hdmi, res->sclk_hdmiphy);
	clk_enable(res->sclk_hdmi);

	/* 3D test */
	hdmi_set_infoframe(hdev);

	/* set packets for audio */
	hdmi_set_packets(hdev);

	/* init audio */
#if defined(CONFIG_VIDEO_EXYNOS_HDMI_AUDIO_I2S)
	hdmi_reg_i2s_audio_init(hdev);
#elif defined(CONFIG_VIDEO_EXYNOS_HDMI_AUDIO_SPDIF)
	hdmi_reg_spdif_audio_init(hdev);
#endif
	/* enbale HDMI audio */
	if (hdev->audio_enable)
		hdmi_audio_enable(hdev, 1);

	hdmi_set_dvi_mode(hdev);

	/* enable HDMI and timing generator */
	hdmi_enable(hdev, 1);
	hdmi_tg_enable(hdev, 1);

	mdelay(5);
	val0 = hdmi_read(hdev, HDMI_ACR_MCTS0);
	val1 = hdmi_read(hdev, HDMI_ACR_MCTS1);
	val2 = hdmi_read(hdev, HDMI_ACR_MCTS2);
	dev_dbg(dev, "HDMI_ACR_MCTS0 : 0x%08x\n", val0);
	dev_dbg(dev, "HDMI_ACR_MCTS1 : 0x%08x\n", val1);
	dev_dbg(dev, "HDMI_ACR_MCTS2 : 0x%08x\n", val2);

	/* start HDCP if enabled */
	if (hdev->hdcp_info.hdcp_enable) {
		ret = hdcp_start(hdev);
		if (ret)
			return ret;
	}

	hdmi_dumpregs(hdev, "streamon");
	return 0;
}