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

📄 otg_demo.c

📁 使用ISP1362芯片的USB_OTG参考设计源代码比较新的版本
💻 C
📖 第 1 页 / 共 5 页
字号:
	char				bf[ 64 ];
	unsigned short		rx_size;
	unsigned char		key;
	unsigned char		i;

	if ( OTG_grab_far_end_device() )
		return;
				
	mprintf( LIGHTCYAN,  CONTINUE, "\r\n\r\nOTG feature demo :   " );
	mprintf( WHITE, CONTINUE, "Play music on remote peer\r\n" );

	if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_STATE | 0, 1, &rx_size, 1 ) )
	{
		OTG_release_far_end_device();
		return;
	}
	
	if ( ((*bf) & 0xC) != 0xC )		//	"0xC" means playing beep
	{
		if ( !((*bf) & 0x1) )
		{
			mprintf( LIGHTGRAY,  CONTINUE, "\r\n  remote peer " );
			mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
			mprintf( LIGHTGRAY,  CONTINUE, " have " );
			mprintf( LIGHTRED,   CONTINUE, "no audio device\r\n\r\n" );
			
			OTG_release_far_end_device();
			return;
		}
		else if ( ((*bf) & 0x2) )
		{
			if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_START | 0, 1, &rx_size, 1 ) )
			{
				OTG_release_far_end_device();
				return;
			}
	

			mprintf( LIGHTGRAY,  CONTINUE, "\r\n  remote peer " );
			mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
			mprintf( LIGHTGRAY,  CONTINUE, " music play " );
			mprintf( LIGHTRED,   CONTINUE, "cancelled\r\n\r\n" );
			
			OTG_release_far_end_device();
			return;
		}
	}



	/*
	 *	Get audio file list on remote
	 */
	 
	mprintf( WHITE,      CONTINUE, "\r\n  remote peer " );
	mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
	mprintf( WHITE,      CONTINUE, " audio file list.\r\n" );
	 
	for ( i = 0; i < MAX_NUM_OF_AUDIO_FILES; i++ )
	{
		if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_LIST_ITEM | i, 64, &rx_size, 1 ) )
		{
			OTG_release_far_end_device();
			return;
		}
		
		if ( rx_size == 0 )
			break;
			
		*(bf + rx_size)	= 0;
		mprintf( YELLOW, CONTINUE, "      [%d]   ", i );
		mprintf( WHITE,  CONTINUE, "%s\r\n", bf );
	}

	num_of_items	= i;

	for ( ; i < MAX_NUM_OF_AUDIO_FILES; i++ )
		mprintf( BROWN, CONTINUE, "      [%d]\r\n", i );

	do
	{
		mprintf( WHITE, CONTINUE, "    Type a number [0-%u] >> ", num_of_items - 1 );

		key		= ui_key_wait() - '0';

		mprintf( WHITE, CONTINUE, "%c\r\n", key + '0' );
	
		if ( key < num_of_items )
		{
			if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_START | key, 1, &rx_size, 1 ) )
				return;
			else
				break;
		}
	}
	while ( 0 );
	
	mprintf( WHITE, CONTINUE, "Play start command issued to remote\r\n" );

	do
	{
		if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_CTRL_AUDIO, OTG_DEMO_SUB_COMMAND_AUDIO_STATE | 0, 1, &rx_size, 1 ) )
		{
			OTG_release_far_end_device();
			return;
		}
	

		if ( *bf & 0x1 )
			break;
	}
	while ( 1 );
		

	OTG_release_far_end_device();
}

//    999            999            999            999            999            999            999          
//   9   9          9   9          9   9          9   9          9   9          9   9          9   9         
//   9   9          9   9          9   9          9   9          9   9          9   9          9   9         
//    9999           9999           9999           9999           9999           9999           9999         
//       9              9              9              9              9              9              9         
//    999            999            999            999            999            999            999          

//   PPPP  EEEE RRRR  I PPPP  H   H    PPPP  EEEE RRRR  I PPPP  H   H    PPPP  EEEE RRRR  I PPPP  H   H    
//   P   P E    R   R I P   P H   H    P   P E    R   R I P   P H   H    P   P E    R   R I P   P H   H    
//   P   P EEE  R   R I P   P HHHHH    P   P EEE  R   R I P   P HHHHH    P   P EEE  R   R I P   P HHHHH    
//   PPP   E    RRRR  I PPPP  H   H    PPP   E    RRRR  I PPPP  H   H    PPP   E    RRRR  I PPPP  H   H    
//   P     EEEE R   R I P     H   H    P     EEEE R   R I P     H   H    P     EEEE R   R I P     H   H    

/*
**	OTG demo applet "Get audio list item"
**
**		Peripheral side service
*/

unsigned char OTG_demo_peripheral_side_9_0( char *s, unsigned short *length, unsigned char index )
{
	unsigned char	audio_start_flag	= False;	
	
	switch ( index & 0x70 )
	{
		case OTG_DEMO_SUB_COMMAND_LIST_ITEM :
			Dc_printf( WHITE, CONTINUE, "Music file list item #%d (string) returned. by request from remote\r\n", index & 0xF );

			if ( !(*gp_sing_file_strings[ index & 0xF ].file_path_and_name) )
			{
				sprintf( s, "" );
				*length		= 0;
			}
			else
			{
				if ( *(gp_sing_file_strings[ index ].file_comment) != 0 )
					strncpy( s,  gp_sing_file_strings[ index ].file_comment, 63 );
				else
					strncpy( s,  gp_sing_file_strings[ index ].file_path_and_name, 63 );

				*(s + 63)	= 0;
				*length		= strlen( s );
			}
			break;
		case OTG_DEMO_SUB_COMMAND_AUDIO_START :
			*s					= 0;
			*length				= 0x1;
			audio_start_flag	= True;
			break;
		case OTG_DEMO_SUB_COMMAND_AUDIO_STATE :
			*s					= ((is_audio_beep_play() << 3) | (is_audio_active() ? 0x4 : 0x0)| (is_audio_in_play() << 1) | is_audio_exist() );
			*length				= 1;
			break;
		default :
			break;
	}
	
	return ( audio_start_flag );
}


void OTG_demo_peripheral_side_9_11( unsigned char index )
{
	index	&= 0xF;

	audio_main( index );
	mprintf( WHITE, CONTINUE, "Audio play started from remote\r\n" );
}



//    000            000            000            000            000            000            000          
//   0   0          0   0          0   0          0   0          0   0          0   0          0   0         
//   0   0          0   0          0   0          0   0          0   0          0   0          0   0         
//   0   0          0   0          0   0          0   0          0   0          0   0          0   0            
//   0   0          0   0          0   0          0   0          0   0          0   0          0   0         
//    000            000            000            000            000            000            000          

//   H   H  OOO   SSSS TTTTT    H   H  OOO   SSSS TTTTT    H   H  OOO   SSSS TTTTT    H   H  OOO   SSSS TTTTT   
//   H   H O   O S       T      H   H O   O S       T      H   H O   O S       T      H   H O   O S       T       
//   HHHHH O   O  SSS    T      HHHHH O   O  SSS    T      HHHHH O   O  SSS    T      HHHHH O   O  SSS    T      
//   H   H O   O     S   T      H   H O   O     S   T      H   H O   O     S   T      H   H O   O     S   T      
//   H   H  OOO  SSSS    T      H   H  OOO  SSSS    T      H   H  OOO  SSSS    T      H   H  OOO  SSSS    T      
 


/********* ********** ********** ********** ********** ********** ********** ********** ********** **********
	OTG demo applet "Executable update through OTG"
 ********* ********** ********** ********** ********** ********** ********** ********** ********** **********/

#define		OTG_DEMO_SUB_COMMAND_DATA_REQUEST				0x00
#define		OTG_DEMO_SUB_COMMAND_GET_TRANSFER_STATUS		0x01
#define		OTG_DEMO_SUB_COMMAND_TRANSFER_RESET				0x02
#define		OTG_DEMO_SUB_COMMAND_GET_FILE_MODIFIED_TIME		0x03
#define		OTG_DEMO_SUB_COMMAND_GET_BUILD_INFO				0x04
#define		OTG_DEMO_SUB_COMMAND_GET_SIZE_AND_CHECKSUM		0x05

unsigned long	get_application_file_time( void );
unsigned long	file_modified_time( int fh );



/*
**	OTG demo applet "Executable update through OTG"
**
**		Host side service
*/

void OTG_demo_host_side_0( void )
{
	char				bf[ 64 ];
	unsigned short		rx_size;
	char				status_bf[ 65 ];
	unsigned short		status_rx_size;
	unsigned short		wt_size;
	unsigned long		total_size						= 0;
	
	char				tmp_file_name[]					= "test.exe";
	int					err;
	int					file_handle;
	
	unsigned long		checksum;
	
	unsigned short		i								= 0;
	unsigned char		ci;
	
	char				key;
	
#if 0
	unsigned long		local_file_time					= 0;
	unsigned long		remote_file_time				= 0;
#endif


	if ( OTG_grab_far_end_device() )
		return;
				
	mprintf( LIGHTCYAN,  CONTINUE, "\r\n\r\nOTG feature demo :   " );
	mprintf( WHITE,  CONTINUE, "Updating application. Copy from remote... \r\n" );
	
	mprintf( LIGHTGRAY,  CONTINUE, "  remote peer " );
	mprintf( LIGHTGREEN, CONTINUE, "%s", g_far_end.id_name );
	
	mprintf( LIGHTGRAY, CONTINUE, "     >>>" );
	mprintf( LIGHTRED, CONTINUE, "copy" );
	mprintf( LIGHTGRAY, CONTINUE, ">>>" );
	
	mprintf( LIGHTGRAY,  CONTINUE, "     local peer name " );
	mprintf( LIGHTGREEN, CONTINUE, "%s\r\n", gp_id_string );
	
#if 0

	/*
	**	Check remote and local file time
	*/
	
	status_rx_size	= sizeof( unsigned long );
			
	if ( devep_std_request( (unsigned char *)status_bf, dvi_ptr, 0xC003, (OTG_DEMO_APP_UPDATE << 8) | (OTG_DEMO_SUB_COMMAND_GET_FILE_MODIFIED_TIME & 0xFF), 0, &status_rx_size ) )
		;
	
	remote_file_time	= *((unsigned long *)status_bf);
	
	if ( !remote_file_time )
		mprintf( LIGHTRED, CONTINUE, "error for remote side file\r\n" );

	local_file_time		= get_application_file_time();

	mprintf( LIGHTGREEN, CONTINUE, "%lu   %lu   %lu   \r\n", local_file_time, remote_file_time, time( NULL ) );


	if ( local_file_time == remote_file_time )
		mprintf( LIGHTGREEN, CONTINUE, "   These files may be same  %lu - %lu ^ %lu\r\n", local_file_time, remote_file_time, time( NULL ) );
	else if ( local_file_time > remote_file_time )
		mprintf( LIGHTGREEN, CONTINUE, "   Local file may be newer then remote  %lu - %lu\r\n", local_file_time, remote_file_time );
	else
		mprintf( LIGHTGREEN, CONTINUE, "   Remote file may be newer then local  %lu - %lu\r\n", local_file_time, remote_file_time );

	strftime( status_bf, 64, "%d-%b-%Y %H:%M:%S", localtime( &local_file_time ) );
	mprintf( LIGHTGREEN, CONTINUE, "   Local file (%s)     ", status_bf );
	
	strftime( status_bf, 64, "%d-%b-%Y %H:%M:%S", localtime( &remote_file_time ) );
	mprintf( LIGHTGREEN, CONTINUE, "   Remote file (%s)     ", status_bf );
	
#endif
	
	
	
	if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_GET_BUILD_INFO, 64, &status_rx_size, 1 ) )
	{
		OTG_release_far_end_device();
		return;
	}
	
		
	*(status_bf + status_rx_size)	= 0;
			
	mprintf( WHITE,  CONTINUE, "    remote side app version / build time : " );
	mprintf( YELLOW, CONTINUE, "%s\r\n", status_bf );

	mprintf( WHITE,  CONTINUE, "    local  side app version / build time : " );
	mprintf( YELLOW, CONTINUE, "v %s / %s, %s\r\n", VERSION_NUMBER, __DATE__, __TIME__ );


	mprintf( LIGHTGREEN, CONTINUE, "\r\n   press [y] to continue\r\n" );

	if ( 'y' != (ui_key_wait() & 0xFF) )
	{
		OTG_release_far_end_device();

		return;
	}

	mprintf( LIGHTGREEN, CONTINUE, "\r\n" );
	
	
	/*
	**	Open local file
	**
	*/
	
	
	_fmode	= O_BINARY;
	
	if ( 0 != (err	= _dos_creat( tmp_file_name, _A_NORMAL, &file_handle )) )
	{
		mprintf( LIGHTGREEN, CONTINUE, "\r\n    error @ opening print source file \"%s\" in OTG_demo_host_side_0() err=%d\r\n", tmp_file_name, err );
		return;
	}
	
	
	/*
	**	File transfer reset for remote side
	**
	*/
	
	if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_TRANSFER_RESET, 0, &status_rx_size, 1 ) )
	{
		OTG_release_far_end_device();
		return;
	}
	
		
	/*
	**	File transfer process
	**
	*/
	
	checksum	= 0;
	
	do
	{
		if ( OTG_command_to_device( bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_DATA_REQUEST, 64, &rx_size, 3 ) )
		{
			OTG_release_far_end_device();
			return;
		}
	
			
		for	( ci = 0; ci < rx_size; ci++ )
			checksum	+= (unsigned long)*((unsigned char *)bf + ci);
		
		_dos_write( file_handle, bf, rx_size, (unsigned *)(&wt_size) );
		
		total_size	+= rx_size;
		
		if ( !(i++ & 0x3F) )
		{
			status_rx_size	= 64;
			if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_GET_TRANSFER_STATUS, 64, &status_rx_size, 1 ) )
				return;
			*(status_bf + status_rx_size)	= 0;
			mprintf( WHITE, CONTINUE, "   file transfer state : %s\r", status_bf );
		}
	}
	while ( rx_size == 64 );
	
	status_rx_size	= 64;
	if ( OTG_command_to_device( status_bf, OTG_CONTROL_TR_DIR_IN, OTG_DEMO_APP_UPDATE, OTG_DEMO_SUB_COMMAND_GET_TRANSFER_STATUS, 64, &status_rx_size, 1 ) )

⌨️ 快捷键说明

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