From ef999bf6ae43ef567c76ac0b473c7d4340760ab2 Mon Sep 17 00:00:00 2001 From: Per Persson Date: Fri, 20 May 2011 11:40:47 +0200 Subject: HDMIservice added Initial commit ST-Ericsson ID: 326691 ST-Ericsson FOSS-OUT ID: STETL-FOSS-OUT-10177 Signed-off-by: Per Persson --- include/hdmi_service_api.h | 106 +++++++++++++ include/hdmi_service_local.h | 358 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 464 insertions(+) create mode 100644 include/hdmi_service_api.h create mode 100644 include/hdmi_service_local.h (limited to 'include') diff --git a/include/hdmi_service_api.h b/include/hdmi_service_api.h new file mode 100644 index 0000000..8133d33 --- /dev/null +++ b/include/hdmi_service_api.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * Author: Per Persson per.xb.persson@stericsson.com for + * ST-Ericsson. + * License terms: . + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _HDMI_SERVICE_API_H +#define _HDMI_SERVICE_API_H + +/* + * Set to 1 to stay alive when system suspends. + * Set to 0 to sleep when system suspends. + */ +#define HDMI_SERVICE_STAY_ALIVE_DURING_SUSPEND 1 + +/* If defined, socket usage is hidden for messages from service, + * and a callback function is used instead + */ +/*#define HDMI_SERVICE_USE_CALLBACK_FN*/ + +/* Service initialisation, threads creation + * Input avoid_return_msg: set to 1 to avoid messages from service. + * Return value: socket number where events will be notified. + */ +int hdmi_init(int avoid_return_msg); + +/* Service exit, threads destruction */ +int hdmi_exit(void); + +/* Enable HDMI HW */ +int hdmi_enable(void); + +/* Disable HDMI HW */ +int hdmi_disable(void); + +#ifdef HDMI_SERVICE_USE_CALLBACK_FN +/* Set callback for reception of messages from service */ +void hdmi_callback_set(void (*hdmi_cb)(int cmd, int data_size, __u8 *data)); +#endif /*HDMI_SERVICE_USE_CALLBACK_FN*/ + +/* Change resolution. cea=0: VESA resolution, cea=1: CEA resolution */ +int hdmi_resolution_set(int cea, int vesaceanr); + +/* Release frame buffer */ +int hdmi_fb_release(void); + +/* Send CEC message */ +int hdmi_cec_send(__u8 initiator, __u8 destination, __u8 data_size, __u8 *data); + +/* Manually request EDID */ +int hdmi_edid_request(__u8 block); + +/* Initialise HDCP. AES data is required */ +int hdmi_hdcp_init(__u16 aes_size, __u8 *aes_data); + +/* Send Infoframe */ +int hdmi_infoframe_send(__u8 type, __u8 version, __u8 crc, __u8 data_size, + __u8 *data); + +/* Set preferred resolution priorities */ +int hdmi_vesa_cea_prio_set(__u8 vesa_cea1, __u8 nr1, + __u8 vesa_cea2, __u8 nr2, + __u8 vesa_cea3, __u8 nr3); + + +/* Messages from service */ + +/* cmd=HDMI_EDIDRESP data format + *u8 result (0 = ok, 1 = not ok) + *u8 edid_data[128] (if result == ok) + */ + +/* cmd=HDMI_HDCPSTATE data format + *u8 state + * state = 0: No Receiver state + * state = 1: Receiver connected state + * state = 2: No HDCP receiver state + * state = 3: No Encryption state + * state = 4: Authentication on going state + * state = 5: Authentication fail state + * state = 6: Authentication succeed state + * state = 7: Encryption on going state + */ + +/* HDMI message cmd sent from hdmi_service */ +#define HDMI_PLUGGED_EV 0x10 +#define HDMI_UNPLUGGED_EV 0x11 +#define HDMI_EDIDRESP 0x12 +#define HDMI_CECRECVD 0x13 +#define HDMI_ILLSTATE_POWERED 0x80 +#define HDMI_ILLSTATE_UNPOWERED 0x81 +#define HDMI_ILLSTATE_UNPLUGGED 0x82 +#define HDMI_ILLSTATE_PWRON_PLUGGED 0x83 +#define HDMI_CECSENDERR 0x84 +#define HDMI_HDCPSTATE 0x85 + +#endif /* #ifdef _HDMI_SERVICE_API_H */ + +#ifdef __cplusplus +} +#endif diff --git a/include/hdmi_service_local.h b/include/hdmi_service_local.h new file mode 100644 index 0000000..83f2bcb --- /dev/null +++ b/include/hdmi_service_local.h @@ -0,0 +1,358 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * Author: Per Persson per.xb.persson@stericsson.com for + * ST-Ericsson. + * License terms: . + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _HDMI_SERVICE_LOCAL_H +#define _HDMI_SERVICE_LOCAL_H + +enum hdmi_fb_state { + HDMI_FB_CLOSED, + HDMI_FB_OPENED +}; + +enum hdmi_plug_state { + HDMI_UNPLUGGED, + HDMI_PLUGGED, + HDMI_PLUGUNDEF +}; + +enum hdmi_power_state { + HDMI_POWEROFF, + HDMI_POWERON, + HDMI_POWERUNDEF +}; + +enum hdmi_format { + HDMI_FORMAT_HDMI, + HDMI_FORMAT_SDTV, + HDMI_FORMAT_DVI +}; + +struct cmd_data { + __u32 cmd; + __u32 cmd_id; + __u32 data_len; + __u8 data[512]; + struct cmd_data *next; +}; + +struct video_format { + __u8 cea; /* 0=VESA, 1=CEA */ + __u8 vesaceanr; + __u8 sink_support; + __u8 prio; +}; + +struct vesacea { + __u8 cea; + __u8 nr; +}; + +struct edid_latency { + int video_latency; + int audio_latency; + int intlcd_video_latency; + int intlcd_audio_latency; +}; + +typedef void(*cb_fn)(int cmd, int data_length, __u8 *data); + +int cecrx_subscribe(void); +int cecsend(__u32 cmd_id, __u8 in, __u8 dest, __u8 len, __u8 *data); +int cecrx(void); +int edid_read(__u8 block, __u8 *data); +int edid_parse0(__u8 *data, __u8 *extension, struct video_format *, int size); +int edid_parse1(__u8 *data, struct video_format formats[], int nr_formats, + int *basic_audio_support, struct edid_latency *edid_latency); +int edidreq(__u8 block, __u32 cmd_id); +int hdcp_init(__u8 *aes); +int hdcp_state(void); +int video_formats_clear(void); +int vesacea_supported(int *nr_supported, struct vesacea vesacea[]); +int video_formats_supported_hw(void); +int nr_formats_get(void); +struct video_format *video_formats_get(void); +void set_vesacea_prio_all(void); +int hdmi_fb_chres(__u8 cea, __u8 vesaceanr); +int vesaceaprio_set(__u8 len, __u8 *data); +int hdmievclr(__u8 mask); +void thread_kevent_fn(void *arg); +int hdmiplug_subscribe(void); +int hdmi_event(int event); +int get_best_videoformat(__u8 *cea, __u8 *vesaceanr); +int listensocket_set(int sock); +int listensocket_get(void); +int clientsocket_get(void); +int cecsenderr(void); +int get_new_cmd_id_ind(void); +void thread_socklisten_fn(void *arg); +int cmd_add(struct cmd_data *cmd); +int serversocket_create(int avoid_return_msg); +int serversocket_write(int len, __u8 *data); +int serversocket_close(void); +int poweronoff(__u8 onoff); +int clientsocket_send(__u8 *buf, int len); + +int hdmi_service_init(int avoid_return_msg); +int hdmi_service_exit(void); +int hdmi_service_enable(void); +int hdmi_service_disable(void); + +#ifdef HDMI_SERVICE_USE_CALLBACK_FN +void hdmi_service_callback_set(cb_fn hdmi_cb); +cb_fn hdmi_service_callback_get(void); +#endif /*HDMI_SERVICE_USE_CALLBACK_FN*/ + +int hdmi_service_resolution_set(int cea, int vesaceanr); +int hdmi_service_fb_release(void); +int hdmi_service_cec_send(__u8 initiator, __u8 destination, __u8 data_size, + __u8 *data); +int hdmi_service_edid_request(__u8 block); +int hdmi_service_hdcp_init(__u16 aes_size, __u8 *aes_data); +int hdmi_service_infoframe_send(__u8 type, __u8 version, __u8 crc, + __u8 data_size, __u8 *data); +int hdmi_service_vesa_cea_prio_set(__u8 vesa_cea1, __u8 nr1, + __u8 vesa_cea2, __u8 nr2, + __u8 vesa_cea3, __u8 nr3); + +#define AES_KEYS_SIZE 297 +#define FORMATS_MAX 35 + +#define false 0 +#define true 1 +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +#define LOGHDMILIB LOGE +#define LOGHDMILIB2 LOGE +#define LOGHDMILIB3(format, ...) + +#ifdef ANDROID +#define FBPATH "/dev/graphics/" +#else +#define FBPATH "/dev/" +#endif + +#define SOCKET_LISTEN_PATH "/dev/socket/hdmi_listen" + +#define STOREASTEXT_FILE "/sys/class/misc/hdmi/storeastext" +#define PLUGDETEN_FILE "/sys/class/misc/hdmi/plugdeten" +#define EVENT_FILE "/sys/class/misc/hdmi/evread" +#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" +#define HDCPAUTH_FILE "/sys/class/misc/hdmi/hdcpauthencr" +#define HDCPEVEN_FILE "/sys/class/misc/hdmi/hdcpeven" +#define CECSEND_FILE "/sys/class/misc/hdmi/cecsend" +#define CECRXEVEN_FILE "/sys/class/misc/hdmi/ceceven" +#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 STOREASTEXT_STR "01" /* Use hextext format in sysfs files */ +#define STOREASBIN_STR "00" /* Use binary format in sysfs files */ + +#define HDMI_PLUGGED_IN_EVSTR "01" +#define HDMI_PLUGGED_OUT_EVSTR "02" +#define HDMI_CEC_EVSTR "04" +#define HDMI_HDCP_EVSTR "08" +#define HDMI_CECTXERR_EVSTR "10" +#define HDMI_USER_EVSTR "20" + +#define EDIDREAD_SIZE 0x80 +#define POLL_READ_SIZE 1 +#define CEAPRIO_MAX_SIZE 10 +#define VESACEAPRIO_DEFAULT 254 +#define OTP_UNPROGGED 0 +#define OTP_PROGGED 1 +#define TIMING_SIZE 32 +#define CEC_MSG_SIZE_MAX 15 +#define INFOFR_MSG_SIZE_MAX 27 + +#define HDMIEVENT_POLLSIZEFAIL -1 +#define HDMIEVENT_EVENTUNKNOWN -2 +#define HDMIEVENT_NOEVENT 0 +#define HDMIEVENT_HDMIPLUGGED 0x1 +#define HDMIEVENT_HDMIUNPLUGGED 0x2 +#define HDMIEVENT_CEC 0x4 +#define HDMIEVENT_HDCP 0x8 +#define HDMIEVENT_CECTXERR 0x10 +#define HDMIEVENT_WAKEUP 0x20 + +#define EVENTMASK_ALL 0xFF +#define EVENTMASK_PLUG 0x03 + +/* User commands */ +#define HDMIEVENT_CMD 0x010000 +#define CMD_OFFSET 0 +#define CMDID_OFFSET 4 +#define CMDLEN_OFFSET 8 +#define CMDBUF_OFFSET 12 + + +#define LOADAES_OK 0 +#define LOADAES_NOT_OK -1 +#define LOADAES_NOT_FUSED -2 +#define LOADAES_CRC_MISMATCH -3 + +#define RESULT_OK 0 +#define STOREAS_FAIL -1 +#define SYSFS_FILE_FAILED -2 +#define EDIDREAD_FAIL -3 +#define EDIDREAD_NOEXT -4 +#define EDIDREAD_NOVIDEO -5 +#define HDCP_OK 0 +#define AESKEYS_FAIL -1 +#define HDCPSTATE_FAIL -2 +#define HDCPAUTHENCR_FAIL -3 + +#define EDID_BL0_HEADER_OFFSET 0x00 +#define EDID_BL0_VERSION_OFFSET 0x12 +#define EDID_BL0_REVISION_OFFSET 0x13 +#define EDID_BL0_EST_TIMING1_OFFSET 0x23 +#define EDID_BL0_EST_TIMING2_OFFSET 0x24 +#define EDID_BL0_EXTFLAG_OFFSET 0x7E +#define EDID_BL0_ESTTIM1_OFFSET 0x23 +#define EDID_BL0_ESTTIM2_OFFSET 0x24 +#define EDID_BL0_STDTIM1_OFFSET 0x26 +#define EDID_BL1_REVNR_OFFSET 0x01 +#define EDID_BL1_OFFSET_OFFSET 0x02 +#define EDID_BL1_AUDIO_SUPPORT_OFFSET 0x03 +#define EDID_BL1_ESTTIM3_1_FLAG_OFFSET 0x48 +#define EDID_BL1_ESTTIM3_2_FLAG_OFFSET 0x5A +#define EDID_BL1_ESTTIM3_3_FLAG_OFFSET 0x6C +#define EDID_BL1_ESTTIM3_BYTE_START 6 +#define EDID_BL1_ESTTIM3_BYTE_END 11 +#define EDID_BL1_STDTIM9_1_FLAG_OFFSET 0x48 +#define EDID_BL1_STDTIM9_2_FLAG_OFFSET 0x5A +#define EDID_BL1_STDTIM9_3_FLAG_OFFSET 0x6C +#define EDID_BL1_STDTIM9_BYTE_START 5 +#define EDID_SVD_ID_MASK 0x7F +#define EDID_EXTVER_3 0x03 +#define EDID_NO_DATA 0x04 +#define EDID_BLK_START 0x04 +#define EDID_BLK_CODE_MSK 0xE0 +#define EDID_BLK_CODE_SHIFT 5 +#define EDID_BLK_LENGTH_MSK 0x1F +#define EDID_CODE_VIDEO 0x02 +#define EDID_CODE_VSDB 0x03 +#define EDID_BL0_STDTIM1_SIZE 8 +#define EDID_BL1_STDTIM9_SIZE 6 +#define EDID_STDTIM_AR_MASK 0xC0 +#define EDID_STDTIM_AR_SHIFT 6 +#define EDID_STDTIM_FREQ_MASK 0x3F +#define EDID_STDTIM_FREQ_SHIFT 0 +#define EDID_BASIC_AUDIO_SUPPORT_MASK 0x40 +#define EDID_VSD_PHYS_SRC 4 +#define EDID_VSD_LATENCY_IND 8 +#define EDID_VSD_LAT_FLD_MASK 0x80 +#define EDID_VSD_INTLCD_LAT_FLD_MASK 0x40 +#define EDID_VSD_VID_LAT 9 +#define EDID_VSD_AUD_LAT 10 +#define EDID_VSD_INTLCD_VID_LAT 11 +#define EDID_VSD_INTLCD_AUD_LAT 12 + +/* HDCP states */ +#define HDCP_STATE_NO_RECV 0 +#define HDCP_STATE_RECV_CONN 1 +#define HDCP_STATE_NO_HDCP 2 +#define HDCP_STATE_NO_ENCR 3 +#define HDCP_STATE_AUTH_ONGOING 4 +#define HDCP_STATE_AUTH_FAIL 5 +#define HDCP_STATE_AUTH_SUCCEDED 6 +#define HDCP_STATE_ENCR_ONGOING 7 + +#define VIDEO_FORMAT_DEFAULT 1 /* 640x480@60P */ + +#define STARTUP_DELAY_US 6000000 +#define HDCPAUTH_WAITTIME 1000000 +#define LOADAES_WAITTIME 250000 +#define EDIDREAD_WAITTIME 2000000 + +/* Socket listen thread */ +#define SOCKET_DATA_MAX 256 +#define SOCKET_MAX_CONN 1 + +/* Command format */ +/* Message data format + *u32 cmd + *u32 cmd_id + *u32 size + *u8 data[size] data format is specified below + */ + +/* HDMI message cmd sent to hdmi_service */ +#define HDMI_ENABLE 0x1 + +#define HDMI_DISABLE 0x2 + +/* cmd=HDMI_EDIDREQ data format + *u8 block (0 or 1) + */ +#define HDMI_EDIDREQ 0x3 + +/* cmd=HDMI_CECSEND and HDMI_CECRECVD data format + *u8 initiator + *u8 destination + *u8 cec_data_size + *u8 cec_data[cec_data_size] + */ +#define HDMI_CECSEND 0x4 + +/* cmd=HDMI_FB_RES_SET data format + *u8 vesa(0)/cea(1) + *u8 vesa/cea nr + */ +#define HDMI_FB_RES_SET 0x5 + +#define HDMI_FB_RELEASE 0x6 + +/* cmd=HDMI_HDCP_INIT data format + *u8 aesdata[297] + */ +#define HDMI_HDCP_INIT 0x7 + +/* cmd=HDMI_VESACEAPRIO_SET data format + *u8 nrofprios + *u8 vesa/cea[0] 0=VESA, 1=CEA + *u8 vesaceanr[0] vesanr or ceanr Prio 1 + *u8 vesa/cea[1] 0=VESA, 1=CEA + *u8 vesaceanr[1] vesanr or ceanr Prio 2 + *.... + *u8 vesa/cea[size-1] 0=VESA, 1=CEA + *u8 vesaceanr[size-1] vesanr or ceanr Prio size + */ +#define HDMI_VESACEAPRIO_SET 0x8 + +/* cmd=HDMI_INFOFR data format + *u8 type + *u8 version + *u8 crc + *u8 size + *u8 data[size] + */ +#define HDMI_INFOFR 0x9 + +#define HDMI_EXIT 0xFF + + + +#endif /* #ifdef _HDMI_SERVICE_LOCAL_H */ + +#ifdef __cplusplus +} +#endif -- cgit v1.2.3