📄 ttx_vbi.c
字号:
/*--------------------------------------------------------------------------+ | Get current STC value +--------------------------------------------------------------------------*/ stc = xp0_dcr_read(XP_DCR_ADDR_STCHI); while ((mb = ttxstat->pes_queue) != NULL) { pts = ((Ttx_mbuf_t)DATA_PTR(mb))->pts; delta = pts - stc; /*----------------------------------------------------------------------+ | PTS is matched to STC, write to VBI buffer +----------------------------------------------------------------------*/ if ((TTX_PTS_MATCH_MIN < delta) && (delta < TTX_PTS_MATCH_MAX) && (get_field(mb) == field_update)) { write_vbi(vbi_base, mb); ttx_m_deq(&ttxstat->pes_queue); ttx_m_enq(&ttxstat->done_queue, mb); ttxstat->stax.inbound_pes++; break; /*----------------------------------------------------------------------+ | Do nothing. This data should be processed future VBI_START +----------------------------------------------------------------------*/ } else if ((TTX_PTS_OUTBOUND_LOW < delta) && (delta < TTX_PTS_OUTBOUND_HIGH)) { break; /*----------------------------------------------------------------------+ | Out of range, discard data and continue loop to process next +----------------------------------------------------------------------*/ } else { ttx_m_deq(&ttxstat->pes_queue); ttx_m_enq(&ttxstat->done_queue, mb); ttxstat->stax.outbound_pes++; continue; } } /*--------------------------------------------------------------------------+ | Set VBI pointer for next VBI scan +--------------------------------------------------------------------------*/ if (field_id&1) { powerpcMtvid0_memcntl(powerpcMfvid0_memcntl()&~DRAM_VBI_POINTER); } else { powerpcMtvid0_memcntl(powerpcMfvid0_memcntl()|DRAM_VBI_POINTER); } return;}/*----------------------------------------------------------------------------+| XXXXXXX XXX XXX XXXXXX XXXXXXX XXXXXX XX XX XX XXXX| XX X XX XX X XX X XX X XX XX XXX XX XXXX XX| XX X XXX XX XX X XX XX XXXX XX XX XX XX| XXXX X XX XXXX XXXXX XX XXXX XX XX XX| XX X XXX XX XX X XX XX XX XXX XXXXXX XX| XX X XX XX XX XX X XX XX XX XX XX XX XX XX| XXXXXXX XXX XXX XXXX XXXXXXX XXX XX XX XX XX XX XXXXXXX+----------------------------------------------------------------------------*//*----------------------------------------------------------------------------+| ttx_vsync_handler| This function is called anytime there is a video decoder interrupt,| but only VBI Start interrupts are processed.+----------------------------------------------------------------------------*/void ttx_vsync_handler(){ unsigned long reg; reg = stb_vid_int_status; if ((reg & DECOD_HOST_MASK_VBI_START) != 0) { ttx_vbi_send(); } return;}/*----------------------------------------------------------------------------+| ttx_vbi_init| Setup video decorder to enable teletext processing.+----------------------------------------------------------------------------*/int ttx_vbi_init(void){ unsigned int reg; unsigned int vdly; /*--------------------------------------------------------------------------+ | Check video mode. This ttx driver supports PAL mode only. +--------------------------------------------------------------------------*/ if (!(powerpcMfvid0_dispm()&DECOD_DISP_MODE_PAL_MODE)) { return(E_TTX_BAD_DISP_MODE); } /*--------------------------------------------------------------------------+ | Check how many VBI lines were assumed by Video Driver. | Set VBI line Count +--------------------------------------------------------------------------*/ ttxstat->num_vbi_lines = VID_VBI_LINES; if (ttxstat->num_vbi_lines < 16) { return(E_TTX_LESS_VBI_COUNT); } else { reg = powerpcMfvid0_vbcntl() & (~DECOD_VBI_CTL_VBI_LINE_MASK); powerpcMtvid0_vbcntl(reg | ttxstat->num_vbi_lines); } /*--------------------------------------------------------------------------+ | Adjust VSYNC delay +--------------------------------------------------------------------------*/ vdly = 23 - ttxstat->num_vbi_lines; powerpcMtvid0_dispd((powerpcMfvid0_dispd()&~0xff)|(vdly&0xff)); /*--------------------------------------------------------------------------+ | Map VBI Logical Address +--------------------------------------------------------------------------*/ if (vid_osd_map_vbi_laddr((ULONG *)&ttxstat->vbi0_addr, (ULONG *)&ttxstat->vbi1_addr) != 0) { return(E_TTX_BAD_VBI_ADDR); } /*--------------------------------------------------------------------------+ | Configure TTX control for field 1. All lines for TELETEXT +--------------------------------------------------------------------------*/ powerpcMtvid0_vbcntl(powerpcMfvid0_vbcntl()&~DECOD_VBI_CTL_TTX_INDEX_MASK); powerpcMtvid0_ttxcntl(0xffffffff); /*--------------------------------------------------------------------------+ | Configure TTX control for field 2. All lines for TELETEXT +--------------------------------------------------------------------------*/ powerpcMtvid0_vbcntl(powerpcMfvid0_vbcntl()|DECOD_VBI_CTL_TTX_INDEX_MASK); powerpcMtvid0_ttxcntl(0xffffffff); /*--------------------------------------------------------------------------+ | Attach to Video Decoder Interrupt Handler to receive VBI Start interrupts +--------------------------------------------------------------------------*/#if 1 if (request_irq(IRQ_VID, ttx_vsync_handler, SA_SHIRQ, "TTXvbi", &ttx_vbi_init) != 0) { vid_osd_unmap_vbi_laddr(); return(E_TTX_VDC_INT_NOTIFY); } vid_atom_set_irq_mask(vid_atom_get_irq_mask() | DECOD_HOST_MASK_VBI_START);#else if (vid_atom_ttx_add_notify(ttx_vsync_handler,DECOD_HOST_MASK_VBI_START) != 0) { vid_osd_unmap_vbi_laddr(); return(E_TTX_VDC_INT_NOTIFY); }#endif return(0);}/*----------------------------------------------------------------------------+| ttx_vbi_term| Setup video decorder to enable teletext processing.+----------------------------------------------------------------------------*/int ttx_vbi_term(void){ unsigned int reg; /*--------------------------------------------------------------------------+ | Remove notification of Video Decoder interrupts for VBI Start +--------------------------------------------------------------------------*/#if 1 vid_atom_set_irq_mask(vid_atom_get_irq_mask() & (~DECOD_HOST_MASK_VBI_START)); free_irq(IRQ_VID, &ttx_vbi_init);#else if (vid_atom_ttx_del_notify(ttx_vsync_handler,DECOD_HOST_MASK_VBI_START) != 0) { return(E_TTX_VDC_INT_NOTIFY); }#endif /*--------------------------------------------------------------------------+ | Change TTX control to reset value +--------------------------------------------------------------------------*/ powerpcMtvid0_vbcntl(powerpcMfvid0_vbcntl()&~DECOD_VBI_CTL_TTX_INDEX_MASK); powerpcMtvid0_ttxcntl(0x00000000); powerpcMtvid0_vbcntl(powerpcMfvid0_vbcntl()|DECOD_VBI_CTL_TTX_INDEX_MASK); powerpcMtvid0_ttxcntl(0x00000000); /*--------------------------------------------------------------------------+ | Reset number of VBI lines +--------------------------------------------------------------------------*/ ttxstat->num_vbi_lines = 0; reg = powerpcMfvid0_vbcntl() & (~DECOD_VBI_CTL_VBI_LINE_MASK); powerpcMtvid0_vbcntl(reg | ttxstat->num_vbi_lines); /*--------------------------------------------------------------------------+ | Unmap VBI Logical Address +--------------------------------------------------------------------------*/ vid_osd_unmap_vbi_laddr(); return(0);}/*----------------------------------------------------------------------------+| XX XXXXXX XXXXXX XXXXX| XXXX XX XX XX XX XX| XX XX XX XX XX XX| XX XX XXXXX XX XX| XXXXXX XX XX XX| XX XX XX XX XX XX| XX XX XX XXXXXX XXXXX+----------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -