forked from enlightenment/efl
ecore-drm: Add support for DPMS on an output
Summary: This commit adds support for setting DPMS level of an output. This adds a new API function 'ecore_drm_output_dpms_set' to set the level. @feature Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
0a19a87c0e
commit
3a0577bd76
|
@ -318,6 +318,19 @@ EAPI Eina_Stringshare *ecore_drm_output_model_get(Ecore_Drm_Output *output);
|
|||
*/
|
||||
EAPI Eina_Stringshare *ecore_drm_output_make_get(Ecore_Drm_Output *output);
|
||||
|
||||
/**
|
||||
* Set the dpms level of an Ecore_Drm_Output
|
||||
*
|
||||
* This function will set the DPMS level of an Ecore_Drm_Output
|
||||
*
|
||||
* @param output The Ecore_Drm_Output to set the dpms level on
|
||||
* @param level The level to set
|
||||
*
|
||||
* @ingroup Ecore_Drm_Output_Group
|
||||
* @since 1.15
|
||||
*/
|
||||
EAPI void ecore_drm_output_dpms_set(Ecore_Drm_Output *output, int level);
|
||||
|
||||
/**
|
||||
* Get the pointer position of Ecore_Drm_Device
|
||||
*
|
||||
|
|
|
@ -25,6 +25,25 @@ static const char *conn_types[] =
|
|||
|
||||
EAPI int ECORE_DRM_EVENT_OUTPUT = 0;
|
||||
|
||||
static drmModePropertyPtr
|
||||
_ecore_drm_output_property_get(int fd, drmModeConnectorPtr conn, const char *name)
|
||||
{
|
||||
drmModePropertyPtr prop;
|
||||
int i = 0;
|
||||
|
||||
for (; i < conn->count_props; i++)
|
||||
{
|
||||
if (!(prop = drmModeGetProperty(fd, conn->props[i])))
|
||||
continue;
|
||||
|
||||
if (!strcmp(prop->name, name)) return prop;
|
||||
|
||||
drmModeFreeProperty(prop);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_drm_output_edid_parse_string(const uint8_t *data, char text[])
|
||||
{
|
||||
|
@ -430,6 +449,7 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto
|
|||
output->conn_id = conn->connector_id;
|
||||
dev->conn_allocator |= (1 << output->conn_id);
|
||||
output->crtc = drmModeGetCrtc(dev->drm.fd, output->crtc_id);
|
||||
output->dpms = _ecore_drm_output_property_get(dev->drm.fd, conn, "DPMS");
|
||||
|
||||
memset(&mode, 0, sizeof(mode));
|
||||
if ((enc = drmModeGetEncoder(dev->drm.fd, conn->encoder_id)))
|
||||
|
@ -500,6 +520,7 @@ mode_err:
|
|||
eina_stringshare_del(output->name);
|
||||
EINA_LIST_FREE(output->modes, mode)
|
||||
free(mode);
|
||||
drmModeFreeProperty(output->dpms);
|
||||
drmModeFreeCrtc(output->crtc);
|
||||
dev->crtc_allocator &= ~(1 << output->crtc_id);
|
||||
dev->conn_allocator &= ~(1 << output->conn_id);
|
||||
|
@ -537,6 +558,7 @@ _ecore_drm_output_free(Ecore_Drm_Output *output)
|
|||
if (output->model) eina_stringshare_del(output->model);
|
||||
if (output->make) eina_stringshare_del(output->make);
|
||||
|
||||
if (output->dpms) drmModeFreeProperty(output->dpms);
|
||||
if (output->crtc) drmModeFreeCrtc(output->crtc);
|
||||
|
||||
free(output);
|
||||
|
@ -871,6 +893,8 @@ ecore_drm_output_enable(Ecore_Drm_Output *output)
|
|||
|
||||
if ((!output) || (!output->current)) return EINA_FALSE;
|
||||
|
||||
ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_ON);
|
||||
|
||||
mode = output->current_mode;
|
||||
if (drmModeSetCrtc(output->drm_fd, output->crtc_id, output->current->id,
|
||||
0, 0, &output->conn_id, 1, &mode->info) < 0)
|
||||
|
@ -1075,3 +1099,13 @@ ecore_drm_output_make_get(Ecore_Drm_Output *output)
|
|||
|
||||
return output->make;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
ecore_drm_output_dpms_set(Ecore_Drm_Output *output, int level)
|
||||
{
|
||||
EINA_SAFETY_ON_NULL_RETURN(output);
|
||||
EINA_SAFETY_ON_NULL_RETURN(output->dpms);
|
||||
|
||||
drmModeConnectorSetProperty(output->dev->drm.fd, output->conn_id,
|
||||
output->dpms->prop_id, level);
|
||||
}
|
||||
|
|
|
@ -113,6 +113,7 @@ struct _Ecore_Drm_Output
|
|||
unsigned int crtc_id;
|
||||
unsigned int conn_id;
|
||||
drmModeCrtcPtr crtc;
|
||||
drmModePropertyPtr dpms;
|
||||
|
||||
int x, y, phys_width, phys_height;
|
||||
int drm_fd;
|
||||
|
|
Loading…
Reference in New Issue