• Amlogic S905X4 平台上针对HDMI TX(OUT) CEC操作


    common/drivers/amlogic/media/cec/hdmi_tx_cec_20.h

    1. /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
    2. /*
    3. * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
    4. */
    5. #ifndef _TX_CEC_H_
    6. #define _TX_CEC_H_
    7. #define CEC0_LOG_ADDR 4 /* MBX logical address */
    8. #define TV_CEC_INTERVAL (HZ * 3)
    9. #define CEC_VERSION "v1.3"
    10. #define _RX_DATA_BUF_SIZE_ 16
    11. #define AO_CEC /* for switch between aocec and hdmi cec2.0 */
    12. #define MAX_MSG 16
    13. #define MAX_NUM_OF_DEV 16
    14. enum _cec_log_dev_addr_e {
    15. CEC_TV_ADDR = 0x00,
    16. CEC_RECORDING_DEVICE_1_ADDR,
    17. CEC_RECORDING_DEVICE_2_ADDR,
    18. CEC_TUNER_1_ADDR,
    19. CEC_PLAYBACK_DEVICE_1_ADDR,
    20. CEC_AUDIO_SYSTEM_ADDR,
    21. CEC_TUNER_2_ADDR,
    22. CEC_TUNER_3_ADDR,
    23. CEC_PLAYBACK_DEVICE_2_ADDR,
    24. CEC_RECORDING_DEVICE_3_ADDR,
    25. CEC_TUNER_4_ADDR,
    26. CEC_PLAYBACK_DEVICE_3_ADDR,
    27. CEC_RESERVED_1_ADDR,
    28. CEC_RESERVED_2_ADDR,
    29. CEC_FREE_USE_ADDR,
    30. CEC_UNREGISTERED_ADDR
    31. };
    32. #define CEC_BROADCAST_ADDR CEC_UNREGISTERED_ADDR
    33. #define CEC_TV (BIT(0))
    34. #define CEC_RECORDING_DEVICE_1 (BIT(1))
    35. #define CEC_RECORDING_DEVICE_2 (BIT(2))
    36. #define CEC_TUNER_1 (BIT(3))
    37. #define CEC_PLAYBACK_DEVICE_1 (BIT(4))
    38. #define CEC_AUDIO_SYSTEM (BIT(5))
    39. #define CEC_TUNER_2 (BIT(6))
    40. #define CEC_TUNER_3 (BIT(7))
    41. #define CEC_PLAYBACK_DEVICE_2 (BIT(8))
    42. #define CEC_RECORDING_DEVICE_3 (BIT(9))
    43. #define CEC_TUNER_4 (BIT(10))
    44. #define CEC_PLAYBACK_DEVICE_3 (BIT(11))
    45. #define CEC_RESERVED_1 (BIT(12))
    46. #define CEC_RESERVED_2 (BIT(13))
    47. #define CEC_FREE_USE (BIT(14))
    48. #define CEC_UNREGISTERED (BIT(15))
    49. #define CEC_DISPLAY_DEVICE (CEC_TV | CEC_FREE_USE)
    50. #define CEC_RECORDING_DEVICE (CEC_RECORDING_DEVICE_1 \
    51. | CEC_RECORDING_DEVICE_2 | CEC_RECORDING_DEVICE_3)
    52. #define CEC_PLAYBACK_DEVICE (CEC_PLAYBACK_DEVICE_1 \
    53. | CEC_PLAYBACK_DEVICE_2 | CEC_PLAYBACK_DEVICE_3)
    54. #define CEC_TUNER_DEVICE (CEC_TUNER_1 | CEC_TUNER_2 \
    55. | CEC_TUNER_3 | CEC_TUNER_4)
    56. #define CEC_AUDIO_SYSTEM_DEVICE (CEC_AUDIO_SYSTEM)
    57. #define CEC_IOC_MAGIC 'C'
    58. #define CEC_IOC_GET_PHYSICAL_ADDR _IOR(CEC_IOC_MAGIC, 0x00, uint16_t)
    59. #define CEC_IOC_GET_VERSION _IOR(CEC_IOC_MAGIC, 0x01, int)
    60. #define CEC_IOC_GET_VENDOR_ID _IOR(CEC_IOC_MAGIC, 0x02, uint32_t)
    61. #define CEC_IOC_GET_PORT_INFO _IOR(CEC_IOC_MAGIC, 0x03, int)
    62. #define CEC_IOC_GET_PORT_NUM _IOR(CEC_IOC_MAGIC, 0x04, int)
    63. #define CEC_IOC_GET_SEND_FAIL_REASON _IOR(CEC_IOC_MAGIC, 0x05, uint32_t)
    64. #define CEC_IOC_SET_OPTION_WAKEUP _IOW(CEC_IOC_MAGIC, 0x06, uint32_t)
    65. #define CEC_IOC_SET_OPTION_ENALBE_CEC _IOW(CEC_IOC_MAGIC, 0x07, uint32_t)
    66. #define CEC_IOC_SET_OPTION_SYS_CTRL _IOW(CEC_IOC_MAGIC, 0x08, uint32_t)
    67. #define CEC_IOC_SET_OPTION_SET_LANG _IOW(CEC_IOC_MAGIC, 0x09, uint32_t)
    68. #define CEC_IOC_GET_CONNECT_STATUS _IOR(CEC_IOC_MAGIC, 0x0A, uint32_t)
    69. #define CEC_IOC_ADD_LOGICAL_ADDR _IOW(CEC_IOC_MAGIC, 0x0B, uint32_t)
    70. #define CEC_IOC_CLR_LOGICAL_ADDR _IOW(CEC_IOC_MAGIC, 0x0C, uint32_t)
    71. #define CEC_IOC_SET_DEV_TYPE _IOW(CEC_IOC_MAGIC, 0x0D, uint32_t)
    72. #define CEC_IOC_SET_ARC_ENABLE _IOW(CEC_IOC_MAGIC, 0x0E, uint32_t)
    73. #define CEC_IOC_SET_AUTO_DEVICE_OFF _IOW(CEC_IOC_MAGIC, 0x0F, uint32_t)
    74. #define CEC_IOC_GET_BOOT_ADDR _IOW(CEC_IOC_MAGIC, 0x10, uint32_t)
    75. #define CEC_IOC_GET_BOOT_REASON _IOW(CEC_IOC_MAGIC, 0x11, uint32_t)
    76. #define CEC_IOC_SET_FREEZE_MODE _IOW(CEC_IOC_MAGIC, 0x12, uint32_t)
    77. #define CEC_IOC_GET_BOOT_PORT _IOW(CEC_IOC_MAGIC, 0x13, uint32_t)
    78. #define CEC_IOC_SET_DEBUG_EN _IOW(CEC_IOC_MAGIC, 0x14, uint32_t)
    79. enum cec_tx_ret {
    80. CEC_FAIL_NONE = 0,
    81. CEC_FAIL_NACK = 1,
    82. CEC_FAIL_BUSY = 2,
    83. CEC_FAIL_OTHER = 3
    84. };
    85. enum hdmi_port_type {
    86. HDMI_INPUT = 0,
    87. HDMI_OUTPUT = 1
    88. };
    89. struct hdmi_port_info {
    90. int type;
    91. /* Port ID should start from 1 which corresponds to HDMI "port 1". */
    92. int port_id;
    93. int cec_supported;
    94. int arc_supported;
    95. u16 physical_address;
    96. };
    97. enum cec_dev_type_addr {
    98. CEC_DISPLAY_DEVICE_TYPE = 0x0,
    99. CEC_RECORDING_DEVICE_TYPE,
    100. CEC_RESERVED_DEVICE_TYPE,
    101. CEC_TUNER_DEVICE_TYPE,
    102. CEC_PLAYBACK_DEVICE_TYPE,
    103. CEC_AUDIO_SYSTEM_DEVICE_TYPE,
    104. CEC_UNREGISTERED_DEVICE_TYPE,
    105. };
    106. enum cec_feature_abort_e {
    107. CEC_UNRECONIZED_OPCODE = 0x0,
    108. CEC_NOT_CORRECT_MODE_TO_RESPOND,
    109. CEC_CANNOT_PROVIDE_SOURCE,
    110. CEC_INVALID_OPERAND,
    111. CEC_REFUSED,
    112. CEC_UNABLE_TO_DETERMINE,
    113. };
    114. /*
    115. * CEC OPCODES
    116. */
    117. #define CEC_OC_ABORT_MESSAGE 0xFF
    118. #define CEC_OC_ACTIVE_SOURCE 0x82
    119. #define CEC_OC_CEC_VERSION 0x9E
    120. #define CEC_OC_CLEAR_ANALOGUE_TIMER 0x33
    121. #define CEC_OC_CLEAR_DIGITAL_TIMER 0x99
    122. #define CEC_OC_CLEAR_EXTERNAL_TIMER 0xA1
    123. #define CEC_OC_DECK_CONTROL 0x42
    124. #define CEC_OC_DECK_STATUS 0x1B
    125. #define CEC_OC_DEVICE_VENDOR_ID 0x87
    126. #define CEC_OC_FEATURE_ABORT 0x00
    127. #define CEC_OC_GET_CEC_VERSION 0x9F
    128. #define CEC_OC_GET_MENU_LANGUAGE 0x91
    129. #define CEC_OC_GIVE_AUDIO_STATUS 0x71
    130. #define CEC_OC_GIVE_DECK_STATUS 0x1A
    131. #define CEC_OC_GIVE_DEVICE_POWER_STATUS 0x8F
    132. #define CEC_OC_GIVE_DEVICE_VENDOR_ID 0x8C
    133. #define CEC_OC_GIVE_OSD_NAME 0x46
    134. #define CEC_OC_GIVE_PHYSICAL_ADDRESS 0x83
    135. #define CEC_OC_GIVE_SYSTEM_AUDIO_MODE_STATUS 0x7D
    136. #define CEC_OC_GIVE_TUNER_DEVICE_STATUS 0x08
    137. #define CEC_OC_IMAGE_VIEW_ON 0x04
    138. #define CEC_OC_INACTIVE_SOURCE 0x9D
    139. #define CEC_OC_MENU_REQUEST 0x8D
    140. #define CEC_OC_MENU_STATUS 0x8E
    141. #define CEC_OC_PLAY 0x41
    142. #define CEC_OC_POLLING_MESSAGE 0xFC
    143. #define CEC_OC_RECORD_OFF 0x0B
    144. #define CEC_OC_RECORD_ON 0x09
    145. #define CEC_OC_RECORD_STATUS 0x0A
    146. #define CEC_OC_RECORD_TV_SCREEN 0x0F
    147. #define CEC_OC_REPORT_AUDIO_STATUS 0x7A
    148. #define CEC_OC_REPORT_PHYSICAL_ADDRESS 0x84
    149. #define CEC_OC_REPORT_POWER_STATUS 0x90
    150. #define CEC_OC_REQUEST_ACTIVE_SOURCE 0x85
    151. #define CEC_OC_ROUTING_CHANGE 0x80
    152. #define CEC_OC_ROUTING_INFORMATION 0x81
    153. #define CEC_OC_SELECT_ANALOGUE_SERVICE 0x92
    154. #define CEC_OC_SELECT_DIGITAL_SERVICE 0x93
    155. #define CEC_OC_SET_ANALOGUE_TIMER 0x34
    156. #define CEC_OC_SET_AUDIO_RATE 0x9A
    157. #define CEC_OC_SET_DIGITAL_TIMER 0x97
    158. #define CEC_OC_SET_EXTERNAL_TIMER 0xA2
    159. #define CEC_OC_SET_MENU_LANGUAGE 0x32
    160. #define CEC_OC_SET_OSD_NAME 0x47
    161. #define CEC_OC_SET_OSD_STRING 0x64
    162. #define CEC_OC_SET_STREAM_PATH 0x86
    163. #define CEC_OC_SET_SYSTEM_AUDIO_MODE 0x72
    164. #define CEC_OC_SET_TIMER_PROGRAM_TITLE 0x67
    165. #define CEC_OC_STANDBY 0x36
    166. #define CEC_OC_SYSTEM_AUDIO_MODE_REQUEST 0x70
    167. #define CEC_OC_SYSTEM_AUDIO_MODE_STATUS 0x7E
    168. #define CEC_OC_TEXT_VIEW_ON 0x0D
    169. #define CEC_OC_TIMER_CLEARED_STATUS 0x43
    170. #define CEC_OC_TIMER_STATUS 0x35
    171. #define CEC_OC_TUNER_DEVICE_STATUS 0x07
    172. #define CEC_OC_TUNER_STEP_DECREMENT 0x06
    173. #define CEC_OC_TUNER_STEP_INCREMENT 0x05
    174. #define CEC_OC_USER_CONTROL_PRESSED 0x44
    175. #define CEC_OC_USER_CONTROL_RELEASED 0x45
    176. #define CEC_OC_VENDOR_COMMAND 0x89
    177. #define CEC_OC_VENDOR_COMMAND_WITH_ID 0xA0
    178. #define CEC_OC_VENDOR_REMOTE_BUTTON_DOWN 0x8A
    179. #define CEC_OC_VENDOR_REMOTE_BUTTON_UP 0x8B
    180. /* cec global struct */
    181. enum cec_node_status_e {
    182. STATE_UNKNOWN = 0x00,
    183. STATE_START,
    184. STATE_STOP
    185. };
    186. enum cec_power_status_e {
    187. CEC_PW_POWER_ON = 0x00,
    188. CEC_PW_STANDBY,
    189. CEC_PW_TRANS_STANDBY_TO_ON,
    190. CEC_PW_TRANS_ON_TO_STANDBY,
    191. };
    192. enum status_req_mode_e {
    193. STATUS_REQ_ON = 1,
    194. STATUS_REQ_OFF,
    195. STATUS_REQ_ONCE,
    196. };
    197. enum deck_info_e {
    198. DECK_UNKNOWN_STATUS = 0,
    199. DECK_PLAY = 0X11,
    200. DECK_RECORD,
    201. DECK_PLAY_REVERSE,
    202. DECK_STILL,
    203. DECK_SLOW,
    204. DECK_SLOW_REVERSE,
    205. DECK_FAST_FORWARD,
    206. DECK_FAST_REVERSE,
    207. DECK_NO_MEDIA,
    208. DECK_STOP,
    209. DECK_SKIP_FORWARD_WIND,
    210. DECK_SKIP_REVERSE_REWIND,
    211. DECK_INDEX_SEARCH_FORWARD,
    212. DECK_INDEX_SEARCH_REVERSE,
    213. DECK_OTHER_STATUS,
    214. };
    215. enum deck_cnt_mode_e {
    216. DECK_CNT_SKIP_FORWARD_WIND = 1,
    217. DECK_CNT_SKIP_REVERSE_REWIND,
    218. DECK_CNT_STOP,
    219. DECK_CNT_EJECT,
    220. };
    221. enum play_mode_e {
    222. PLAY_FORWARD = 0X24,
    223. PLAY_REVERSE = 0X20,
    224. PLAY_STILL = 0X25,
    225. FAST_FORWARD_MIN_SPEED = 0X05,
    226. FAST_FORWARD_MEDIUM_SPEED = 0X06,
    227. FAST_FORWARD_MAX_SPEED = 0X07,
    228. FAST_REVERSE_MIN_SPEED = 0X09,
    229. FAST_REVERSE_MEDIUM_SPEED = 0X0A,
    230. FAST_REVERSE_MAX_SPEED = 0X0B,
    231. SLOW_FORWARD_MIN_SPEED = 0X15,
    232. SLOW_FORWARD_MEDIUM_SPEED = 0X16,
    233. SLOW_FORWARD_MAX_SPEED = 0X17,
    234. SLOW_REVERSE_MIN_SPEED = 0X19,
    235. SLOW_REVERSE_MEDIUM_SPEED = 0X1A,
    236. SLOW_REVERSE_MAX_SPEED = 0X1B,
    237. };
    238. enum cec_version_e {
    239. CEC_VERSION_11 = 0,
    240. CEC_VERSION_12,
    241. CEC_VERSION_12A,
    242. CEC_VERSION_13,
    243. CEC_VERSION_13A,
    244. CEC_VERSION_14A,
    245. CEC_VERSION_20,
    246. };
    247. #define INFO_MASK_CEC_VERSION (BIT(0))
    248. #define INFO_MASK_VENDOR_ID (BIT(1))
    249. #define INFO_MASK_DEVICE_TYPE (BIT(2))
    250. #define INFO_MASK_POWER_STATUS (BIT(3))
    251. #define INFO_MASK_PHYSICAL_ADDRESS (BIT(4))
    252. #define INFO_MASK_LOGIC_ADDRESS (BIT(5))
    253. #define INFO_MASK_OSD_NAME (BIT(6))
    254. #define INFO_MASK_MENU_STATE (BIT(7))
    255. #define INFO_MASK_MENU_LANGUAGE (BIT(8))
    256. #define INFO_MASK_DECK_INfO (BIT(9))
    257. #define INFO_MASK_PLAY_MODE (BIT(10))
    258. /*
    259. * only for 1 tx device
    260. */
    261. struct cec_global_info_t {
    262. dev_t dev_no;
    263. atomic_t open_count;
    264. unsigned int hal_ctl; /* message controlled by hal */
    265. unsigned int vendor_id:24;
    266. unsigned int menu_lang;
    267. unsigned int cec_version;
    268. unsigned char power_status;
    269. unsigned char log_addr;
    270. unsigned int addr_enable;
    271. unsigned char menu_status;
    272. unsigned char osd_name[16];
    273. struct input_dev *remote_cec_dev; /* cec input device */
    274. struct hdmitx_dev *hdmitx_device;
    275. };
    276. enum cec_device_menu_state_e {
    277. DEVICE_MENU_ACTIVE = 0,
    278. DEVICE_MENU_INACTIVE,
    279. };
    280. #endif

    具体操作对应关系:

    如以下命令

    echo 0x40 0x04 > /sys/class/cec/cmd  (To turn the TV on)
    echo 0x40 0x36 > /sys/class/cec/cmd  (To turn the TV off)
    echo 0x40 0x8F > /sys/class/cec/cmd      (CEC_OC_GIVE_DEVICE_POWER_STATUS)

    echo 0x40  VALUE  > /sys/class/cec/cmd

    VALUE 对应以下绿色框起来的部分

     操作命令后,可以使用命令

    cat /sys/class/cec/dump_reg    //读取CEC 寄存器状态

     cd /sys/class/amhdmitx/amhdmitx0

    下面为HDMI OUT 的相关节点状态读取

    1. console:/sys/class/amhdmitx/amhdmitx0 # ls
    2. allm_cap div40 hdcp_stickmode power
    3. allm_mode dv_cap hdcp_stickstep preferred_mode
    4. attr dv_cap2 hdcp_topo_info rawedid
    5. aud_cap edid hdcp_type_policy ready
    6. aud_ch edid_parsing hdcp_ver rhpd_state
    7. aud_mode fake_plug hdmi_config_info rxsense_policy
    8. avmute frac_rate_policy hdmi_hdr_status rxsense_state
    9. cea_cap hdcp22_base hdmi_hsty_config sink_type
    10. cedst_count hdcp22_type hdmi_init sspll
    11. cedst_policy hdcp_byp hdmi_repeater_tx subsystem
    12. config hdcp_clkdis hdmi_used support_3d
    13. contenttype_cap hdcp_ctl_lvl hdmirx_info swap
    14. contenttype_mode hdcp_ctrl hdmitx_drm_flag sysctrl_enable
    15. dc_cap hdcp_ksv_info hdr_cap uevent
    16. debug hdcp_lstore hdr_cap2 valid_mode
    17. dev hdcp_mode hdr_mute_frame vesa_cap
    18. disp_cap hdcp_pwr hpd_state vic
    19. disp_cap_3d hdcp_repeater max_exceed vid_mute
    20. disp_mode hdcp_rptxlstore phy waiting_for_supplier

    cat /sys/class/display/mode   //查看当前输出的状态和分辨率

    cat /sys/class/amhdmitx/amhdmitx0/dc_cap //显示设备支持的色域间及色深

    cat  /sys/class/amhdmitx/amhdmitx0/disp_cap  //显示设备支持的分辨率,*显示当前分辨率

  • 相关阅读:
    遭到全网嘲讽,宋丹丹这次被骂惨了...
    在线文本过滤小于指定长度工具
    有一个List<Date> ,现在有一个Date 时间,找到这个list 里面和时间最近的一个,进行返回
    多个服务器之间免密登录
    redis GEO使用及基本原理——实现对经纬度的操作
    分布式概念:写一个分布式锁
    利用Python进行数据分析-Numpy入门基础知识
    电商后台项目 + 源码
    4. 运行Openocd
    Jetson Nano 系列之:刷机、瘦身、部署应用
  • 原文地址:https://blog.csdn.net/BENKG/article/details/126299456