/** 
 * @brief		USB HOST API Wrapper Header
 * @author      AXELL CORPORATION
 * @description	USB HOST API Wrapper提供ヘッダ。
 * @note		none
 * @history     2017_02_22	初版
 * @history     2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
 */
#ifndef __USBH_API_H__
    #define __USBH_API_H__
/* DOM-IGNORE-END */


// *************************************************************************************************
//	include
// *************************************************************************************************
//#include	"uhs_config.h"
#include	"uhs_type.h"
#include	"depend_cfg.h"														//	open_usbdi.h での参照マクロ有り
#include	"open_usbdi.h"
#include	"wrapper_kernel.h"
#include	"usbc_api.h"

/** 電源供給状態（ON）*/
#define USBH_RH_PORT_POWER_ON				(0x1U)
/** 電源供給状態（OFF）*/
#define USBH_RH_PORT_POWER_OFF				(0x0U)

/**	オーバーカレントCALLBACK種別（ルートHUBでのオーバーカレント検出）*/
#define	USBH_OVCR_KIND_ROOT_HUB				(1)
/**	オーバーカレントCALLBACK種別（汎用HUB全体でのオーバーカレント検出）*/
#define	USBH_OVCR_KIND_GENERIC_HUB			(2)
/**	オーバーカレントCALLBACK種別（汎用HUBの特定ポートでのオーバーカレント検出）*/
#define	USBH_OVCR_KIND_GENERIC_PORT			(3)

/**	CALLBACK関数Return値（OK）*/
#define	USBH_CBRTN_OK						(0)
/**	CALLBACK関数Return値（NG[理由問わず]）*/
#define	USBH_CBRTN_NG						(-1)
/**	CALLBACK関数Return値（NG[接続制限OVER]）*/
#define	USBH_CBRTN_NG_TOOMANY				(-2)


/**	オーバーカレントCALLBACKへのパラメータ定義 */
struct usbh_overcurrent_info {
    struct usbd_usb_deviceinfo		*usbhub;									/** 過電流が発生したハブデバイス */
    uhs_ubit8_t						port_num;									/** 過電流が発生したポート番号 */
	uhs_ubit8_t						ovcr_kind;									/**	オーバーカレント種別 */
};

/**	Split Error Notify CALLBACKへのパラメータ定義 */
struct usbh_split_err_notify_info {

	struct	usbd_usb_spliterrinfo	*split_err_info;							/**	Splitエラー発生時の情報
																					CLEAR_TT_BUFFERに必要な情報のみ含む。 */
};


/*
 * デバイス指定によるポート制御関連の宣言(ここから)
 */

/** デバイス情報 */
typedef struct usbd_usb_deviceinfo *PUSB_DEVICE;

/** デバイスのクラスタイプ */
typedef enum {
    DEV_TYPE_NONE,																/** 未定義 */
    DEV_TYPE_OTHER,																/** その他のデバイス */
    DEV_TYPE_ROOT,																/** Root HUB */
    DEV_TYPE_HUB,																/** HUB デバイス */
    DEV_TYPE_STOR,																/** Storage デバイス */
    DEV_TYPE_CDC,																/** CDC デバイス */
    DEV_TYPE_HID																/** HID デバイス */
} DEVICE_TYPE;

/*
 * デバイス指定によるポート制御関連の宣言(ここまで)
 */


/*
 * ステータス通知関連の宣言(ここから)
 */

/** ログ種別指定用 */
typedef enum _usb_logtype {
    USB_MSGMON_LOGTYPE_ANALYSIS,												/** 解析ログ */
    USB_MSGMON_LOGTYPE_NORMALOP													/** 運用ログ */
} usb_logtype;


/** 解析ログ用メッセージフォーマット<p>
    USB Host 各層は本構造体を使ってメッセージを投げて下さい。<p>
    解析ログ指定時、アプリケーションには本構造体で通知を行います。 */
typedef struct _usb_msgformat {
    uhs_ubit8_t  msglayer;														/** メッセージの送信元階層 */
    uhs_ubit8_t  msgsublayer;													/** メッセージ送信元階層の副階層 */
    uhs_ubit8_t  msgtype;														/** メッセージタイプ */
    uhs_ubit8_t  msglevel;														/** メッセージレベル */
    uhs_ubit16_t msgdata;														/** メッセージデータ */
    uhs_ubit16_t extdatasize;													/** extdata にリンクされたデータサイズ */
    void *       extdata;														/** 拡張メッセージデータへのポインタ */
    SYSTIM      rcvdtime;														/** 受信時刻 */
} usb_msgformat;


/** 運用中用メッセージフォーマット<p>
    運用中ログ指定時、アプリケーションには本構造体で通知を行います。*/
typedef struct _usb_simple_msgformat {
    uhs_ubit8_t  msglayer;														/** メッセージの送信元階層 */
    uhs_ubit8_t  msgsublayer;													/** メッセージ送信元階層の副階層 */
    uhs_ubit8_t  msgtype;														/** メッセージタイプ */
    uhs_ubit8_t  msglevel;														/** メッセージレベル */
    uhs_ubit16_t msgdata;														/** メッセージデータ */
    uhs_ubit16_t extdatasize;													/** extdata にリンクされたデータサイズ */
    void *       extdata;														/** 拡張メッセージデータへのポインタ */
    SYSTIM      rcvdtime;														/** 受信時刻 */
} usb_simple_msgformat;


/** メッセージの送信元階層 ( msglayer ) */
typedef enum _usb_msglayer {
    USB_MSGMON_LAYER_USBH_HCD,													/**	HCD */
    USB_MSGMON_LAYER_USBH_CORE,													/**	コア */
    USB_MSGMON_LAYER_USBH_CLASSDRIVER,											/**	クラスドライバ */
    USB_MSGMON_LAYER_USBH_FILESYSTEM											/**	ファイルシステム */
} usb_msglayer;


//--------------------------------------------------------------------------------------------------
// メッセージ送信元副階層 ( msgsublayer )
//--------------------------------------------------------------------------------------------------

// コアの副階層は無し。msgsublayer には 0 を指定。

/** HCD の副階層 */
typedef enum _usb_msgsublayer_hcd {
    USB_MSGMON_SUBLAYER_HCD_OHCI,												/**	OHCI ドライバ */
    USB_MSGMON_SUBLAYER_HCD_EHCI												/**	EHCI ドライバ */
} usb_msgsublayer_hcd;

/** クラスドライバの副階層 */
typedef enum _usb_msgsublayer_clsdrv {
    USB_MSGMON_SUBLAYER_CLSDRV_STOR,											/** マスストレージクラスドライバ */
    USB_MSGMON_SUBLAYER_CLSDRV_HUB,												/**	ハブドライバ */
    USB_MSGMON_SUBLAYER_CLSDRV_CDC,												/**	コミュニケーションデバイスクラスドライバ */
    USB_MSGMON_SUBLAYER_CLSDRV_HID												/**	HIDクラスドライバ */
} usb_msgsublayer_clsdrv;

// ファイルシステムの副階層は無し。msgsublayer には 0 を指定。



/** メッセージレベル ( msglevel ) */
typedef enum _usg_msglevel {
    USB_MSGMON_MSGLVL_MILESTONE,												/**	通常イベント */
    USB_MSGMON_MSGLVL_ERROR,													/**	エラー */
    USB_MSGMON_MSGLVL_WARNING													/**	警告 */
} usb_msglevel;


/** EHCI ステータスコード( msgdata ) */
/**	イリーガルERR */
#define USBHC_ILLEGAL_ERROR			(1)
/**	リソースERR */
#define USBHC_RESOURCE_UNAVAIL		(2)
/**	パラメータERR */
#define USBHC_INVALID_PARAMETER		(3)
/**	FORCE_RESUME ビット0に戻らない。*/
#define	USBHC_RESUME_NOT_ZEORRTN	(4)


/** EHCI マイルストーン */
/** 初期化完了 */
#define USBHC_EHCI_INIT_COMP        (1)
/** 削除完了 */
#define USBHC_EHCI_EXIT_COMP        (2)
/** デバイス接続 */
#define USBHC_DEVICE_CONNECT        (3)
/** デバイス切断 */
#define USBHC_DEVICE_DISCONNECT     (4)
/** ポートON */
#define USBHC_EHCI_PORTPOWER_ON     (5)
/** ポートOFF */
#define USBHC_EHCI_PORTPOWER_OFF    (6)

/** CORE ステータスコード( msgdata ) */
/** アドレスERR */
#define USBC_INVALID_ADDRESS        (1)
/** インターフェースERR */
#define USBC_INVALID_INTERFACE      (2)
/** エンドポイントERR */
#define USBC_INVALID_ENDPOINT       (3)
/** パイプERR */
#define USBC_INVALID_PIPE           (4)
/** パラメータERR */
#define USBC_INVALID_PARAMETER      (5)
/** パイプHALT */
#define USBC_PIPE_HALT_ERROR        (6)
/** バンド幅ERR */
#define USBC_NO_BANDWIDTH           (7)
/** 初期化ERR */
#define USBC_INIT_ERROR             (8)
/** HOST初期化ERR */
#define USBC_HOST_INIT_ERROR        (9)
/** イリーガルERR */
#define USBC_ILLEGAL_ERROR          (10)
/** リソースERR */
#define USBC_RESOURCE_UNAVAIL       (11)
/** パスSUSPEND */
#define USBC_BUS_SUSPEND            (12)
/** リクエストキューFULL */
#define USBC_REQUEST_QUEUE_FULL     (13)

/**	CORE  マイルストーン */
/**	CORE初期化完了 */
#define USBC_INIT_COMP              (1)
/**	CORE終了処理完了 */
#define USBC_EXIT_COMP              (2)
/**	エニュメレーション開始 */
#define USBC_ENUM_START             (3)
/**	エニュメレーション終了 */
#define USBC_ENUM_END               (4)

/** HUB ステータスコード( msgdata ) */
/**	オーバーカレント検出 */
#define USBCLS_HUB_DETECT_OVERCURRENT   (1)
/**	イリーガルERR */
#define USBCLS_HUB_ILLEGAL_ERROR        (2)
/**	リソースERR */
#define USBCLS_HUB_RESOURCE_UNAVAIL     (3)
/**	パラメータERR */
#define USBCLS_HUB_INVALID_PARAMETER    (4)
/**	PORT_RESETに失敗 */
#define USBCLS_HUB_IMPORTANT_ERROR		(5)
/**	ステータスERR */
#define USBCLS_HUB_INVALID_STATUS		(6)
/**	接続可能台数オーバー */
#define USBCLS_HUB_OVERCONN				(7)

/** HUB マイルストーン */
/**	HUB初期化処理正常完了 */
#define USBCLS_HUB_INIT_COMP            (1)
/**	HUB終了処理正常完了 */
#define USBCLS_HUB_EXIT_COMP            (2)
/**	PORTへの有効デバイス接続検出 */
#define USBCLS_HUB_DEVICE_CONNECTED     (3)
/**	PORTにからのデバイス切断検出 */
#define USBCLS_HUB_DEVICE_DISCONNECTED  (4)
/**	HUBデバイス接続失敗 */
#define	USBCLS_HUB_DEVICE_CONNECT_NG	(5)



/*
 * ステータス通知関連の宣言(ここまで)
 */

//--------------------------------------------------------------------------------------------------
//	Assert種別コード
//--------------------------------------------------------------------------------------------------
/** Assert種別コード メモリ TOPID */
#define		USBH_ASSERT_MEM_TOPID			(0x00010000)
/** Assert種別コード メモリ CREATE */
#define		USBH_ASSERT_MEM_CREATE			(USBH_ASSERT_MEM_TOPID | 0x00000001)
/** Assert種別コード メモリ ALLOC */
#define		USBH_ASSERT_MEM_ALLOC			(USBH_ASSERT_MEM_TOPID | 0x00000002)
/** Assert種別コード メモリ FREE */
#define		USBH_ASSERT_MEM_FREE			(USBH_ASSERT_MEM_TOPID | 0x00000003)
/** Assert種別コード メモリ DELETE */
#define		USBH_ASSERT_MEM_DELETE			(USBH_ASSERT_MEM_TOPID | 0x00000004)

/** Assert種別コード セマフォ TOPID */
#define		USBH_ASSERT_SEM_TOPID			(0x00020000)						
/** Assert種別コード セマフォ CREATE */
#define		USBH_ASSERT_SEM_CREATE			(USBH_ASSERT_SEM_TOPID | 0x00000001)
/** Assert種別コード セマフォ ACQU */
#define		USBH_ASSERT_SEM_ACQU			(USBH_ASSERT_SEM_TOPID | 0x00000002)
/** Assert種別コード セマフォ REL */
#define		USBH_ASSERT_SEM_REL				(USBH_ASSERT_SEM_TOPID | 0x00000003)
/** Assert種別コード セマフォ DELETE */
#define		USBH_ASSERT_SEM_DELETE			(USBH_ASSERT_SEM_TOPID | 0x00000004)

/** Assert種別コード イベントフラグ TOPID */
#define		USBH_ASSERT_EVF_TOPID			(0x00030000)						
/** Assert種別コード イベントフラグ CREATE */
#define		USBH_ASSERT_EVF_CREATE			(USBH_ASSERT_EVF_TOPID | 0x00000001)
/** Assert種別コード イベントフラグ SET */
#define		USBH_ASSERT_EVF_SET				(USBH_ASSERT_EVF_TOPID | 0x00000002)
/** Assert種別コード イベントフラグ WAIT */
#define		USBH_ASSERT_EVF_WAIT			(USBH_ASSERT_EVF_TOPID | 0x00000003)
/** Assert種別コード イベントフラグ DELETE */
#define		USBH_ASSERT_EVF_DELETE			(USBH_ASSERT_EVF_TOPID | 0x00000004)

/** Assert種別コード データキュー TOPID */
#define		USBH_ASSERT_DTQ_TOPID			(0x00040000)						
/** Assert種別コード データキュー CREATE */
#define		USBH_ASSERT_DTQ_CREATE			(USBH_ASSERT_DTQ_TOPID | 0x00000001)
/** Assert種別コード データキュー SND */
#define		USBH_ASSERT_DTQ_SND				(USBH_ASSERT_DTQ_TOPID | 0x00000002)
/** Assert種別コード データキュー RCV */
#define		USBH_ASSERT_DTQ_RCV				(USBH_ASSERT_DTQ_TOPID | 0x00000003)
/** Assert種別コード データキュー DELETE */
#define		USBH_ASSERT_DTQ_DELETE			(USBH_ASSERT_DTQ_TOPID | 0x00000004)

/** Assert種別コード 時刻取得 TOPID */
#define		USBH_ASSERT_TIM_TOPID			(0x00050000)						
/** Assert種別コード 時刻取得 GET */	
#define		USBH_ASSERT_TIM_GET				(USBH_ASSERT_TIM_TOPID | 0x00000001)
/** Assert種別コード 時刻取得 WAIT */
#define		USBH_ASSERT_TIM_WAIT			(USBH_ASSERT_TIM_TOPID | 0x00000002)

/** Assert種別コード 周期ハンドラ TOPID */
#define		USBH_ASSERT_CYC_TOPID			(0x00060000)						
/** Assert種別コード 周期ハンドラ CREATE */
#define		USBH_ASSERT_CYC_CREATE			(USBH_ASSERT_CYC_TOPID | 0x00000001)
/** Assert種別コード 周期ハンドラ INACT */
#define		USBH_ASSERT_CYC_INACT			(USBH_ASSERT_CYC_TOPID | 0x00000002)
/** Assert種別コード 周期ハンドラ DELETE */
#define		USBH_ASSERT_CYC_DELETE			(USBH_ASSERT_CYC_TOPID | 0x00000003)

/** Assert種別コード スレッド TOPID */
#define		USBH_ASSERT_THREAD_TOPID		(0x00070000)						
/** Assert種別コード スレッド CREATE */
#define		USBH_ASSERT_THREAD_CREATE		(USBH_ASSERT_THREAD_TOPID | 0x00000001)
/** Assert種別コード スレッド EXIT */
#define		USBH_ASSERT_THREAD_EXIT			(USBH_ASSERT_THREAD_TOPID | 0x00000002)
/** Assert種別コード スレッド DELETE */
#define		USBH_ASSERT_THREAD_DELETE		(USBH_ASSERT_THREAD_TOPID | 0x00000003)

/** Assert種別コード MailBox TOPID */
#define		USBH_ASSERT_MBOX_TOPID			(0x00080000)						
/** Assert種別コード MailBox CREATE */
#define		USBH_ASSERT_MBOX_CREATE			(USBH_ASSERT_MBOX_TOPID | 0x00000001)
/** Assert種別コード MailBox SND */
#define		USBH_ASSERT_MBOX_SND			(USBH_ASSERT_MBOX_TOPID | 0x00000002)
/** Assert種別コード MailBox RCV */
#define		USBH_ASSERT_MBOX_RCV			(USBH_ASSERT_MBOX_TOPID | 0x00000003)
/** Assert種別コード MailBox DELETE */
#define		USBH_ASSERT_MBOX_DELETE			(USBH_ASSERT_MBOX_TOPID | 0x00000004)

/** Assert種別コード 割込み TOPID */
#define		USBH_ASSERT_INT_TOPID			(0x00090000)						
/** Assert種別コード 割込み REG */
#define		USBH_ASSERT_INT_REG				(USBH_ASSERT_INT_TOPID | 0x00000001)
/** Assert種別コード 割込み ENA */
#define		USBH_ASSERT_INT_ENA				(USBH_ASSERT_INT_TOPID | 0x00000002)
/** Assert種別コード 割込み DIS */
#define		USBH_ASSERT_INT_DIS				(USBH_ASSERT_INT_TOPID | 0x00000003)
/** Assert種別コード 割込み UNREG */
#define		USBH_ASSERT_INT_UNREG			(USBH_ASSERT_INT_TOPID | 0x00000004)



/** クラスドライバ初期化関数用コールバック型 */
typedef int (*usb_class_init_callback_t)(void * stCallback);



/**	各クラスドライバのCALLBACK情報<p>
    USB Hostを初期化する際にクラスドライバの初期化関数、及び、アプリケーションレベルのアタッチ/デタッチ
    CALLBACK関数のポインタを指定するためのデータ構造。<p>
    Usbh_init の呼出にて、本構造体に定義されたクラスドライバの初期化関数が呼び出され、USB COREブロックに
    クラスドライバが登録されます。<p>
    本構造体は配列として宣言することで、USB HOSTスタックの初期化時に複数のクラスドライバを登録する事が
    出来ます。 <p>
    生成タイミング ： USB Host初期化時<p>
    削除タイミング ： USB Host初期化後、任意のタイミング */
typedef struct _app_callback_info {

    class_driver_type			clsdrv_type;									/**	デバイス種別 */
    usb_common_callback_t		attach_callback;								/** アプリケーションへの接続コールバック */
    usb_common_callback_t		detach_callback;								/** アプリケーションへの切断コールバック */
	usb_class_init_callback_t	class_ini_callback;								/** クラスドライバ初期化関数ポインタ(Reregist と Exit は、class_driver_reginfo型で保持) */
    uhs_boolean_t				is_lastnode;									/** 最後のノードであれば TRUE。そうでなければ FALSE。 */

} app_callback_info;


/**	USB HOSTの初期化関数に渡す 各種CALLBACK情報<p>
    各種コールバックをNULLに設定した場合はコールバックは行われません。<p>
    生成タイミング ： USB Host初期化時<p>
    削除タイミング ： USB Host初期化後、任意のタイミング */
typedef struct _usbh_regist_info {

	//	システムに１つ
	//^^^^^^^^^^^^^^^^^^
    usb_common_callback_t		overload_callback;								/** 過電流通知コールバック */
    usb_common_callback_t		status_notify_callback;							/** ステータス通知コールバック	(status monitor が呼び出す) */
    usb_common_callback_t		split_err_notify_callback;						/** Split通信エラー通知コールバック	(これを契機にCLEAR_TT_BUFFERを発行する) */
    usb_common_callback_t		assert_callback;								/** USB HOST内でのAssert検出時に呼び出すコールバック */
    usb_logtype					logtype;										/** ステータス通知ログタイプ(feature use) */

	//	クラドライバ毎
	//^^^^^^^^^^^^^^^^^^
    app_callback_info 			* app_callback;									/**	クラスドライバのCB関数	※配列形式で複数クラス分を渡せる。 */

} usbh_regist_info;


extern uhs_status_t Usbh_Init( usbh_regist_info init );
extern uhs_status_t Usbh_Exit( void );
extern uhs_status_t Usbh_Api_RegistAppCallback( usbh_regist_info init );
extern uhs_status_t Usbh_Api_DriverRegister(struct class_driver_reginfo * driver_info);
extern void         Usbh_Api_DriverUnRegister(struct class_driver_reginfo * driver_info);
extern uhs_status_t Usbh_Api_OpenPipe(struct usb_control_block* ucb);
extern uhs_status_t Usbh_Api_ClosePipe(struct usb_control_block* ucb);
extern uhs_status_t Usbh_Api_ControlMsg(struct usb_control_block* ucb);
extern uhs_status_t Usbh_Api_BulkMsg(struct usb_control_block* ucb);
extern uhs_status_t Usbh_Api_IntMsg(struct usb_control_block* ucb);
extern uhs_status_t Usbh_Api_SyncControlMsg(struct usb_control_block* ucb, const udi_ubit8_t bmRequestType, const udi_ubit8_t bRequest, 
                                            const udi_ubit8_t wValue0, const udi_ubit8_t wValue1, const udi_ubit8_t wIndex0, const udi_ubit8_t wIndex1, void *buf, const uhs_ubit32_t size);
extern uhs_status_t Usbh_Api_SyncBulkMsg( struct usb_control_block* ucb );
extern uhs_status_t Usbh_Api_CancelPipe(struct usb_control_block* ucb);
extern uhs_status_t Usbh_Api_GetDescriptor(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit8_t type, const uhs_ubit8_t index, const uhs_ubit16_t wIndex, void *buf, const uhs_ubit32_t size);
extern uhs_status_t Usbh_Api_SetDescriptor(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit8_t type, const uhs_ubit8_t index, const uhs_ubit16_t wIndex, void *buf, const uhs_ubit32_t size);
extern uhs_status_t Usbh_Api_ClearFeature(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit8_t bmRequest, const uhs_ubit16_t feature_select, const uhs_ubit16_t wIndex);
extern uhs_status_t Usbh_Api_SetFeature(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit8_t bmRequest, const uhs_ubit16_t feature_select, const uhs_ubit16_t wIndex);
extern uhs_status_t Usbh_Api_GetStatus(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit8_t bmRequest, const uhs_ubit16_t wIndex, void *buf);
extern uhs_status_t Usbh_Api_SetAddress(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit16_t address);
extern uhs_status_t Usbh_Api_GetConfiguration(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, void *buf);
extern uhs_status_t Usbh_Api_SetConfiguration(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit16_t config_num);
extern uhs_status_t Usbh_Api_GetInterface(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit16_t wIndex, void *buf);
extern uhs_status_t Usbh_Api_SetInterface(struct usb_control_block* ucb, struct usbd_usb_deviceinfo* usbdev, const uhs_ubit16_t intf_num, const uhs_ubit16_t alt_num);
extern uhs_status_t Usbh_Api_AllocUsbCtrlBlock(struct usb_control_block ** ucb);
extern uhs_status_t Usbh_Api_FreeUsbCtrlBlock(struct usb_control_block * ucb);
extern void			Usbh_Api_FixupUsbCtrlBlock(struct usb_control_block * ucb, struct usbd_usb_deviceinfo* usbdev,  const uhs_ubit32_t pipe,  usb_device_request_t *setup_data, void *data_buf,  const uhs_ubit32_t data_len, const uhs_ubit8_t interval, usb_common_callback_t complete_func, void     *context);
extern void			Usbh_Api_FixupPipeInfo( uhs_ubit32_t *pipe, const uhs_ubit8_t usb_addr, const uhs_ubit8_t ep_num, const uhs_ubit8_t packet_id, const uhs_ubit8_t ep_type, const uhs_ubit32_t maxpkt_size);
extern uhs_boolean_t Usbh_Api_PipeIsOpened(struct usb_control_block* ucb);
extern uhs_ubit32_t Usbh_Api_GetPipeAddr(const uhs_ubit32_t pipe);
extern uhs_ubit32_t Usbh_Api_GetPipeEpNum(const uhs_ubit32_t pipe);
extern uhs_ubit32_t Usbh_Api_GetPipePID(const uhs_ubit32_t pipe);
extern uhs_boolean_t Usbh_Api_GetPipeDirIn(const uhs_ubit32_t pipe);
extern uhs_ubit32_t Usbh_Api_GetPipeEpType(const uhs_ubit32_t pipe);
extern uhs_ubit32_t Usbh_Api_GetPipeMaxPktSize(const uhs_ubit32_t pipe);
extern uhs_ubit8_t Usbh_Api_GetPortPower(struct usbd_usb_deviceinfo *usbhub, const uhs_ubit8_t port_num);
extern void 		Usbh_Api_SetPortPower(struct usbd_usb_deviceinfo *usbhub, const uhs_ubit8_t port_num, const uhs_ubit8_t stat);
extern struct usbd_usb_deviceinfo *   Usbh_Api_EnumRootHub( struct usbd_usb_deviceinfo * pRootHub );
extern struct usbd_usb_deviceinfo *   Usbh_Api_EnumDevice( struct usbd_usb_deviceinfo * pParent, struct usbd_usb_deviceinfo * pChild );
extern uhs_ubit8_t   Usbh_Api_GetDeviceType( struct usbd_usb_deviceinfo * pDev );
extern uhs_boolean_t Usbh_Api_GetVidPid( struct usbd_usb_deviceinfo * pDev, udi_ubit16_t *pVid, udi_ubit16_t *pPid );
extern uhs_boolean_t Usbh_Api_GetSerial( struct usbd_usb_deviceinfo * pDev, udi_ubit8_t *pSerial, udi_ubit8_t bufsize );
extern uhs_status_t  Usbh_Api_GetVersion(uhs_ubit8_t* pu8MajorVersion, uhs_ubit8_t* pu8MinorVersion);
extern	uhs_status_t	Usbh_Api_ResetTT(struct usbd_usb_deviceinfo *usbhub, const uhs_ubit16_t tt_num);
extern	uhs_status_t	Usbh_Api_ClearTTBuffer(struct usbd_usb_deviceinfo *usbhub, const uhs_ubit16_t tt_num, struct usbd_usb_spliterrinfo *split_err_info);
extern void Usb_Core_ReportStatus( const char *pFileName, uhs_ubit32_t nLine, usb_msglevel level, uhs_ubit16_t msgdata );
extern void Hcd_EHCI_ReportStatus( const char *pFileName, uhs_ubit32_t nLine, usb_msglevel level, uhs_ubit16_t msgdata );
extern	uhs_status_t Usbh_Api_ReqDisableAttDet( void );
extern	uhs_status_t Usbh_Api_CancelDisableAttDet( void );
extern uhs_status_t Usbh_Api_ReqSuspend( void );
extern uhs_status_t Usbh_Api_ReqResume( void );


// *************************************************************************************************
//  マクロ定義
// *************************************************************************************************
/** コントロール転送用UCB設定API */
#define Usbh_FixupCtrlUcb(ucb, usbdev, pipe, setup, buf, size, function, context)   \
            Usbh_Api_FixupUsbCtrlBlock(ucb, usbdev, pipe, setup, buf, size, 0x00, function, context)
/** バルク転送用UCB設定API */
#define Usbh_FixupBulkUcb(ucb, usbdev, pipe, buf, size, function, context)  \
            Usbh_Api_FixupUsbCtrlBlock(ucb, usbdev, pipe, NULL, buf, size, 0, function, context)
/** インタラプト転送用UCB設定API */
#define Usbh_FixupIntrUcb(ucb, usbdev, pipe, buf, size, interval, function, context)    \
            Usbh_Api_FixupUsbCtrlBlock(ucb, usbdev, pipe, NULL, buf, size, interval, function, context)
/** アイソ転送用UCB設定API */
#define Usbh_FixupIsoUcb(ucb, usbdev, pipe, buf, size, function, context)   \
            Usbh_Api_FixupUsbCtrlBlock(ucb, usbdev, pipe, NULL, buf, size, 0, function, context)


#endif	//	__USBH_API_H__
