#include <nitro/spi.h>
u32 PM_SetAmpGain( PMAmpGain val );
u32 PM_SetAmpGainAsync( PMAmpGain val, PMCallback callback, void* arg );
val | Setting value that determines the amp gain. |
callback | Callback that is called when the command finishes. |
arg | Argument that is used when calling the callback. |
If PM_RESULT_SUCCESS
, the command execution has succeeded (for synchronous functions), or the command was successfully sent to the ARM7 processor (for asynchronous functions).
If PM_RESULT_BUSY
, the SPI was occupied by other processing and unable to process this function.
Sets the programmable amp gain.
The val argument is a PMAmpGain
enumerator type value that can contain one of the following values.
val | Gain to Set |
---|---|
PM_AMPGAIN_20 |
26.0 dB (20x) |
PM_AMPGAIN_40, PM_AMPGAIN_DEFAULT |
32.0 dB (40x) |
PM_AMPGAIN_80 |
38.0 dB (80x) |
PM_AMPGAIN_160 |
44.0 dB (160x) |
This function can be used from an interrupt handler. This function cannot be used in interrupt-prohibited states other than interrupt handlers.
Asynchronous Functions
This function uses PXI to send the command that performs the corresponding operation in the ARM7 processor. The ARM7 side that receives that command is executed by operating the PMIC. Therefore, this function may not operate instantly after you call it. A synchronous function that waits for the operation to finish, as well as an asynchronous function that only sends commands to the ARM7, are provided. Use either of the functions depending on your operational requirements. (The asynchronous function has "Async" appended to the function name.)
When an asynchronous function is called, the specified callback is called when processing on the ARM7 side finishes. The callback type PMCallback
is defined by:
typedef void ( *PMCallback )( u32 result, void* arg )
;
This callback is called from within the PXI interrupt handler.
The callback's first argument, result, indicates the result of the command. This is either PM_RESULT_SUCCESS
or PM_RESULT_BUSY
. The second argument in the callback returns the value arg.
About PM_RESULT_BUSY
The SPI is used for various other processes besides power management. If you call this function while another process is using it, this function sends a command to the ARM7. There, the SPI is determined to be BUSY, and PM_RESULT_BUSY
is dispatched to the ARM9 without actually processing this function. Likewise, if you call this function while another PM process is running, that fact is determined on the ARM9, and this function returns PM_RESULT_BUSY
. (In this case, the determination is made before notification is sent to the ARM7.)
Accordingly, if you want to ensure that this function succeeds, make it loop until it succeeds as shown below. (This example does not take into account mistakes such as wrong arguments.)
Example
while( PM_SetAmpGain( ... ) != PM_RESULT_SUCCESS )
{
}
When using the Async
version of this function, you could do this with code similar to the following.
Example
void setResult( u32 result, void* arg )
{
if ( arg )
{
*(u32*)arg = result;
}
}
while(1)
{
volatile u32 result = PM_RESULT_NONE; // Value that is not returned as a result
while ( PM_SetAmpGainAsync(..., setResult, (void*)&result ) != PM_RESULT_SUCCESS )
{
}
// Some other process
otherProcess();
// Wait for processing to finish
while( result == PM_RESULT_NONE )
{
}
// Exit from the loop on success
if ( result == PM_RESULT_SUCCESS )
{
break;
}
}
About PM_AMPGAIN_DEFAULT
The PM_AMPGAIN_DEFAULT
setting of 40x is the default value configured by the hardware when the PM_SetAmpGain*
functions have not been used; it is not necessarily the recommended setting.
Differences Between the PM_SetAmpGain*
and PM_SetAmpGainLevel*
Functions
In TWL mode, the CODEC can set the amp gain precisely to one of 120 levels, instead of 4 levels. See the PM_SetAmpGainLevel
function for more information.
On NITRO hardware, this function manipulates the PMIC register PGA_GAIN. On TWL hardware it manipulates the CODEC.
PM_Init
PM_SetAmp*
PM_SetAmpGainLevel*
PM_GetAmpGain
2009/06/03 Removed a description of the PM_Init
function (because OS_Init
is now required).
2008/08/23 Discontinued use of PM_RESULT_ERROR
and mentioned PM_RESULT_BUSY
.
2008/05/01 Added information on PM_SetAmpGainLevel*
.
2006/01/25 Added the PM_AMPGAIN_DEFAULT
setting value.
2005/07/07 Mentioned the PM_RESULT_ERROR
return value.
2005/06/02 Explicitly stated where the callback is invoked.
2004/07/31 Initial version.
CONFIDENTIAL