/* // Copyright (c) 2014 Intel Corporation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. */ #ifndef __DRM_H__ #define __DRM_H__ #include <utils/Mutex.h> #include <linux/psb_drm.h> extern "C" { #include "xf86drm.h" #include "xf86drmMode.h" } namespace android { namespace intel { enum { PANEL_ORIENTATION_0 = 0, PANEL_ORIENTATION_180 }; #ifdef INTEL_SUPPORT_HDMI_PRIMARY enum { DEFAULT_DRM_FB_WIDTH = 1920, DEFAULT_DRM_FB_HEIGHT = 1080, }; #endif class Drm { public: Drm(); virtual ~Drm(); public: bool initialize(); void deinitialize(); bool detect(int device); bool setDrmMode(int device, drmModeModeInfo& value); bool setRefreshRate(int device, int hz); bool writeReadIoctl(unsigned long cmd, void *data, unsigned long size); bool writeIoctl(unsigned long cmd, void *data, unsigned long size); bool readIoctl(unsigned long cmd, void *data, unsigned long size); bool isConnected(int device); bool setDpmsMode(int device, int mode); int getDrmFd() const; bool getModeInfo(int device, drmModeModeInfo& mode); bool getPhysicalSize(int device, uint32_t& width, uint32_t& height); bool getDisplayResolution(int device, uint32_t& width, uint32_t& height); bool isSameDrmMode(drmModeModeInfoPtr mode, drmModeModeInfoPtr base) const; int getPanelOrientation(int device); drmModeModeInfoPtr detectAllConfigs(int device, int *modeCount); private: bool initDrmMode(int index); bool setDrmMode(int index, drmModeModeInfoPtr mode); void resetOutput(int index); // map device type to output index, return -1 if not mapped inline int getOutputIndex(int device); private: // DRM object index enum { OUTPUT_PRIMARY = 0, OUTPUT_EXTERNAL, OUTPUT_MAX, }; struct DrmOutput { drmModeConnectorPtr connector; drmModeEncoderPtr encoder; drmModeCrtcPtr crtc; drmModeModeInfo mode; uint32_t fbHandle; uint32_t fbId; int connected; int panelOrientation; } mOutputs[OUTPUT_MAX]; int mDrmFd; Mutex mLock; bool mInitialized; }; } // namespace intel } // namespace android #endif /* __DRM_H__ */