First Publish. Works fine.
Dependents: unzen_sample_nucleo_f746 unzen_delay_sample_nucleo_f746 skeleton_unzen_nucleo_f746 ifmag_noise_canceller ... more
Nucleo F746ZG用のオーディオ・フレームワークです。フレームワーク地震の詳細は『雲仙』オーディオ・フレームワークを参照してください。
参考リンク
- skeleton_unzen_nucleo_f746 Nucleo F746ZGおよびUI基板を使う場合のスケルトンプログラム。F746を使う方はここから読み始めると良いでしょう。
Diff: unzen.cpp
- Revision:
- 5:1cbfb7a9cd0c
- Parent:
- 4:d89a1e2b4b03
- Child:
- 6:df928d55613b
--- a/unzen.cpp Wed May 04 01:56:03 2016 +0000 +++ b/unzen.cpp Thu May 05 07:46:52 2016 +0000 @@ -295,228 +295,6 @@ - umb_adau1361::umb_adau1361( I2C * controler, Fs_Type Fs, Addr_Type Addr ) - { - i2c = controler; - fs = Fs; - addr = Addr; - } - - - #define DATA 2 /* data payload of register */ - #define ADDL 1 /* lower address of register */ - void umb_adau1361::start(void) - { - char data[8]; - - // **** Setup all ADAU-1361 register to reset state **** - - data[0] = 0x40; // Upper address of register - - - // then, start of configuration as register address order - data[ADDL] = 0x00; data[DATA] = 0x0F; i2c->write( addr, data, 3 ); // clock CTL. PLL input. Core clock enable. - - // set Fs ( clock in is 12MHz ) - if ( fs == Fs_441 ) - { - data[ADDL] = 0x02; - data[2] = 0x02; - data[3] = 0x71; - data[4] = 0x01; - data[5] = 0xDD; - data[6] = 0x19; - data[7] = 0x01; - i2c->write( addr, data, 8 ); - } - else if ( fs == Fs_48 || fs == Fs_96 || fs == Fs_32 ) - { - data[ADDL] = 0x02; - data[2] = 0x00; - data[3] = 0x7D; - data[4] = 0x00; - data[5] = 0x0C; - data[6] = 0x21; - data[7] = 0x01; - i2c->write( addr, data, 8 ); - } - - // Additional clock setting for 96kHz - if ( fs == Fs_48 || fs == Fs_441) - { - data[ADDL] = 0x17; data[DATA] = 0x00; - i2c->write( addr, data, 3 ); // R17:Converter control, CONVSR = 0 - } - else if ( fs == Fs_96 ) - { - data[ADDL] = 0x17; data[DATA] = 0x06; - i2c->write( addr, data, 3 ); // R17:Converter control, CONVSR = 6 - } - else if ( fs == Fs_32 ) - { - data[ADDL] = 0x17; data[DATA] = 0x05; - i2c->write( addr, data, 3 ); // R17:Converter control, CONVSR = 5 - } - - - // Initialize all register as reset. - for ( int i=0x08; i<0x17; i++ ) - data[ADDL] = i; data[DATA] = 0x00; i2c->write( addr, data, 3 ); // R2:Dig Mic ... R18:Converter 1 - - for ( int i=0x18; i<0x19; i++ ) - data[ADDL] = i; data[DATA] = 0x00; i2c->write( addr, data, 3 ); // R2:Dig Mic ... R18:Converter 1 - - data[ADDL] = 0x19; data[DATA] = 0x20; i2c->write( addr, data, 3 ); // R19:ADC Control. HPF on - - for ( int i=0x1A; i<0x23; i++ ) - data[ADDL] = i; data[DATA] = 0x00; i2c->write( addr, data, 3 ); // R20:Left digital vol ... R28: play mixer mono - - for ( int i=0x23; i<0x28; i++ ) - data[ADDL] = i; data[DATA] = 0x02; i2c->write( addr, data, 3 ); // R29:Play HP left vol ... R33: play mono vol - - for ( int i=0x28; i<0x2d; i++ ) - data[ADDL] = i; data[DATA] = 0x00; i2c->write( addr, data, 3 ); // R34:play pop surpress ... R38: Dac ctl2 - - data[ADDL] = 0x2d; data[DATA] = 0xaa; i2c->write( addr, data, 3 ); // R39:serial control pad - data[ADDL] = 0x2f; data[DATA] = 0xaa; i2c->write( addr, data, 3 ); // R40:control pad 1 - data[ADDL] = 0x30; data[DATA] = 0x00; i2c->write( addr, data, 3 ); // R41:control pad 2 - data[ADDL] = 0x31; data[DATA] = 0x08; i2c->write( addr, data, 3 ); // R42:jack detect - data[ADDL] = 0x36; data[DATA] = 0x03; i2c->write( addr, data, 3 ); // R67:dejitter - - // **** Configuration for UMB-ADAU1361 **** - - - // set Master ( set clock and WS as output ) - data[ADDL] = 0x15; data[DATA] = 0x01; i2c->write( addr, data, 3 ); // R15:Serial Port control, MS = 6 - - // Enable ADC - // both channel ADC ON, HPF on - data[ADDL] = 0x19; data[DATA] = 0x23; i2c->write( addr, data, 3 ); // R19:ADC Control - - // Playback Power Management - data[ADDL] = 0x29; data[DATA] = 0x3; i2c->write( addr, data, 3 ); // R35:Left/Right Playback Enable - - // Enable DAC - // bot channel DAC ON - data[ADDL] = 0x2a; data[DATA] = 0x03; i2c->write( addr, data, 3 ); // R36:DAC Control - - // Left DAC mixer - // L DAC to L Mixer - data[ADDL] = 0x1C; data[DATA] = 0x21; i2c->write( addr, data, 3 ); // R22:MIXER 3 - - // Right DAC mixer - // R DAC to R Mixer - data[ADDL] = 0x1E; data[DATA] = 0x41; i2c->write( addr, data, 3 ); // R24:MIXER 4 - - // Left out mixer - // L out MIX5G3 and enable - data[ADDL] = 0x20; data[DATA] = 0x03; i2c->write( addr, data, 3 ); // R26:MIXER 5 - - // Right out mixer - // R out MIX6G4 and enable - data[ADDL] = 0x21; data[DATA] = 0x09; i2c->write( addr, data, 3 ); // R27:MIXER 6 - - - - // set input gain - set_line_input_gain( 0, 0 ); // unmute - set_line_output_gain( 0, 0, true ); // mute - set_hp_output_gain( 0, 0, true ); // mute - } - -#define SET_INPUT_GAIN( x ) ((x<<1)|1) - - void umb_adau1361::set_line_input_gain(float left_gain, float right_gain, bool mute) - { - char data[3]; - int left, right; - - - data[0] = 0x40; // Upper address of register - - if ( mute ) - { - data[ADDL] = 0x0a; data[DATA] = 0x01; i2c->write( addr, data, 3 ); // R4: mixer 1 enable - data[ADDL] = 0x0c; data[DATA] = 0x01; i2c->write( addr, data, 3 ); // R6: mixer 2 enable - } - else - { - - // set left gain - left = (left_gain+15)/3 ; // See table 31 LINNG - left = max( left, 0 ); - left = min( left, 7 ); - data[DATA] = SET_INPUT_GAIN( left ); - - data[ADDL] = 0x0a; i2c->write( addr, data, 3 ); // R4: mixer 1 enable - - // set right gain - right = (right_gain+15)/3 ; // See table 31 LINNG - right = max( right, 0 ); - right = min( right, 7 ); - data[DATA] = SET_INPUT_GAIN( right ); - - data[ADDL] = 0x0c; i2c->write( addr, data, 3 ); // R4: mixer 1 enable - - } - } - - -#define SET_LO_GAIN( x ) ((x<<2)|2) - - void umb_adau1361::set_line_output_gain(float left_gain, float right_gain, bool mute) - { - char data[3]; - int left, right; - - if ( mute ) - { - data[ADDL] = 0x25; data[DATA] = 0x01; i2c->write( addr, data, 3 ); // R31: LOUTVOL - data[ADDL] = 0x26; data[DATA] = 0x01; i2c->write( addr, data, 3 ); // R32: LOUTVOL - } - else - { - left = left_gain+57; - left = max( left, 0 ); - left = min( left, 63 ); - - right = right_gain+57; - right = max( right, 0 ); - right = min( right, 63 ); - - data[ADDL] = 0x25; data[DATA] = SET_LO_GAIN(left ); i2c->write( addr, data, 3 ); // R31: LOUTVOL - data[ADDL] = 0x26; data[DATA] = SET_LO_GAIN(right); i2c->write( addr, data, 3 ); // R32: LOUTVOL - - } - } - -#define SET_HP_GAIN( x ) ((x<<2)|3) - - void umb_adau1361::set_hp_output_gain(float left_gain, float right_gain, bool mute) - { - char data[3]; - int left, right; - - if ( mute ) - { - data[ADDL] = 0x23; data[DATA] = 0x01; i2c->write( addr, data, 3 ); // R29: LHPVOL - data[ADDL] = 0x24; data[DATA] = 0x01; i2c->write( addr, data, 3 ); // R30: LHPVOL - } - else - { - left = left_gain+57; - left = max( left, 0 ); - left = min( left, 63 ); - - right = right_gain+57; - right = max( right, 0 ); - right = min( right, 63 ); - - data[ADDL] = 0x23; data[DATA] = SET_HP_GAIN(left ); i2c->write( addr, data, 3 ); // R29: LHPVOL - data[ADDL] = 0x24; data[DATA] = SET_HP_GAIN(right); i2c->write( addr, data, 3 ); // R30: LHPVOL - - } - } - + } \ No newline at end of file