From 23362b8dfcd202b097c48753f6167b428818ca53 Mon Sep 17 00:00:00 2001 From: Per Persson Date: Wed, 8 Jun 2011 14:32:46 +0200 Subject: HDMIservice: Allow dynamic minor number Support is added for that the hdmi display device can have different device minor numbers. ST-Ericsson ID: 344334 ST-Ericsson FOSS-OUT ID: STETL-FOSS-OUT-10177 Signed-off-by: Per Persson Change-Id: I1ba92f35528518c9a9e2c805973dac8033a17f39 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/24689 Reviewed-by: QATOOLS Reviewed-by: QATEST Reviewed-by: Marcel TUNNISSEN Reviewed-by: Per-Daniel OLSSON Reviewed-by: Robert FEKETE --- include/hdmi_service_local.h | 14 ++++++---- src/hdmi_service.c | 64 ++++++++++++++++++++++++++++++++++++++++---- src/setres.c | 6 ++--- 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/include/hdmi_service_local.h b/include/hdmi_service_local.h index d3ea3db..bba6812 100644 --- a/include/hdmi_service_local.h +++ b/include/hdmi_service_local.h @@ -100,6 +100,7 @@ int serversocket_write(int len, __u8 *data); int serversocket_close(void); int poweronoff(__u8 onoff); int clientsocket_send(__u8 *buf, int len); +int dispdevice_file_open(char *file, int attr); int hdmi_service_init(int avoid_return_msg); int hdmi_service_exit(void); @@ -148,7 +149,6 @@ int hdmi_service_vesa_cea_prio_set(__u8 vesa_cea1, __u8 nr1, #define EVENTCLR_FILE "/sys/class/misc/hdmi/evclr" #define EVWAKEUP_FILE "/sys/class/misc/hdmi/evwakeup" #define EDIDREAD_FILE "/sys/class/misc/hdmi/edidread" -#define DISPONOFF_FILE "/sys/devices/av8100_hdmi.2/disponoff" #define HDCPCHKAESOTP_FILE "/sys/class/misc/hdmi/hdcpchkaesotp" #define HDCPLOADAES_FILE "/sys/class/misc/hdmi/hdcploadaes" #define HDCPSTATEGET_FILE "/sys/class/misc/hdmi/hdcpstateget" @@ -159,10 +159,14 @@ int hdmi_service_vesa_cea_prio_set(__u8 vesa_cea1, __u8 nr1, #define CECREAD_FILE "/sys/class/misc/hdmi/cecread" #define INFOFRSEND_FILE "/sys/class/misc/hdmi/infofrsend" #define POWERONOFF_FILE "/sys/class/misc/hdmi/poweronoff" -#define HDMIFORMAT_FILE "/sys/devices/av8100_hdmi.2/hdmisdtvswitch" -#define VESACEAFORMATS_FILE "/sys/devices/av8100_hdmi.2/vesacea" -#define TIMING_FILE "/sys/devices/av8100_hdmi.2/timing" -#define STAYALIVE_FILE "/sys/devices/av8100_hdmi.2/stayalive" + +#define DISPDEVICE_PATH_1 "/sys/devices/" +#define DISPDEVICE_PATH_2 "av8100_hdmi" +#define DISPONOFF_FILE "disponoff" +#define HDMIFORMAT_FILE "hdmisdtvswitch" +#define VESACEAFORMATS_FILE "vesacea" +#define TIMING_FILE "timing" +#define STAYALIVE_FILE "stayalive" #define STOREASTEXT_STR "01" /* Use hextext format in sysfs files */ #define STOREASBIN_STR "00" /* Use binary format in sysfs files */ diff --git a/src/hdmi_service.c b/src/hdmi_service.c index e262f8b..6232b75 100644 --- a/src/hdmi_service.c +++ b/src/hdmi_service.c @@ -20,6 +20,7 @@ #include "linux/fb.h" #include #include +#include #include "../include/hdmi_service_api.h" #include "../include/hdmi_service_local.h" @@ -38,12 +39,65 @@ enum hdmi_fb_state hdmi_fb_state; enum hdmi_plug_state hdmi_plug_state = HDMI_PLUGUNDEF; struct cmd_data *cmd_data; int cmd_id_ind; +char dispdevice_path[64]; const __u8 plugdetdis_val[] = {0x00, 0x00, 0x00};/* 00: disable, 00:ontime, 00: offtime*/ const __u8 plugdeten_val[] = {0x01, 0x05, 0x02};/* 01: enable, 05:ontime, 02: offtime*/ +static int hdmidirsort(const struct dirent **a, const struct dirent **b) +{ + return 1; +} + +/* Find the correct device path since the device minor number can vary */ +static int dispdevice_path_set(void) +{ + struct dirent **namelist; + int n; + int found = 0; + + n = scandir(DISPDEVICE_PATH_1, &namelist, 0, hdmidirsort); + if (n < 0) { + LOGHDMILIB("scandir error"); + return -1; + } + + while (n--) { + if (!found && strncmp(namelist[n]->d_name, DISPDEVICE_PATH_2, + strlen(DISPDEVICE_PATH_2)) == 0) { + strcpy(dispdevice_path, namelist[n]->d_name); + LOGHDMILIB("%s found:%s\n", __func__, dispdevice_path); + found = 1; + } + free(namelist[n]); + } + free(namelist); + return 0; +} + +static char *dispdevice_path_get(void) +{ + return &dispdevice_path[0]; +} + +int dispdevice_file_open(char *file, int attr) +{ + int fd = -1; + char fname[128]; + + if (dispdevice_path[0] == 0) + dispdevice_path_set(); + + if (dispdevice_path[0] != 0) { + sprintf(fname, "%s%s/%s", DISPDEVICE_PATH_1, + dispdevice_path_get(), file); + fd = open(fname, attr); + } + return fd; +} + int get_new_cmd_id_ind(void) { cmd_id_ind++; @@ -159,7 +213,7 @@ static int hdmi_format_set(enum hdmi_format format) { int fd; - fd = open(HDMIFORMAT_FILE, O_WRONLY); + fd = dispdevice_file_open(HDMIFORMAT_FILE, O_WRONLY); if (fd < 0) { LOGHDMILIB(" failed to open %s", HDMIFORMAT_FILE); return -1; @@ -220,10 +274,10 @@ static int stayalive(__u8 enable) int cnt = 0; int res; - stayalivefd = open(STAYALIVE_FILE, O_WRONLY); + stayalivefd = dispdevice_file_open(STAYALIVE_FILE, O_WRONLY); while ((stayalivefd < 0) && (cnt++ < 30)) { usleep(200000); - stayalivefd = open(STAYALIVE_FILE, O_WRONLY); + stayalivefd = dispdevice_file_open(STAYALIVE_FILE, O_WRONLY); } LOGHDMILIB("cnt:%d", cnt); @@ -341,7 +395,7 @@ static int hdmiplugged_handle(int *basic_audio_support) /* Check if fb is created */ /* Get fb dev name */ - disponoff = open(DISPONOFF_FILE, O_RDWR); + disponoff = dispdevice_file_open(DISPONOFF_FILE, O_RDWR); if (disponoff < 0) { LOGHDMILIB("***** Failed to open %s *****", DISPONOFF_FILE); ret = -3; @@ -423,7 +477,7 @@ static int hdmi_fb_close(void) } /* Destroy frame buffer */ - disponoff = open(DISPONOFF_FILE, O_WRONLY); + disponoff = dispdevice_file_open(DISPONOFF_FILE, O_WRONLY); if (disponoff < 0) { LOGHDMILIB("***** Failed to open %s *****", DISPONOFF_FILE); } else { diff --git a/src/setres.c b/src/setres.c index 4e13c6e..a4be32f 100644 --- a/src/setres.c +++ b/src/setres.c @@ -63,7 +63,7 @@ int video_formats_supported_hw(void) char buf[FORMATS_MAX * 2 + 1]; /* Get hw supported formats */ - vesacea = open(VESACEAFORMATS_FILE, O_RDONLY); + vesacea = dispdevice_file_open(VESACEAFORMATS_FILE, O_RDONLY); if (vesacea < 0) { LOGHDMILIB("***** Failed to open %s *****", VESACEAFORMATS_FILE); @@ -116,7 +116,7 @@ static int vesaceanrtovar(struct fb_var_screeninfo *var, __u8 cea, int interlaced; /* Request timing info */ - timing = open(TIMING_FILE, O_RDWR); + timing = dispdevice_file_open(TIMING_FILE, O_RDWR); if (timing < 0) { LOGHDMILIB("***** Failed to open %s *****", TIMING_FILE); return -1; @@ -321,7 +321,7 @@ int hdmi_fb_chres(__u8 cea, __u8 vesaceanr) __u8 num_buffers; /* Get fb dev name */ - disponoff = open(DISPONOFF_FILE, O_RDONLY); + disponoff = dispdevice_file_open(DISPONOFF_FILE, O_RDONLY); if (disponoff < 0) { LOGHDMILIB("***** Failed to open %s *****", DISPONOFF_FILE); return -1; -- cgit v1.2.3