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

📄 audio.c

📁 PEAKAUDIO用于EV2板的MCU控制源码
💻 C
字号:
/*************************************************************************

	Audio.c

	Line command routines to control the audio on the CobraNet Eval board.
 
	Line commands supported: ROUTE, AUDIO

	Copyright (C) 2001-2004 by Cirrus Logic Inc. All Rights Reserved
*************************************************************************/

#include <8051.h>
#include <intrpt.h>
#include <conio.h>
#include <string.h>
#include "serial.h"
#include "cnmutil.h"
#include "command.h"
#include "error.h"
#include "test.h"
#include "mystrings.h"
#include "audio.h"

void audio_preroute( unsigned char in_selection, 
										 unsigned char out_selection );
void route_help( unsigned char detailed );
void audio_help( unsigned char detailed );

/*************************************************************************
*															 ROUTE COMMAND														 *
*************************************************************************/
void route( char * com_arg_ptr[] );

code struct command_item_t route_command = {
	( code char * ) str_Com_route,
	( code command_function_t ) route
};

void route( char * com_arg_ptr[] )	{
	unsigned char c_in;		//this is the index for the input argument
	unsigned char c_out;	//this is the index for the output argument

	if ( com_arg_ptr[ 1 ] == NULL )	//look for the command without arguments
		route_help( cHELP_SHORT );		//this would be the short help string
	else	{
		if ( *com_arg_ptr[ 1 ] == '?' )	//the long help string
			route_help( cHELP_LONG );
		else
			if ( com_arg_ptr[ 2 ] == NULL )
				printErrString( get_error_string( cERR_MISSING_ARG ) );
			else	{
				c_in = 0;
				while ( ( strCodecmp( audio_inputs[ c_in ], com_arg_ptr[ 1 ] ) ) &&
								( audio_inputs[ c_in ] != NULL ) )
					c_in++;
				if ( audio_inputs[ c_in ] == NULL )	//not a valid input argument
					printErrString( get_error_string( cERR_ARGUMENT ) );
				else	{
					c_out = 0;
					while ( ( strCodecmp( audio_outputs[ c_out ], com_arg_ptr[ 2 ] ) )
									&& ( audio_outputs[ c_out ] != NULL ) )
						c_out++;
					if ( audio_outputs[ c_out ] == NULL )//not a valid output argument
						printErrString( get_error_string( cERR_ARGUMENT ) );
					else
						audio_preroute( c_in, c_out );	//valid line command
				}
			}
	}
}

void route_help( unsigned char detailed )	{
	printStrCodeC( route_str_help1 );
	if ( detailed )
		printStrCodeC( route_str_help2 );
}


void audio_preroute( unsigned char in_selection, 
										unsigned char out_selection )	{
	char * reg_int_ptr = NULL;

  switch( out_selection )	{
		//sets up pointer to output channel register
    case cAUDIO_SSI0:
      reg_int_ptr = ( char * ) cSSI_REG0_ptr;
      break;
    case cAUDIO_SSI1:
      reg_int_ptr = ( char * ) cSSI_REG1_ptr;
      break;
    case cAUDIO_SSI2:
      reg_int_ptr = ( char * ) cSSI_REG2_ptr;
      break;
    case cAUDIO_SSI3:
      reg_int_ptr = ( char * ) cSSI_REG3_ptr;
      break;
    case cAUDIO_DAC:
      reg_int_ptr = ( char * ) cDAC_REG_ptr;
      break;
    case cAUDIO_AES:
      reg_int_ptr = ( char * ) cAES_REG_ptr;
      break;
    default:
      break;
	};	//switch

  if ( in_selection == cAUDIO_MUTE )
		audio_mute( reg_int_ptr );	//mute the audio
	else	{
		audio_put_route( in_selection, reg_int_ptr );
		audio_unmute( reg_int_ptr );
	}
}

extern void audio_put_route( unsigned char source, char * target )	{
  char * target_ptr = ( char * ) target;

  *target_ptr = source;
}

extern char audio_get_route( char * target )	{
  char * target_ptr = ( char * ) target;

  return( *target_ptr );
}

extern void audio_mute( char * target )	{
  char * iDAC_ptr = ( char * ) ( target + 1 );

  *( iDAC_ptr ) = cMUTE_ON;
}

extern void audio_unmute( char * target )	{
  char * iDAC_ptr = ( char * ) ( target + 1 );

  *( iDAC_ptr ) = cMUTE_OFF;
}

extern void audio_DACMode( unsigned char the_mode )	{
//sets the speed mode for the DAC
  char * iDAC_ptr = ( char * ) cDAC_MODE_ptr;

  *( iDAC_ptr ) = the_mode;
	audio_DACreset( cDAC_RESET_ON );
	waiting( 0x0606,0x00 ); //hold in reset for a while
	audio_DACreset( cDAC_RESET_OFF );
}

extern void audio_DACreset( unsigned char resetit )	{
//put DAC in or out of reset
  char * iDAC_ptr = ( char * ) cDAC_RESET_ptr;

  *( iDAC_ptr ) = resetit;
}

extern void audio_ADCCaste( unsigned char the_caste )	{
//configure ADC as master or slave
  char * iDAC_ptr = ( char * ) cADC_SLAVE_ptr;

  *( iDAC_ptr ) = the_caste;
}


/*************************************************************************
*															 AUDIO COMMAND														 *
*************************************************************************/

void audio( char * com_arg_ptr[] );
void audio_execute( unsigned char audio_selection, char * com_arg_ptr[] );

code struct command_item_t audio_command =	{
	( code char * ) str_Com_audio,
	( code command_function_t ) audio
};

void audio( char * com_arg_ptr[] )	{
	unsigned char c_op;

	if ( com_arg_ptr[ 1 ] == NULL )	//look for the command without arguments
		audio_help( cHELP_SHORT );
	else	{
		if ( *com_arg_ptr[ 1 ] == '?' )
			audio_help( cHELP_LONG );
		else	{
			c_op = 0;
			while ( ( strCodecmp( audio_ops[ c_op ], com_arg_ptr[ 1 ] ) ) && 
															( audio_ops[ c_op ] != NULL ) )
				c_op++;
			if ( audio_ops[ c_op ] == NULL )
				printErrString( get_error_string( cERR_ARGUMENT ) );
			else
				audio_execute( c_op, com_arg_ptr );
		}
	}
}

void do_audio_samplerate( char * the_value )	{
	unsigned char c_op;

	if ( the_value == NULL )	{	//look for missing argument
		printErr( cERR_MISSING_ARG );
		return;
	}
	else	{
		c_op = 0;
		while ( ( strCodecmp( str_SampleRate[ c_op ], the_value ) ) && 
															( str_SampleRate[ c_op ] != NULL ) )
				c_op++;
		if ( str_SampleRate[ c_op ] == NULL )	//invalid argument
			printErrString( get_error_string( cERR_ARGUMENT ) );
		else
			switch ( c_op )	{
				case cAUDIO_48K:
					audio_DACMode( cDAC_SINGLE_SPEED );	//48 kHz
					break;
				case cAUDIO_96K:
					audio_DACMode( cDAC_DOUBLE_SPEED );	//96 kHz
					break;
				case cAUDIO_48KD:
					audio_DACMode( cDAC_SINGLE_DEEM );	//48 kHz w/deemphasis
					break;
				case cAUDIO_192K:
					audio_DACMode( cDAC_QUAD_SPEED );		//192k (not supported)
					break;
				default:
					break;
			};
	}
}

void do_audio_gain( char * the_value )	{
//check the gain argument
	unsigned char c_op;

	if ( the_value == NULL )	{	//check for missing argument
		printErr( cERR_MISSING_ARG );
		return;
	}
	else	{
		c_op = 0;
		while ( ( strCodecmp( str_Gain[ c_op ], the_value ) ) && 
															( str_Gain[ c_op ] != NULL ) )
				c_op++;
		if ( str_Gain[ c_op ] == NULL )	//invalid gain argument
			printErrString( get_error_string( cERR_ARGUMENT ) );
		else
			sine_gain( c_op );	//good argument, set new gain.
	}
}

void do_audio_frequency( char * the_value )	{
//check the frequency argument
	unsigned char freq_op;
	unsigned char error_code = 0;

	if ( the_value == NULL )	{	//check for missing argument
		printErr( cERR_MISSING_ARG );
		return;
	}
	else	{
		if (  error_code = validate_hex_string( the_value, c2_HEX_CHAR ) )
			printTwoErrorString( get_error_string( cERR_ARGUMENT ),
													 get_error_string( error_code ) );
		else	{
			freq_op = ( unsigned char ) str2Long( the_value + 2 );
			if ( ( freq_op > 8 ) || ( freq_op < 1 ) )
				printErr( cERR_OUT_OF_RANGE );	//invalid frequency argument
			else
				sine_freq( freq_op );
		}
	}
}

void audio_execute( unsigned char audio_selection, char * com_arg_ptr[] )	{
//execute the audio command selection
  switch( audio_selection )	{
    case cAUDIO_SAMPLERATE:
			do_audio_samplerate( com_arg_ptr[ 2 ] );
      break;
    case cAUDIO_CALIBRATE:
			ad_cal( cADCAL_ON );
			waiting( mMSECOND10 );
			ad_cal( cADCAL_OFF );
      break;
		case cAUDIO_GAIN:
			do_audio_gain( com_arg_ptr[ 2 ] );
			break;
		case cAUDIO_FREQUENCY:
			do_audio_frequency( com_arg_ptr[ 2 ] );
			break;
    default:
      break;
	};	//switch
}

//sets or resets the AD calibration mode or returns the current state of
//the calibration. On power up the FPGA initiates a calibration cycle;
//this routine can check if that calibration is still in progress.
extern char ad_cal( unsigned char the_op )	{
	far char * ad_loc_ptr = ( far char * ) cAD_CAL_ADDR_ptr;
	unsigned char return_char = 0;

	switch( the_op )	{
		case cADCAL_OFF:
			*ad_loc_ptr = 0;
			break;
		case cADCAL_ON:
			*ad_loc_ptr = 1;
			break;
		case cADCAL_CHECK:
			return_char = *ad_loc_ptr & 0x01;
			break;
		default:
			break;
	}	//switch

  return( return_char );  
}

extern void sine_gain( unsigned char the_gain )	{
// set the gain for the sinewave generator
  char * GAIN_ptr = ( char * ) ( cGAIN_ptr );

  *( GAIN_ptr ) = the_gain;
}

extern void sine_freq( unsigned char the_frequency )	{
// set the frequency for the sinewave generator
  char * FREQ_ptr = ( char * ) ( cFREQ_ptr );

  *( FREQ_ptr ) = the_frequency;
}

void audio_help( unsigned char detailed )	{
	printStrCodeC( audio_str_help1 );
	if ( detailed )
		printStrCodeC( audio_str_help2 );
}

⌨️ 快捷键说明

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