⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfd_drv_nec16312.c

📁 Sunplus 8202S source code.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
history:
2004-7-19 14:43
         wanghaoying move the following functions for nec16312 here
2004-7-7 14:25  
        lijd
        Process 16312sw use for:
        1. extern pannel key
        2. volume button 
        note: need define NEC16312SW in cust_def.h
*/

/*
** FUNCTION
** reset_vfd
**
** DESCRIPTION
** setup VFD.  Should only called at power-up or emergency.
*/
void reset_vfd(void)
{

	UINT16 nIndex = 0;

	init_vfd_clear();

	/* display mode ? 13d15s or 6d16s add by chichang 2001/6/6 */
	
	
#ifndef TEST_VFD								//shawn modify at 910131
	regs0->iop_data[VFD_CMD] = VFDC_SET_DISP | VFD_DISPLAY_MODE;	//2001/10/23
#else
	regs0->iop_data[VFD_CMD] = VFDC_SET_DISP | COMMAND_MODE;	//2002/01/31
#endif

	regs0->iop_data[0] = (regs0->iop_data[0] & VFD_DATLEN_MASK) |
		(FUN_VFD_WRITE | VFD_DAT_LEN0);
	
	//erase_vfd_mem();
	
	WaitIopFunRdy(IOP_RDY_WAIT);
	
#ifdef USE_VFD_LED_POWER
    #if defined(USE_VFD_LED_POWER_LOW)&&!defined(VFD_SHOW_LOAD_TOGGLE)
	write_vfd_led(0x0f);
    #elif defined(PROVIEW_DV_509)	
	write_vfd_led(4);
    #else
    write_vfd_led(0);
    #endif
#endif

#ifdef TONIC_DVD//20040206
	write_vfd_led(0);
#endif//TONIC_DVD

	vfd_set_idle_state(nIndex);
	WaitIopFunRdy(IOP_RDY_WAIT);
}

//
//    LED: 
//
//    MSB   LSB
//    ---- 0000  turn on all led
//    ---- 1111  turn off all led
//
void write_vfd_led(UINT8 led_id)
{
	regs0->iop_data[VFD_CMD] = 0x41;
	regs0->iop_data[VFD_DAT0] = 0xff00 | led_id;
	regs0->iop_data[0] = (regs0->iop_data[0] & VFD_DATLEN_MASK) | (FUN_VFD_WRITE | VFD_DAT_LEN1);
	WaitIopFunRdy(IOP_RDY_WAIT);
}


#ifdef NEC16312SW
#define USE_16312SW_EXTEND_KEY
//#define USE_16312SW_VOLUME_BUTTON


#ifdef  USE_16312SW_EXTEND_KEY
#define SW_KEY1     31
#define SW_KEY2     35
#endif

#ifdef USE_16312SW_VOLUME_BUTTON
    #define VFD_SW_SPEED 3
#endif

void polling_vfdsw(void)
{
#ifdef  USE_16312SW_EXTEND_KEY   
    BYTE key_datasw;
#ifdef THAKRAL_USE_SW_KEY
	static BYTE flag=0;
	static BYTE pre_key_datasw;
   	key_datasw= (BYTE)regs0->iop_data[7];

//    psprintf(RegionValStr[REGION1], "KEY %02x ", key_datasw);
//    PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
    
    #ifdef VFD_KEY_TEST
    if(key_datasw != 0xF0)
    {
        key_datasw>>=4;
        key_datasw+=24;

        {
			  printf("data=%d\n",key_datasw);
			  psprintf(RegionValStr[REGION1], "KEY %02d F:%d", key_datasw,
				  vfd_keycode[key_datasw - 1]);
			  PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
        }
        regs0->iop_data[7] = 0xF0;            
     } 
    #endif
    
    if(key_datasw != 0xf0)
    {
        pre_key_datasw = key_datasw;
        flag = 1;
    }
    
    if((key_datasw==0xf0)&&(flag==1))
    {
        flag = 0;


        //pre_key_datasw>>=4;
        //pre_key_datasw+=24;

        save_srn_start_t = get_rtc_val();
        
        #if defined(SW1_POWER)
        if(pre_key_datasw==0x70)
            call_ir_func(IRC_POWER);
        else if(pre_key_datasw==0xb0)
            call_ir_func(IRC_EJECT);
        #elif defined(SW4_POWER)
        if(pre_key_datasw==0x70)
            call_ir_func(IRC_ONLY_PAUSE);
        else if(pre_key_datasw==0xb0)
            call_ir_func(IRC_PLAY_RESUME);
        else if(pre_key_datasw==0xd0)
            call_ir_func(IRC_STOP);
        else if(pre_key_datasw==0xe0)
            call_ir_func(IRC_POWER);
        #else
        call_ir_func(vfd_keycode[key_datasw-1]);
        #endif 
//        pre_key_datasw = key_datasw;

    }
    
//	if((key_datasw&0x80)==0)
//    { 
//		flag=1;
//	}
//	if(((key_datasw&0x80)==0x80)&&(flag==1))
//	{
//		flag=0;
//		//call_ir_func(vfd_keycode[key_datasw - 1]);
//		call_ir_func(IRC_POWER);
//	}
#else
    key_datasw= (BYTE)regs0->iop_data[7];
    
    if(key_datasw != 0xF0)
    {
        key_datasw>>=4;
        key_datasw+=24;

	#ifdef FUSS_SW
        if( (key_datasw == SW_KEY1) || (key_datasw == SW_KEY2) )
    #endif
        {
    #ifdef VFD_KEY_TEST
			  printf("data=%d\n",key_datasw);
			  psprintf(RegionValStr[REGION1], "KEY %02d F:%d", key_datasw,
				  vfd_keycode[key_datasw - 1]);
			  PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
    #else
			  save_srn_start_t = get_rtc_val();
			  call_ir_func(vfd_keycode[key_datasw - 1]);
    #endif
        }
        regs0->iop_data[7] = 0xF0;            
     } 
#endif    //#ifdef THAKRAL_USE_SW_KEY
#endif    //#ifdef  USE_16312SW_EXTEND_KEY   

#ifdef USE_16312SW_VOLUME_BUTTON
    BYTE key_datasw;
    static BYTE prev = 0;
    BYTE updown = 0;
    static BYTE up_cnt = 0;
    static BYTE down_cnt = 0;
    
    key_datasw= (BYTE)regs0->iop_data[7];  
    
    if(prev != key_datasw)
    {
    
        switch(prev)
        {
        case 0x00:
            if (key_datasw == 0x80)
                updown = 2;    
            else if(key_datasw == 0x40)
                updown = 1;    
            break;
    
        case 0x80:
            if(key_datasw == 0xc0)
                updown = 2;
            else if (key_datasw == 0x00)
                updown = 1;    
            break;
        
        case 0xc0:
            if(key_datasw == 0x40)
                updown = 2;
            else if (key_datasw == 0x80)
                updown = 1;    
            break;
        
        case 0x40: 
            if(key_datasw == 0x00)
                updown = 2;
            else if (key_datasw == 0xc0)
                updown = 1;    
            break;   
       
       default:
            updown = 0;
            break;     
        }
        
        if(updown == 1)
        {
            down_cnt++;
            up_cnt = 0;     
            if(down_cnt >VFD_SW_SPEED )
            {
                down_cnt = 0;               
                ircmd_volume_up();   
            }
        }
        
        if(updown == 2)
        {
            up_cnt++;
            down_cnt = 0;    
            if(up_cnt >VFD_SW_SPEED )
            {
                up_cnt = 0;               
                ircmd_volume_down(); 
            }
    
        }
        prev = key_datasw;  
    }
#endif      //#ifdef USE_16312SW_VOLUME_BUTTON
}
#endif      //#ifdef NEC16312SW

/*
** FUNCTION
** polling_vfdr
**
** DESCRIPTION
** check if polling-ready
*/

#ifdef QISHENG_DVD
int standby_cnt=0;
#endif 

#ifdef AUTO_INTO_STANDBY    //oujx for tonic dvd//20040206
int auto_standby_timer=0;
#endif

#ifdef SUPPORT_GPIO_P_SCAN
BYTE PscanPortStatus=0;
BYTE PscanStatus=0;
BYTE PscanCount=0;
#endif

#if defined(TWO_FUN_IN_ONE_VFD_KEY) || defined(TWO_FUNC_IN_LEFT_RIGHT_KEY)||defined(TWO_FUNC_IN_VOLUP_VOLDN_KEY)//xyy add for Oritron 2004-11-10 
BYTE num_add_flag = 0;
BYTE command_flag = 1;
#endif

#ifdef FIX_PAUSEPLAY_IN_JPEG_SLIDE
extern BYTE play_pause_flay_in_jpeg;
#endif
void polling_vfdr(void)  //nec16321 type vfd
{
//psprintf(RegionValStr[REGION1], "KEY %02d",disp_trk_now);
//PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);    
    
#ifdef SUPPORT_SPI_QSI
  //not use
#endif


#ifndef  SUPPORT_SPI_QSI

  
    
#ifdef SUPPORT_VFD

	UINT8   i;
	UINT32  temp;
	UINT32  key_data;
	static UINT8 count = 0;
	static UINT32 key_previ = 0;
	
	static BYTE bWriteState=0;
	
#ifdef TWO_FUN_IN_ONE_VFD_KEY
	static UINT32 key_previ_temp = 0;
	static UINT16 key_press_time_count = 0;
#endif //TWO_FUN_IN_ONE_VFD_KEY
	
#if defined(TWO_FUNC_IN_LEFT_RIGHT_KEY)||defined(TWO_FUNC_IN_VOLUP_VOLDN_KEY)//lihj add for Oritron 2004-11-10
	static UINT32 uPrevKey = 0;
	static UINT16 uTimeCount = 0;
#endif	
	
	
    #ifdef KENLOON_PANEL3
	write_vfd_led(0xe);
	#endif
	
	#if defined(SUPPORT_VFD_SHOW_P_SCAN)&&defined(TONIC_DVD)//20040206
	if(vfd_intr_timer)
	    vfd_intr_timer--;	
	#endif
	
	UINT32 *VfdReadData;

#ifdef  SUPPORT_SPI
    return;
#endif

    #ifdef SUPPORT_GPIO_P_SCAN    //oujx for tonic only
    if(full_scrn==0&&(system_state==SYSTEM_READ_TITLE||system_state==SYSTEM_SETUP_BROWSER||system_state==SYSTEM_BROWSE||system_state==SYSTEM_OPEN||play_state==VCD_STATE_STOP||system_state==SYSTEM_NODISC))	
    {
    	if(PscanStatus==0)
    	{
    	
    		if(GPIO_I_GET(36)==0)
    		    PscanPortStatus=0;
    		else
    		    PscanPortStatus=1;
    		    
    		PscanCount=0;
    		PscanStatus=1;
    	}
    	else
    	if(PscanStatus==1)
    	{
    		PscanCount++;
    		if(PscanCount>50)
    		{
    			if(GPIO_I_GET(36)==PscanPortStatus)
    			{
    				if(PscanPortStatus==0)
    		            ircmd_p_scan_only();
    		        else
    		            ircmd_yuv_only();
    		
    	        }
    			PscanStatus=0;
    		}
    	}
    }		
	#endif//#ifdef SUPPORT_GPIO_P_SCAN    //oujx for tonic only
	
	if(regs0->iop_data[0] & FUN_MASK)
		return;
       

	if(vfd_state == VFD_READ)
	{
#ifndef USE_C_IOP//2004-2-12 12:08 lijd
		//update_vfd_data();//nono 2003-7-24 0:41 mark

		#ifdef  SUPPORT_RECEIVER  //huziqin 2004-4-27
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x588));
		#elif defined( SPHE8202)
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x5e8));//for 8202 2004-3-31 16:47 lijd	//lihj
		#elif defined(XINGQIU_RECEIVER_PANNEL)
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x588));
		#else
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x5b8));		//gerry,2004-3-24 12:53		
		#endif
		//current is read 3 byte on io
		key_data = *VfdReadData & 0x00ffffff;

		*VfdReadData = 0; // Robert 030313
#else//USE_C_IOP
		key_data =(regs0->iop_data[3]);
#endif//USE_C_IOP

		if(key_data == 0xffffff)
			return;

        #ifdef USE_VFD_LED_TO_KEY_SOUND_INDICATE		//gerry for PANDA6950,3-8-23 17:17
		write_vfd_led(0xf);
        #elif defined(USE_VFD_LED_TO_KEY_SOUND_INDICATE_HI_ON)		//NONO 2003-10-15 16:14
		write_vfd_led(0x0);
        #endif

#ifdef TWO_FUN_IN_ONE_VFD_KEY
		if((vfd_keycode[keycode_to_num(key_data)-1]==IRC_NEXT)||(vfd_keycode[keycode_to_num(key_data)-1]==IRC_PREV))
		{
			key_press_time_count++;
		    printf("key_press_time_count= %d \n",key_press_time_count);   
		}
		    
		if(key_press_time_count>=15)
		{
			if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_NEXT)
			{
				call_ir_func(IRC_VFD_NEXT);
			    key_press_time_count=0;
			    num_add_flag = 1;
			}
			else if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_PREV)
			{
				call_ir_func(IRC_VFD_PREV);
			    key_press_time_count=0;
			    num_add_flag = 1;
			}
		}
		
#endif //TWO_FUN_IN_ONE_VFD_KEY 

#ifdef TWO_FUNC_IN_LEFT_RIGHT_KEY//xyy add for Oritron 2004-11-10
		if((vfd_keycode[keycode_to_num(key_data)-1]==IRC_LEFT)||(vfd_keycode[keycode_to_num(key_data)-1]==IRC_RIGHT))
		{
			uTimeCount++;
		    printf("uTimeCount= %d \n",uTimeCount);   
		}
		    
		if(uTimeCount>=20)
		{
			if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_LEFT)
			{
				call_ir_func(IRC_VFD_LEFT);
			    uTimeCount=0;
			    num_add_flag = 1;
			}
			else if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_RIGHT)
			{
				call_ir_func(IRC_VFD_RIGHT);
			    uTimeCount=0;
			    num_add_flag = 1;
			}
		}
#endif

#ifdef TWO_FUNC_IN_VOLUP_VOLDN_KEY//lihj add for Oritron 2004-11-10
				if((vfd_keycode[keycode_to_num(key_data)-1]==IRC_VOLUME_UP)||(vfd_keycode[keycode_to_num(key_data)-1]==IRC_VOLUME_DN))
				{
					uTimeCount++;
					printf("uTimeCount= %d \n",uTimeCount);   
				}
					
				if(uTimeCount>=20)
				{
					if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_VOLUME_UP)
					{
						call_ir_func(IRC_VOLUME_UP);
						uTimeCount=0;
						num_add_flag = 1;
					}
					else if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_VOLUME_DN)
					{
						call_ir_func(IRC_VOLUME_DN);
						uTimeCount=0;
						num_add_flag = 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -