]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/pdk.git/blobdiff - packages/ti/drv/dss/examples/dss_display_test/dss_display_dsi_cfg.c
[DSS][PDK-12083]: Support 720p and 1080p resolutions for DSI using DSI to DP bridge.
[processor-sdk/pdk.git] / packages / ti / drv / dss / examples / dss_display_test / dss_display_dsi_cfg.c
index c7e2f83562f1e57a204e8036ee8ce7e752783254..50c7736395102ef907ba69d65cf8f401f1d9373c 100755 (executable)
@@ -67,6 +67,8 @@
 /* ========================================================================== */
 
 #define DISP_APP_I2C_TIMEOUT 1000U
+#define DSS_BRIDGE_720P      0U
+#define DSS_BRIDGE_1080P     1U
 
 /* ========================================================================== */
 /*                         Structure Declarations                             */
@@ -80,7 +82,6 @@
 
 extern void App_wait(uint32_t wait_in_ms);
 int32_t DispApp_SetBoardMux();
-int32_t DispApp_InitI2c(DispApp_Obj *appObj);
 
 
 /* ========================================================================== */
@@ -89,39 +90,38 @@ int32_t DispApp_InitI2c(DispApp_Obj *appObj);
 
 I2C_Handle gI2cHandle = NULL;
 
-/* Bridge configuration array for 800x600 resolution.
- * Tupples represent {Address, Value}.
- */
+/* SN65DSI bridge configurations. Default is for 720p. */
 uint8_t gI2cDsiBridgeCfg[][2] = {
-    {0xFF, 0x7},
-    {0x16, 0x1},
-    {0xFF, 0x0},
-    {0x0A, 0x2},
-    {0x10, 0x36},
-    {0x12, 0x2B},
-    {0x13, 0x2B},
-    {0x94, 0x20},
-    {0x0D, 0x1},
-    {0x5A, 0x4},
-    {0x93, 0x10},
-    {0x96, 0x0A},
-    {0x20, 0x20},
-    {0x21, 0x03},
-    {0x22, 0x0},
-    {0x23, 0x0},
-    {0x24, 0x58},
-    {0x25, 0x02},
-    {0x2C, 0x48},
-    {0x2D, 0x00},
-    {0x30, 0x02},
-    {0x31, 0x00},
-    {0x34, 0x80},
-    {0x36, 0x16},
-    {0x38, 0x18},
-    {0x3A, 0x01},
-    {0x5B, 0x0},
-    {0x3C, 0x02},
-    {0x5A, 0x0C},
+{0xFF, 0x7},
+{0x16, 0x1},
+{0xFF, 0x0},
+{0x0A, 0x2},
+{0x10, 0x36},
+{0x12, 0x4C},
+{0x13, 0x4C},
+{0x94, 0x80},
+{0x0D, 0x1},
+{0x5A, 0x4},
+{0x5F, 0x28},
+{0x93, 0x10},
+{0x96, 0x0A},
+{0x20, 0x00},
+{0x21, 0x05},
+{0x22, 0x0},
+{0x23, 0x0},
+{0x24, 0xD0},
+{0x25, 0x02},
+{0x2C, 0x20},
+{0x2D, 0x00},
+{0x30, 0x05},
+{0x31, 0x00},
+{0x34, 0x50},
+{0x36, 0x0C},
+{0x38, 0x30},
+{0x3A, 0x04},
+{0x5B, 0x0},
+{0x3C, 0x00},
+{0x5A, 0x0C},
 };
 
 /* ========================================================================== */
@@ -239,27 +239,116 @@ void DispApp_ErrorRegRead(void)
 {
     int i=0;
     uint8_t readVal;
-    I2C_Params i2cParams;
-    I2C_Handle i2cHandle = NULL;
-    I2C_init();
-    I2C_Params_init(&i2cParams);
-    i2cHandle = I2C_open(4, &i2cParams);
 
-    /* Bridge status registers range from address 0xF0 to 0xFF. */
-    printf("\n-----------STARTING REGISTER DUMP-----------\n");
-    for(i = 0xF0; i < 0xFF; i++)
+    for(i = 0xF0; i < 0xF8; i++)
     {
-        Board_i2c8BitRegRd(i2cHandle,
-        0x2c,
-        i & 0xFF,
-        &readVal,
-        1,
-        DISP_APP_I2C_TIMEOUT);
-        printf("Data at 0x%x is 0x%x...\n", i, readVal);
+        Board_i2c8BitRegRd(gI2cHandle,
+                           0x2c,
+                           i & 0xFF,
+                           &readVal,
+                           1,
+                           DISP_APP_I2C_TIMEOUT);
+        if (readVal != 0)
+        {
+            printf("Status at 0x%x in the SN65DSI bridge is 0x%x...\n", i, readVal);
+        }
     }
 }
 
-int32_t DispApp_InitI2c(DispApp_Obj *appObj)
+void DisapApp_prepareI2cConfig(uint32_t resolution)
+{
+    int32_t i = 0;
+    for(i=0; i<sizeof(gI2cDsiBridgeCfg)/sizeof(gI2cDsiBridgeCfg[0]); i++)
+    {
+        if (gI2cDsiBridgeCfg[i][0] == 0x10)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x26;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x12)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x4f;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x93)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x20;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x20)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x80;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x21)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x07;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x24)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x38;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x25)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x4;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x30)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x08;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x34)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x28;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x36)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x06;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x38)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x08;
+            }
+        }
+        else if (gI2cDsiBridgeCfg[i][0] == 0x3a)
+        {
+            if (resolution == DSS_BRIDGE_1080P)
+            {
+                gI2cDsiBridgeCfg[i][1] = 0x10;
+            }
+        }
+
+    }
+}
+
+int32_t DispApp_InitI2c()
 {
     int32_t status = FVID2_SOK;
 
@@ -296,7 +385,6 @@ int32_t DispApp_InitI2c(DispApp_Obj *appObj)
 #elif defined (SOC_J721S2) || defined(SOC_J784S4)
     uint32_t i=0;
     I2C_Params i2cParams;
-    I2C_Handle i2cHandle = NULL;
 
     /* Enable the DSI to eDP bridge. */
     Board_control(BOARD_CTRL_CMD_ENABLE_DSI2DP_BRIDGE, NULL);
@@ -306,94 +394,20 @@ int32_t DispApp_InitI2c(DispApp_Obj *appObj)
     /* Do the i2c driver init */
     I2C_init();
 
-    /* Initializes the I2C Parameters */
+    /* Initializes the I2C Parameters for instance 4*/
     I2C_Params_init(&i2cParams);
-    i2cHandle = I2C_open(4, &i2cParams);
-    if(i2cHandle == NULL)
+    gI2cHandle = I2C_open(4, &i2cParams);
+    if(gI2cHandle == NULL)
     {
         printf("\nI2C Open failed!\n");
-        return -1;
-    }
-
-    uint8_t readVal;
-    for(i=0; i<sizeof(gI2cDsiBridgeCfg)/sizeof(gI2cDsiBridgeCfg[0]); i++)
-    {
-        /* Read the value at bridge address. */
-        Board_i2c8BitRegRd(i2cHandle,
-                            0x2c,
-                            gI2cDsiBridgeCfg[i][0] & 0xFF,
-                            &readVal,
-                            1,
-                            DISP_APP_I2C_TIMEOUT);
-        Osal_delay(100);
-        printf("Before Write operation, data at 0x%x is 0x%x...\n",gI2cDsiBridgeCfg[i][0], readVal);
-        printf("Writing at 0x%x the value of 0x%x...\n", gI2cDsiBridgeCfg[i][0], gI2cDsiBridgeCfg[i][1]);
-
-        /* Write the required value at bridge address to configure the bridge.. */
-        Board_i2c8BitRegWr(i2cHandle,
-                            0x2c,
-                            gI2cDsiBridgeCfg[i][0] & 0xFF,
-                            &(gI2cDsiBridgeCfg[i][1]),
-                            1,
-                            DISP_APP_I2C_TIMEOUT);
-        Osal_delay(100);
-
-        /* Read back the value after writing at bridge address. */
-        Board_i2c8BitRegRd(i2cHandle,
-                            0x2c,
-                            gI2cDsiBridgeCfg[i][0] & 0xFF,
-                            &readVal,
-                            1,
-                            DISP_APP_I2C_TIMEOUT);
-        Osal_delay(100);
-        printf("After Write operation, data at 0x%x is 0x%x...\n\n",gI2cDsiBridgeCfg[i][0], readVal);
-
-        /* Wait untill the DP_PLL has been locked. */
-        if(gI2cDsiBridgeCfg[i][0] == 0x0d)
-        {
-            Board_i2c8BitRegRd(i2cHandle,
-                            0x2c,
-                            0x0a,
-                            &readVal,
-                            1,
-                            DISP_APP_I2C_TIMEOUT);
-            while( (readVal & 0x80) == 0x00){
-                Board_i2c8BitRegRd(i2cHandle,
-                            0x2c,
-                            0x0a,
-                            &readVal,
-                            1,
-                            DISP_APP_I2C_TIMEOUT);
-            }
-        }
-
-        /* Main link should not be off. So keep waiting as long as the main links are off. */
-        if(gI2cDsiBridgeCfg[i][0] == 0x96)
-        {
-            Board_i2c8BitRegRd(i2cHandle,
-                            0x2c,
-                            0x96,
-                            &readVal,
-                            1,
-                            DISP_APP_I2C_TIMEOUT);
-            while( (readVal) == 0x00){
-                Board_i2c8BitRegRd(i2cHandle,
-                            0x2c,
-                            0x96,
-                            &readVal,
-                            1,
-                            DISP_APP_I2C_TIMEOUT);
-            }
-        }
+        status = FVID2_EFAIL;
     }
-    
-    I2C_close(i2cHandle);
-    status = FVID2_SOK;
 #endif
+
     return (status);
 }
 
-int32_t DispApp_SetDsiSerdesCfg(DispApp_Obj *appObj)
+int32_t DispApp_cfgAdditionalDsiPeripherals()
 {
     int32_t status = FVID2_SOK;
 #if defined(SOC_J721E)
@@ -404,9 +418,9 @@ int32_t DispApp_SetDsiSerdesCfg(DispApp_Obj *appObj)
 
     if (FVID2_SOK == status)
     {
-        status = DispApp_InitI2c(appObj);
+        status = DispApp_InitI2c();
     }
-
+/* SerDes configuration is required only for J721E. */
 #if defined (SOC_J721E)
     if (FVID2_SOK == status)
     {
@@ -427,8 +441,58 @@ int32_t DispApp_SetDsiSerdesCfg(DispApp_Obj *appObj)
             }
         }
     }
+#elif defined (SOC_J721S2) || defined (SOC_J784S4)
+    uint8_t readVal, wrVal=0xFF, i;
+    for(i = 0xF0; i < 0xF9; i++)
+    {
+        Board_i2c8BitRegWr(gI2cHandle,
+                            0x2c,
+                            i & 0xFF,
+                            &wrVal,
+                            1,
+                            DISP_APP_I2C_TIMEOUT);
+    }
+    DisapApp_prepareI2cConfig(DSS_BRIDGE_720P);
+    for(i=0; i<sizeof(gI2cDsiBridgeCfg)/sizeof(gI2cDsiBridgeCfg[0]); i++)
+    {
+        /* Read the value at bridge address. */
+        Board_i2c8BitRegWr(gI2cHandle,
+                            0x2c,
+                            gI2cDsiBridgeCfg[i][0] & 0xFF,
+                            &(gI2cDsiBridgeCfg[i][1]),
+                            1,
+                            DISP_APP_I2C_TIMEOUT);
+        Osal_delay(200);
+        /* Wait untill the DP_PLL has been locked. */
+        if(gI2cDsiBridgeCfg[i][0] == 0x0d)
+        {
+            do {
+                Board_i2c8BitRegRd(gI2cHandle,
+                            0x2c,
+                            0x0a,
+                            &readVal,
+                            1,
+                            DISP_APP_I2C_TIMEOUT);
+            } while( (readVal & 0x80) == 0x00);
+        }
 
-    I2C_close(gI2cHandle);
+        /* Main link should not be off. So keep waiting as long as the main links are off. */
+        if(gI2cDsiBridgeCfg[i][0] == 0x96)
+        {
+            do {
+                Board_i2c8BitRegRd(gI2cHandle,
+                            0x2c,
+                            0x96,
+                            &readVal,
+                            1,
+                            DISP_APP_I2C_TIMEOUT);
+            } while( (readVal) == 0x00);
+        }
+    }
+    DispApp_ErrorRegRead();
 #endif
+
+    I2C_close(gI2cHandle);
+
     return (status);
 }