| /* |
| * drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_pktinfo.c |
| * |
| * Copyright (C) 2017 Amlogic, Inc. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| */ |
| |
| #include <linux/version.h> |
| #include <linux/module.h> |
| #include <linux/types.h> |
| #include <linux/kernel.h> |
| #include <linux/slab.h> |
| #include <linux/delay.h> |
| #include <linux/fs.h> |
| #include <linux/device.h> |
| #include <linux/mm.h> |
| #include <linux/major.h> |
| #include <linux/platform_device.h> |
| #include <linux/mutex.h> |
| #include <linux/cdev.h> |
| |
| /* Local include */ |
| #include "hdmi_rx_repeater.h" |
| #include "hdmi_rx_pktinfo.h" |
| #include "hdmi_rx_drv.h" |
| #include "hdmi_rx_hw.h" |
| #include "hdmi_rx_wrapper.h" |
| |
| /*this parameter moved from wrapper.c */ |
| /* |
| * bool hdr_enable = true; |
| */ |
| static struct rxpkt_st rxpktsts; |
| struct packet_info_s rx_pkt; |
| int dv_nopacket_timeout = 30; |
| uint32_t gpkt_fifo_pri; |
| /*struct mutex pktbuff_lock;*/ |
| |
| |
| static struct pkt_typeregmap_st pktmaping[] = { |
| /*infoframe pkt*/ |
| {PKT_TYPE_INFOFRAME_VSI, PFIFO_VS_EN}, |
| {PKT_TYPE_INFOFRAME_AVI, PFIFO_AVI_EN}, |
| {PKT_TYPE_INFOFRAME_SPD, PFIFO_SPD_EN}, |
| {PKT_TYPE_INFOFRAME_AUD, PFIFO_AUD_EN}, |
| {PKT_TYPE_INFOFRAME_MPEGSRC, PFIFO_MPEGS_EN}, |
| {PKT_TYPE_INFOFRAME_NVBI, PFIFO_NTSCVBI_EN}, |
| {PKT_TYPE_INFOFRAME_DRM, PFIFO_DRM_EN}, |
| /*other pkt*/ |
| {PKT_TYPE_ACR, PFIFO_ACR_EN}, |
| {PKT_TYPE_GCP, PFIFO_GCP_EN}, |
| {PKT_TYPE_ACP, PFIFO_ACP_EN}, |
| {PKT_TYPE_ISRC1, PFIFO_ISRC1_EN}, |
| {PKT_TYPE_ISRC2, PFIFO_ISRC2_EN}, |
| {PKT_TYPE_GAMUT_META, PFIFO_GMT_EN}, |
| {PKT_TYPE_AUD_META, PFIFO_AMP_EN}, |
| {PKT_TYPE_EMP, PFIFO_EMP_EN}, |
| |
| /*end of the table*/ |
| {K_FLAG_TAB_END, K_FLAG_TAB_END}, |
| }; |
| |
| /* |
| * uint32_t timerbuff[50]; |
| * uint32_t timerbuff_idx = 0; |
| */ |
| |
| struct st_pkt_test_buff *pkt_testbuff; |
| |
| void rx_pkt_status(void) |
| { |
| /*uint32_t i;*/ |
| rx_pr("pkt module ver: 1.1\n"); |
| rx_pr("packet_fifo_cfg=0x%x\n", packet_fifo_cfg); |
| /*rx_pr("pdec_ists_en=0x%x\n\n", pdec_ists_en);*/ |
| |
| rx_pr("fifo_Int_cnt=%d\n", rxpktsts.fifo_Int_cnt); |
| rx_pr("fifo_pkt_num=%d\n", rxpktsts.fifo_pkt_num); |
| |
| rx_pr("pkt_cnt_avi=%d\n", rxpktsts.pkt_cnt_avi); |
| rx_pr("pkt_cnt_vsi=%d\n", rxpktsts.pkt_cnt_vsi); |
| rx_pr("pkt_cnt_drm=%d\n", rxpktsts.pkt_cnt_drm); |
| rx_pr("pkt_cnt_spd=%d\n", rxpktsts.pkt_cnt_spd); |
| rx_pr("pkt_cnt_audif=%d\n", rxpktsts.pkt_cnt_audif); |
| rx_pr("pkt_cnt_mpeg=%d\n", rxpktsts.pkt_cnt_mpeg); |
| rx_pr("pkt_cnt_nvbi=%d\n", rxpktsts.pkt_cnt_nvbi); |
| |
| rx_pr("pkt_cnt_acr=%d\n", rxpktsts.pkt_cnt_acr); |
| rx_pr("pkt_cnt_gcp=%d\n", rxpktsts.pkt_cnt_gcp); |
| rx_pr("pkt_cnt_acp=%d\n", rxpktsts.pkt_cnt_acp); |
| rx_pr("pkt_cnt_isrc1=%d\n", rxpktsts.pkt_cnt_isrc1); |
| rx_pr("pkt_cnt_isrc2=%d\n", rxpktsts.pkt_cnt_isrc2); |
| rx_pr("pkt_cnt_gameta=%d\n", rxpktsts.pkt_cnt_gameta); |
| rx_pr("pkt_cnt_amp=%d\n", rxpktsts.pkt_cnt_amp); |
| rx_pr("pkt_cnt_emp=%d\n", rxpktsts.pkt_cnt_emp); |
| |
| rx_pr("pkt_cnt_vsi_ex=%d\n", rxpktsts.pkt_cnt_vsi_ex); |
| rx_pr("pkt_cnt_drm_ex=%d\n", rxpktsts.pkt_cnt_drm_ex); |
| rx_pr("pkt_cnt_gmd_ex=%d\n", rxpktsts.pkt_cnt_gmd_ex); |
| rx_pr("pkt_cnt_aif_ex=%d\n", rxpktsts.pkt_cnt_aif_ex); |
| rx_pr("pkt_cnt_avi_ex=%d\n", rxpktsts.pkt_cnt_avi_ex); |
| rx_pr("pkt_cnt_acr_ex=%d\n", rxpktsts.pkt_cnt_acr_ex); |
| rx_pr("pkt_cnt_gcp_ex=%d\n", rxpktsts.pkt_cnt_gcp_ex); |
| rx_pr("pkt_cnt_amp_ex=%d\n", rxpktsts.pkt_cnt_amp_ex); |
| rx_pr("pkt_cnt_nvbi_ex=%d\n", rxpktsts.pkt_cnt_nvbi_ex); |
| rx_pr("pkt_cnt_nvbi_ex=%d\n", rxpktsts.pkt_cnt_emp_ex); |
| |
| rx_pr("pkt_chk_flg=%d\n", rxpktsts.pkt_chk_flg); |
| |
| rx_pr("FIFO_STS=0x%x(b31-b16/b15-b0)\n", |
| hdmirx_rd_dwc(DWC_PDEC_FIFO_STS)); |
| rx_pr("FIFO_STS1=0x%x(b15-b0)\n", |
| hdmirx_rd_dwc(DWC_PDEC_FIFO_STS1)); |
| } |
| |
| void rx_pkt_debug(void) |
| { |
| uint32_t data32; |
| |
| rx_pr("\npktinfo size=%d\n", sizeof(union pktinfo)); |
| rx_pr("infoframe_st size=%d\n", sizeof(union infoframe_u)); |
| rx_pr("fifo_rawdata_st size=%d\n", sizeof(struct fifo_rawdata_st)); |
| rx_pr("vsi_infoframe_st size=%d\n", sizeof(struct vsi_infoframe_st)); |
| rx_pr("avi_infoframe_st size=%d\n", sizeof(struct avi_infoframe_st)); |
| rx_pr("spd_infoframe_st size=%d\n", sizeof(struct spd_infoframe_st)); |
| rx_pr("aud_infoframe_st size=%d\n", sizeof(struct aud_infoframe_st)); |
| rx_pr("ms_infoframe_st size=%d\n", sizeof(struct ms_infoframe_st)); |
| rx_pr("vbi_infoframe_st size=%d\n", sizeof(struct vbi_infoframe_st)); |
| rx_pr("drm_infoframe_st size=%d\n", sizeof(struct drm_infoframe_st)); |
| |
| rx_pr("acr_pkt_st size=%d\n", |
| sizeof(struct acr_pkt_st)); |
| rx_pr("aud_sample_pkt_st size=%d\n", |
| sizeof(struct aud_sample_pkt_st)); |
| rx_pr("gcp_pkt_st size=%d\n", sizeof(struct gcp_pkt_st)); |
| rx_pr("acp_pkt_st size=%d\n", sizeof(struct acp_pkt_st)); |
| rx_pr("isrc_pkt_st size=%d\n", sizeof(struct isrc_pkt_st)); |
| rx_pr("onebit_aud_pkt_st size=%d\n", |
| sizeof(struct obasmp_pkt_st)); |
| rx_pr("dst_aud_pkt_st size=%d\n", |
| sizeof(struct dstaud_pkt_st)); |
| rx_pr("hbr_aud_pkt_st size=%d\n", |
| sizeof(struct hbraud_pkt_st)); |
| rx_pr("gamut_Meta_pkt_st size=%d\n", |
| sizeof(struct gamutmeta_pkt_st)); |
| rx_pr("aud_3d_smppkt_st size=%d\n", |
| sizeof(struct a3dsmp_pkt_st)); |
| rx_pr("oneb3d_smppkt_st size=%d\n", |
| sizeof(struct ob3d_smppkt_st)); |
| rx_pr("aud_mtdata_pkt_st size=%d\n", |
| sizeof(struct audmtdata_pkt_st)); |
| rx_pr("mulstr_audsamp_pkt_st size=%d\n", |
| sizeof(struct msaudsmp_pkt_st)); |
| rx_pr("onebmtstr_smaud_pkt_st size=%d\n", |
| sizeof(struct obmaudsmp_pkt_st)); |
| rx_pr("emp size=%d\n", |
| sizeof(struct emp_pkt_st)); |
| memset(&rxpktsts, 0, sizeof(struct rxpkt_st)); |
| |
| data32 = hdmirx_rd_dwc(DWC_PDEC_CTRL); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_VSI)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_AVI)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_SPD)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_AUD)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_VSI)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_MPEGSRC)); |
| if (rx.chip_id != CHIP_ID_TXHD) { |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_NVBI)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_INFOFRAME_DRM)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_AUD_META)); |
| } |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_ACR)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_GCP)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_ACP)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_ISRC1)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_ISRC2)); |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_GAMUT_META)); |
| if (rx.chip_id == CHIP_ID_TL1) |
| data32 |= (rx_pkt_type_mapping(PKT_TYPE_EMP)); |
| |
| hdmirx_wr_dwc(DWC_PDEC_CTRL, data32); |
| rx_pr("enable fifo\n"); |
| |
| } |
| |
| |
| void rx_get_pd_fifo_param(enum pkt_type_e pkt_type, |
| struct pd_infoframe_s *pkt_info) |
| { |
| switch (pkt_type) { |
| case PKT_TYPE_INFOFRAME_VSI: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.vs_info; */ |
| memcpy(&pkt_info, &rx_pkt.vs_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_vsi_ex(&pkt_info); |
| break; |
| case PKT_TYPE_INFOFRAME_AVI: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.avi_info; */ |
| memcpy(&pkt_info, &rx_pkt.avi_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_avi_ex(&pkt_info); |
| break; |
| case PKT_TYPE_INFOFRAME_SPD: |
| /* srcbuff = &rx.spd_info; */ |
| memcpy(&pkt_info, &rx_pkt.spd_info, |
| sizeof(struct pd_infoframe_s)); |
| break; |
| case PKT_TYPE_INFOFRAME_AUD: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.aud_pktinfo; */ |
| memcpy(&pkt_info, &rx_pkt.aud_pktinfo, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_audif_ex(&pkt_info); |
| break; |
| case PKT_TYPE_INFOFRAME_MPEGSRC: |
| /* srcbuff = &rx.mpegs_info; */ |
| memcpy(&pkt_info, &rx_pkt.mpegs_info, |
| sizeof(struct pd_infoframe_s)); |
| break; |
| case PKT_TYPE_INFOFRAME_NVBI: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.ntscvbi_info; */ |
| memcpy(&pkt_info, &rx_pkt.ntscvbi_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_ntscvbi_ex(&pkt_info); |
| break; |
| case PKT_TYPE_INFOFRAME_DRM: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.drm_info; */ |
| memcpy(&pkt_info, &rx_pkt.drm_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_drm_ex(&pkt_info); |
| break; |
| case PKT_TYPE_ACR: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.acr_info; */ |
| memcpy(&pkt_info, &rx_pkt.acr_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_acr_ex(&pkt_info); |
| break; |
| case PKT_TYPE_GCP: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.gcp_info; */ |
| memcpy(&pkt_info, &rx_pkt.gcp_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_gcp_ex(&pkt_info); |
| break; |
| case PKT_TYPE_ACP: |
| /* srcbuff = &rx.acp_info; */ |
| memcpy(&pkt_info, &rx_pkt.acp_info, |
| sizeof(struct pd_infoframe_s)); |
| break; |
| case PKT_TYPE_ISRC1: |
| /* srcbuff = &rx.isrc1_info; */ |
| memcpy(&pkt_info, &rx_pkt.isrc1_info, |
| sizeof(struct pd_infoframe_s)); |
| break; |
| case PKT_TYPE_ISRC2: |
| /* srcbuff = &rx.isrc2_info; */ |
| memcpy(&pkt_info, &rx_pkt.isrc2_info, |
| sizeof(struct pd_infoframe_s)); |
| break; |
| case PKT_TYPE_GAMUT_META: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.gameta_info; */ |
| memcpy(&pkt_info, &rx_pkt.gameta_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_gmd_ex(&pkt_info); |
| break; |
| case PKT_TYPE_AUD_META: |
| if (rx_pkt_get_fifo_pri()) |
| /* srcbuff = &rx.amp_info; */ |
| memcpy(&pkt_info, &rx_pkt.amp_info, |
| sizeof(struct pd_infoframe_s)); |
| else |
| rx_pkt_get_amp_ex(&pkt_info); |
| break; |
| default: |
| if (pd_fifo_buf != NULL) |
| /* srcbuff = pd_fifo_buf; */ |
| memcpy(&pkt_info, &pd_fifo_buf, |
| sizeof(struct pd_infoframe_s)); |
| else |
| pr_err("err:pd_fifo_buf is empty\n"); |
| break; |
| } |
| } |
| #if 0 |
| void rx_debug_dump_vs_status(void) |
| { |
| struct vsi_info_s *vs; |
| |
| vs = &rx.vsi_info; |
| |
| rx_pr("dobv:%d\n", vs->dolby_vision); |
| rx_pr("ieee:%0x\n", vs->identifier); |
| rx_pr("dobvsts:%d\n", vs->dolby_vision_sts); |
| rx_pr("3dst:0x%x\n", vs->_3d_structure); |
| rx_pr("3dext:0x%x\n", vs->_3d_ext_data); |
| } |
| #endif |
| |
| /* |
| * hdmi rx packet module debug interface, if system not |
| * enable pkt fifo module, you need first fun "debugfifo" cmd |
| * to enable hw de-code pkt. and then rum "status", you will |
| * see the pkt_xxx_cnt value is increasing. means have received |
| * pkt info. |
| * @param input [are group of string] |
| * cmd style: pktinfo [param1] [param2] |
| * cmd ex:pktinfo dump 0x82 |
| * ->means dump avi infofram pkt content |
| * @return [no] |
| */ |
| void rx_debug_pktinfo(char input[][20]) |
| { |
| uint32_t sts = 0; |
| uint32_t enable = 0; |
| uint32_t res = 0; |
| |
| if (strncmp(input[1], "debugfifo", 9) == 0) { |
| /*open all pkt interrupt source for debug*/ |
| rx_pkt_debug(); |
| enable |= (PD_FIFO_START_PASS | PD_FIFO_OVERFL); |
| pdec_ists_en |= enable; |
| rx_pr("pdec_ists_en=0x%x\n", pdec_ists_en); |
| rx_irq_en(1); |
| } else if (strncmp(input[1], "debugext", 8) == 0) { |
| if ((rx.chip_id == CHIP_ID_TXLX) || |
| (rx.chip_id == CHIP_ID_TXHD)) |
| enable |= _BIT(30);/* DRC_RCV*/ |
| else |
| enable |= _BIT(9);/* DRC_RCV*/ |
| if (rx.chip_id == CHIP_ID_TL1) |
| enable |= _BIT(9);/* EMP_RCV*/ |
| enable |= _BIT(20);/* GMD_RCV */ |
| enable |= _BIT(19);/* AIF_RCV */ |
| enable |= _BIT(18);/* AVI_RCV */ |
| enable |= _BIT(17);/* ACR_RCV */ |
| enable |= _BIT(16);/* GCP_RCV */ |
| enable |= _BIT(15);/* VSI_RCV CHG*/ |
| enable |= _BIT(14);/* AMP_RCV*/ |
| pdec_ists_en |= enable; |
| rx_pr("pdec_ists_en=0x%x\n", pdec_ists_en); |
| rx_irq_en(1); |
| } else if (strncmp(input[1], "status", 6) == 0) |
| rx_pkt_status(); |
| else if (strncmp(input[1], "dump", 7) == 0) { |
| /*check input type*/ |
| if (kstrtou32(input[2], 16, &res) < 0) |
| rx_pr("error input:fmt is 0xValue\n"); |
| rx_pkt_dump(res); |
| } else if (strncmp(input[1], "irqdisable", 10) == 0) { |
| if (strncmp(input[2], "fifo", 4) == 0) |
| sts = (PD_FIFO_START_PASS|PD_FIFO_OVERFL); |
| else if (strncmp(input[2], "drm", 3) == 0) { |
| if ((rx.chip_id == CHIP_ID_TXLX) || |
| (rx.chip_id == CHIP_ID_TXHD)) |
| sts = _BIT(30); |
| else |
| sts = _BIT(9); |
| } else if (strncmp(input[2], "gmd", 3) == 0) |
| sts = _BIT(20); |
| else if (strncmp(input[2], "aif", 3) == 0) |
| sts = _BIT(19); |
| else if (strncmp(input[2], "avi", 3) == 0) |
| sts = _BIT(18); |
| else if (strncmp(input[2], "acr", 3) == 0) |
| sts = _BIT(17); |
| else if (strncmp(input[2], "gcp", 3) == 0) |
| sts = GCP_RCV; |
| else if (strncmp(input[2], "vsi", 3) == 0) |
| sts = VSI_RCV; |
| else if (strncmp(input[2], "amp", 3) == 0) |
| sts = _BIT(14); |
| else if (strncmp(input[2], "emp", 3) == 0) { |
| if (rx.chip_id == CHIP_ID_TL1) |
| sts = _BIT(9); |
| else |
| rx_pr("no emp function\n"); |
| } |
| pdec_ists_en &= ~sts; |
| rx_pr("pdec_ists_en=0x%x\n", pdec_ists_en); |
| /*disable irq*/ |
| hdmirx_wr_dwc(DWC_PDEC_IEN_CLR, sts); |
| } else if (strncmp(input[1], "irqenable", 9) == 0) { |
| sts = hdmirx_rd_dwc(DWC_PDEC_IEN); |
| if (strncmp(input[2], "fifo", 4) == 0) |
| enable |= (PD_FIFO_START_PASS|PD_FIFO_OVERFL); |
| else if (strncmp(input[2], "drm", 3) == 0) { |
| if ((rx.chip_id == CHIP_ID_TXLX) || |
| (rx.chip_id == CHIP_ID_TXHD)) |
| enable |= _BIT(30); |
| else |
| enable |= _BIT(9); |
| } else if (strncmp(input[2], "gmd", 3) == 0) |
| enable |= _BIT(20); |
| else if (strncmp(input[2], "aif", 3) == 0) |
| enable |= _BIT(19); |
| else if (strncmp(input[2], "avi", 3) == 0) |
| enable |= _BIT(18); |
| else if (strncmp(input[2], "acr", 3) == 0) |
| enable |= _BIT(17); |
| else if (strncmp(input[2], "gcp", 3) == 0) |
| enable |= GCP_RCV; |
| else if (strncmp(input[2], "vsi", 3) == 0) |
| enable |= VSI_RCV; |
| else if (strncmp(input[2], "amp", 3) == 0) |
| enable |= _BIT(14); |
| else if (strncmp(input[2], "emp", 3) == 0) { |
| if (rx.chip_id == CHIP_ID_TL1) |
| enable |= _BIT(9); |
| else |
| rx_pr("no emp function\n"); |
| } |
| pdec_ists_en = enable|sts; |
| rx_pr("pdec_ists_en=0x%x\n", pdec_ists_en); |
| /*open irq*/ |
| hdmirx_wr_dwc(DWC_PDEC_IEN_SET, pdec_ists_en); |
| /*hdmirx_irq_open()*/ |
| } else if (strncmp(input[1], "fifopkten", 9) == 0) { |
| /*check input*/ |
| if (kstrtou32(input[2], 16, &res) < 0) |
| return; |
| rx_pr("pkt ctl disable:0x%x", res); |
| /*check pkt enable ctl bit*/ |
| sts = rx_pkt_type_mapping((uint32_t)res); |
| if (sts == 0) |
| return; |
| |
| packet_fifo_cfg |= sts; |
| /* not work immediately ?? meybe int is not open*/ |
| enable = hdmirx_rd_dwc(DWC_PDEC_CTRL); |
| enable |= sts; |
| hdmirx_wr_dwc(DWC_PDEC_CTRL, enable); |
| } else if (strncmp(input[1], "fifopktdis", 10) == 0) { |
| /*check input*/ |
| if (kstrtou32(input[2], 16, &res) < 0) |
| return; |
| rx_pr("pkt ctl disable:0x%x", res); |
| /*check pkt enable ctl bit*/ |
| sts = rx_pkt_type_mapping((uint32_t)res); |
| if (sts == 0) |
| return; |
| |
| packet_fifo_cfg &= (~sts); |
| /* not work immediately ?? meybe int is not open*/ |
| enable = hdmirx_rd_dwc(DWC_PDEC_CTRL); |
| enable &= (~sts); |
| hdmirx_wr_dwc(DWC_PDEC_CTRL, enable); |
| } else if (strncmp(input[1], "contentchk", 10) == 0) { |
| /*check input*/ |
| if (kstrtou32(input[2], 16, &res) < 0) { |
| rx_pr("error input:fmt is 0xXX\n"); |
| return; |
| } |
| rx_pkt_content_chk_en(res); |
| } else if (strncmp(input[1], "pdfifopri", 9) == 0) { |
| /*check input*/ |
| if (kstrtou32(input[2], 16, &res) < 0) { |
| rx_pr("error input:fmt is 0xXX\n"); |
| return; |
| } |
| rx_pkt_set_fifo_pri(res); |
| } |
| } |
| |
| static void rx_pktdump_raw(void *pdata) |
| { |
| uint8_t i; |
| union infoframe_u *pktdata = pdata; |
| |
| rx_pr(">---raw data detail------>\n"); |
| rx_pr("HB0:0x%x\n", pktdata->raw_infoframe.pkttype); |
| rx_pr("HB1:0x%x\n", pktdata->raw_infoframe.version); |
| rx_pr("HB2:0x%x\n", pktdata->raw_infoframe.length); |
| rx_pr("RSD:0x%x\n", pktdata->raw_infoframe.rsd); |
| |
| for (i = 0; i < 28; i++) |
| rx_pr("PB%d:0x%x\n", i, pktdata->raw_infoframe.PB[i]); |
| rx_pr(">------------------>end\n"); |
| } |
| |
| static void rx_pktdump_vsi(void *pdata) |
| { |
| struct vsi_infoframe_st *pktdata = pdata; |
| uint32_t i; |
| |
| rx_pr(">---vsi infoframe detail -------->\n"); |
| rx_pr("type: 0x%x\n", pktdata->pkttype); |
| rx_pr("ver: %d\n", pktdata->ver_st.version); |
| rx_pr("chgbit: %d\n", pktdata->ver_st.chgbit); |
| rx_pr("length: %d\n", pktdata->length); |
| |
| rx_pr("ieee: 0x%x\n", pktdata->ieee); |
| rx_pr("3d vdfmt: 0x%x\n", pktdata->sbpkt.vsi.vdfmt); |
| |
| if (pktdata->length == E_DV_LENGTH_24) { |
| /*dobly version v0 pkt*/ |
| |
| } else { |
| if (pktdata->sbpkt.vsi.vdfmt == 0) { |
| rx_pr("no additional vd fmt\n"); |
| } else if (pktdata->sbpkt.vsi.vdfmt == 1) { |
| /*extended resolution format*/ |
| rx_pr("hdmi vic: 0x%x\n", |
| pktdata->sbpkt.vsi.hdmi_vic); |
| } else if (pktdata->sbpkt.vsi.vdfmt == 2) { |
| /*3D format*/ |
| rx_pr("3d struct: 0x%x\n", |
| pktdata->sbpkt.vsi_3Dext.threeD_st); |
| rx_pr("3d ext_data : 0x%x\n", |
| pktdata->sbpkt.vsi_3Dext.threeD_ex); |
| } else { |
| rx_pr("unknown vd fmt\n"); |
| } |
| } |
| |
| for (i = 0; i < 6; i++) |
| rx_pr("payload %d : 0x%x\n", i, |
| pktdata->sbpkt.payload.data[i]); |
| rx_pr(">------------------>end\n"); |
| } |
| |
| static void rx_pktdump_avi(void *pdata) |
| { |
| struct avi_infoframe_st *pktdata = pdata; |
| |
| rx_pr(">---avi infoframe detail -------->\n"); |
| rx_pr("type: 0x%x\n", pktdata->pkttype); |
| rx_pr("ver: %d\n", pktdata->version); |
| rx_pr("length: %d\n", pktdata->length); |
| |
| if (pktdata->version == 1) { |
| /*ver 1*/ |
| rx_pr("scaninfo S: 0x%x\n", pktdata->cont.v1.scaninfo); |
| rx_pr("barinfo B : 0x%x\n", pktdata->cont.v1.barinfo); |
| rx_pr("activeinfo A: 0x%x\n", pktdata->cont.v1.activeinfo); |
| rx_pr("colorimetry Y: 0x%x\n", |
| pktdata->cont.v1.colorindicator); |
| |
| rx_pr("fmt_ration R: 0x%x\n", pktdata->cont.v1.fmt_ration); |
| rx_pr("pic_ration M: 0x%x\n", pktdata->cont.v1.pic_ration); |
| rx_pr("colorimetry C: 0x%x\n", pktdata->cont.v1.colorimetry); |
| |
| rx_pr("colorimetry SC: 0x%x\n", pktdata->cont.v1.pic_scaling); |
| } else { |
| /*ver 2/3*/ |
| rx_pr("scaninfo S: 0x%x\n", pktdata->cont.v2v3.scaninfo); |
| rx_pr("barinfo B: 0x%x\n", pktdata->cont.v2v3.barinfo); |
| rx_pr("activeinfo A: 0x%x\n", pktdata->cont.v2v3.activeinfo); |
| rx_pr("colorimetry Y: 0x%x\n", |
| pktdata->cont.v2v3.colorindicator); |
| |
| rx_pr("fmt_ration R: 0x%x\n", pktdata->cont.v2v3.fmt_ration); |
| rx_pr("pic_ration M: 0x%x\n", pktdata->cont.v2v3.pic_ration); |
| rx_pr("colorimetry C: 0x%x\n", pktdata->cont.v2v3.colorimetry); |
| |
| rx_pr("pic_scaling SC: 0x%x\n", pktdata->cont.v2v3.pic_scaling); |
| rx_pr("qt_range Q: 0x%x\n", pktdata->cont.v2v3.qt_range); |
| rx_pr("ext_color EC : 0x%x\n", pktdata->cont.v2v3.ext_color); |
| rx_pr("it_content ITC: 0x%x\n", pktdata->cont.v2v3.it_content); |
| |
| rx_pr("vic: 0x%x\n", pktdata->cont.v2v3.vic); |
| |
| rx_pr("pix_repeat PR: 0x%x\n", |
| pktdata->cont.v2v3.pix_repeat); |
| rx_pr("content_type CN: 0x%x\n", |
| pktdata->cont.v2v3.content_type); |
| rx_pr("ycc_range YQ: 0x%x\n", |
| pktdata->cont.v2v3.ycc_range); |
| } |
| rx_pr("line_end_topbar: 0x%x\n", |
| pktdata->line_num_end_topbar); |
| rx_pr("line_start_btmbar: 0x%x\n", |
| pktdata->line_num_start_btmbar); |
| rx_pr("pix_num_left_bar: 0x%x\n", |
| pktdata->pix_num_left_bar); |
| rx_pr("pix_num_right_bar: 0x%x\n", |
| pktdata->pix_num_right_bar); |
| rx_pr(">------------------>end\n"); |
| } |
| |
| static void rx_pktdump_spd(void *pdata) |
| { |
| struct spd_infoframe_st *pktdata = pdata; |
| |
| static const char * const spd_source_info[] = { |
| /*0x00 */"unknown", |
| /*0x01 */"Digital STB", |
| /*0x02 */"DVD player", |
| /*0x03 */"D-VHS", |
| /*0x04*/ "HDD Videorecorder", |
| /*0x05 */"DVC", |
| /*0x06 */"DSC", |
| /*0x07 */"Video CD", |
| /*0x08 */"Game", |
| /*0x09 */"PC general", |
| /*0x0A */"Blu-Ray Disc (BD)", |
| /*0x0B */"Super Audio CD", |
| /*0x0C */"HD DVD", |
| /*0x0D */"PMP", |
| }; |
| |
| rx_pr(">---spd infoframe detail ---->\n"); |
| |
| rx_pr("type: 0x%x\n", pktdata->pkttype); |
| rx_pr("ver: %d\n", pktdata->version); |
| rx_pr("length: %d\n", pktdata->length); |
| |
| rx_pr("vendor name: %s\n", pktdata->vendor_name); |
| rx_pr("product des: %s\n", pktdata->product_des); |
| rx_pr("source info: 0x%x\n", pktdata->source_info); |
| if (pktdata->source_info <= 0x0d) |
| rx_pr("source info: %s\n", |
| spd_source_info[pktdata->source_info]); |
| else |
| rx_pr("unknown\n"); |
| |
| rx_pr(">------------------>end\n"); |
| } |
| |
| static void rx_pktdump_aud(void *pdata) |
| { |
| struct aud_infoframe_st *pktdata = pdata; |
| |
| rx_pr(">---audio infoframe detail ---->\n"); |
| |
| rx_pr("type: 0x%x\n", pktdata->pkttype); |
| rx_pr("ver: %d\n", pktdata->version); |
| rx_pr("length: %d\n", pktdata->length); |
| |
| rx_pr("ch_count(CC):0x%x\n", pktdata->ch_count); |
| rx_pr("coding_type(CT):0x%x\n", pktdata->coding_type); |
| rx_pr("sample_size(SS):0x%x\n", pktdata->sample_size); |
| rx_pr("sample_frq(SF):0x%x\n", pktdata->sample_frq); |
| |
| rx_pr("fromat(PB3):0x%x\n", pktdata->fromat); |
| rx_pr("mul_ch(CA):0x%x\n", pktdata->ca); |
| rx_pr("lfep(BL):0x%x\n", pktdata->lfep); |
| rx_pr("level_shift_value(LSV):0x%x\n", pktdata->level_shift_value); |
| rx_pr("down_mix(DM_INH):0x%x\n", pktdata->down_mix); |
| rx_pr(">------------------>end\n"); |
| } |
| |
| static void rx_pktdump_drm(void *pdata) |
| { |
| struct drm_infoframe_st *pktdata = pdata; |
| union infoframe_u pktraw; |
| |
| memset(&pktraw, 0, sizeof(union infoframe_u)); |
| |
| rx_pr(">---drm infoframe detail -------->\n"); |
| rx_pr("type: 0x%x\n", pktdata->pkttype); |
| rx_pr("ver: %d\n", pktdata->version); |
| rx_pr("length: %d\n", pktdata->length); |
| |
| rx_pr("b1 eotf: 0x%x\n", pktdata->des_u.tp1.eotf); |
| rx_pr("b2 meta des id: 0x%x\n", pktdata->des_u.tp1.meta_des_id); |
| |
| rx_pr("dis_pri_x0: %d\n", pktdata->des_u.tp1.dis_pri_x0); |
| rx_pr("dis_pri_y0: %d\n", pktdata->des_u.tp1.dis_pri_y0); |
| rx_pr("dis_pri_x1: %d\n", pktdata->des_u.tp1.dis_pri_x1); |
| rx_pr("dis_pri_y1: %d\n", pktdata->des_u.tp1.dis_pri_y1); |
| rx_pr("dis_pri_x2: %d\n", pktdata->des_u.tp1.dis_pri_x2); |
| rx_pr("dis_pri_y2: %d\n", pktdata->des_u.tp1.dis_pri_y2); |
| rx_pr("white_points_x: %d\n", |
| pktdata->des_u.tp1.white_points_x); |
| rx_pr("white_points_y: %d\n", |
| pktdata->des_u.tp1.white_points_y); |
| rx_pr("max_dislum: %d\n", pktdata->des_u.tp1.max_dislum); |
| rx_pr("min_dislum: %d\n", pktdata->des_u.tp1.min_dislum); |
| rx_pr("max_light_lvl: %d\n", pktdata->des_u.tp1.max_light_lvl); |
| rx_pr("max_fa_light_lvl: %d\n", pktdata->des_u.tp1.max_fa_light_lvl); |
| rx_pr(">------------------>end\n"); |
| } |
| |
| static void rx_pktdump_acr(void *pdata) |
| { |
| struct acr_pkt_st *pktdata = pdata; |
| uint32_t CTS; |
| uint32_t N; |
| |
| rx_pr(">---audio clock regeneration detail ---->\n"); |
| |
| rx_pr("type: 0x%0x\n", pktdata->pkttype); |
| |
| CTS = (pktdata->sbpkt1.SB1_CTS_H << 16) | |
| (pktdata->sbpkt1.SB2_CTS_M << 8) | |
| pktdata->sbpkt1.SB3_CTS_L; |
| |
| N = (pktdata->sbpkt1.SB4_N_H << 16) | |
| (pktdata->sbpkt1.SB5_N_M << 8) | |
| pktdata->sbpkt1.SB6_N_L; |
| rx_pr("sbpkt1 CTS: %d\n", CTS); |
| rx_pr("sbpkt1 N : %d\n", N); |
| |
| #if 0 |
| CTS = (pktdata->sbpkt2.SB1_CTS_H << 16) | |
| (pktdata->sbpkt2.SB2_CTS_M << 8) | |
| pktdata->sbpkt2.SB3_CTS_L; |
| |
| N = (pktdata->sbpkt2.SB4_N_H << 16) | |
| (pktdata->sbpkt2.SB5_N_M << 8) | |
| pktdata->sbpkt2.SB6_N_L; |
| rx_pr("sbpkt2 CTS: %d\n", CTS); |
| rx_pr("sbpkt2 N : %d\n", N); |
| |
| |
| CTS = (pktdata->sbpkt3.SB1_CTS_H << 16) | |
| (pktdata->sbpkt3.SB2_CTS_M << 8) | |
| pktdata->sbpkt3.SB3_CTS_L; |
| |
| N = (pktdata->sbpkt3.SB4_N_H << 16) | |
| (pktdata->sbpkt3.SB5_N_M << 8) | |
| pktdata->sbpkt3.SB6_N_L; |
| rx_pr("sbpkt3 CTS: %d\n", CTS); |
| rx_pr("sbpkt3 N : %d\n", N); |
| |
| |
| CTS = (pktdata->sbpkt4.SB1_CTS_H << 16) | |
| (pktdata->sbpkt4.SB2_CTS_M << 8) | |
| pktdata->sbpkt4.SB3_CTS_L; |
| |
| N = (pktdata->sbpkt4.SB4_N_H << 16) | |
| (pktdata->sbpkt4.SB5_N_M << 8) | |
| pktdata->sbpkt4.SB6_N_L; |
| rx_pr("sbpkt4 CTS: %d\n", CTS); |
| rx_pr("sbpkt4 N : %d\n", N); |
| #endif |
| rx_pr(">------------------>end\n"); |
| } |
| |
| static void rx_pktdump_emp(void *pdata) |
| { |
| struct emp_pkt_st *pktdata = pdata; |
| |
| rx_pr("pkttype=0x%x\n", pktdata->pkttype); |
| rx_pr("first=0x%x\n", pktdata->first); |
| rx_pr("last=0x%x\n", pktdata->last); |
| rx_pr("sequence_idx=0x%x\n", pktdata->sequence_idx); |
| rx_pr("cnt.new=0x%x\n", pktdata->cnt.new); |
| rx_pr("cnt.end=0x%x\n", pktdata->cnt.end); |
| rx_pr("cnt.ds_type=0x%x\n", pktdata->cnt.ds_type); |
| rx_pr("cnt.afr=0x%x\n", pktdata->cnt.afr); |
| rx_pr("cnt.vfr=0x%x\n", pktdata->cnt.vfr); |
| rx_pr("cnt.sync=0x%x\n", pktdata->cnt.sync); |
| rx_pr("cnt.or_id=0x%x\n", pktdata->cnt.organization_id); |
| rx_pr("cnt.tag=0x%x\n", pktdata->cnt.data_set_tag); |
| rx_pr("cnt.length=0x%x\n", pktdata->cnt.data_set_length); |
| } |
| |
| void rx_pkt_dump(enum pkt_type_e typeID) |
| { |
| struct packet_info_s *prx = &rx_pkt; |
| union infoframe_u pktdata; |
| |
| rx_pr("dump cmd:0x%x\n", typeID); |
| |
| /*mutex_lock(&pktbuff_lock);*/ |
| memset(&pktdata, 0, sizeof(pktdata)); |
| switch (typeID) { |
| /*infoframe pkt*/ |
| case PKT_TYPE_INFOFRAME_VSI: |
| rx_pktdump_raw(&prx->vs_info); |
| rx_pktdump_vsi(&prx->vs_info); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_vsi_ex(&pktdata); |
| rx_pktdump_vsi(&pktdata); |
| break; |
| case PKT_TYPE_INFOFRAME_AVI: |
| rx_pktdump_raw(&prx->avi_info); |
| rx_pktdump_avi(&prx->avi_info); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_avi_ex(&pktdata); |
| rx_pktdump_avi(&pktdata); |
| break; |
| case PKT_TYPE_INFOFRAME_SPD: |
| rx_pktdump_raw(&prx->spd_info); |
| rx_pktdump_spd(&prx->spd_info); |
| break; |
| case PKT_TYPE_INFOFRAME_AUD: |
| rx_pktdump_raw(&prx->aud_pktinfo); |
| rx_pktdump_aud(&prx->aud_pktinfo); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_audif_ex(&pktdata); |
| rx_pktdump_raw(&pktdata); |
| break; |
| case PKT_TYPE_INFOFRAME_MPEGSRC: |
| rx_pktdump_raw(&prx->mpegs_info); |
| /*rx_pktdump_mpeg(&prx->mpegs_info);*/ |
| break; |
| case PKT_TYPE_INFOFRAME_NVBI: |
| rx_pktdump_raw(&prx->ntscvbi_info); |
| /*rx_pktdump_ntscvbi(&prx->ntscvbi_info);*/ |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_ntscvbi_ex(&pktdata); |
| rx_pktdump_raw(&pktdata); |
| break; |
| case PKT_TYPE_INFOFRAME_DRM: |
| rx_pktdump_raw(&prx->drm_info); |
| rx_pktdump_drm(&prx->drm_info); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_drm_ex(&pktdata); |
| rx_pktdump_drm(&pktdata); |
| break; |
| /*other pkt*/ |
| case PKT_TYPE_ACR: |
| rx_pktdump_raw(&prx->acr_info); |
| rx_pktdump_acr(&prx->acr_info); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_acr_ex(&pktdata); |
| rx_pktdump_acr(&pktdata); |
| break; |
| case PKT_TYPE_GCP: |
| rx_pktdump_raw(&prx->gcp_info); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_gcp_ex(&pktdata); |
| rx_pktdump_raw(&pktdata); |
| break; |
| case PKT_TYPE_ACP: |
| rx_pktdump_raw(&prx->acp_info); |
| break; |
| case PKT_TYPE_ISRC1: |
| rx_pktdump_raw(&prx->isrc1_info); |
| break; |
| case PKT_TYPE_ISRC2: |
| rx_pktdump_raw(&prx->isrc2_info); |
| break; |
| case PKT_TYPE_GAMUT_META: |
| rx_pktdump_raw(&prx->gameta_info); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_gmd_ex(&pktdata); |
| rx_pktdump_raw(&pktdata); |
| break; |
| case PKT_TYPE_AUD_META: |
| rx_pktdump_raw(&prx->amp_info); |
| rx_pr("-------->ex register set >>\n"); |
| rx_pkt_get_amp_ex(&pktdata); |
| rx_pktdump_raw(&pktdata); |
| break; |
| case PKT_TYPE_EMP: |
| rx_pktdump_emp(&prx->emp_info); |
| rx_pktdump_raw(&prx->emp_info); |
| break; |
| default: |
| rx_pr("warning: not support\n"); |
| rx_pr("vsi->0x81:Vendor-Specific infoframe\n"); |
| rx_pr("avi->0x82:Auxiliary video infoframe\n"); |
| rx_pr("spd->0x83:Source Product Description infoframe\n"); |
| rx_pr("aud->0x84:Audio infoframe\n"); |
| rx_pr("mpeg->0x85:MPEG infoframe\n"); |
| rx_pr("nvbi->0x86:NTSC VBI infoframe\n"); |
| rx_pr("drm->0x87:DRM infoframe\n"); |
| rx_pr("acr->0x01:audio clk regeneration\n"); |
| rx_pr("gcp->0x03\n"); |
| rx_pr("acp->0x04\n"); |
| rx_pr("isrc1->0x05\n"); |
| rx_pr("isrc2->0x06\n"); |
| rx_pr("gmd->0x0a\n"); |
| rx_pr("amp->0x0d\n"); |
| rx_pr("emp->0x7f:EMP\n"); |
| break; |
| } |
| |
| /*mutex_unlock(&pktbuff_lock);*/ |
| } |
| |
| uint32_t rx_pkt_type_mapping(enum pkt_type_e pkt_type) |
| { |
| struct pkt_typeregmap_st *ptab = pktmaping; |
| uint32_t i = 0; |
| uint32_t rt = 0; |
| |
| while (ptab[i].pkt_type != K_FLAG_TAB_END) { |
| if (ptab[i].pkt_type == pkt_type) |
| rt = ptab[i].reg_bit; |
| i++; |
| } |
| return rt; |
| } |
| |
| #if 0 |
| /*this function for debug*/ |
| static void rx_pkt_enable(uint32_t type_regbit) |
| { |
| uint32_t data32; |
| |
| data32 = hdmirx_rd_dwc(DWC_PDEC_CTRL); |
| data32 |= type_regbit; |
| hdmirx_wr_dwc(DWC_PDEC_CTRL, data32); |
| |
| /*add for enable pd fifo start int for debug*/ |
| if ((pdec_ists_en & PD_FIFO_START_PASS) == 0) { |
| pdec_ists_en |= PD_FIFO_START_PASS; |
| hdmirx_irq_enable(true); |
| } |
| } |
| |
| /*this function for debug*/ |
| static void rx_pkt_disable(uint32_t type_regbit) |
| { |
| uint32_t data32; |
| |
| data32 = hdmirx_rd_dwc(DWC_PDEC_CTRL); |
| data32 &= ~type_regbit; |
| hdmirx_wr_dwc(DWC_PDEC_CTRL, data32); |
| } |
| #endif |
| |
| void rx_pkt_initial(void) |
| { |
| memset(&rxpktsts, 0, sizeof(struct rxpkt_st)); |
| |
| memset(&rx_pkt.vs_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.avi_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.spd_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.aud_pktinfo, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.mpegs_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.ntscvbi_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.drm_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.emp_info, 0, sizeof(struct pd_infoframe_s)); |
| |
| memset(&rx_pkt.acr_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.gcp_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.acp_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.isrc1_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.isrc2_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.gameta_info, 0, sizeof(struct pd_infoframe_s)); |
| memset(&rx_pkt.amp_info, 0, sizeof(struct pd_infoframe_s)); |
| |
| } |
| |
| /*please ignore checksum byte*/ |
| void rx_pkt_get_audif_ex(void *pktinfo) |
| { |
| struct aud_infoframe_st *pkt = pktinfo; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| /*memset(pkt, 0, sizeof(struct aud_infoframe_st));*/ |
| |
| pkt->pkttype = PKT_TYPE_INFOFRAME_AUD; |
| pkt->version = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, MSK(8, 0)); |
| pkt->length = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, MSK(5, 8)); |
| pkt->checksum = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, MSK(8, 16)); |
| pkt->rsd = 0; |
| |
| /*get AudioInfo */ |
| pkt->coding_type = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, CODING_TYPE); |
| pkt->ch_count = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, CHANNEL_COUNT); |
| pkt->sample_frq = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, SAMPLE_FREQ); |
| pkt->sample_size = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, SAMPLE_SIZE); |
| pkt->fromat = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, AIF_DATA_BYTE_3); |
| pkt->ca = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB0, CH_SPEAK_ALLOC); |
| pkt->down_mix = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB1, DWNMIX_INHIBIT); |
| pkt->level_shift_value = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB1, LEVEL_SHIFT_VAL); |
| pkt->lfep = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AIF_PB1, MSK(2, 8)); |
| } |
| |
| void rx_pkt_get_acr_ex(void *pktinfo) |
| { |
| struct acr_pkt_st *pkt = pktinfo; |
| uint32_t N, CTS; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| /*memset(pkt, 0, sizeof(struct acr_pkt_st));*/ |
| |
| pkt->pkttype = PKT_TYPE_ACR; |
| pkt->zero0 = 0x0; |
| pkt->zero1 = 0x0; |
| |
| CTS = hdmirx_rd_dwc(DWC_PDEC_ACR_CTS); |
| N = hdmirx_rd_dwc(DWC_PDEC_ACR_N); |
| |
| pkt->sbpkt1.SB1_CTS_H = ((CTS >> 16) & 0xf); |
| pkt->sbpkt1.SB2_CTS_M = ((CTS >> 8) & 0xff); |
| pkt->sbpkt1.SB3_CTS_L = (CTS & 0xff); |
| pkt->sbpkt1.SB4_N_H = ((N >> 16) & 0xf); |
| pkt->sbpkt1.SB5_N_M = ((N >> 8) & 0xff); |
| pkt->sbpkt1.SB6_N_L = (N & 0xff); |
| |
| pkt->sbpkt2.SB1_CTS_H = ((CTS >> 16) & 0xf); |
| pkt->sbpkt2.SB2_CTS_M = ((CTS >> 8) & 0xff); |
| pkt->sbpkt2.SB3_CTS_L = (CTS & 0xff); |
| pkt->sbpkt2.SB4_N_H = ((N >> 16) & 0xf); |
| pkt->sbpkt2.SB5_N_M = ((N >> 8) & 0xff); |
| pkt->sbpkt2.SB6_N_L = (N & 0xff); |
| |
| pkt->sbpkt3.SB1_CTS_H = ((CTS >> 16) & 0xf); |
| pkt->sbpkt3.SB2_CTS_M = ((CTS >> 8) & 0xff); |
| pkt->sbpkt3.SB3_CTS_L = (CTS & 0xff); |
| pkt->sbpkt3.SB4_N_H = ((N >> 16) & 0xf); |
| pkt->sbpkt3.SB5_N_M = ((N >> 8) & 0xff); |
| pkt->sbpkt3.SB6_N_L = (N & 0xff); |
| |
| pkt->sbpkt4.SB1_CTS_H = ((CTS >> 16) & 0xf); |
| pkt->sbpkt4.SB2_CTS_M = ((CTS >> 8) & 0xff); |
| pkt->sbpkt4.SB3_CTS_L = (CTS & 0xff); |
| pkt->sbpkt4.SB4_N_H = ((N >> 16) & 0xf); |
| pkt->sbpkt4.SB5_N_M = ((N >> 8) & 0xff); |
| pkt->sbpkt4.SB6_N_L = (N & 0xff); |
| |
| } |
| |
| /*please ignore checksum byte*/ |
| void rx_pkt_get_avi_ex(void *pktinfo) |
| { |
| struct avi_infoframe_st *pkt = pktinfo; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| /*memset(pkt, 0, sizeof(struct avi_infoframe_st));*/ |
| |
| pkt->pkttype = PKT_TYPE_INFOFRAME_AVI; |
| pkt->version = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_HB, MSK(8, 0)); |
| pkt->length = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_HB, MSK(5, 8)); |
| |
| pkt->checksum = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_HB, MSK(8, 16)); |
| /* AVI parameters */ |
| pkt->cont.v2v3.vic = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, VID_IDENT_CODE); |
| pkt->cont.v2v3.pix_repeat = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_HB, PIX_REP_FACTOR); |
| pkt->cont.v2v3.colorindicator = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, VIDEO_FORMAT); |
| pkt->cont.v2v3.it_content = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, IT_CONTENT); |
| pkt->cont.v2v3.pic_scaling = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, RGB_QUANT_RANGE); |
| pkt->cont.v2v3.content_type = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_HB, MSK(2, 28)); |
| pkt->cont.v2v3.qt_range = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_HB, YUV_QUANT_RANGE); |
| pkt->cont.v2v3.activeinfo = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, ACT_INFO_PRESENT); |
| pkt->cont.v2v3.barinfo = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, BAR_INFO_VALID); |
| pkt->cont.v2v3.scaninfo = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, SCAN_INFO); |
| pkt->cont.v2v3.colorimetry = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, COLORIMETRY); |
| pkt->cont.v2v3.pic_ration = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, PIC_ASPECT_RATIO); |
| pkt->cont.v2v3.fmt_ration = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, ACT_ASPECT_RATIO); |
| pkt->cont.v2v3.it_content = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, IT_CONTENT); |
| pkt->cont.v2v3.ext_color = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, EXT_COLORIMETRY); |
| pkt->cont.v2v3.pic_scaling = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_PB, NON_UNIF_SCALE); |
| |
| pkt->line_num_end_topbar = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_TBB, LIN_END_TOP_BAR); |
| pkt->line_num_start_btmbar = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_TBB, LIN_ST_BOT_BAR); |
| pkt->pix_num_left_bar = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_LRB, PIX_END_LEF_BAR); |
| pkt->pix_num_right_bar = |
| hdmirx_rd_bits_dwc(DWC_PDEC_AVI_LRB, PIX_ST_RIG_BAR); |
| } |
| |
| void rx_pkt_get_vsi_ex(void *pktinfo) |
| { |
| struct vsi_infoframe_st *pkt = pktinfo; |
| uint32_t st0; |
| uint32_t st1; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| /*memset(pkt, 0, sizeof(struct vsi_infoframe_st));*/ |
| |
| /*length = 0x18,PB6-PB24 = 0x00*/ |
| st0 = hdmirx_rd_dwc(DWC_PDEC_VSI_ST0); |
| st1 = hdmirx_rd_dwc(DWC_PDEC_VSI_ST1); |
| |
| pkt->pkttype = PKT_TYPE_INFOFRAME_VSI; |
| pkt->length = st1 & 0x1f; |
| |
| pkt->checksum = (st0 >> 24) & 0xff; |
| pkt->ieee = st0 & 0xffffff; |
| |
| pkt->ver_st.version = 0; |
| pkt->ver_st.chgbit = 0; |
| |
| if (rx.chip_id != CHIP_ID_TXHD) { |
| pkt->sbpkt.payload.data[0] = |
| hdmirx_rd_dwc(DWC_PDEC_VSI_PLAYLOAD0); |
| pkt->sbpkt.payload.data[1] = |
| hdmirx_rd_dwc(DWC_PDEC_VSI_PLAYLOAD1); |
| pkt->sbpkt.payload.data[2] = |
| hdmirx_rd_dwc(DWC_PDEC_VSI_PLAYLOAD2); |
| pkt->sbpkt.payload.data[3] = |
| hdmirx_rd_dwc(DWC_PDEC_VSI_PLAYLOAD3); |
| pkt->sbpkt.payload.data[4] = |
| hdmirx_rd_dwc(DWC_PDEC_VSI_PLAYLOAD4); |
| pkt->sbpkt.payload.data[5] = |
| hdmirx_rd_dwc(DWC_PDEC_VSI_PLAYLOAD5); |
| } |
| } |
| |
| /*return 32 byte data , data struct see register spec*/ |
| void rx_pkt_get_amp_ex(void *pktinfo) |
| { |
| struct pd_infoframe_s *pkt = pktinfo; |
| uint32_t HB; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| /*memset(pkt, 0, sizeof(struct pd_infoframe_s));*/ |
| if (rx.chip_id != CHIP_ID_TXHD) { |
| HB = hdmirx_rd_dwc(DWC_PDEC_AMP_HB); |
| pkt->HB = (HB << 8) | PKT_TYPE_AUD_META; |
| pkt->PB0 = hdmirx_rd_dwc(DWC_PDEC_AMP_PB0); |
| pkt->PB1 = hdmirx_rd_dwc(DWC_PDEC_AMP_PB1); |
| pkt->PB2 = hdmirx_rd_dwc(DWC_PDEC_AMP_PB2); |
| pkt->PB3 = hdmirx_rd_dwc(DWC_PDEC_AMP_PB3); |
| pkt->PB4 = hdmirx_rd_dwc(DWC_PDEC_AMP_PB4); |
| pkt->PB5 = hdmirx_rd_dwc(DWC_PDEC_AMP_PB5); |
| pkt->PB6 = hdmirx_rd_dwc(DWC_PDEC_AMP_PB6); |
| } |
| } |
| |
| void rx_pkt_get_gmd_ex(void *pktinfo) |
| { |
| struct gamutmeta_pkt_st *pkt = pktinfo; |
| uint32_t HB, PB; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| /*memset(pkt, 0, sizeof(struct gamutmeta_pkt_st));*/ |
| |
| pkt->pkttype = PKT_TYPE_GAMUT_META; |
| |
| HB = hdmirx_rd_dwc(DWC_PDEC_GMD_HB); |
| PB = hdmirx_rd_dwc(DWC_PDEC_GMD_PB); |
| |
| /*3:0*/ |
| pkt->affect_seq_num = (HB & 0xf); |
| /*6:4*/ |
| pkt->gbd_profile = ((HB >> 4) & 0x7); |
| /*7*/ |
| pkt->next_feild = ((HB >> 7) & 0x1); |
| /*11:8*/ |
| pkt->cur_seq_num = ((HB >> 8) & 0xf); |
| /*13:12*/ |
| pkt->pkt_seq = ((HB >> 12) & 0x3); |
| /*15*/ |
| pkt->no_cmt_gbd = ((HB >> 15) & 0x1); |
| |
| pkt->sbpkt.p1_profile.gbd_length_l = (PB & 0xff); |
| pkt->sbpkt.p1_profile.gbd_length_h = ((PB >> 8) & 0xff); |
| pkt->sbpkt.p1_profile.checksum = ((PB >> 16) & 0xff); |
| } |
| |
| void rx_pkt_get_gcp_ex(void *pktinfo) |
| { |
| struct gcp_pkt_st *pkt = pktinfo; |
| uint32_t gcpAVMUTE; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| /*memset(pkt, 0, sizeof(struct gcp_pkt_st));*/ |
| |
| gcpAVMUTE = hdmirx_rd_dwc(DWC_PDEC_GCP_AVMUTE); |
| |
| pkt->pkttype = PKT_TYPE_GCP; |
| pkt->sbpkt.clr_avmute = (gcpAVMUTE & 0x01); |
| pkt->sbpkt.set_avmute = ((gcpAVMUTE >> 1) & 0x01); |
| pkt->sbpkt.colordepth = ((gcpAVMUTE >> 4) & 0xf); |
| pkt->sbpkt.pixelpkgphase = ((gcpAVMUTE >> 8) & 0xf); |
| pkt->sbpkt.def_phase = ((gcpAVMUTE >> 12) & 0x01); |
| } |
| |
| void rx_pkt_get_drm_ex(void *pktinfo) |
| { |
| struct drm_infoframe_st *drmpkt = pktinfo; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| drmpkt->pkttype = PKT_TYPE_INFOFRAME_DRM; |
| if (rx.chip_id != CHIP_ID_TXHD) { |
| drmpkt->length = (hdmirx_rd_dwc(DWC_PDEC_DRM_HB) >> 8); |
| drmpkt->version = hdmirx_rd_dwc(DWC_PDEC_DRM_HB); |
| |
| drmpkt->des_u.payload[0] = |
| hdmirx_rd_dwc(DWC_PDEC_DRM_PAYLOAD0); |
| drmpkt->des_u.payload[1] = |
| hdmirx_rd_dwc(DWC_PDEC_DRM_PAYLOAD1); |
| drmpkt->des_u.payload[2] = |
| hdmirx_rd_dwc(DWC_PDEC_DRM_PAYLOAD2); |
| drmpkt->des_u.payload[3] = |
| hdmirx_rd_dwc(DWC_PDEC_DRM_PAYLOAD3); |
| drmpkt->des_u.payload[4] = |
| hdmirx_rd_dwc(DWC_PDEC_DRM_PAYLOAD4); |
| drmpkt->des_u.payload[5] = |
| hdmirx_rd_dwc(DWC_PDEC_DRM_PAYLOAD5); |
| drmpkt->des_u.payload[6] = |
| hdmirx_rd_dwc(DWC_PDEC_DRM_PAYLOAD6); |
| } |
| } |
| |
| /*return 32 byte data , data struct see register spec*/ |
| void rx_pkt_get_ntscvbi_ex(void *pktinfo) |
| { |
| struct pd_infoframe_s *pkt = pktinfo; |
| |
| if (pktinfo == NULL) { |
| rx_pr("pkinfo null\n"); |
| return; |
| } |
| |
| if (rx.chip_id != CHIP_ID_TXHD) { |
| /*byte 0 , 1*/ |
| pkt->HB = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_HB); |
| pkt->PB0 = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_PB0); |
| pkt->PB1 = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_PB1); |
| pkt->PB2 = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_PB2); |
| pkt->PB3 = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_PB3); |
| pkt->PB4 = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_PB4); |
| pkt->PB5 = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_PB5); |
| pkt->PB6 = hdmirx_rd_dwc(DWC_PDEC_NTSCVBI_PB6); |
| } |
| } |
| |
| uint32_t rx_pkt_chk_attach_vsi(void) |
| { |
| if (rxpktsts.pkt_attach_vsi) |
| return 1; |
| else |
| return 0; |
| } |
| |
| void rx_pkt_clr_attach_vsi(void) |
| { |
| rxpktsts.pkt_attach_vsi = 0; |
| } |
| |
| uint32_t rx_pkt_chk_attach_drm(void) |
| { |
| if (rxpktsts.pkt_attach_drm) |
| return 1; |
| else |
| return 0; |
| } |
| |
| void rx_pkt_clr_attach_drm(void) |
| { |
| rxpktsts.pkt_attach_drm = 0; |
| } |
| |
| |
| uint32_t rx_pkt_chk_busy_vsi(void) |
| { |
| if (rxpktsts.pkt_op_flag & PKT_OP_VSI) |
| return 1; |
| else |
| return 0; |
| } |
| |
| uint32_t rx_pkt_chk_busy_drm(void) |
| { |
| if (rxpktsts.pkt_op_flag & PKT_OP_DRM) |
| return 1; |
| else |
| return 0; |
| } |
| |
| #if 0 |
| static int vsi_handler(struct hdmi_rx_ctrl *ctx) |
| { |
| struct vendor_specific_info_s *vs_info = &rx.vendor_specific_info; |
| |
| rx_pkt_getvsinfo(vs_info); |
| if (log_level & VSI_LOG) |
| rx_pr("dolby vision:%d,dolby_vision_sts %d)\n", |
| vs_info->dolby_vision, vs_info->dolby_vision_sts); |
| return true; |
| } |
| #endif |
| |
| /* version2.86 ieee-0x00d046, length 0x1B |
| * pb4 bit[0]: Low_latency |
| * pb4 bit[1]: Dolby_vision_signal |
| * pb5 bit[7]: Backlt_Ctrl_MD_Present |
| * pb5 bit[3:0] | pb6 bit[7:0]: Eff_tmax_PQ |
| * |
| * version2.6 ieee-0x000c03, |
| * start: length 0x18 |
| * stop: 0x05,0x04 |
| * |
| */ |
| void rx_get_vsi_info(void) |
| { |
| struct vsi_infoframe_st *pkt; |
| unsigned int tmp; |
| |
| pkt = (struct vsi_infoframe_st *)&(rx_pkt.vs_info); |
| |
| rx.vs_info_details._3d_structure = 0; |
| rx.vs_info_details._3d_ext_data = 0; |
| rx.vs_info_details.low_latency = false; |
| rx.vs_info_details.backlt_md_bit = false; |
| rx.vs_info_details.dolby_timeout = 0xffff; |
| if ((pkt->length == E_DV_LENGTH_27) && |
| (pkt->ieee == 0x00d046)) { |
| /* dolby1.5 */ |
| tmp = pkt->sbpkt.payload.data[0] & _BIT(1); |
| rx.vs_info_details.dolby_vision = tmp ? true : false; |
| tmp = pkt->sbpkt.payload.data[0] & _BIT(0); |
| rx.vs_info_details.low_latency = tmp ? true : false; |
| tmp = pkt->sbpkt.payload.data[0] >> 15 & 0x01; |
| rx.vs_info_details.backlt_md_bit = tmp ? true : false; |
| if (tmp) { |
| tmp = (pkt->sbpkt.payload.data[0] >> 16 & 0x0f) | |
| (pkt->sbpkt.payload.data[0] & 0xf00); |
| rx.vs_info_details.eff_tmax_pq = tmp; |
| } |
| } else if (pkt->ieee == 0x000c03) { |
| /* dobly10 */ |
| if (pkt->length == E_DV_LENGTH_24) { |
| rx.vs_info_details.dolby_vision = true; |
| if ((pkt->sbpkt.payload.data[0] & 0xffff) == 0) |
| rx.vs_info_details.dolby_timeout = |
| dv_nopacket_timeout; |
| } else if ((pkt->length == E_DV_LENGTH_5) && |
| (pkt->sbpkt.payload.data[0] & 0xffff)) { |
| rx.vs_info_details.dolby_vision = false; |
| } else if ((pkt->length == E_DV_LENGTH_4) && |
| ((pkt->sbpkt.payload.data[0] & 0xff) == 0)) { |
| rx.vs_info_details.dolby_vision = false; |
| } |
| } else if (pkt->ieee == 0xd85dc4) { |
| /*TODO:hdmi2.1 spec vsi packet*/ |
| tmp = pkt->sbpkt.payload.data[0] & _BIT(9); |
| rx.vs_info_details.allm_mode = tmp ? true : false; |
| } else { |
| /*3d VSI*/ |
| if (pkt->sbpkt.vsi_3Dext.vdfmt == VSI_FORMAT_3D_FORMAT) { |
| rx.vs_info_details._3d_structure = |
| pkt->sbpkt.vsi_3Dext.threeD_st; |
| rx.vs_info_details._3d_ext_data = |
| pkt->sbpkt.vsi_3Dext.threeD_ex; |
| if (log_level & VSI_LOG) |
| rx_pr("struct_3d:%d, struct_3d_ext:%d\n", |
| pkt->sbpkt.vsi_3Dext.threeD_st, |
| pkt->sbpkt.vsi_3Dext.threeD_ex); |
| } |
| rx.vs_info_details.dolby_vision = false; |
| } |
| } |
| |
| #if 0 |
| static int rx_pkt_get_drminfo(struct hdmi_rx_ctrl *ctx) |
| { |
| int error = 0; |
| struct drm_infoframe_st *drmpkt; |
| |
| if (rx.state != FSM_SIG_READY) |
| return 0; |
| /* |
| * if (hdr_enable == false) |
| * return 0; |
| */ |
| if (ctx == 0) |
| return -EINVAL; |
| |
| /* waiting, before send the hdr data to post modules */ |
| if (rx.hdr_info.hdr_state != HDR_STATE_NULL) |
| return -EBUSY; |
| |
| /*rx_pkt_get_drm_ex(&drmpkt);*/ |
| drmpkt = (struct drm_infoframe_st *)&(rx.drm_info); |
| |
| rx.hdr_info.hdr_state = HDR_STATE_GET; |
| rx.hdr_info.hdr_data.length = drmpkt->length; |
| rx.hdr_info.hdr_data.eotf = drmpkt->des_u.tp1.eotf; |
| rx.hdr_info.hdr_data.metadata_id = drmpkt->des_u.tp1.meta_des_id; |
| rx.hdr_info.hdr_data.primaries[0].x = drmpkt->des_u.tp1.dis_pri_x0; |
| rx.hdr_info.hdr_data.primaries[0].y = drmpkt->des_u.tp1.dis_pri_y0; |
| rx.hdr_info.hdr_data.primaries[1].x = drmpkt->des_u.tp1.dis_pri_x1; |
| rx.hdr_info.hdr_data.primaries[1].y = drmpkt->des_u.tp1.dis_pri_y1; |
| rx.hdr_info.hdr_data.primaries[2].x = drmpkt->des_u.tp1.dis_pri_x2; |
| rx.hdr_info.hdr_data.primaries[2].y = drmpkt->des_u.tp1.dis_pri_y2; |
| rx.hdr_info.hdr_data.white_points.x = drmpkt->des_u.tp1.white_points_x; |
| rx.hdr_info.hdr_data.white_points.y = drmpkt->des_u.tp1.white_points_y; |
| rx.hdr_info.hdr_data.master_lum.x = drmpkt->des_u.tp1.max_dislum; |
| rx.hdr_info.hdr_data.master_lum.y = drmpkt->des_u.tp1.min_dislum; |
| rx.hdr_info.hdr_data.mcll = drmpkt->des_u.tp1.max_light_lvl; |
| rx.hdr_info.hdr_data.mfall = drmpkt->des_u.tp1.max_fa_light_lvl; |
| |
| rx.hdr_info.hdr_state = HDR_STATE_SET; |
| |
| return error; |
| } |
| #endif |
| |
| void rx_pkt_buffclear(enum pkt_type_e pkt_type) |
| { |
| struct packet_info_s *prx = &rx_pkt; |
| void *pktinfo; |
| |
| if (pkt_type == PKT_TYPE_INFOFRAME_VSI) |
| pktinfo = &prx->vs_info; |
| else if (pkt_type == PKT_TYPE_INFOFRAME_AVI) |
| pktinfo = &prx->avi_info; |
| else if (pkt_type == PKT_TYPE_INFOFRAME_SPD) |
| pktinfo = &prx->spd_info; |
| else if (pkt_type == PKT_TYPE_INFOFRAME_AUD) |
| pktinfo = &prx->aud_pktinfo; |
| else if (pkt_type == PKT_TYPE_INFOFRAME_MPEGSRC) |
| pktinfo = &prx->mpegs_info; |
| else if (pkt_type == PKT_TYPE_INFOFRAME_NVBI) |
| pktinfo = &prx->ntscvbi_info; |
| else if (pkt_type == PKT_TYPE_INFOFRAME_DRM) |
| pktinfo = &prx->drm_info; |
| else if (pkt_type == PKT_TYPE_EMP) |
| pktinfo = &prx->emp_info; |
| else if (pkt_type == PKT_TYPE_ACR) |
| pktinfo = &prx->acr_info; |
| else if (pkt_type == PKT_TYPE_GCP) |
| pktinfo = &prx->gcp_info; |
| else if (pkt_type == PKT_TYPE_ACP) |
| pktinfo = &prx->acp_info; |
| else if (pkt_type == PKT_TYPE_ISRC1) |
| pktinfo = &prx->isrc1_info; |
| else if (pkt_type == PKT_TYPE_ISRC2) |
| pktinfo = &prx->isrc2_info; |
| else if (pkt_type == PKT_TYPE_GAMUT_META) |
| pktinfo = &prx->gameta_info; |
| else if (pkt_type == PKT_TYPE_AUD_META) |
| pktinfo = &prx->amp_info; |
| else { |
| rx_pr("err type:0x%x\n", pkt_type); |
| return; |
| } |
| memset(pktinfo, 0, sizeof(struct pd_infoframe_s)); |
| } |
| |
| void rx_pkt_content_chk_en(uint32_t enable) |
| { |
| rx_pr("content chk:%d\n", enable); |
| if (enable) { |
| if (pkt_testbuff == NULL) |
| pkt_testbuff = kmalloc(sizeof(struct st_pkt_test_buff), |
| GFP_KERNEL); |
| if (pkt_testbuff) { |
| memset(pkt_testbuff, 0, |
| sizeof(struct st_pkt_test_buff)); |
| rxpktsts.pkt_chk_flg = true; |
| } else |
| rx_pr("kmalloc fail for pkt chk\n"); |
| } else { |
| if (rxpktsts.pkt_chk_flg) |
| kfree(pkt_testbuff); |
| rxpktsts.pkt_chk_flg = false; |
| pkt_testbuff = NULL; |
| } |
| } |
| |
| /* |
| * read pkt data from pkt fifo or external register set |
| */ |
| void rx_pkt_set_fifo_pri(uint32_t pri) |
| { |
| gpkt_fifo_pri = pri; |
| rx_pr("gpkt_fifo_pri=%d\n", pri); |
| } |
| |
| uint32_t rx_pkt_get_fifo_pri(void) |
| { |
| return gpkt_fifo_pri; |
| } |
| |
| void rx_pkt_check_content(void) |
| { |
| struct packet_info_s *cur_pkt = &rx_pkt; |
| struct st_pkt_test_buff *pre_pkt; |
| struct rxpkt_st *pktsts; |
| static uint32_t acr_pkt_cnt; |
| static uint32_t ex_acr_pkt_cnt; |
| struct pd_infoframe_s pktdata; |
| |
| pre_pkt = pkt_testbuff; |
| pktsts = &rxpktsts; |
| |
| if (pre_pkt == NULL) |
| return; |
| |
| if (rxpktsts.pkt_chk_flg) { |
| /*compare vsi*/ |
| if (pktsts->pkt_cnt_vsi) { |
| if (memcmp((char *)&pre_pkt->vs_info, |
| (char *)&cur_pkt->vs_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" vsi chg\n"); |
| /*dump pre data*/ |
| rx_pktdump_raw(&(pre_pkt->vs_info)); |
| /*dump current data*/ |
| rx_pktdump_raw(&(cur_pkt->vs_info)); |
| /*save current*/ |
| memcpy(&(pre_pkt->vs_info), &(cur_pkt->vs_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| |
| /*compare avi*/ |
| if (pktsts->pkt_cnt_avi) { |
| if (memcmp((char *)&pre_pkt->avi_info, |
| (char *)&cur_pkt->avi_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" avi chg\n"); |
| rx_pktdump_raw(&(pre_pkt->avi_info)); |
| rx_pktdump_raw(&(cur_pkt->avi_info)); |
| memcpy(&(pre_pkt->avi_info), |
| &(cur_pkt->avi_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| |
| /*compare spd*/ |
| if (pktsts->pkt_cnt_spd) { |
| if (memcmp((char *)&pre_pkt->spd_info, |
| (char *)&cur_pkt->spd_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" spd chg\n"); |
| rx_pktdump_raw(&(pre_pkt->spd_info)); |
| rx_pktdump_raw(&(cur_pkt->spd_info)); |
| memcpy(&(pre_pkt->spd_info), |
| &(cur_pkt->spd_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare aud_pktinfo*/ |
| if (pktsts->pkt_cnt_audif) { |
| if (memcmp((char *)&pre_pkt->aud_pktinfo, |
| (char *)&cur_pkt->aud_pktinfo, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" audif chg\n"); |
| rx_pktdump_raw(&(pre_pkt->aud_pktinfo)); |
| rx_pktdump_raw(&(cur_pkt->aud_pktinfo)); |
| memcpy(&(pre_pkt->aud_pktinfo), |
| &(cur_pkt->aud_pktinfo), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare mpegs_info*/ |
| if (pktsts->pkt_cnt_mpeg) { |
| if (memcmp((char *)&pre_pkt->mpegs_info, |
| (char *)&cur_pkt->mpegs_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pktdump_raw(&(pre_pkt->mpegs_info)); |
| rx_pktdump_raw(&(cur_pkt->mpegs_info)); |
| memcpy(&(pre_pkt->mpegs_info), |
| &(cur_pkt->mpegs_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare ntscvbi_info*/ |
| if (pktsts->pkt_cnt_nvbi) { |
| if (memcmp((char *)&pre_pkt->ntscvbi_info, |
| (char *)&cur_pkt->ntscvbi_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" nvbi chg\n"); |
| rx_pktdump_raw(&(pre_pkt->ntscvbi_info)); |
| rx_pktdump_raw(&(cur_pkt->ntscvbi_info)); |
| memcpy(&(pre_pkt->ntscvbi_info), |
| &(cur_pkt->ntscvbi_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare drm_info*/ |
| if (pktsts->pkt_cnt_drm) { |
| if (memcmp((char *)&pre_pkt->drm_info, |
| (char *)&cur_pkt->drm_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" drm chg\n"); |
| rx_pktdump_raw(&(pre_pkt->drm_info)); |
| rx_pktdump_raw(&(cur_pkt->drm_info)); |
| memcpy(&(pre_pkt->drm_info), |
| &(cur_pkt->drm_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare acr_info*/ |
| if (pktsts->pkt_cnt_acr) { |
| if (memcmp((char *)&pre_pkt->acr_info, |
| (char *)&cur_pkt->acr_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| if (acr_pkt_cnt++ > 100) { |
| acr_pkt_cnt = 0; |
| rx_pr(" acr chg\n"); |
| rx_pktdump_acr(&(cur_pkt->acr_info)); |
| } |
| /*save current*/ |
| memcpy(&(pre_pkt->acr_info), |
| &(cur_pkt->acr_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare gcp_info*/ |
| if (pktsts->pkt_cnt_gcp) { |
| if (memcmp((char *)&pre_pkt->gcp_info, |
| (char *)&cur_pkt->gcp_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" gcp chg\n"); |
| /*dump pre data*/ |
| rx_pktdump_raw(&(pre_pkt->gcp_info)); |
| /*dump current data*/ |
| rx_pktdump_raw(&(cur_pkt->gcp_info)); |
| /*save current*/ |
| memcpy(&(pre_pkt->gcp_info), |
| &(cur_pkt->gcp_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare acp_info*/ |
| if (pktsts->pkt_cnt_acp) { |
| if (memcmp((char *)&pre_pkt->acp_info, |
| (char *)&cur_pkt->acp_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" acp chg\n"); |
| /*dump pre data*/ |
| rx_pktdump_raw(&(pre_pkt->acp_info)); |
| /*dump current data*/ |
| rx_pktdump_raw(&(cur_pkt->acp_info)); |
| /*save current*/ |
| memcpy(&(pre_pkt->acp_info), |
| &(cur_pkt->acp_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare isrc1_info*/ |
| if (pktsts->pkt_cnt_isrc1) { |
| if (memcmp((char *)&pre_pkt->isrc1_info, |
| (char *)&cur_pkt->isrc1_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" isrc2 chg\n"); |
| /*dump pre data*/ |
| rx_pktdump_raw(&(pre_pkt->isrc1_info)); |
| /*dump current data*/ |
| rx_pktdump_raw(&(cur_pkt->isrc1_info)); |
| /*save current*/ |
| memcpy(&(pre_pkt->isrc1_info), |
| &(cur_pkt->isrc1_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare isrc2_info*/ |
| if (pktsts->pkt_cnt_isrc2) { |
| if (memcmp((char *)&pre_pkt->isrc2_info, |
| (char *)&cur_pkt->isrc2_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" isrc1 chg\n"); |
| /*dump pre data*/ |
| rx_pktdump_raw(&(pre_pkt->isrc2_info)); |
| /*dump current data*/ |
| rx_pktdump_raw(&(cur_pkt->isrc2_info)); |
| /*save current*/ |
| memcpy(&(pre_pkt->isrc2_info), |
| &(cur_pkt->isrc2_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare gameta_info*/ |
| if (pktsts->pkt_cnt_gameta) { |
| if (memcmp((char *)&pre_pkt->gameta_info, |
| (char *)&cur_pkt->gameta_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" gmd chg\n"); |
| /*dump pre data*/ |
| rx_pktdump_raw(&(pre_pkt->gameta_info)); |
| /*dump current data*/ |
| rx_pktdump_raw(&(cur_pkt->gameta_info)); |
| /*save current*/ |
| memcpy(&(pre_pkt->gameta_info), |
| &(cur_pkt->gameta_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| /*compare amp_info*/ |
| if (pktsts->pkt_cnt_amp) { |
| if (memcmp((char *)&pre_pkt->amp_info, |
| (char *)&cur_pkt->amp_info, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" amp chg\n"); |
| /*dump pre data*/ |
| rx_pktdump_raw(&(pre_pkt->amp_info)); |
| /*dump current data*/ |
| rx_pktdump_raw(&(cur_pkt->amp_info)); |
| /*save current*/ |
| memcpy(&(pre_pkt->amp_info), |
| &(cur_pkt->amp_info), |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| |
| rx_pkt_get_audif_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_audif, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_audif chg\n"); |
| memcpy(&(pre_pkt->ex_audif), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_acr_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_acr, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| if (ex_acr_pkt_cnt++ > 100) { |
| ex_acr_pkt_cnt = 0; |
| rx_pr(" ex_acr chg\n"); |
| } |
| memcpy(&(pre_pkt->ex_acr), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_avi_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_avi, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_avi chg\n"); |
| memcpy(&(pre_pkt->ex_avi), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_vsi_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_vsi, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_vsi chg\n"); |
| memcpy(&(pre_pkt->ex_vsi), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_amp_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_amp, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_amp chg\n"); |
| memcpy(&(pre_pkt->ex_amp), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_gmd_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_gmd, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_gmd chg\n"); |
| memcpy(&(pre_pkt->ex_gmd), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_gcp_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_gcp, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_gcp chg\n"); |
| memcpy(&(pre_pkt->ex_gcp), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_drm_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_drm, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_drm chg\n"); |
| memcpy(&(pre_pkt->ex_drm), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| |
| rx_pkt_get_ntscvbi_ex(&pktdata); |
| if (memcmp((char *)&pre_pkt->ex_nvbi, |
| (char *)&pktdata, |
| sizeof(struct pd_infoframe_s)) != 0) { |
| rx_pr(" ex_nvbi chg\n"); |
| memcpy(&(pre_pkt->ex_nvbi), &pktdata, |
| sizeof(struct pd_infoframe_s)); |
| } |
| } |
| } |
| |
| int rx_pkt_fifodecode(struct packet_info_s *prx, |
| union infoframe_u *pktdata, |
| struct rxpkt_st *pktsts) |
| { |
| switch (pktdata->raw_infoframe.pkttype) { |
| case PKT_TYPE_INFOFRAME_VSI: |
| pktsts->pkt_attach_vsi++; |
| pktsts->pkt_cnt_vsi++; |
| pktsts->pkt_op_flag |= PKT_OP_VSI; |
| /*memset(&prx->vs_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->vs_info, pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_VSI; |
| break; |
| case PKT_TYPE_INFOFRAME_AVI: |
| pktsts->pkt_cnt_avi++; |
| pktsts->pkt_op_flag |= PKT_OP_AVI; |
| /*memset(&prx->avi_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->avi_info, pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_AVI; |
| break; |
| case PKT_TYPE_INFOFRAME_SPD: |
| pktsts->pkt_cnt_spd++; |
| pktsts->pkt_op_flag |= PKT_OP_SPD; |
| /*memset(&prx->spd_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->spd_info, pktdata, |
| sizeof(struct spd_infoframe_st)); |
| pktsts->pkt_op_flag &= ~PKT_OP_SPD; |
| break; |
| case PKT_TYPE_INFOFRAME_AUD: |
| pktsts->pkt_cnt_audif++; |
| pktsts->pkt_op_flag |= PKT_OP_AIF; |
| /*memset(&prx->aud_pktinfo, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->aud_pktinfo, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_AIF; |
| break; |
| case PKT_TYPE_INFOFRAME_MPEGSRC: |
| pktsts->pkt_cnt_mpeg++; |
| pktsts->pkt_op_flag |= PKT_OP_MPEGS; |
| /*memset(&prx->mpegs_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->mpegs_info, pktdata, |
| sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_MPEGS; |
| break; |
| case PKT_TYPE_INFOFRAME_NVBI: |
| pktsts->pkt_cnt_nvbi++; |
| pktsts->pkt_op_flag |= PKT_OP_NVBI; |
| /* memset(&prx->ntscvbi_info, 0, */ |
| /* sizeof(struct pd_infoframe_s)); */ |
| memcpy(&prx->ntscvbi_info, pktdata, |
| sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_NVBI; |
| break; |
| case PKT_TYPE_INFOFRAME_DRM: |
| pktsts->pkt_attach_drm++; |
| pktsts->pkt_cnt_drm++; |
| pktsts->pkt_op_flag |= PKT_OP_DRM; |
| /*memset(&prx->drm_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->drm_info, pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_DRM; |
| break; |
| |
| case PKT_TYPE_ACR: |
| pktsts->pkt_cnt_acr++; |
| pktsts->pkt_op_flag |= PKT_OP_ACR; |
| /*memset(&prx->acr_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->acr_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_ACR; |
| break; |
| case PKT_TYPE_GCP: |
| pktsts->pkt_cnt_gcp++; |
| pktsts->pkt_op_flag |= PKT_OP_GCP; |
| /*memset(&prx->gcp_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->gcp_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_GCP; |
| break; |
| case PKT_TYPE_ACP: |
| pktsts->pkt_cnt_acp++; |
| pktsts->pkt_op_flag |= PKT_OP_ACP; |
| /*memset(&prx->acp_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->acp_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_ACP; |
| break; |
| case PKT_TYPE_ISRC1: |
| pktsts->pkt_cnt_isrc1++; |
| pktsts->pkt_op_flag |= PKT_OP_ISRC1; |
| /*memset(&prx->isrc1_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->isrc1_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_ISRC1; |
| break; |
| case PKT_TYPE_ISRC2: |
| pktsts->pkt_cnt_isrc2++; |
| pktsts->pkt_op_flag |= PKT_OP_ISRC2; |
| /*memset(&prx->isrc2_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->isrc2_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_ISRC2; |
| break; |
| case PKT_TYPE_GAMUT_META: |
| pktsts->pkt_cnt_gameta++; |
| pktsts->pkt_op_flag |= PKT_OP_GMD; |
| /*memset(&prx->gameta_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->gameta_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_GMD; |
| break; |
| case PKT_TYPE_AUD_META: |
| pktsts->pkt_cnt_amp++; |
| pktsts->pkt_op_flag |= PKT_OP_AMP; |
| /*memset(&prx->amp_info, 0, sizeof(struct pd_infoframe_s));*/ |
| memcpy(&prx->amp_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_AMP; |
| break; |
| case PKT_TYPE_EMP: |
| pktsts->pkt_cnt_emp++; |
| pktsts->pkt_op_flag |= PKT_OP_EMP; |
| memcpy(&prx->emp_info, |
| pktdata, sizeof(struct pd_infoframe_s)); |
| pktsts->pkt_op_flag &= ~PKT_OP_EMP; |
| break; |
| |
| default: |
| break; |
| } |
| |
| return 0; |
| } |
| |
| |
| int rx_pkt_handler(enum pkt_decode_type pkt_int_src) |
| { |
| uint32_t i = 0; |
| uint32_t j = 0; |
| uint32_t pkt_num = 0; |
| uint32_t pkt_cnt = 0; |
| union infoframe_u *pktdata; |
| struct packet_info_s *prx = &rx_pkt; |
| /*uint32_t t1, t2;*/ |
| |
| if (pkt_int_src == PKT_BUFF_SET_FIFO) { |
| /*from pkt fifo*/ |
| if (!pd_fifo_buf) |
| return 0; |
| |
| /*t1 = sched_clock();*/ |
| /*for recode interrupt cnt*/ |
| rxpktsts.fifo_Int_cnt++; |
| |
| /*ps:read 10 packet from fifo cost time < less than 200 us */ |
| if (hdmirx_rd_dwc(DWC_PDEC_STS) & PD_TH_START) { |
| readpkt: |
| /*how many packet number need read from fifo*/ |
| /* If software tries to read more packets from the */ |
| /* FIFO than what is stored already, an underflow */ |
| /* occurs. */ |
| pkt_num = hdmirx_rd_dwc(DWC_PDEC_FIFO_STS1) >> 3; |
| rxpktsts.fifo_pkt_num = pkt_num; |
| |
| for (pkt_cnt = 0; pkt_cnt < pkt_num; pkt_cnt++) { |
| /*read one pkt from fifo*/ |
| for (j = 0; j < K_ONEPKT_BUFF_SIZE; j++) { |
| /*8 word per packet size*/ |
| pd_fifo_buf[i+j] = |
| hdmirx_rd_dwc(DWC_PDEC_FIFO_DATA); |
| } |
| |
| if (log_level & PACKET_LOG) |
| rx_pr("PD[%d]=%x\n", i, pd_fifo_buf[i]); |
| |
| pktdata = (union infoframe_u *)&pd_fifo_buf[i]; |
| /*mutex_lock(&pktbuff_lock);*/ |
| /*pkt decode*/ |
| rx_pkt_fifodecode(prx, pktdata, &rxpktsts); |
| /*mutex_unlock(&pktbuff_lock);*/ |
| i += 8; |
| if (i > (PFIFO_SIZE - 8)) |
| i = 0; |
| } |
| /*while read from buff, other more packets attach*/ |
| pkt_num = hdmirx_rd_dwc(DWC_PDEC_FIFO_STS1) >> 3; |
| if (pkt_num > K_PKT_REREAD_SIZE) |
| goto readpkt; |
| } |
| } else if (pkt_int_src == PKT_BUFF_SET_VSI) { |
| rxpktsts.pkt_attach_vsi++; |
| rxpktsts.pkt_op_flag |= PKT_OP_VSI; |
| rx_pkt_get_vsi_ex(&prx->vs_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_VSI; |
| rxpktsts.pkt_cnt_vsi_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_DRM) { |
| rxpktsts.pkt_attach_drm++; |
| rxpktsts.pkt_op_flag |= PKT_OP_DRM; |
| rx_pkt_get_drm_ex(&prx->drm_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_DRM; |
| rxpktsts.pkt_cnt_drm_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_GMD) { |
| rxpktsts.pkt_op_flag |= PKT_OP_GMD; |
| rx_pkt_get_gmd_ex(&prx->gameta_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_GMD; |
| rxpktsts.pkt_cnt_gmd_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_AIF) { |
| rxpktsts.pkt_op_flag |= PKT_OP_AIF; |
| rx_pkt_get_audif_ex(&prx->aud_pktinfo); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_AIF; |
| rxpktsts.pkt_cnt_aif_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_AVI) { |
| rxpktsts.pkt_op_flag |= PKT_OP_AVI; |
| rx_pkt_get_avi_ex(&prx->avi_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_AVI; |
| rxpktsts.pkt_cnt_avi_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_ACR) { |
| rxpktsts.pkt_op_flag |= PKT_OP_ACR; |
| rx_pkt_get_acr_ex(&prx->acr_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_ACR; |
| rxpktsts.pkt_cnt_acr_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_GCP) { |
| rxpktsts.pkt_op_flag |= PKT_OP_GCP; |
| rx_pkt_get_gcp_ex(&prx->gcp_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_GCP; |
| rxpktsts.pkt_cnt_gcp_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_AMP) { |
| rxpktsts.pkt_op_flag |= PKT_OP_AMP; |
| rx_pkt_get_amp_ex(&prx->amp_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_AMP; |
| rxpktsts.pkt_cnt_amp_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_NVBI) { |
| rxpktsts.pkt_op_flag |= PKT_OP_NVBI; |
| rx_pkt_get_ntscvbi_ex(&prx->ntscvbi_info); |
| rxpktsts.pkt_op_flag &= ~PKT_OP_NVBI; |
| rxpktsts.pkt_cnt_nvbi_ex++; |
| } else if (pkt_int_src == PKT_BUFF_SET_EMP) { |
| rxpktsts.pkt_op_flag &= ~PKT_OP_EMP; |
| rxpktsts.pkt_cnt_emp_ex++; |
| } |
| |
| /*t2 = sched_clock();*/ |
| /* |
| * timerbuff[timerbuff_idx] = pkt_num; |
| * if (timerbuff_idx++ >= 50) |
| * timerbuff_idx = 0; |
| */ |
| return 0; |
| } |
| |