2 Copyright 2012 Samsung Electronics Co., Ltd
4 Licensed under the Flora License, Version 1.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.tizenopensource.org/license
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
21 #include "chg_common.h"
25 /*-----------------------------------------------------------------------------
27 ----------------------------------------------------------------------------*/
28 static int find_connector(st_drmdi *drmdi, int type)
32 drmModeConnectorPtr connector=NULL;
33 drmModeEncoderPtr encoder=NULL;
35 drmModeResPtr res_mode;
41 res_mode = drmdi->res_mode;
43 for(i=0; i<res_mode->count_connectors; i++) {
44 connector =drmModeGetConnector(fd, res_mode->connectors[i]);
45 if(connector->connector_type == type)
48 drmModeFreeConnector(connector);
53 LOGD("[find_connector] Cannot find connector:%d\n", type);
57 if(connector->connection != DRM_MODE_CONNECTED) {
58 LOGD("[find_connector] connector is not connected (%d)\n",
59 (int)connector->connection);
63 /* find default encoder */
64 encoder = drmModeGetEncoder(fd, connector->encoder_id);
66 LOGD("[find_connector] Cannot get encoder:%d\n", type);
70 /* find default crtc */
71 crtc = drmModeGetCrtc(fd, encoder->crtc_id);
73 LOGD("[find_connector] Cannot get CRTC\n");
77 drmdi->connector = connector;
78 drmdi->encoder = encoder;
84 /*-----------------------------------------------------------------------------
86 ----------------------------------------------------------------------------*/
87 static int create_framebuffer(st_drmdi *drmdi)
89 unsigned int attrs[]={
92 KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
93 KMS_TERMINATE_PROP_LIST
97 attrs[1] = drmdi->connector->modes[0].hdisplay;
98 attrs[3] = drmdi->connector->modes[0].vdisplay;
100 if(kms_bo_create(drmdi->kms, attrs, &drmdi->bo)) {
101 LOGD("[create_framebuffer] Cannot create kms bo\n");
105 drmdi->bo_width = drmdi->connector->modes[0].hdisplay;
106 drmdi->bo_height = drmdi->connector->modes[0].vdisplay;
107 kms_bo_get_prop(drmdi->bo, KMS_PITCH, &drmdi->bo_stride);
108 kms_bo_get_prop(drmdi->bo, KMS_HANDLE, &drmdi->bo_handle);
110 /* add drm framebuffer */
111 if(drmModeAddFB(drmdi->fd, drmdi->bo_width, drmdi->bo_height,
112 24, 32, drmdi->bo_stride, drmdi->bo_handle, &drmdi->fb_id)) {
113 LOGD("[create_framebuffer] Cannot add drm fb\n");
120 /*-----------------------------------------------------------------------------
122 ----------------------------------------------------------------------------*/
123 static int set_drm_mode(st_drmdi *drmdi)
125 if(drmModeSetCrtc(drmdi->fd
126 , drmdi->crtc->crtc_id
129 , &drmdi->connector->connector_id, 1
130 , drmdi->connector->modes)) {
131 LOGD("[set_drm_mode] Cannot set drm mode\n");
138 /*-----------------------------------------------------------------------------
140 ----------------------------------------------------------------------------*/
141 static void free_drm_res(st_drmdi *drmdi)
144 drmModeFreeConnector(drmdi->connector);
147 drmModeFreeEncoder(drmdi->encoder);
150 drmModeFreeCrtc(drmdi->crtc);
153 drmModeFreeResources(drmdi->res_mode);
156 drmModeRmFB(drmdi->fd, drmdi->fb_id);
159 kms_bo_destroy(&drmdi->bo);
162 kms_destroy(&drmdi->kms);
167 /*-----------------------------------------------------------------------------
169 ----------------------------------------------------------------------------*/
170 int drmd_open(st_drmdi *drmdi)
178 LOGD("[drmd_open] drmdi is NULL\n");
182 memset(drmdi, 0x00, sizeof(st_drmdi));
184 drmdi->fd = drmOpen(chg_env_str[EN_ENV_DEV_DRM_NAME], NULL);
186 LOGD("[drmd_open] Cannot open drm:%s\n",
187 chg_env_str[EN_ENV_DEV_DRM_NAME]);
191 drmdi->driver_name = drmGetDeviceNameFromFd(drmdi->fd);
192 LOGD("[drmd_open] Init DRM(name:%s, fd:%d)...OK\n",
193 drmdi->driver_name, drmdi->fd);
196 if(drmGetMagic(drmdi->fd, &magic)) {
197 LOGD("[drmd_open] Cannot get magic\n");
201 if(drmAuthMagic(drmdi->fd, magic)) {
202 LOGD("[drmd_open] Cannot auth magic\n");
207 if(kms_create(drmdi->fd, &drmdi->kms)) {
208 LOGD("[drmd_open] Cannot create kms\n");
212 /* Get drmmode resource */
213 drmdi->res_mode = drmModeGetResources(drmdi->fd);
214 if(!drmdi->res_mode) {
215 LOGD("[drmd_open] Cannot get drmmode resources\n");
219 ret = find_connector(drmdi, DRM_MODE_CONNECTOR_LVDS);
221 LOGD("[drmd_open] Cannot get default(LVDS) connector\n");
225 /* Create framebuffer */
226 ret = create_framebuffer(drmdi);
228 LOGD("[drmd_open] Cannot create frame buffer\n");
232 if (kms_bo_map(drmdi->bo, &ptr)) {
233 LOGD("[drmd_open] kms_bo_map() failed. \n");
237 drmdi->dpms_mode = DPMSModeOn;
238 memset(ptr, 0x00, drmdi->bo_stride * drmdi->bo_height);
241 ret = set_drm_mode(drmdi);
243 LOGD("[drmd_open] Cannot set drm mode\n");
254 /*-----------------------------------------------------------------------------
256 ----------------------------------------------------------------------------*/
257 void drmd_close(st_drmdi *drmdi)
259 kms_bo_unmap(drmdi->bo);
263 /*-----------------------------------------------------------------------------
265 ----------------------------------------------------------------------------*/
266 static int drmd_set_dpms_mode(st_drmdi *drmdi, int dpms_mode)
269 drmModeConnectorPtr connector;
272 LOGD("[drmd_set_dpms_mode] drmdi is NULL\n");
276 connector = drmdi->connector;
278 if (dpms_mode == DPMSModeStandby || dpms_mode == DPMSModeSuspend) {
279 LOGD("[drmd_set_dpms_mode] dmps_mode %s is not supported.\n",
280 (dpms_mode == DPMSModeStandby)?
281 "DPMSModeStandby":"DPMSModeSuspend");
285 for (i = 0; i < connector->count_props; i++) {
286 drmModePropertyPtr props;
287 props = drmModeGetProperty (drmdi->fd, connector->props[i]);
291 if (!strcmp(props->name, "DPMS")) {
292 int _tmp_dpms = dpms_mode;
295 if (drmdi->dpms_mode == DPMSModeOn) {
296 drmModeFreeProperty (props);
301 _tmp_dpms = DPMSModeOn;
302 drmdi->dpms_mode = DPMSModeOn;
306 if (drmdi->dpms_mode == DPMSModeOff) {
307 drmModeFreeProperty(props);
312 _tmp_dpms = DPMSModeOff;
313 drmdi->dpms_mode = DPMSModeOff;
319 drmModeConnectorSetProperty(drmdi->fd,
320 connector->connector_id,
324 drmModeFreeProperty(props);
328 drmModeFreeProperty(props);
334 /*-----------------------------------------------------------------------------
336 ----------------------------------------------------------------------------*/
337 int drmd_lcd_on(st_drmdi *drmdi)
341 ret = drmd_set_dpms_mode(drmdi, DPMSModeOn);
343 LOGD("[drmd_lcd_on] drmd_set_dpms_mode() fail.\n");
350 /*-----------------------------------------------------------------------------
352 ----------------------------------------------------------------------------*/
353 int drmd_lcd_off(st_drmdi *drmdi)
357 ret = drmd_set_dpms_mode(drmdi, DPMSModeOff);
359 LOGD("[drmd_lcd_off] drmd_set_dpms_mode() fail.\n");