/* ------------------------------------------------------------------------ * * * * _I2C_read( i2c_addr, data, len ) * * * * I2C read in Master mode * * * * i2c_addr <- I2C slave address * * data <- I2C data ptr * * len <- # of bytes to write * * * * Returns: 0: PASS * * -1: FAIL Timeout * * * * ------------------------------------------------------------------------ */ Int16 USBSTK5505_I2C_read( Uint16 i2c_addr, Uint8* data, Uint16 len ) { Int32 timeout, i; I2C_CNT = len; // Set length I2C_SAR = i2c_addr; // Set I2C slave address I2C_MDR = MDR_STT // Set for Master Read | MDR_MST | MDR_IRS | MDR_FREE; USBSTK5505_wait( 10 ); // Short delay for ( i = 0 ; i < len ; i++ ) { timeout = i2c_timeout; //Wait for Rx Ready do { if ( timeout-- < 0 ) { USBSTK5505_I2C_reset( ); return -1; } } while ( ( I2C_STR & STR_RRDY ) == 0 );// Wait for Rx Ready data[i] = I2C_DRR; // Read } I2C_MDR |= MDR_STP; // Generate STOP USBSTK5505_waitusec(10); return 0; }
/* * * aic3204_test( ) * * Test different configurations of the AIC3204 */ Int16 aic3204_test( ) { /* Set A20_MODE for GPIO mode */ CSL_FINST(CSL_SYSCTRL_REGS->EBSR, SYS_EBSR_A20_MODE, MODE1); /* Use GPIO to enable AIC3204 chip */ USBSTK5505_GPIO_init(); USBSTK5505_GPIO_setDirection(GPIO26, GPIO_OUT); USBSTK5505_GPIO_setOutput( GPIO26, 1 ); // Take AIC3201 chip out of reset /* Initialize I2C */ USBSTK5505_I2C_init( ); /* Codec tests */ printf( " -> 1 KHz Tone on Headphone.\n" ); if ( aic3204_tone_headphone( ) ) // Output test return 1; USBSTK5505_wait( 100 ); // Wait printf( "<-> Audio Loopback from Stereo IN --> to HP OUT\n" ); if ( aic3204_loop_linein( ) ) // Loop test return 3; USBSTK5505_GPIO_setOutput( GPIO26, 0 ); // Disable AIC3204 return 0; }
void aic3204_hardware_init(void) { // SYS_EXBUSSEL |= 0x0020; // Select A20/GPIO26 as GPIO26 // USBSTK5505_GPIO_init(); // USBSTK5505_GPIO_setDirection(GPIO26, GPIO_OUT); // USBSTK5505_GPIO_setOutput( GPIO26, 1 ); // Take AIC3204 chip out of reset USBSTK5505_I2C_init( ); // Initialize I2C USBSTK5505_wait( 100 ); // Wait }
/* ------------------------------------------------------------------------ * * * * _AIC3204_rget( regnum, regval ) * * * * Return value of codec register regnum * * * * ------------------------------------------------------------------------ */ Int16 AIC3204_rget( Uint16 regnum, Uint16* regval ) { Int16 retcode = 0; Uint8 cmd[2]; cmd[0] = regnum & 0x007F; // 7-bit Device Address cmd[1] = 0; retcode |= USBSTK5505_I2C_write( AIC3204_I2C_ADDR, cmd, 1 ); retcode |= USBSTK5505_I2C_read( AIC3204_I2C_ADDR, cmd, 1 ); *regval = cmd[0]; USBSTK5505_wait( 10 ); return retcode; }
/* ------------------------------------------------------------------------ * * * * _I2C_write( i2c_addr, data, len ) * * * * I2C write in Master mode * * * * i2c_addr <- I2C slave address * * data <- I2C data ptr * * len <- # of bytes to write * * * * ------------------------------------------------------------------------ */ Int16 USBSTK5505_I2C_write( Uint16 i2c_addr, Uint8* data, Uint16 len ) { Int32 timeout, i; //I2C_IER = 0x0000; I2C_CNT = len; // Set length I2C_SAR = i2c_addr; // Set I2C slave address I2C_MDR = MDR_STT // Set for Master Write | MDR_TRX | MDR_MST | MDR_IRS | MDR_FREE; USBSTK5505_wait(10); // Short delay for ( i = 0 ; i < len ; i++ ) { I2C_DXR = data[i]; // Write timeout = i2c_timeout; do { if ( timeout-- < 0 ) { USBSTK5505_I2C_reset( ); return -1; } } while ( ( I2C_STR & STR_XRDY ) == 0 );// Wait for Tx Ready } I2C_MDR |= MDR_STP; // Generate STOP USBSTK5505_waitusec(100); return 0; }