'hdmi can switch resolution automatically' and 'modify gpio_key(vol+ vol-) report...
authorkfx <kfx@rock-chips.com>
Wed, 29 Dec 2010 04:33:30 +0000 (12:33 +0800)
committerkfx <kfx@rock-chips.com>
Wed, 29 Dec 2010 04:33:30 +0000 (12:33 +0800)
arch/arm/mach-rk29/board-rk29sdk-key.c
drivers/video/hdmi/chips/anx7150.c
drivers/video/hdmi/chips/anx7150.h
drivers/video/hdmi/chips/anx7150_hw.c
drivers/video/hdmi/chips/anx7150_hw.h
drivers/video/hdmi/hdmi-core.c
drivers/video/hdmi/hdmi-fb.c [changed mode: 0644->0755]
drivers/video/rk29_fb.c
include/linux/hdmi.h

index d00596d40504cc7f06b0f6c2e9c2ee59c17acfd1..8626e8d9d9bdc31e3761041ca4d0b864eeac284f 100755 (executable)
@@ -16,13 +16,13 @@ static struct rk29_keys_button key_button[] = {
        },
        {
                .desc   = "vol+",
-               .code   = KEY_VOLUMEDOWN,
+               .code   = KEY_VOLUMEUP,
                .gpio   = RK29_PIN6_PA1,
                .active_low = PRESS_LEV_LOW,
        },
        {
                .desc   = "vol-",
-               .code   = KEY_VOLUMEUP,
+               .code   = KEY_VOLUMEDOWN,
                .gpio   = RK29_PIN6_PA2,
                .active_low = PRESS_LEV_LOW,
        },
index 2c412bfbe13e62ea7f81a00fb81b3095eb9e0ea2..4e8212e00329030e45864ce7c9fb55ab1053d2bb 100755 (executable)
@@ -35,10 +35,9 @@ int anx7150_i2c_write_p1_reg(struct i2c_client *client, char reg, char *val)
 static int rk29_hdmi_enter(struct anx7150_dev_s *dev)\r
 {\r
        if(dev->rk29_output_status == RK29_OUTPUT_STATUS_LCD) {\r
-               printk("%s, resolution = %d\n", __func__, dev->resolution_set);\r
-               if(hdmi_switch_fb(dev->resolution_set, 1) < 0)\r
-                       return -1;\r
                dev->hdmi->resolution = dev->resolution_set;\r
+               if(hdmi_switch_fb(dev->hdmi, 1) < 0)\r
+                       return -1;\r
                dev->rk29_output_status = RK29_OUTPUT_STATUS_HDMI;\r
        }\r
        return 0;\r
@@ -46,8 +45,8 @@ static int rk29_hdmi_enter(struct anx7150_dev_s *dev)
 static int rk29_hdmi_exit(struct anx7150_dev_s *dev)\r
 {\r
        if(dev->rk29_output_status == RK29_OUTPUT_STATUS_HDMI) {\r
-               printk("%s\n", __func__);\r
-               if(hdmi_switch_fb(dev->resolution_set, 0) < 0)\r
+               dev->hdmi->resolution = dev->resolution_set;\r
+               if(hdmi_switch_fb(dev->hdmi, 0) < 0)\r
                        return -1;\r
                dev->rk29_output_status = RK29_OUTPUT_STATUS_LCD;\r
        }\r
@@ -142,6 +141,7 @@ void anx7150_task(struct anx7150_pdata *anx)
                        rk29_hdmi_exit(&anx->dev);\r
                if(anx->dev.HPD_status){\r
                        anx7150_plug(anx->client);\r
+                       hdmi_changed(anx->dev.hdmi, 1);\r
                        state = READ_PARSE_EDID;\r
                }\r
                if(anx->dev.hdmi_auto_switch)\r
@@ -344,13 +344,14 @@ static int anx7150_i2c_probe(struct i2c_client *client,const struct i2c_device_i
        anx->dev.HPD_change_cnt = 0;\r
        anx->dev.rk29_output_status = RK29_OUTPUT_STATUS_LCD;\r
        anx->dev.hdcp_enable = ANX7150_HDCP_EN;\r
+       anx->dev.rate = 100;\r
 \r
        anx->init = 1;\r
 \r
        anx->dev.workqueue = create_singlethread_workqueue("ANX7150_WORKQUEUE");\r
        INIT_DELAYED_WORK(&anx->dev.delay_work, anx7150_work_func);\r
        \r
-       hdmi->display_on = 0;\r
+       hdmi->display_on = anx->dev.hdmi_enable;\r
        hdmi->auto_switch = anx->dev.hdmi_auto_switch;\r
        hdmi->hdcp_on = anx->dev.hdcp_enable;\r
        hdmi->audio_fs = anx->dev.i2s_Fs;\r
index 868eb9ae953351dfc2e64aab2552e0f2846e8f43..1122861d799e0ab09b14abfd2d51ce21aed63d01 100755 (executable)
 /* HDMI HDCP ENABLE */\r
 #define ANX7150_HDCP_EN  HDMI_DISABLE\r
 \r
-/* HDMI default resolution */\r
-#define HDMI_DEFAULT_RESOLUTION HDMI_1280x720p_50Hz\r
-/* I2S Fs */\r
-#define HDMI_I2S_Fs_44100 0\r
-#define HDMI_I2S_Fs_48000 2\r
-\r
-/* I2S default sample rate */\r
-#define HDMI_I2S_DEFAULT_Fs HDMI_I2S_Fs_44100\r
-\r
 /* ANX7150 state machine */\r
 enum{\r
        HDMI_INITIAL = 1,\r
index f2bafff90617c181e2c577989c5418b515faba7a..811e607a8f41e2fcdccc76d94c648a9610b4166c 100755 (executable)
@@ -191,7 +191,7 @@ void ANX7150_Set_System_State(struct i2c_client *client, u8 new_state)
                        hdmi_dbg(&client->dev, "SYSTEM_CONFIG\n");\r
                        break;\r
         case CONFIG_VIDEO:\r
-            hdmi_dbg(&client->dev, "CONFIG_VIDEO\n");\r
+            dev_info(&client->dev, "CONFIG_VIDEO\n");\r
             break;\r
         case CONFIG_AUDIO:\r
             hdmi_dbg(&client->dev, "CONFIG_AUDIO\n");\r
@@ -209,7 +209,7 @@ void ANX7150_Set_System_State(struct i2c_client *client, u8 new_state)
             break;\r
             ////////////////////////////////////////////////\r
         case PLAY_BACK:\r
-            hdmi_dbg(&client->dev, "PLAY_BACK\n");\r
+            dev_info(&client->dev, "PLAY_BACK\n");\r
             break;\r
                default:\r
                        hdmi_dbg(&client->dev, "unknown state\n");\r
@@ -498,7 +498,7 @@ int anx7150_unplug(struct i2c_client *client)
 {\r
        int rc = 0;\r
        char c;\r
-       hdmi_dbg(&client->dev, "anx7150 unplug\n");\r
+       dev_info(&client->dev, "anx7150 unplug\n");\r
        \r
     //wen HDCP CTS\r
     ANX7150_Variable_Initial();   //simon\r
@@ -528,7 +528,7 @@ int anx7150_plug(struct i2c_client *client)
        int rc = 0;\r
        char c;\r
 \r
-       hdmi_dbg(&client->dev, "anx7150 plug\n");\r
+       dev_info(&client->dev, "anx7150 plug\n");\r
 \r
        rc = anx7150_i2c_read_p0_reg(client, ANX7150_SYS_CTRL3_REG, &c);\r
        c |= (0x01);\r
@@ -1051,7 +1051,7 @@ int ANX7150_Interrupt_Process(struct anx7150_pdata *anx, int cur_state)
                anx->dev.HPD_change_cnt = 0;\r
        }\r
 \r
-       if(anx->dev.HPD_change_cnt > 2){\r
+       if(anx->dev.HPD_change_cnt > 1){\r
                hdmi_dbg(&anx->client->dev, "hotplug_change\n");\r
 \r
                if(hot_plug == HDMI_RECIVER_UNPLUG){\r
@@ -2401,6 +2401,10 @@ static int anx7150_embed_sync_decode(struct i2c_client *client)
        rc = anx7150_i2c_write_p0_reg(client, ANX7150_HSYNC_ACT_WIDTHH_REG, &c);\r
        return rc;\r
 }\r
+int ANX7150_Blue_Screen(struct anx7150_pdata *anx)\r
+{\r
+       return anx7150_blue_screen_format_config(anx->client);\r
+}\r
 //******************************Video Config***************************************\r
 int ANX7150_Config_Video(struct i2c_client *client)\r
 {\r
@@ -2787,8 +2791,8 @@ int ANX7150_Config_Video(struct i2c_client *client)
     rc = anx7150_i2c_read_p0_reg(client, ANX7150_VID_CTRL_REG, &c);\r
        c |= (ANX7150_VID_CTRL_IN_EN);\r
        rc = anx7150_i2c_write_p0_reg(client, ANX7150_VID_CTRL_REG, &c);\r
-       msleep(200);\r
     //D("Video configure OK!\n");\r
+    msleep(60);\r
        rc = anx7150_i2c_read_p0_reg(client, ANX7150_VID_STATUS_REG, &c);\r
     if (!(c & ANX7150_VID_STATUS_VID_STABLE))\r
     {\r
@@ -2836,8 +2840,8 @@ int ANX7150_Config_Video(struct i2c_client *client)
        rc = anx7150_i2c_read_p0_reg(client, ANX7150_TMDS_CLKCH_CONFIG_REG, &c);\r
        c |= (ANX7150_TMDS_CLKCH_MUTE);\r
        rc = anx7150_i2c_write_p0_reg(client, ANX7150_TMDS_CLKCH_CONFIG_REG, &c);\r
-\r
-    msleep(400);  //400ms only for HDCP CTS\r
+       if(ANX7150_HDCP_enable)\r
+       msleep(400);  //400ms only for HDCP CTS\r
 \r
     //ANX7150_i2c_read_p0_reg(ANX7150_VID_MODE_REG, &c);  //zy 061110\r
     return 0;\r
index 5c628f34b9b60389daa271ff99d749d2f192afba..5166e577ec02c99df2b58f39e9fb642745e9c7c7 100755 (executable)
@@ -1260,6 +1260,7 @@ int ANX7150_GET_RECIVER_TYPE(void);
 void  HDMI_Set_Video_Format(u8 video_format);\r
 void  HDMI_Set_Audio_Fs( u8 audio_fs);\r
 int ANX7150_PLAYBACK_Process(void);\r
+int ANX7150_Blue_Screen(struct anx7150_pdata *anx);\r
 \r
 \r
 #endif\r
index 59d17e4fab89273e9f2f480313fc45245c6a9007..5375f6c209162843cac8280b074361fd9f1bcbfd 100755 (executable)
@@ -133,6 +133,7 @@ static void __exit hdmi_class_exit(void)
 EXPORT_SYMBOL(hdmi_changed);\r
 EXPORT_SYMBOL(hdmi_register);\r
 EXPORT_SYMBOL(hdmi_unregister);\r
+EXPORT_SYMBOL(get_hdmi_struct);\r
 \r
 subsys_initcall(hdmi_class_init);\r
 module_exit(hdmi_class_exit);\r
old mode 100644 (file)
new mode 100755 (executable)
index 1eb2e30..66aee74
@@ -1,6 +1,7 @@
 #include <linux/console.h>
 #include <linux/fb.h>
 #include <linux/hdmi.h>
+#include <linux/completion.h>
 
 #include "../display/screen/screen.h"
 #include "../rk29_fb.h"
@@ -222,14 +223,14 @@ static void hdmi_set_info(struct rk29fb_screen *screen)
        screen4->standby = anx7150_standby;
 }
 
-int hdmi_switch_fb(int resolution, int type)
+int hdmi_switch_fb(struct hdmi *hdmi, int type)
 {
        int rc = 0;
        struct rk29fb_screen hdmi_info[4];
 
        hdmi_set_info(&hdmi_info[0]);
 
-       switch(resolution)
+       switch(hdmi->resolution)
        {
                case HDMI_1280x720p_50Hz:
                        rc = FB_Switch_Screen(&hdmi_info[1], type);
@@ -247,23 +248,37 @@ int hdmi_switch_fb(int resolution, int type)
                        rc = FB_Switch_Screen(&hdmi_info[1], type);
                        break;          
        }
+       if(hdmi->wait == 1) {
+               complete(&hdmi->complete);
+               hdmi->wait = 0;
+       }
        return rc;
 }
-int hdmi_resolution_changed(struct hdmi *hdmi, int xres, int yres)
+int hdmi_resolution_changed(struct hdmi *hdmi, int xres, int yres, int video_on)
 {
-       if(xres > 1280 && hdmi->resolution != HDMI_1920x1080p_50Hz) {
+       int ret = 0;
+       if(hdmi->display_on == 0|| hdmi->plug == 0)
+               return ret;
+       if(xres > 1280 && hdmi->resolution != HDMI_1920x1080p_50Hz) 
+       {
                hdmi->resolution = HDMI_1920x1080p_50Hz;
                hdmi->display_on = 1;
                hdmi->hdmi_set_param(hdmi);
+               ret = 1;
        }
-       else if(xres >1024 && hdmi->resolution != HDMI_1280x720p_50Hz){
+       
+
+       else if(xres >1024 && xres <= 1280 && hdmi->resolution != HDMI_1280x720p_50Hz){
                hdmi->resolution = HDMI_1280x720p_50Hz;
                hdmi->display_on = 1;
                hdmi->hdmi_set_param(hdmi);
+               ret = 1;
        }
+       /*
        else {
                if(hdmi->display_on == 1)
                        hdmi->hdmi_display_off(hdmi);
-       }
-       return 0;
+       }*/
+       return ret;
 }
+EXPORT_SYMBOL(hdmi_resolution_changed);
\ No newline at end of file
index 9a50d54916e72fea8fdfef86a4d12c808e41971b..473ea33ec578c447b5f7a05b20e25dfe95ad5b03 100755 (executable)
 #ifdef CONFIG_PM
 #include <linux/pm.h>
 #endif
+#ifdef CONFIG_HDMI
+#include <linux/completion.h>
+
+#include <linux/hdmi.h>
+#endif
 
 #include <mach/iomux.h>
 #include <mach/gpio.h>
@@ -1320,7 +1325,9 @@ static int fb1_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
     u16 xlcd = screen->x_res;        //size of panel
     u16 ylcd = screen->y_res;
     u16 yres = 0;
-
+#ifdef CONFIG_HDMI
+       struct hdmi *hdmi = get_hdmi_struct(0);
+#endif
     xpos = (xpos * screen->x_res) / inf->panel1_info.x_res;
     ypos = (ypos * screen->y_res) / inf->panel1_info.y_res;
     xsize = (xsize * screen->x_res) / inf->panel1_info.x_res;
@@ -1411,7 +1418,19 @@ static int fb1_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
     {
         return -EINVAL;        // multiple of scale down or scale up can't exceed 8
     }
-
+#ifdef CONFIG_HDMI
+       if(inf->video_mode == 1) {
+               if(hdmi_resolution_changed(hdmi,var->xres,var->yres, 1) == 1)
+               {
+                       LcdMskReg(inf, DSP_CTRL1, m_BLACK_MODE,  v_BLACK_MODE(1));
+               LcdWrReg(inf, REG_CFG_DONE, 0x01);
+                       init_completion(&hdmi->complete);
+                       hdmi->wait = 1;
+                       wait_for_completion_interruptible_timeout(&hdmi->complete,
+                                                               msecs_to_jiffies(10000));
+               }
+       }
+#endif
     return 0;
 }
 
index bf5194fb9740bb4ebe383ced1cccf54019713318..3813b74e8fae3825d45f3ece77093aa0a8398a54 100755 (executable)
@@ -12,6 +12,9 @@
 #include <linux/device.h>\r
 #include <linux/workqueue.h>\r
 #include <linux/i2c.h>\r
+#include <linux/completion.h>\r
+\r
+\r
 \r
 #ifdef CONFIG_HDMI_DEBUG\r
 #define hdmi_dbg(dev, format, arg...)          \\r
@@ -26,11 +29,18 @@ typedef int                 BOOL;
 \r
 #define TRUE           1\r
 #define FALSE          0\r
-\r
+/* resolution */\r
 #define HDMI_1280x720p_50Hz    0\r
 #define HDMI_1280x720p_60Hz            1\r
 #define HDMI_720x576p_50Hz             2\r
 #define HDMI_1920x1080p_50Hz   3\r
+/* HDMI default resolution */\r
+#define HDMI_DEFAULT_RESOLUTION HDMI_1280x720p_50Hz\r
+/* I2S Fs */\r
+#define HDMI_I2S_Fs_44100 0\r
+#define HDMI_I2S_Fs_48000 2\r
+/* I2S default sample rate */\r
+#define HDMI_I2S_DEFAULT_Fs HDMI_I2S_Fs_44100\r
 \r
 \r
 #define HDMI_MAX_ID            32\r
@@ -40,6 +50,7 @@ struct hdmi {
        struct device *dev;\r
        struct work_struct changed_work;\r
        int id;\r
+       int wait;\r
        BOOL display_on;\r
        BOOL plug;\r
        BOOL auto_switch;\r
@@ -51,6 +62,8 @@ struct hdmi {
 \r
        void *priv;\r
 \r
+       struct completion       complete;\r
+\r
        int (*hdmi_display_on)(struct hdmi *);\r
        int (*hdmi_display_off)(struct hdmi *);\r
        int (*hdmi_set_param)(struct hdmi *);\r
@@ -66,8 +79,8 @@ extern void hdmi_changed(struct hdmi *hdmi, int plug);
 extern int hdmi_codec_set_audio_fs(unsigned char audio_fs);\r
 extern int hdmi_fb_set_resolution(unsigned char resolution);\r
 \r
-extern int hdmi_switch_fb(int resolution, int type);\r
-extern int hdmi_resolution_changed(struct hdmi *hdmi, int xres, int yres);\r
+extern int hdmi_switch_fb(struct hdmi *hdmi, int type);\r
+extern int hdmi_resolution_changed(struct hdmi *hdmi, int xres, int yres, int video_on);\r
 \r
 extern struct hdmi *get_hdmi_struct(int nr);\r
 \r