usbdev.h 5.87 KB
#ifndef __USBDEV_H__
#define __USBDEV_H__


//#define USB_SPEAKER_DONGLE
#if 0//ndef USB_SPEAKER_DONGLE
#define USB_SPEAKER_AUTO_DETECT
#else
#undef USB_SPEAKER_AUTO_DETECT
#endif


#if 1
#define	VENDOR_ID    0x0475
#define	PRODUCT_ID   0x1503
#else
#define	VENDOR_ID    0x0000
#define	PRODUCT_ID   0x0005
#endif


/* Allow USB AUDIO_SUB_FRAME_SIZE=3, AUDIO_BIT_RESOLUTION=24 */
//#define AudioData24BIT


//JJ+ for USB audio class 2.0
//#define ADC20

//JJ!!!+ for USB duplex both downwards and upwards pipe
//Normal undef below macros, i.e. both Speaker and Mic exist!
//#undef ONLYSpeakerCFG
//#undef ONLYMicCFG



//#define HIDFUNC

#ifdef HIDFUNC
	//for HID Consumer device! 
	#define HIDKEY
#endif

//2nd ISO IN Intf1/endp3In (#define	ENDP_NUM_ISO_INFB 3) for USB Audio Device Async !
//#define USBDEV_ISOIN_ASYNC

//Only function of USB Speaker
//#define ONLYSpeakerCFG

//Only function of USB Microphone
//#define ONLYMicCFG

//JJ+ for DFU
//#define DFUFUNC


//Enable USB SOF Interrupt
#define USB_DEV_LIB_V1P0P10
#ifdef USB_DEV_LIB_V1P0P10
//V1.0.10
#define SOFINTEN
#endif


//Window XP/7 can support only up to 44.1, 48Khz and 16bits !!!
//#define USB_AUDIO_SRC_44100
#define USB_AUDIO_SRC_48000
//#define USB_AUDIO_SRC_88200
//#define USB_AUDIO_SRC_96000
//#define USB_AUDIO_SRC_176400
//#define USB_AUDIO_SRC_192000



/* second USB Audio Out should be mandatory ! */
#if 1//ndef ADC20

#define	AUDIO_CHANNELS          2    /*for Audio Out*/
#define	AUDIO_OUT_CHANNELS      AUDIO_CHANNELS
#define	AUDIO_SUB_FRAME_SIZE    2    //pcm16
#define	AUDIO_BIT_RESOLUTION    16		

#if 0
#define AUDIOIN_CHANNELS        2    /*for Audio In*/
#else
#define AUDIOIN_CHANNELS        1    /*for Audio In*/
#endif
#define AUDIOIN_SUB_FRAME_SIZE  2    //pcm16, Force MIC audio IN to 16bits !!!
#define AUDIOIN_BIT_RESOLUTION  16

//-------------------------------------------------------
#ifdef USB_AUDIO_SRC_44100
#define	AUDIO_SAMPLE_FREQ       44100
//for USB Audio In MIC.
#define	AUDIOIN_SAMPLE_FREQ     44100

//for second USB Audio Out.
#define	AUDIO_SAMPLE_FREQ2      44100
#endif

//-------------------------------------------------------
#ifdef USB_AUDIO_SRC_48000
//for first USB Audio Out.
#define AUDIO_SAMPLE_FREQ       48000
//#define AUDIO_SAMPLE_FREQ       96000
//for USB Audio In MIC.
#if 1
#define AUDIOIN_SAMPLE_FREQ     48000
#else
/* !!! Note xiaomi6 cannot support 24KHz !!! */
#define AUDIOIN_SAMPLE_FREQ     24000	
#endif

//#define AUDIOIN_SAMPLE_FREQ     16000

//for second USB Audio Out.
#define AUDIO_SAMPLE_FREQ2     48000

//#define AUDIO_SAMPLE_RATE_HALF
#endif

//-------------------------------------------------------
#ifdef USB_AUDIO_SRC_88200
//for first USB Audio Out.
#define	AUDIO_SAMPLE_FREQ      88200
//for USB Audio In MIC.
#define	AUDIOIN_SAMPLE_FREQ    88200

//for second USB Audio Out.
#define	AUDIO_SAMPLE_FREQ2     44100
#endif

//-------------------------------------------------------
#ifdef USB_AUDIO_SRC_96000
//for first USB Audio Out.
#define	AUDIO_SAMPLE_FREQ      96000
//for USB Audio In MIC.
#define	AUDIOIN_SAMPLE_FREQ    48000

//for second USB Audio Out.
#define	AUDIO_SAMPLE_FREQ2     48000
#endif

//-------------------------------------------------------
#ifdef USB_AUDIO_SRC_176400
//for first USB Audio Out.
#define	AUDIO_SAMPLE_FREQ     176400
//for USB Audio In MIC.
#define	AUDIOIN_SAMPLE_FREQ   176400

//for second USB Audio Out.
#define	AUDIO_SAMPLE_FREQ2    44100
#endif

//-------------------------------------------------------
#ifdef USB_AUDIO_SRC_192000
//for first USB Audio Out.
#define	AUDIO_SAMPLE_FREQ     192000
//for USB Audio In MIC.
#define	AUDIOIN_SAMPLE_FREQ   192000

//for second USB Audio Out.
#define	AUDIO_SAMPLE_FREQ2    48000
#endif
#endif



typedef struct {
	BOOL	USBOutEnable;		//USB Speaker
	BOOL	USBInEnable;		//USB Mic, ONLYMicCFG, USB_DEVICE_IN_OUT_CFG
	BOOL	USBOutMixInEnable;	//Mix USB Out with other data then USB In.

#if 1//def USB_DEV_LIB_V1P0P10
	BOOL	SOFINTEnable;		//Enable SOF Interrupt
#endif

	BOOL	ADC20Enable;		//ADC20
	
	BOOL	ISOIN_ASYNCEnable;	//USBDEV_ISOIN_ASYNC

	BOOL	HIDFuncEnable;		//HIDFUNC
	BOOL 	HIDKEYEnable;		//HIDKEY

	BOOL 	USBAUDIOdata_BITs;	//USBAUDIO_BITs 0: 16bits, 1: 24bits

	BOOL 	SECOND_OUTEPEnable;	//SECOND_OUTEP, 2nd Ep for USB Audio Out.

	//-------- Audio Out/In formats --------
	U32		usb_AUDIO_SAMPLE_FREQ;		//AUDIO_SAMPLE_FREQ		48000, for first USB Audio Out.
	U32		usb_AUDIO_SAMPLE_FREQ2;		//AUDIO_SAMPLE_FREQ		44100, for second USB Audio Out.

	U8		usb_AUDIO_CHANNELS;			//AUDIO_CHANNELS			2
	U8		usb_AUDIO_SUB_FRAME_SIZE;	//AUDIO_SUB_FRAME_SIZE		2		//pcm16
	U8 		usb_AUDIO_BIT_RESOLUTION;	//AUDIO_BIT_RESOLUTION		16		

	U32		usb_AUDIOIN_SAMPLE_FREQ;	//AUDIOIN_SAMPLE_FREQ	48000, for USB Audio In MIC.

	U8		usb_AUDIOIN_CHANNELS;		//AUDIOIN_CHANNELS			2		/*for Audio In*/
	U8		usb_AUDIOIN_SUB_FRAME_SIZE;	//AUDIOIN_SUB_FRAME_SIZE	2		//pcm16, Force MIC audio IN to 16bits !!!
	U8		usb_AUDIOIN_BIT_RESOLUTION;	//AUDIOIN_BIT_RESOLUTION	16

} USB_DEV_FEATURE_CONF;

extern USB_DEV_FEATURE_CONF usbdev_featureconf;

/*
	device
*/

#define	VOLUME_MASTER_CHAN_ONLY


typedef enum {
	enUSB_DEV_STACK_ATTR_NULL	=	0,
	enUSB_DEV_STACK_ATTR_PC_SPEAKER,
	enUSB_DEV_STACK_ATTR_APPLE_LIGHTNING,
	enUSB_DEV_STACK_ATTR_USB_MICROPHONE,
	enUSB_DEV_STACK_ATTR_USB_MSC
} enum_USB_DEVICE_STACK_ATTR;

typedef enum {
	//Telephony Page
	enHUTTELEPHONY_HOOK	=	0x01,
	enHUTTELEPHONY_DROP	=	0x04,
	enHUTTELEPHONY_MUTE	=	0x04
} enum_USB_HUTTELEPHONY_KEYCODE;

typedef enum {
	//Consumer Page
	enHUTCONSUMER_VOLUP		=	0x01,
	enHUTCONSUMER_VOLDOWN	=	0x02,
	enHUTCONSUMER_PLAY	=	0x04,
	enHUTCONSUMER_NEXT	=	0x08,
	enHUTCONSUMER_PREV	=	0x10,
	enHUTCONSUMER_STOP	=	0x20,
	enHUTCONSUMER_FF	=	0x40,
	enHUTCONSUMER_RW	=	0x80
} enum_USB_HUTCONSUMER_KEYCODE;


int usb_devStart(enum_USB_DEVICE_STACK_ATTR attr);
int usb_devStop(void);

int usb_devID_get(U16 *pVendorID, U16 *pProductID);
int usb_devAudioSampleRate_get(U32 *pSampleRate);

void daudio_SetFBSamplerateCorrection(int value);


#endif