struct awacsOW_regmap_t
{
volatile u_int32_t SoundControlRegister;
u_int32_t pad0[3];
volatile u_int32_t CodecControlRegister;
u_int32_t pad1[3];
volatile u_int32_t CodecStatusRegister;
u_int32_t pad2[3];
volatile u_int32_t ClippingCountRegister;
u_int32_t pad3[3];
volatile u_int32_t ByteSwappingRegister;
};
enum AWACsCODEC_ControlRegisterGeneralConstants
{
kCodecCtlDataMask = 0x00000FFF,
kCodecCtlAddress0 = 0x00000000, kCodecCtlAddress1 = 0x00001000, kCodecCtlAddress2 = 0x00002000, kCodecCtlAddress4 = 0x00004000, kCodecCtlAddress5 = 0x00005000, kCodecCtlAddress6 = 0x00006000, kCodecCtlAddress7 = 0x00007000,
kCodecCtlEMSelect0 = 0x00000000, kCodecCtlEMSelect1 = 0x00400000, kCodecCtlEMSelect2 = 0x00800000, kCodecCtlEMSelect4 = 0x00C00000,
kCodecCtlBusy = 0x01000000 };
enum AWACsCODEC_ControlRegister0Constants
{
kLeftInputGainMask = 0x000000F0, kLeftInputGainShift = 4,
kRightInputGainMask = 0x0000000F, kRightInputGainShift = 0,
kDefaultMicGain = 0x000000CC, kDefaultCDGain = 0x000000BB,
kNotMicPreamp = 0x00000100,
kInputMuxMask = 0x00000E00, kCDInput = 0x00000200, kMicInput = 0x00000400, kUnusedInput = 0x00000800, kInitialAwacsR0Value = 0x00000000 };
enum AWACsCODEC_ControlRegister1Constants
{
kReservedR1Bit0 = 0x00000001, kReservedR1Bit1 = 0x00000002, kRecalibrate = 0x00000004, kExtraSampleRateMask = 0x00000038, kLoopThruEnable = 0x00000040, kMuteInternalSpeaker = 0x00000080, kReservedR1Bit8 = 0x00000100, kMuteHeadphone = 0x00000200, kOutputZero = 0x00000400,
kOutputOne = 0x00000800, kParallelOutputEnable = 0x00000C00, kInitialAwacsR1Value = 0x00000000 };
enum AWACsCODEC_ControlRegister2Constants
{
kRightHeadphoneAttenMask = 0x0000000F, kRightHeadphoneAttenShift = 0, kReservedR2Bit4 = 0x00000010, kReservedR2Bit5 = 0x00000020, kLeftHeadphoneAttenMask = 0x000003C0, kLeftHeadphoneAttenShift = 6, kReservedR2Bit10 = 0x00000400, kReservedR2Bit11 = 0x00000800, kHeadphoneAttenMask = (kRightHeadphoneAttenMask | kLeftHeadphoneAttenMask),
kInitialAwacsR2Value = 0x00000000 };
enum AWACsCODEC_ControlRegister4Constants
{
kRightSpeakerAttenMask = 0x0000000F, kRightSpeakerAttenShift = 0, kReservedR4Bit4 = 0x00000010, kReservedR4Bit5 = 0x00000020, kLeftSpeakerAttenMask = 0x000003C0, kLeftSpeakerAttenShift = 6, kReservedR4Bit10 = 0x00000400, kReservedR4Bit11 = 0x00000800, kSpeakerAttenMask = (kRightSpeakerAttenMask | kLeftSpeakerAttenMask),
kInitialAwacsR4Value = 0x00000000 };
enum AWACsVersions
{
kAWACSMaxVersion = 2
};
enum AWACsCODEC_ControlRegister5Constants
{
kRightLoopThruAttenMask = 0x0000000F,
kRightLoopThruAttenShift = 0,
kLeftLoopThruAttenMask = 0x000003C0,
kLeftLoopThruAttenShift = 6
};
enum AWACsCODEC_ControlRegister6Constants
{
kPowerModeDoze = 0x00000001,
kPowerModeIdle = 0x00000002,
kMicPreampBoostEnable = 0x00000004,
kPCMCIASpeakerAttenMask = 0x00000038,
kPowerModeAnalogShutdown = 0x00000040,
kLittleDischarge = 0x00000080,
kBigDischarge = 0x00000100
};
enum AWACsCODEC_ControlRegister7Constants
{
kReadBackEnable = 0x00000001,
kReadBackRegisterMask = 0x0000000E,
kReadBackRegisterShift = 1
};
enum AWACsCODEC_StatusRegisterConstants
{
kNotMicSense = 0x00000001, kNotMicShift = 0,
kLineInSense = 0x00000002, kLineInShft = 1,
kAux1Sense = 0x00000004, kAux1Shft = 2,
kHeadphoneSense = 0x00000008, kHeadphoneShft = 3,
kAllSense = 0x0000000F,
kManufacturerIDMask = 0x00000F00, kManufacturerIDShft = 8, kRevisionNumberMask = 0x0000F000, kRevisionNumberShft = 12, kAwacsErrorStatus = 0x000F0000, kOverflowRight = 0x00100000,
kOverflowLeft = 0x00200000,
kValidData = 0x00400000,
kExtend = 0x00800000
};
enum AWACsSoundControlRegisterConstants
{
kInSubFrameMask = 0x0000000F, kInSubFrame0 = 0x00000001, kInSubFrame1 = 0x00000002, kInSubFrame2 = 0x00000004, kInSubFrame3 = 0x00000008,
kOutSubFrameMask = 0x000000F0, kOutSubFrame0 = 0x00000010, kOutSubFrame1 = 0x00000020, kOutSubFrame2 = 0x00000040, kOutSubFrame3 = 0x00000080,
kHWRateMask = 0x00000700, kHWRate44100 = 0x00000000, kHWRate29400 = 0x00000100, kHWRate22050 = 0x00000200, kHWRate17640 = 0x00000300, kHWRate14700 = 0x00000400, kHWRate11025 = 0x00000500, kHWRate08820 = 0x00000600, kHWRate07350 = 0x00000700,
kHWRateShift = 8,
kAWACSError = 0x00000800, kPortChange = 0x00001000, kEnableErrInt = 0x00002000, kEnablePortChangeInt = 0x00004000,
kStatusSubFrmSel0 = 0x00000000, kStatusSubFrmSel1 = 0x00008000, kStatusSubFrmSel2 = 0x00010000, kStatusSubFrmSel3 = 0x00018000 };
enum AWACsClippingCountRegisterConstants
{
kRightClippingCount = 0x000000FF,
kLeftClippingCount = 0x0000FF00
};
#define kScreamerOWSampleLatency 32
#define kSGS7433Addr 0x8A // IIC address of the SGS tone chip
#define defSGSInSel 0x09 // The default input magic byte
#define kInFuncReg 0x00 // Input and global function reg
#define kVolReg 0x01 // Volume control register
#define kToneReg 0x02 // Bass and treble control register low nibble treble, hi nibble bass , 0xFF is flat)
#define kLFAttnReg 0x03 // Left Front (ie everything except the rear spkr jack)
#define kRFAttnReg 0x05 // Right Front
#define kLRAttnReg 0x04 // Left Rear (the rear speaker jack only)
#define kRRAttnReg 0x06 // Right Rear
#define kNumberOfRegs 7
#define SGSVolStepSize 2 // 1 dB steps (0x20 is 0 db gain. Values go from 0x6f ie (-79dB) to VolMaxVal)
#define SGSVolMaxVal 0x1D
#define SGSVolMinVal 0x6F
#define SCALER 256 // input range is...
#define SGSVolSteps (SGSVolMinVal-SGSVolMaxVal)/SGSVolStepSize
#define SGSVolDefaultVal ( ((SGSVolMinVal-SGSVolMaxVal)/4)*3 ) // default volume, 75%
#define SGSfSCALER 256.0 // absolute max val of short fixed volume param as a double
#define SGSfChipRange (double)(SGSVolMinVal-SGSVolMaxVal) // This is a double rep of the range
#define SGSfChipMax (double)SGSVolMinVal // This is the max chip attn val (in double format)
#define SGSChipMuteBit 0x02 // set to mute system. This actually switches to the second input, which is grounded.
#define TrebleSteps 15 // Number of treble steps
#define TrebleStepSize (SCALER/TrebleSteps)
#define TrebleLUTEntries 8
#define BassSteps 19 // Number of bass steps
#define BassStepSize (SCALER/BassSteps)
#define BassStupidBit 0x10
#define BassLUTEntries 10
#define ToneBoostBit 8 // bit 3 set is tone boost, else it's cut
#define TONECENTER (SCALER/2) // Balance, bass and treble go +/- around this point
#define SGSToneFlat 0xFF // Ye olde init value
#define BalanceStepSizeIndB .5 // .5 dB steps attn, from 0 to 37.5dB
#define BalanceSteps 0x1F // Number of balance steps
#define BalanceStepSize (SCALER/BalanceSteps)
#define sgsBalMuteBit 0x020 // When this bit is set in the output fader/ balance regs, the channel is muted
#define kNumSpkrDevs 4 // Number of different possible output devices
#define kCpuSpkr 1
#define kBoseSpkr 2
#define kExtPwrSpkr 3
#define kHeadPhoneSpkr 4
enum {
kAWACsInputReg = 0x00000000, kAWACsInputA = 0x00000800, kAWACsInputB = 0x00000400, kAWACsInputC = 0x00000200, kAWACsInputField = kAWACsInputA | kAWACsInputB | kAWACsInputC,
kAWACsPreampBReg = 0x00000000, kAWACsPreampB = 0x00000100,
kAWACsGainReg = 0x00000000, kAWACsGainLeft = 0x000000F0, kAWACsGainLeftShift = 0x00000004, kAWACsGainRight = 0x0000000F, kAWACsGainField = kAWACsGainLeft | kAWACsGainRight,
kAWACsProgOutputReg = 0x00000001, kAWACsOutputZero = 0x00000400, kAWACsOutputOne = 0x00000800, kAWACsProgOutputField = kAWACsOutputZero | kAWACsOutputOne, kAWACsProgOutputShift = 10,
kAWACsMuteReg = 0x00000001, kAWACsMuteOutputA = 0x00000200, kAWACsMuteOutputC = 0x00000080, kAWACsMuteField = kAWACsMuteOutputA | kAWACsMuteOutputC,
kAWACsLoopThruReg = 0x00000001, kAWACsLoopThruEnable = 0x00000040,
kAWACsRecalibrateReg = 0x00000001, kAWACsRecalibrate = 0x00000004,
kAWACsOutputAAttenReg = 0x00000002, kAWACsOutputCAttenReg = 0x00000004, kAWACsOutputLeftAtten = 0x000003C0, kAWACsOutputLeftShift = 0x00000006, kAWACsOutputRightAtten = 0x0000000F, kAWACsOutputAttenField = kAWACsOutputLeftAtten | kAWACsOutputRightAtten,
kAWACsPlayThruAttenReg = 0x00000005,
kAWACsPowerReg = 0x00000006, kAWACsSettlingTimeField = 0x00000180, kAWACsSettlingTimeLong = 0x00000100, kAWACsSettlingTimeShort = 0x00000080, kAWACsAnalogShutdown = 0x00000040,
kAWACsPCMCIAAttenReg = 0x00000006, kAWACsPCMCIAAttenField = 0x00000038, kAWACsPCMCIAOn = 0x00000008, kAWACsPCMCIAOff = 0x00000000,
kAWACsPreampAReg = 0x00000006, kAWACsPreampA = 0x00000004,
kAWACsPowerStateField = 0x00000003, kAWACsPowerStateIdle = 0x00000002, kAWACsPowerStateDoze = 0x00000001, kAWACsPowerStateRun = 0x00000000,
kAWACsMinHardwareGain = 0,
kAWACsMaxHardwareGain = 15,
kAWACsMaxHardwareGainPreAmp = 31,
kAWACsHWdBStepSize = 0x00018000,
kAWACsMinVolume = 15,
kAWACsInvalidVolumeMask = 0xFE00FE00,
kAWACsMaxVolumeA = 2,
kAWACsMaxVolumeC = 0
};
enum AwacsSndHWCtrl {
kAWACsCtlAddressMask = 0x003FF000, kAWACsCtlAddressShift = 12,
kAWACsReadbackRegister = 7, kAWACsReadbackRegAddrMask = 0x0000000E, kAWACsReadbackRegAddrShift = 1, kAWACsReadbackEnable = 0x00000001, kAWACsReadbackMask = 0x0000000F, kAWACsReadbackDataShift = 4, kAWACsReadbackDataMask = 0x00000FFF };
enum AwacsSndHWStatus {
kAWACsManufacturerIDMask = 0x00000F00, kAWACsManfCrystal = 0x00000100, kAWACsManfNational = 0x00000200, kAWACsManfTI = 0x00000300,
kAWACsRevisionNumberMask = 0x0000F000, kAWACsRevisionShift = 12, kAWACsValidData = 0x00400000, kAWACsRecalTimeOut = 1000,
kAWACsStatusMask = 0x00FFFFFF, kAWACsStatusInSenseMask = 0x0000000F,
kAWACsAwacsRevision = 2, kAWACsScreamerRevision = 3,
kAWACsInSenseMask = 0x0000000F, kAWACsInSense0 = 0x00000008, kAWACsInSense1 = 0x00000004, kAWACsInSense2 = 0x00000002, kAWACsInSense3 = 0x00000001,
kScreamerRunState1 = 0, kScreamerRunState2 = 3, kScreamerDozeState = 1, kScreamerIdleState = 2, kScreamerStateField = 3 };