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.
19 #include "chg_common.h"
23 /*-----------------------------------------------------------------------------
25 ----------------------------------------------------------------------------*/
26 static int find_connector(st_drmdi *drmdi, int type)
30 drmModeConnectorPtr connector=NULL;
31 drmModeEncoderPtr encoder=NULL;
33 drmModeResPtr res_mode;
39 res_mode = drmdi->res_mode;
41 for(i=0; i<res_mode->count_connectors; i++) {
42 connector =drmModeGetConnector(fd, res_mode->connectors[i]);
43 if(connector->connector_type == type)
46 drmModeFreeConnector(connector);
51 LOGD("[find_connector] Cannot find connector:%d\n", type);
55 if(connector->connection != DRM_MODE_CONNECTED) {
56 LOGD("[find_connector] connector is not connected (%d)\n",
57 (int)connector->connection);
61 /* find default encoder */
62 encoder = drmModeGetEncoder(fd, connector->encoder_id);
64 LOGD("[find_connector] Cannot get encoder:%d\n", type);
68 /* find default crtc */
69 crtc = drmModeGetCrtc(fd, encoder->crtc_id);
71 LOGD("[find_connector] Cannot get CRTC\n");
75 drmdi->connector = connector;
76 drmdi->encoder = encoder;
82 /*-----------------------------------------------------------------------------
84 ----------------------------------------------------------------------------*/
85 static int create_framebuffer(st_drmdi *drmdi)
87 unsigned int attrs[]={
90 KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
91 KMS_TERMINATE_PROP_LIST
95 attrs[1] = drmdi->connector->modes[0].hdisplay;
96 attrs[3] = drmdi->connector->modes[0].vdisplay;
98 if(kms_bo_create(drmdi->kms, attrs, &drmdi->bo)) {
99 LOGD("[create_framebuffer] Cannot create kms bo\n");
103 drmdi->bo_width = drmdi->connector->modes[0].hdisplay;
104 drmdi->bo_height = drmdi->connector->modes[0].vdisplay;
105 kms_bo_get_prop(drmdi->bo, KMS_PITCH, &drmdi->bo_stride);
106 kms_bo_get_prop(drmdi->bo, KMS_HANDLE, &drmdi->bo_handle);
108 /* add drm framebuffer */
109 if(drmModeAddFB(drmdi->fd, drmdi->bo_width, drmdi->bo_height,
110 32, 32, drmdi->bo_stride, drmdi->bo_handle, &drmdi->fb_id)) {
111 LOGD("[create_framebuffer] Cannot add drm fb\n");
118 /*-----------------------------------------------------------------------------
120 ----------------------------------------------------------------------------*/
121 static int set_drm_mode(st_drmdi *drmdi)
123 if(drmModeSetCrtc(drmdi->fd
124 , drmdi->crtc->crtc_id
127 , &drmdi->connector->connector_id, 1
128 , drmdi->connector->modes)) {
129 LOGD("[set_drm_mode] Cannot set drm mode\n");
136 /*-----------------------------------------------------------------------------
138 ----------------------------------------------------------------------------*/
139 static void free_drm_res(st_drmdi *drmdi)
142 drmModeFreeConnector(drmdi->connector);
145 drmModeFreeEncoder(drmdi->encoder);
148 drmModeFreeCrtc(drmdi->crtc);
151 drmModeFreeResources(drmdi->res_mode);
154 drmModeRmFB(drmdi->fd, drmdi->fb_id);
157 kms_bo_destroy(&drmdi->bo);
160 kms_destroy(&drmdi->kms);
165 /*-----------------------------------------------------------------------------
167 ----------------------------------------------------------------------------*/
168 int drmd_open(st_drmdi *drmdi)
176 LOGD("[drmd_open] drmdi is NULL\n");
180 memset(drmdi, 0x00, sizeof(st_drmdi));
182 drmdi->fd = drmOpen(chg_env_str[EN_ENV_DEV_DRM_NAME], NULL);
184 LOGD("[drmd_open] Cannot open drm:%s\n",
185 chg_env_str[EN_ENV_DEV_DRM_NAME]);
189 drmdi->driver_name = drmGetDeviceNameFromFd(drmdi->fd);
190 LOGD("[drmd_open] Init DRM(name:%s, fd:%d)...OK\n",
191 drmdi->driver_name, drmdi->fd);
194 if(drmGetMagic(drmdi->fd, &magic)) {
195 LOGD("[drmd_open] Cannot get magic\n");
199 if(drmAuthMagic(drmdi->fd, magic)) {
200 LOGD("[drmd_open] Cannot auth magic\n");
205 if(kms_create(drmdi->fd, &drmdi->kms)) {
206 LOGD("[drmd_open] Cannot create kms\n");
210 /* Get drmmode resource */
211 drmdi->res_mode = drmModeGetResources(drmdi->fd);
212 if(!drmdi->res_mode) {
213 LOGD("[drmd_open] Cannot get drmmode resources\n");
217 ret = find_connector(drmdi, DRM_MODE_CONNECTOR_LVDS);
219 LOGD("[drmd_open] Cannot get default(LVDS) connector\n");
223 /* Create framebuffer */
224 ret = create_framebuffer(drmdi);
226 LOGD("[drmd_open] Cannot create frame buffer\n");
230 if (kms_bo_map(drmdi->bo, &ptr)) {
231 LOGD("[drmd_open] kms_bo_map() failed. \n");
235 drmdi->dpms_mode = DPMSModeOn;
236 memset(ptr, 0x00, drmdi->bo_stride * drmdi->bo_height);
239 ret = set_drm_mode(drmdi);
241 LOGD("[drmd_open] Cannot set drm mode\n");
252 /*-----------------------------------------------------------------------------
254 ----------------------------------------------------------------------------*/
255 void drmd_close(st_drmdi *drmdi)
257 kms_bo_unmap(drmdi->bo);
261 /*-----------------------------------------------------------------------------
263 ----------------------------------------------------------------------------*/
264 static int drmd_set_dpms_mode(st_drmdi *drmdi, int dpms_mode)
267 drmModeConnectorPtr connector;
270 LOGD("[drmd_set_dpms_mode] drmdi is NULL\n");
274 connector = drmdi->connector;
276 if (dpms_mode == DPMSModeStandby || dpms_mode == DPMSModeSuspend) {
277 LOGD("[drmd_set_dpms_mode] dmps_mode %s is not supported.\n",
278 (dpms_mode == DPMSModeStandby)?
279 "DPMSModeStandby":"DPMSModeSuspend");
283 for (i = 0; i < connector->count_props; i++) {
284 drmModePropertyPtr props;
285 props = drmModeGetProperty (drmdi->fd, connector->props[i]);
289 if (!strcmp(props->name, "DPMS")) {
290 int _tmp_dpms = dpms_mode;
293 if (drmdi->dpms_mode == DPMSModeOn) {
294 drmModeFreeProperty (props);
299 _tmp_dpms = DPMSModeOn;
300 drmdi->dpms_mode = DPMSModeOn;
304 if (drmdi->dpms_mode == DPMSModeOff) {
305 drmModeFreeProperty(props);
310 _tmp_dpms = DPMSModeOff;
311 drmdi->dpms_mode = DPMSModeOff;
317 drmModeConnectorSetProperty(drmdi->fd,
318 connector->connector_id,
322 drmModeFreeProperty(props);
326 drmModeFreeProperty(props);
332 /*-----------------------------------------------------------------------------
334 ----------------------------------------------------------------------------*/
335 int drmd_lcd_on(st_drmdi *drmdi)
339 ret = drmd_set_dpms_mode(drmdi, DPMSModeOn);
341 LOGD("[drmd_lcd_on] drmd_set_dpms_mode() fail.\n");
348 /*-----------------------------------------------------------------------------
350 ----------------------------------------------------------------------------*/
351 int drmd_lcd_off(st_drmdi *drmdi)
355 ret = drmd_set_dpms_mode(drmdi, DPMSModeOff);
357 LOGD("[drmd_lcd_off] drmd_set_dpms_mode() fail.\n");