#include "drv_types.h" #include "hdmi.h" #include "hdmi_dbg.h" #include "hdmi_mapping.h" /* Check the following config for hdmi port mapping CONFIG_HDMI_NUM - hdmi source number SISCONFIG_HDMI_SWITCH - hdmi switch location SISCONFIG_HDMI_PORT_MAP - hw and source mapping */ #define SWITCH_FOR_PORTA ((CONFIG_HDMI_SWITCH&0xF)) #define SWITCH_FOR_PORTB ((CONFIG_HDMI_SWITCH>>4)&0xF) #define SWITCH_FOR_PORTC ((CONFIG_HDMI_SWITCH>>8)&0xF) #define SWITCH_FOR_PORTD ((CONFIG_HDMI_SWITCH>>12)&0xF) #if (SWITCH_FOR_PORTA > 0) #define A_PORT_NUM SWITCH_FOR_PORTA #else #define A_PORT_NUM 1 #endif #if (SWITCH_FOR_PORTB > 0) #define B_PORT_NUM SWITCH_FOR_PORTB #else #define B_PORT_NUM 1 #endif #if (SWITCH_FOR_PORTC > 0) #define C_PORT_NUM SWITCH_FOR_PORTC #else #define C_PORT_NUM 1 #endif #if (SWITCH_FOR_PORTD > 0) #define D_PORT_NUM SWITCH_FOR_PORTD #else #define D_PORT_NUM 1 #endif #define HDMI_CONNECTOR_NUM (A_PORT_NUM + B_PORT_NUM + C_PORT_NUM + D_PORT_NUM) #if (SWITCH_FOR_PORTA > 0 || SWITCH_FOR_PORTB > 0 || SWITCH_FOR_PORTC > 0 || SWITCH_FOR_PORTD > 0) #define HDMI_SWITCH_EXIST #endif static HDMI_PORT_T hw_map[HDMI_CONNECTOR_NUM]; static SWITCH_PORT_T sw_map[HDMI_CONNECTOR_NUM]; #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE static void hdmi_mapping_info(void) { INT32 i = 0; HDMI_SRC_T src; HDMI_PORT_T hw_port; SWITCH_PORT_T sw_port; hdmidbg("CONFIG_HDMI_NUM %d\n", CONFIG_HDMI_NUM); hdmidbg("SISCONFIG_HDMI_SWITCH 0x%x\n", CONFIG_HDMI_SWITCH); hdmidbg("SISCONFIG_HDMI_PORT_MAP 0x%x\n", CONFIG_HDMI_PORT_MAP); for (i = 0; i < CONFIG_HDMI_NUM; i++) { hw_port = hdmi_hw_port(i); sw_port = hdmi_sw_port(i); if (sw_port == SWITCH_PORT_NULL) { /* hdmi source is hw port */ hdmidbg("HDMI %d is hw port %s\n", i + 1, hw_port == HDMI_PORT_A ? "A" : hw_port == HDMI_PORT_B ? "B" : hw_port == HDMI_PORT_C ? "C" : hw_port == HDMI_PORT_D ? "D" : hw_port == HDMI_PORT_NULL ? "Null" : "Error" ); } else { /* hdmi source is switch port */ hdmidbg("HDMI %d is switch port %s from hw port %s\n", i + 1, sw_port == SWITCH_PORT_A ? "A" : sw_port == SWITCH_PORT_B ? "B" : sw_port == SWITCH_PORT_C ? "C" : sw_port == SWITCH_PORT_D ? "D" : sw_port == SWITCH_PORT_NULL ? "Null" : "Error", hw_port == HDMI_PORT_A ? "A" : hw_port == HDMI_PORT_B ? "B" : hw_port == HDMI_PORT_C ? "C" : hw_port == HDMI_PORT_D ? "D" : hw_port == HDMI_PORT_NULL ? "Null" : "Error" ); } } for (i = 0; i < HDMI_PORT_NUM; i++) { src = hdmi_get_channel_at_hw_port(i); if (src < 0) { hdmidbg("Hw port %s is not connected\n", i == HDMI_PORT_A ? "A" : i == HDMI_PORT_B ? "B" : i == HDMI_PORT_C ? "C" : i == HDMI_PORT_D ? "D" : i == HDMI_PORT_NULL ? "Null" : "Error"); } else { hdmidbg("Hw port %s is HDMI %d\n", i == HDMI_PORT_A ? "A" : i == HDMI_PORT_B ? "B" : i == HDMI_PORT_C ? "C" : i == HDMI_PORT_D ? "D" : i == HDMI_PORT_NULL ? "Null" : "Error", src + 1); } } for (i = 0; i < SWITCH_PORT_NUM; i++) { src = hdmi_get_channel_at_switch_port(i); if (src < 0) { hdmidbg("Switch port %s is not connected\n", i == SWITCH_PORT_A ? "A" : i == SWITCH_PORT_B ? "B" : i == SWITCH_PORT_C ? "C" : i == SWITCH_PORT_D ? "D" : i == SWITCH_PORT_NULL ? "Null" : "Error"); } else { hdmidbg("Switch port %s is HDMI %d\n", i == SWITCH_PORT_A ? "A" : i == SWITCH_PORT_B ? "B" : i == SWITCH_PORT_C ? "C" : i == SWITCH_PORT_D ? "D" : i == SWITCH_PORT_NULL ? "Null" : "Error", src + 1); } } } #endif HDMI_PORT_T hdmi_hw_port(HDMI_SRC_T src) { if (src >= HDMI_SRC_1 && src < HDMI_SRC_NUM && src < CONFIG_HDMI_NUM && src < HDMI_CONNECTOR_NUM) { return hw_map[src]; } return HDMI_PORT_NULL; } SWITCH_PORT_T hdmi_sw_port(HDMI_SRC_T src) { if (src >= HDMI_SRC_1 && src < HDMI_SRC_NUM && src < CONFIG_HDMI_NUM && src < HDMI_CONNECTOR_NUM) { return sw_map[src]; } return SWITCH_PORT_NULL; } HDMI_SRC_T hdmi_get_channel_at_hw_port(HDMI_PORT_T hw_port) { HDMI_SRC_T src; for (src = HDMI_SRC_1; src < HDMI_CONNECTOR_NUM; src++) { if (hdmi_sw_port(src) == SWITCH_PORT_NULL && hdmi_hw_port(src) == hw_port) { return src; } } return HDMI_SRC_NULL; } HDMI_SRC_T hdmi_get_channel_at_switch_port(SWITCH_PORT_T sw_port) { HDMI_SRC_T src; for (src = HDMI_SRC_1; src < HDMI_CONNECTOR_NUM; src++) { if (hdmi_sw_port(src) == sw_port) { return src; } } return HDMI_SRC_NULL; } void hdmi_mapping_init(void) { INT32 i = 0, sw = 0; memset(hw_map, -1, sizeof(hw_map)); memset(sw_map, -1, sizeof(sw_map)); for (i = 0; i < HDMI_CONNECTOR_NUM; i++) { INT32 idx = (((CONFIG_HDMI_PORT_MAP >> (i * 4)) & 0xF) - 1)%HDMI_CONNECTOR_NUM; if (i < A_PORT_NUM) { sw = i; hw_map[idx] = 0; sw_map[idx] = (SWITCH_FOR_PORTA) ? (sw) : (-1); } else if ((i - A_PORT_NUM) < B_PORT_NUM) { sw = i - A_PORT_NUM; hw_map[idx] = 1; sw_map[idx] = (SWITCH_FOR_PORTB) ? (sw) : (-1); } else if ((i - A_PORT_NUM - B_PORT_NUM) < C_PORT_NUM) { sw = i - A_PORT_NUM - B_PORT_NUM; hw_map[idx] = 2; sw_map[idx] = (SWITCH_FOR_PORTC) ? (sw) : (-1); } else if ((i - A_PORT_NUM - B_PORT_NUM - C_PORT_NUM) < D_PORT_NUM) { sw = i - A_PORT_NUM - B_PORT_NUM - C_PORT_NUM; hw_map[idx] = 3; sw_map[idx] = (SWITCH_FOR_PORTD) ? (sw) : (-1); } } #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE /* Debug print */ hdmi_mapping_info(); #endif }