Home | History | Annotate | Download | only in libhdmi
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved.
      4  *
      5  * Not a Contribution, Apache license notifications and license are
      6  * retained for attribution purposes only.
      7 
      8  * Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *      http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  */
     20 
     21 #ifndef HWC_HDMI_DISPLAY_H
     22 #define HWC_HDMI_DISPLAY_H
     23 
     24 #include <linux/fb.h>
     25 
     26 struct msm_hdmi_mode_timing_info;
     27 
     28 namespace qhwc {
     29 
     30 //Type of scanning of EDID(Video Capability Data Block)
     31 enum hdmi_scansupport_type {
     32     HDMI_SCAN_NOT_SUPPORTED      = 0,
     33     HDMI_SCAN_ALWAYS_OVERSCANED  = 1,
     34     HDMI_SCAN_ALWAYS_UNDERSCANED = 2,
     35     HDMI_SCAN_BOTH_SUPPORTED     = 3
     36 };
     37 
     38 // Structure to store EDID related data
     39 struct EDIDData {
     40     int mMode, mWidth, mHeight, mFps;
     41     // Predetermined ordering for each mode
     42     int mModeOrder;
     43     EDIDData(int mode, int width, int height, int fps, int order)
     44     : mMode(mode), mWidth(width), mHeight(height), mFps(fps), mModeOrder(order)
     45     { }
     46 };
     47 
     48 class HDMIDisplay
     49 {
     50 public:
     51     HDMIDisplay();
     52     ~HDMIDisplay();
     53     void setHPD(uint32_t startEnd);
     54     void setActionSafeDimension(int w, int h);
     55     bool isCEUnderscanSupported() { return mUnderscanSupported; }
     56     int configure();
     57     void getAttributes(uint32_t& width, uint32_t& height);
     58     int teardown();
     59     uint32_t getWidth() const { return mXres; };
     60     uint32_t getHeight() const { return mYres; };
     61     uint32_t getVsyncPeriod() const { return mVsyncPeriod; };
     62     int getFd() const { return mFd; };
     63     bool getMDPScalingMode() const { return mMDPScalingMode; }
     64     void activateDisplay();
     65     /* Returns true if HDMI is the PRIMARY display device*/
     66     bool isHDMIPrimaryDisplay();
     67     int getConnectedState();
     68     /* when HDMI is an EXTERNAL display, PRIMARY display attributes are needed
     69        for scaling mode */
     70     void setPrimaryAttributes(uint32_t primaryWidth, uint32_t primaryHeight);
     71     int getActiveConfig() const { return mActiveConfig; };
     72     int setActiveConfig(int newConfig);
     73     int getAttrForConfig(int config, uint32_t& xres,
     74             uint32_t& yres, uint32_t& refresh) const;
     75     int getDisplayConfigs(uint32_t* configs, size_t* numConfigs) const;
     76 
     77 private:
     78     int getModeCount() const;
     79     void setSPDInfo(const char* node, const char* property);
     80     void readCEUnderscanInfo();
     81     bool readResolution();
     82     int  parseResolution(char* edidMode);
     83     bool openFrameBuffer();
     84     bool closeFrameBuffer();
     85     bool writeHPDOption(int userOption) const;
     86     bool isValidMode(int mode);
     87     int  getModeOrder(int mode);
     88     int  getUserConfig();
     89     int  getBestConfig();
     90     bool isInterlacedMode(int mode);
     91     void resetInfo();
     92     void setAttributes();
     93     void getAttrForMode(uint32_t& width, uint32_t& height, uint32_t& fps);
     94     int openDeviceNode(const char* node, int fileMode) const;
     95     int getModeIndex(int mode);
     96     bool isValidConfigChange(int newConfig);
     97 
     98     int mFd;
     99     int mFbNum;
    100     // mCurrentMode is the HDMI video format that corresponds to the mEDIDMode
    101     // entry referenced by mActiveConfig
    102     int mCurrentMode;
    103     // mActiveConfig is the index correponding to the currently active mode for
    104     // the HDMI display. It basically indexes the mEDIDMode array
    105     int mActiveConfig;
    106     // mEDIDModes contains a list of HDMI video formats (modes) supported by the
    107     // HDMI display
    108     int mEDIDModes[64];
    109     int mModeCount;
    110     fb_var_screeninfo mVInfo;
    111     // Holds all the HDMI modes and timing info supported by driver
    112     msm_hdmi_mode_timing_info* supported_video_mode_lut;
    113     uint32_t mXres, mYres, mVsyncPeriod, mPrimaryWidth, mPrimaryHeight;
    114     bool mMDPScalingMode;
    115     bool mUnderscanSupported;
    116     // Downscale feature switch, set via system property
    117     // sys.hwc.mdp_downscale_enabled
    118     bool mMDPDownscaleEnabled;
    119     bool mEnableResolutionChange;
    120     int mDisplayId;
    121 };
    122 
    123 }; //qhwc
    124 // ---------------------------------------------------------------------------
    125 #endif //HWC_HDMI_DISPLAY_H
    126