#ifndef __TEXAS_HW__
#define __TEXAS_HW__
#include <libkern/OSTypes.h>
#define kDontRestoreOnNormal 0
#define kRestoreOnNormal 1
#define kNumberOfBiquadsPerChannel 6
#define kNumberOfCoefficientsPerBiquad 5
#define kNumberOfBiquadCoefficientsPerChannel ( kNumberOfBiquadsPerChannel * kNumberOfCoefficientsPerBiquad )
#define kNumberOfBiquadCoefficients ( kNumberOfBiquadCoefficientsPerChannel * kTumblerMaxStreamCnt )
#define kHeadphoneBit 0x02
typedef UInt8 biquadParams[15];
static biquadParams kBiquad0db = { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
#if 0
static UInt8 kTrebleRegValues[] = {
0x01, 0x09, 0x10, 0x16, 0x1C, 0x22, 0x28, 0x2D, 0x32, 0x36, 0x3A, 0x3E, 0x42, 0x45, 0x49, 0x4C, 0x4F, 0x52, 0x55, 0x57, 0x5A, 0x5C, 0x5E, 0x60, 0x62, 0x63, 0x65, 0x66, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96 };
static UInt8 kBassRegValues[] = {
0x01, 0x03, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0F, 0x10, 0x12, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1C, 0x1F, 0x21, 0x23, 0x25, 0x26, 0x28, 0x29, 0x2B, 0x2C, 0x2E, 0x30, 0x31, 0x33, 0x35, 0x36, 0x28, 0x39, 0x3B, 0x3C, 0x3E, 0x40, 0x42, 0x44, 0x46, 0x49, 0x4B, 0x4D, 0x4F, 0x51, 0x53, 0x54, 0x55, 0x56, 0x58, 0x59, 0x5A, 0x5C, 0x5D, 0x5F, 0x61, 0x64, 0x66, 0x69, 0x6B, 0x6D, 0x6E, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7D, 0x7F, 0x82, 0x86 };
#endif
static UInt32 volumeTable[] = { 0x00000000, 0x00000015, 0x00000016, 0x00000017, 0x00000019, 0x0000001A, 0x0000001C, 0x0000001D, 0x0000001F, 0x00000021, 0x00000023, 0x00000025, 0x00000027, 0x00000029, 0x0000002C, 0x0000002E, 0x00000031, 0x00000034, 0x00000037, 0x0000003A, 0x0000003E, 0x00000042, 0x00000045, 0x0000004A, 0x0000004E, 0x00000053, 0x00000057, 0x0000005D, 0x00000062, 0x00000068, 0x0000006E, 0x00000075, 0x0000007B, 0x00000083, 0x0000008B, 0x00000093, 0x0000009B, 0x000000A5, 0x000000AE, 0x000000B9, 0x000000C4, 0x000000CF, 0x000000DC, 0x000000E9, 0x000000F6, 0x00000105, 0x00000114, 0x00000125, 0x00000136, 0x00000148, 0x0000015C, 0x00000171, 0x00000186, 0x0000019E, 0x000001B6, 0x000001D0, 0x000001EB, 0x00000209, 0x00000227, 0x00000248, 0x0000026B, 0x0000028F, 0x000002B6, 0x000002DF, 0x0000030B, 0x00000339, 0x0000036A, 0x0000039E, 0x000003D5, 0x0000040F, 0x0000044C, 0x0000048D, 0x000004D2, 0x0000051C, 0x00000569, 0x000005BB, 0x00000612, 0x0000066E, 0x000006D0, 0x00000737, 0x000007A5, 0x00000818, 0x00000893, 0x00000915, 0x0000099F, 0x00000A31, 0x00000ACC, 0x00000B6F, 0x00000C1D, 0x00000CD5, 0x00000D97, 0x00000E65, 0x00000F40, 0x00001027, 0x0000111C, 0x00001220, 0x00001333, 0x00001456, 0x0000158A, 0x000016D1, 0x0000182B, 0x0000199A, 0x00001B1E, 0x00001CB9, 0x00001E6D, 0x0000203A, 0x00002223, 0x00002429, 0x0000264E, 0x00002893, 0x00002AFA, 0x00002D86, 0x00003039, 0x00003314, 0x0000361B, 0x00003950, 0x00003CB5, 0x0000404E, 0x0000441D, 0x00004827, 0x00004C6D, 0x000050F4, 0x000055C0, 0x00005AD5, 0x00006037, 0x000065EA, 0x00006BF4, 0x0000725A, 0x00007920, 0x0000804E, 0x000087EF, 0x00008FF6, 0x0000987D, 0x0000A186, 0x0000AB19, 0x0000B53C, 0x0000BFF9, 0x0000CB59, 0x0000D766, 0x0000E429, 0x0000F1AE, 0x00010000, 0x00010F2B, 0x00011F3D, 0x00013042, 0x00014249, 0x00015562, 0x0001699C, 0x00017F09, 0x000195BC, 0x0001ADC6, 0x0001C73D, 0x0001E237, 0x0001FECA, 0x00021D0E, 0x00023D1D, 0x00025F12, 0x0002830B, 0x0002A925, 0x0002D182, 0x0002FC42, 0x0003298B, 0x00035983, 0x00038C53, 0x0003C225, 0x0003FB28, 0x0004378B, 0x00047783, 0x0004BB44, 0x0005030A, 0x00054F10, 0x00059F98, 0x0005F4E5, 0x00064F40, 0x0006AEF6, 0x00071457, 0x00077FBB, 0x0007F17B };
static IOFixed volumedBTable[] = {
-70 << 16, -70 << 16, -69 << 16 | 0x8000, -69 << 16, -68 << 16 | 0x8000,
-68 << 16, -67 << 16 | 0x8000, -67 << 16, -66 << 16 | 0x8000,
-66 << 16, -65 << 16 | 0x8000, -65 << 16, -64 << 16 | 0x8000,
-64 << 16, -63 << 16 | 0x8000, -63 << 16, -62 << 16 | 0x8000,
-62 << 16, -61 << 16 | 0x8000, -61 << 16, -60 << 16 | 0x8000,
-60 << 16, -59 << 16 | 0x8000, -59 << 16, -58 << 16 | 0x8000,
-58 << 16, -57 << 16 | 0x8000, -57 << 16, -56 << 16 | 0x8000,
-56 << 16, -55 << 16 | 0x8000, -55 << 16, -54 << 16 | 0x8000,
-54 << 16, -53 << 16 | 0x8000, -53 << 16, -52 << 16 | 0x8000,
-52 << 16, -51 << 16 | 0x8000, -51 << 16, -50 << 16 | 0x8000,
-50 << 16, -49 << 16 | 0x8000, -49 << 16, -48 << 16 | 0x8000,
-48 << 16, -47 << 16 | 0x8000, -47 << 16, -46 << 16 | 0x8000,
-46 << 16, -45 << 16 | 0x8000, -45 << 16, -44 << 16 | 0x8000,
-44 << 16, -43 << 16 | 0x8000, -43 << 16, -42 << 16 | 0x8000,
-42 << 16, -41 << 16 | 0x8000, -41 << 16, -40 << 16 | 0x8000,
-40 << 16, -39 << 16 | 0x8000, -39 << 16, -38 << 16 | 0x8000,
-38 << 16, -37 << 16 | 0x8000, -37 << 16, -36 << 16 | 0x8000,
-36 << 16, -35 << 16 | 0x8000, -35 << 16, -34 << 16 | 0x8000,
-34 << 16, -33 << 16 | 0x8000, -33 << 16, -32 << 16 | 0x8000,
-32 << 16, -31 << 16 | 0x8000, -31 << 16, -30 << 16 | 0x8000,
-30 << 16, -29 << 16 | 0x8000, -29 << 16, -28 << 16 | 0x8000,
-28 << 16, -27 << 16 | 0x8000, -27 << 16, -26 << 16 | 0x8000,
-26 << 16, -25 << 16 | 0x8000, -25 << 16, -24 << 16 | 0x8000,
-24 << 16, -23 << 16 | 0x8000, -23 << 16, -22 << 16 | 0x8000,
-22 << 16, -21 << 16 | 0x8000, -21 << 16, -20 << 16 | 0x8000,
-20 << 16, -19 << 16 | 0x8000, -19 << 16, -18 << 16 | 0x8000,
-18 << 16, -17 << 16 | 0x8000, -17 << 16, -16 << 16 | 0x8000,
-16 << 16, -15 << 16 | 0x8000, -15 << 16, -14 << 16 | 0x8000,
-14 << 16, -13 << 16 | 0x8000, -13 << 16, -12 << 16 | 0x8000,
-12 << 16, -11 << 16 | 0x8000, -11 << 16, -10 << 16 | 0x8000,
-10 << 16, -9 << 16 | 0x8000, -9 << 16, -8 << 16 | 0x8000,
-8 << 16, -7 << 16 | 0x8000, -7 << 16, -6 << 16 | 0x8000,
-6 << 16, -5 << 16 | 0x8000, -5 << 16, -4 << 16 | 0x8000,
-4 << 16, -3 << 16 | 0x8000, -3 << 16, -2 << 16 | 0x8000,
-2 << 16, -1 << 16 | 0x8000, -1 << 16, -0 << 16 | 0x8000,
0 << 16, +0 << 16 | 0x8000, +1 << 16, +1 << 16 | 0x8000,
2 << 16, +2 << 16 | 0x8000, +3 << 16, +3 << 16 | 0x8000,
4 << 16, +4 << 16 | 0x8000, +5 << 16, +5 << 16 | 0x8000,
6 << 16, +6 << 16 | 0x8000, +7 << 16, +7 << 16 | 0x8000,
8 << 16, +8 << 16 | 0x8000, +9 << 16, +9 << 16 | 0x8000,
10 << 16, +10 << 16 | 0x8000, +11 << 16, +11 << 16 | 0x8000,
12 << 16, +12 << 16 | 0x8000, +13 << 16, +13 << 16 | 0x8000,
14 << 16, +14 << 16 | 0x8000, +15 << 16, +15 << 16 | 0x8000,
16 << 16, +16 << 16 | 0x8000, +17 << 16, +17 << 16 | 0x8000,
+18 << 16
};
#pragma mark -
#pragma mark ¥¥¥¥¥¥¥¥ TAS3001C Registers ¥¥¥¥¥¥¥¥
enum TAS3001Registers { kMainCtrlReg = 0x01,
kFL = 7, kSC = 6, kE0 = 4, kF0 = 2, kW0 = 0,
kNormalLoad = 0, kFastLoad = 1,
kSerialModeLeftJust = 0, kSerialModeRightJust = 1, kSerialModeI2S = 2,
kSerialWordLength16 = 0, kSerialWordLength18 = 1, kSerialWordLength20 = 2,
k32fs = 0, k64fs = 1,
kI2SMode = ( kSerialModeI2S << kE0 ) | ( kSerialModeI2S << kF0 ),
kLeftJustMode = ( kSerialModeLeftJust << kE0 ) | ( kSerialModeLeftJust << kF0 ),
kRightJustMode = ( kSerialModeRightJust << kE0 ) | ( kSerialModeRightJust << kF0 ),
kDynamicRangeCtrlReg = 0x02, kEN = 0, kCR = 6, kCompression3to1 = 3,
kDrcDisable = 0, kDrcEnable = 1, kDefaultCompThld = 0xA0,
kVolumeCtrlReg = 0x04,
kTrebleCtrlReg = 0x05,
kBassCtrlReg = 0x06,
kMixer1CtrlReg = 0x07,
kMixer2CtrlReg = 0x08,
kLeftBiquad0CtrlReg = 0x0A,
kLeftBiquad1CtrlReg = 0x0B, kLeftBiquad2CtrlReg = 0x0C, kLeftBiquad3CtrlReg = 0x0D, kLeftBiquad4CtrlReg = 0x0E, kLeftBiquad5CtrlReg = 0x0F,
kRightBiquad0CtrlReg = 0x13, kRightBiquad1CtrlReg = 0x14, kRightBiquad2CtrlReg = 0x15, kRightBiquad3CtrlReg = 0x16, kRightBiquad4CtrlReg = 0x17, kRightBiquad5CtrlReg = 0x18 };
enum biquadInformation{
kBiquadRefNum_0 = 0,
kBiquadRefNum_1 = 1,
kBiquadRefNum_2 = 2,
kBiquadRefNum_3 = 3,
kBiquadRefNum_4 = 4,
kBiquadRefNum_5 = 5,
kTumblerMaxBiquadRefNum = 5,
kTumblerNumBiquads = 6,
kTumblerCoefficientsPerBiquad = 5,
kTumblerCoefficientBitWidth = 24,
kTumblerCoefficientIntegerBitWidth = 4,
kTumblerCoefficientFractionBitWidth = 20
};
#define kEXPERIMENT 2
#if kEXPERIMENT == 1
#define TAS_I2S_MODE kLeftJustMode
#define TAS_WORD_LENGTH kSerialWordLength20
#elif kEXPERIMENT == 2
#define TAS_I2S_MODE kI2SMode
#define TAS_WORD_LENGTH kSerialWordLength20
#elif kEXPERIMENT == 3
#define TAS_I2S_MODE kLeftJustMode
#define TAS_WORD_LENGTH kSerialWordLength16
#elif kEXPERIMENT == 4
#define TAS_I2S_MODE kI2SMode
#define TAS_WORD_LENGTH kSerialWordLength16
#endif
#define ASSERT_GPIO( x ) ( 0 == x ? 0 : 1 )
#define NEGATE_GPIO( x ) ( 0 == x ? 1 : 0 )
enum TAS3001C_registerWidths{
kMCRwidth = 1,
kDRCwidth = 2,
kVOLwidth = 6,
kTREwidth = 1,
kBASwidth = 1,
kMIXwidth = 3,
kBIQwidth = ( 3 * 5 )
};
enum mixerType{
kMixerNone,
kMixerTAS3001C
};
enum TAS3001Constants {
kMixMute = 0x00000000, kMix0dB = 0x00100000 };
enum {
kStreamCountMono = 1,
kStreamCountStereo = 2
};
enum GeneralHardwareAttributeConstants {
kSampleRatesCount = 2,
kFrontLeftOFFSET = 0,
kFrontRightOFFSET = 1,
kTumblerMaxStreamCnt = kStreamCountStereo, kTumblerMaxSndSystem = 2, k16BitsPerChannel = 16,
kTumblerInputChannelDepth = kStreamCountMono,
kTumblerInputFrameSize = 16,
kTouchBiquad = 1,
kBiquadUntouched = 0
};
enum {
kStreamFrontLeft = 'fntl', kStreamFrontRight = 'fntr', kStreamSurroundLeft = 'surl', kStreamSurroundRight = 'surr', kStreamCenter = 'cntr', kStreamLFE = 'lfe ', kStreamHeadphoneLeft = 'hplf', kStreamHeadphoneRight = 'hprt', kStreamLeftOfCenter = 'loc ', kStreamRightOfCenter = 'roc ', kStreamSurround = 'sur ', kStreamSideLeft = 'sidl', kStreamSideRight = 'sidr', kStreamTop = 'top ', kStreamMono = 'mono',
kStreamVirtualHPLeft = 'vhpl', kStreamVirtualHPRight = 'vhpr',
kStreamEmbeddedSubwoofer = 'lfei', kStreamBitBucketLeft = 'sbbl', kStreamBitBucketRight = 'sbbr', kMAX_STREAM_COUNT = 20,
kStreamStereo = 'flfr' };
#define kSetBass 1
#define kSetTreble 0
#define kToneGainToRegIndex 0x38E
#define kDrcThresholdMin -35.9375
#define kDrcThresholdMax 0
#define kDrcThresholdStepSize 375
#define kDrcUnityThresholdHW (15 << 4 )
#define kDrcRatioNumerator 3
#define kDrcRationDenominator 1
#define kDefaultMaximumVolume 0
#define kTumblerVolumeStepSize 1
#define kTumblerMinVolume -70
#define kTumblerAbsMaxVolume 18
#define kTumblerMaxIntVolume 256
#define kAmpRecoveryMuteDuration 225
#define kTexasInputSampleLatency 32
#define kTexasOutputSampleLatency 31
#define kHeadphoneAmpEntry "headphone-mute"
#define kAmpEntry "amp-mute"
#define kHWResetEntry "audio-hw-reset"
#define kHeadphoneDetectInt "headphone-detect"
#define kKWHeadphoneDetectInt "keywest-gpio15"
#define kDallasDetectInt "extint-gpio16"
#define kKWDallasDetectInt "keywest-gpio16"
#define kVideoPropertyEntry "video"
#define kOneWireBus "one-wire-bus"
#define kI2CDTEntry "i2c"
#define kDigitalEQDTEntry "deq"
#define kSoundEntry "sound"
#define kNumInputs "#-inputs"
#define kDeviceID "device-id"
#define kSpeakerID "speaker-id"
#define kCompatible "compatible"
#define kI2CAddress "i2c-address"
#define kAudioGPIO "audio-gpio"
#define kAudioGPIOActiveState "audio-gpio-active-state"
#define kIOInterruptControllers "IOInterruptControllers"
enum UFixedPointGain{
kMinSoftwareGain = 0x00008000,
kUnitySoftwareGain = 0x00010000,
kMaxSoftwareGain = 0x00018000,
kSoftwareGainMask = 0x0001F000
};
enum TAS3001C_ResetFlags{
kNO_FORCE_RESET_SETUP_TIME = 0,
kFORCE_RESET_SETUP_TIME = 1
};
enum loadMode {
kSetNormalLoadMode = 0,
kSetFastLoadMode = 1
};
enum semaphores{
kResetSemaphoreBit = 0, kResetSemaphoreMask = ( 1 << 0 ) };
enum writeMode{
kUPDATE_SHADOW = 0,
kUPDATE_HW = 1,
kUPDATE_ALL = 2
};
enum resetRetryCount{
kRESET_MAX_RETRY_COUNT = 5
};
enum eqPrefsVersion{
kCurrentEQPrefsVersion = 1
};
enum muteSelectors{
kHEADPHONE_AMP = 0,
kSPEAKER_AMP = 1
};
#define kHeadphoneBitPolarity 1
#define kHeadphoneBitAddr 0
#define kHeadphoneBitMask (1 << kHeadphoneBitAddr)
#define kHeadphoneBitMatch (kHeadphoneBitPolarity << kHeadphoneBitAddr)
#define kHeadphoneDetect 1
#define kSpeakerBit 1
#pragma mark -
#pragma mark ¥¥¥¥¥¥¥¥ Structures ¥¥¥¥¥¥¥¥
typedef Boolean GpioActiveState;
typedef struct{
UInt8 sMCR[kMCRwidth];
UInt8 sDRC[kDRCwidth];
UInt8 sVOL[kVOLwidth];
UInt8 sTRE[kTREwidth];
UInt8 sBAS[kBASwidth];
UInt8 sMX1[kMIXwidth];
UInt8 sMX2[kMIXwidth];
UInt8 sLB0[kBIQwidth];
UInt8 sLB1[kBIQwidth];
UInt8 sLB2[kBIQwidth];
UInt8 sLB3[kBIQwidth];
UInt8 sLB4[kBIQwidth];
UInt8 sLB5[kBIQwidth];
UInt8 sRB0[kBIQwidth];
UInt8 sRB1[kBIQwidth];
UInt8 sRB2[kBIQwidth];
UInt8 sRB3[kBIQwidth];
UInt8 sRB4[kBIQwidth];
UInt8 sRB5[kBIQwidth];
}TAS3001C_ShadowReg;
typedef TAS3001C_ShadowReg TAS3001C_ShadowReg;
typedef TAS3001C_ShadowReg *TAS3001C_ShadowRegPtr;
struct HiLevelFilterCoefficients {
float filterFrequency;
float filterGain;
float filterQ;
UInt32 filterType;
};
typedef HiLevelFilterCoefficients * HiLevelFilterCoefficientsPtr;
struct FourDotTwenty
{
unsigned char integerAndFraction1;
unsigned char fraction2;
unsigned char fraction3;
};
typedef struct FourDotTwenty FourDotTwenty, *FourDotTwentyPtr;
union EQFilterCoefficients {
FourDotTwenty coefficient[kNumberOfCoefficientsPerBiquad]; };
typedef EQFilterCoefficients *EQFilterCoefficientsPtr;
struct EQPrefsElement {
UInt32 filterSampleRate;
UInt32 drcCompressionRatioNumerator;
UInt32 drcCompressionRatioDenominator;
SInt32 drcThreshold;
SInt32 drcMaximumVolume;
UInt32 drcEnable;
UInt32 layoutID; UInt32 deviceID; UInt32 speakerID; UInt32 reserved;
UInt32 filterCount; EQFilterCoefficients filter[12]; };
typedef EQPrefsElement *EQPrefsElementPtr;
#define kCurrentEQPrefVersion 1
struct EQPrefs {
UInt32 structVersionNumber; UInt32 genreType; UInt32 eqCount; UInt32 nameID; EQPrefsElement eq[0x00000013]; };
typedef EQPrefs *EQPrefsPtr;
struct DRCInfo {
UInt32 compressionRatioNumerator;
UInt32 compressionRatioDenominator;
SInt32 threshold;
SInt32 maximumVolume;
UInt32 maximumAvailableVolume;
UInt32 minimumAvailableVolume;
UInt32 maximumAvailableThreshold;
UInt32 minimumAvailableThreshold;
Boolean enable;
};
typedef DRCInfo *DRCInfoPtr;
enum extInt_gpio{
intEdgeSEL = 7, positiveEdge = 0, dualEdge = 1 };
enum gpio{
gpioOS = 4, gpioBit0isOutput = 0, gpioMediaBayIsOutput = 1, gpioReservedOutputSel = 2, gpioMPICopenCollector = 3,
gpioAltOE = 3, gpioOE_DDR = 0, gpioOE_Use_OS = 1,
gpioDDR = 2, gpioDDR_INPUT = 0, gpioDDR_OUTPUT = 1,
gpioPIN_RO = 1,
gpioDATA = 0 };
#endif // __TEXAS_HW__