mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
120 lines
3.6 KiB
C
120 lines
3.6 KiB
C
|
/* Google ADK interface support header */
|
||
|
|
||
|
#if !defined(_ADK_H_)
|
||
|
#define _ADK_H_
|
||
|
|
||
|
#include <inttypes.h>
|
||
|
#include <avr/pgmspace.h>
|
||
|
#include "avrpins.h"
|
||
|
#include "max3421e.h"
|
||
|
#include "usbhost.h"
|
||
|
#include "usb_ch9.h"
|
||
|
#include "Usb.h"
|
||
|
#include <WProgram.h>
|
||
|
|
||
|
#include "printhex.h"
|
||
|
#include "hexdump.h"
|
||
|
#include "message.h"
|
||
|
|
||
|
#include "confdescparser.h"
|
||
|
|
||
|
#define ADK_VID 0x18D1
|
||
|
#define ADK_PID 0x2D00
|
||
|
#define ADB_PID 0x2D01
|
||
|
|
||
|
/* requests */
|
||
|
|
||
|
#define ADK_GETPROTO 51 //check USB accessory protocol version
|
||
|
#define ADK_SENDSTR 52 //send identifying string
|
||
|
#define ADK_ACCSTART 53 //start device in accessory mode
|
||
|
|
||
|
#define bmREQ_ADK_GET USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_VENDOR|USB_SETUP_RECIPIENT_DEVICE
|
||
|
#define bmREQ_ADK_SEND USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_VENDOR|USB_SETUP_RECIPIENT_DEVICE
|
||
|
|
||
|
#define ACCESSORY_STRING_MANUFACTURER 0
|
||
|
#define ACCESSORY_STRING_MODEL 1
|
||
|
#define ACCESSORY_STRING_DESCRIPTION 2
|
||
|
#define ACCESSORY_STRING_VERSION 3
|
||
|
#define ACCESSORY_STRING_URI 4
|
||
|
#define ACCESSORY_STRING_SERIAL 5
|
||
|
|
||
|
#define ADK_MAX_ENDPOINTS 3 //endpoint 0, bulk_IN, bulk_OUT
|
||
|
|
||
|
class ADK;
|
||
|
|
||
|
class ADK : public USBDeviceConfig
|
||
|
{
|
||
|
private:
|
||
|
/* ID strings */
|
||
|
const char* manufacturer;
|
||
|
const char* model;
|
||
|
const char* description;
|
||
|
const char* version;
|
||
|
const char* uri;
|
||
|
const char* serial;
|
||
|
|
||
|
/* ADK proprietary requests */
|
||
|
uint8_t getProto( uint8_t* adkproto );
|
||
|
uint8_t sendStr( uint8_t index, const char* str );
|
||
|
uint8_t switchAcc( void );
|
||
|
|
||
|
protected:
|
||
|
static const uint8_t epDataInIndex; // DataIn endpoint index
|
||
|
static const uint8_t epDataOutIndex; // DataOUT endpoint index
|
||
|
|
||
|
/* mandatory members */
|
||
|
USB *pUsb;
|
||
|
uint8_t bAddress;
|
||
|
uint8_t bConfNum; // configuration number
|
||
|
uint8_t bControlIface; // Control interface value
|
||
|
uint8_t bDataIface; // Data interface value
|
||
|
uint8_t bNumEP; // total number of EP in the configuration
|
||
|
uint32_t qNextPollTime; // next poll time
|
||
|
bool bPollEnable; // poll enable flag
|
||
|
//uint8_t bInitState; //initialization state machine state
|
||
|
|
||
|
/* Endpoint data structure */
|
||
|
EpInfo epInfo[ADK_MAX_ENDPOINTS];
|
||
|
|
||
|
// void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
|
||
|
|
||
|
public:
|
||
|
ADK(USB *pUsb, const char* manufacturer,
|
||
|
const char* model,
|
||
|
const char* description,
|
||
|
const char* version,
|
||
|
const char* uri,
|
||
|
const char* serial);
|
||
|
|
||
|
// Methods for recieving and sending data
|
||
|
uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr);
|
||
|
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
|
||
|
|
||
|
|
||
|
// USBDeviceConfig implementation
|
||
|
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
|
||
|
virtual uint8_t Release();
|
||
|
virtual uint8_t Poll();
|
||
|
virtual uint8_t GetAddress() { return bAddress; };
|
||
|
|
||
|
// UsbConfigXtracter implementation
|
||
|
// virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
|
||
|
}; //class ADK : public USBDeviceConfig ...
|
||
|
/* get ADK protocol version */
|
||
|
/* returns 2 bytes in *adkproto */
|
||
|
inline uint8_t ADK::getProto( uint8_t* adkproto )
|
||
|
{
|
||
|
return( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_GET, ADK_GETPROTO, 0, 0, 0, 2, 2, adkproto, NULL ));
|
||
|
}
|
||
|
/* send ADK string */
|
||
|
inline uint8_t ADK::sendStr( uint8_t index, const char* str )
|
||
|
{
|
||
|
return( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_SEND, ADK_SENDSTR, 0, 0, index, strlen(str) + 1, strlen(str) + 1, (uint8_t*)str, NULL));
|
||
|
}
|
||
|
/* switch to accessory mode */
|
||
|
inline uint8_t ADK::switchAcc( void )
|
||
|
{
|
||
|
return( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_SEND, ADK_ACCSTART, 0, 0, 0, 0, 0, NULL, NULL));
|
||
|
}
|
||
|
|
||
|
#endif // _ADK_H_
|