/** 
 * @brief           HCD COM Header
 * @author          AXELL CORPORATION
 * @description     hcd_com.c用ヘッダ
 * @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.
 */
/* DOM-IGNORE-END */




#ifndef __HCD_COM_H__
    #define __HCD_COM_H__


// *************************************************************************************************
//	include
// *************************************************************************************************
#include "usbc_main.h"
#include "usbc_api.h"


// *************************************************************************************************
//	define
// *************************************************************************************************
// HCD共通部 バージョン情報
#define HCD_COMMON_MODULE_VERSION       0x0100                  // HCD共通部のバージョン(1.00)
#define HCD_MAX_DRIVERS                 10                      // HCDドライバの最大数

// ルートハブ用宣言
//#define HUB_DESCRIPTOR_TYPE         0x29
#define HUB_DESCRIPTOR_SIZE         0x6

#define HUB_NOTICE_HUB_CHANGED      0x01
#define HUB_NOTICE_PORT_CHANGED     0x01

#define ROOTHUB_PORT_NUM            0x01                        // ルートハブのポート数


struct hcd_driver_info;

// *************************************************************************************************
//	structure
// *************************************************************************************************
typedef uhs_status_t (*Hcd_OpenPipe_t)(struct usb_control_block * ucb);                 // パイプオープン関数ポインタ
typedef uhs_status_t (*Hcd_ClosePipe_t)(struct usb_control_block * ucb);                // パイプクローズ関数ポインタ
typedef uhs_status_t (*Hcd_TransReq_t)(struct usb_control_block * ucb);                 // 転送要求API関数ポインタ
typedef uhs_status_t (*Hcd_TransStopReq_t)(struct usb_control_block * ucb);             // 転送停止要求API関数ポインタ
typedef uhs_ubit32_t (*Hcd_GetFrameNo_t)(struct usbd_usb_deviceinfo * usbdev);          // フレーム番号取得API関数ポインタ
typedef uhs_ubit32_t (*Hcd_GetHcRevision_t)(struct usbd_usb_deviceinfo * usbdev);       // HCリビジョン番号取得関数ポインタ
typedef uhs_status_t (*Hcd_DevAttach_t)(struct usbd_usb_deviceinfo * usbdev);           // USBデバイス接続時、HC特有の設定を実施
typedef void         (*Hcd_DevDisConnect_t)(struct usbd_usb_deviceinfo * usbdev);       // USBデバイス切断時、HC特有の設定を実施
typedef uhs_status_t (*drv_hcd_attach_callback_t)(struct hcd_driver_info *hcd_reg, void * base_addr);   // ホストコントローラ発見時のコールバック
typedef uhs_status_t (*drv_hcd_detach_callback_t)(struct hcd_driver_info *hcd_reg);     // ホストコントローラ終了処理用コールバック
typedef uhs_status_t (*Hcd_ResetController_t)( struct usbd_usb_deviceinfo * usbdev );   // HC RESET要求API関数ポインタ
typedef uhs_status_t (*Hcd_NotifyStartSuspend)( struct usbd_usb_deviceinfo * usbdev );	//	Suspend開始通知
typedef uhs_status_t (*Hcd_NotifyFinishSuspend)( struct usbd_usb_deviceinfo * usbdev );	//	Suspend終了通知

// HCD情報格納構造体
struct hcd_info {

    Hcd_OpenPipe_t					open_pipe;                              // パイプオープン関数ポインタ
    Hcd_ClosePipe_t					close_pipe;                             // パイプクローズ関数ポインタ
    Hcd_TransReq_t					trans_req;                              // 転送要求API関数ポインタ
    Hcd_TransStopReq_t				trans_end_req;                          // 転送停止要求API関数ポインタ

    Hcd_GetFrameNo_t				get_frame_no;                           // フレーム番号取得API関数ポインタ
    Hcd_GetHcRevision_t				get_revision;                           // HCリビジョン番号取得関数ポインタ
    Hcd_DevAttach_t					dev_attach;                             // USBデバイス接続時、HC特有の設定を実施
    Hcd_DevDisConnect_t				dev_detach;                             // USBデバイス切断時、HC特有の設定を実施
    struct usbd_usb_deviceinfo		*root_hub_dev;                   		// ルートハブのデバイス構造体格納

	Hcd_NotifyStartSuspend			start_suspend;							//	Suspend開始（HUB以外の通信REQ NG）
	Hcd_NotifyFinishSuspend			finish_suspend;							//	Suspend終了（全通信REQ OK）

    void 							* hcd;                                  // HC各デバドラ情報アドレス格納ポインタ

	//	root_hub専用
    Hcd_OpenPipe_t					rh_open_pipe;                           // パイプオープン関数ポインタ
    Hcd_ClosePipe_t					rh_close_pipe;                          // パイプクローズ関数ポインタ
    Hcd_TransReq_t					rh_trans_req;                           // 転送要求API関数ポインタ
    Hcd_TransStopReq_t				rh_trans_end_req;                       // 転送停止要求API関数ポインタ

	Hcd_ResetController_t			rh_reset_hc;							// Reset HC

};



// HCDドライバ情報テーブル
struct hcd_driver_ids{      // __st__
    uhs_ubit8_t     class_id;                                   // クラスコード
        #define SERIAL_BUS_CONTROLLER   0x0c                        // シリアル周辺バスコントローラ
    uhs_ubit8_t     subclass_id;                                // サブクラスコード
        #define USB_BUS_CONTROLLER      0x03                        // USBコントローラ
    uhs_ubit8_t     interface_id;                               // プログラム・インターフェース
        #define USB_UHCI_CONTROLLER     0x00                        // UHCI準拠ホストコントローラ
        #define USB_OHCI_CONTROLLER     0x10                        // OHCI準拠ホストコントローラ
        #define USB_EHCI_CONTROLLER     0x20                        // EHCI準拠ホストコントローラ
};


// HCDドライバ登録用構造体
struct hcd_driver_info{     // __st__
    // 対応デバイス判定情報
    struct hcd_driver_ids           id_table;
    // 対応デバイス発見時コールバック情報
    drv_hcd_attach_callback_t       attach;     // デバイス接続時にコールされるコールバック関数
    // 対応デバイス終了処理コールバック情報
    drv_hcd_detach_callback_t       detach;     // 終了処理時にコールされるコールバック関数
    // コンテキスト情報
    void *                          context;    // 発見時に設定し、終了時に利用する。
};


struct root_hub{                    // __st__
    enum usb_state{
        USB_DEFAULT = 0,
        USB_ADDRESS,
        USB_CONFIGURED
    }device_state;                                          // Default, Addressed, Configured状態を格納

    uhs_ubit32_t    config_value;                           // Configuration値を格納
};


#endif	//  __HCD_COM_H__

