You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
9.5 KiB

/********************************** (C) COPYRIGHT *******************************
* File Name : CH59x_usbhost.h
* Author : WCH
* Version : V1.2
* Date : 2021/11/17
* Description
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH59x_USBHOST_H__
#define __CH59x_USBHOST_H__
#ifdef __cplusplus
extern "C" {
#endif
#if DISK_LIB_ENABLE
#if DISK_WITHOUT_USB_HUB
/* ��ʹ��U���ļ�ϵͳ������U�̹���USBhub���棬��Ҫ�ر����涨�� */
#define FOR_ROOT_UDISK_ONLY
#endif
/* ʹ��U���ļ�ϵͳ�⣬��Ҫ�������涨��, ��ʹ�����ر� */
#define DISK_BASE_BUF_LEN 512 /* Ĭ�ϵĴ������ݻ�������СΪ512�ֽ�,����ѡ��Ϊ2048����4096��֧��ijЩ��������U��,Ϊ0����ֹ��.H�ļ��ж��建��������Ӧ�ó�����pDISK_BASE_BUF��ָ�� */
#endif
// ���ӳ��򷵻�״̬��
#define ERR_SUCCESS 0x00 // �����ɹ�
#define ERR_USB_CONNECT 0x15 /* ���⵽USB�豸�����¼�,�Ѿ����� */
#define ERR_USB_DISCON 0x16 /* ���⵽USB�豸�Ͽ��¼�,�Ѿ��Ͽ� */
#define ERR_USB_BUF_OVER 0x17 /* USB����������������������̫�໺�������� */
#define ERR_USB_DISK_ERR 0x1F /* USB�洢������ʧ��,�ڳ�ʼ��ʱ������USB�洢����֧��,�ڶ�д�����п����Ǵ����𻵻����Ѿ��Ͽ� */
#define ERR_USB_TRANSFER 0x20 /* NAK/STALL�ȸ�����������0x20~0x2F */
#define ERR_USB_UNSUPPORT 0xFB /* ��֧�ֵ�USB�豸*/
#define ERR_USB_UNKNOWN 0xFE /* �豸��������*/
#define ERR_AOA_PROTOCOL 0x41 /* Э���汾���� */
/*USB�豸������Ϣ��,����֧��1���豸*/
#define ROOT_DEV_DISCONNECT 0
#define ROOT_DEV_CONNECTED 1
#define ROOT_DEV_FAILED 2
#define ROOT_DEV_SUCCESS 3
#define DEV_TYPE_KEYBOARD (USB_DEV_CLASS_HID | 0x20)
#define DEV_TYPE_MOUSE (USB_DEV_CLASS_HID | 0x30)
#define DEF_AOA_DEVICE 0xF0
#define DEV_TYPE_UNKNOW 0xFF
/*
Լ: USBַ(οUSB_DEVICE_ADDR)
ֵַ λ
0x02 Root-HUBµUSBⲿHUB
0x1x Root-HUBµⲿHUBĶ˿xµUSB,xΪ1~n
*/
#define HUB_MAX_PORTS 4
#define WAIT_USB_TOUT_200US 800 // �ȴ�USB�жϳ�ʱʱ��
typedef struct
{
uint8_t DeviceStatus; // �豸״̬,0-���豸,1-���豸����δ��ʼ��,2-���豸����ʼ��ö��ʧ��,3-���豸�ҳ�ʼ��ö�ٳɹ�
uint8_t DeviceAddress; // �豸��������USB��ַ
uint8_t DeviceSpeed; // 0Ϊ����,��0Ϊȫ��
uint8_t DeviceType; // �豸����
uint16_t DeviceVID;
uint16_t DevicePID;
uint8_t GpVar[4]; // ͨ�ñ��������Ŷ˵�
uint8_t GpHUBPortNum; // ͨ�ñ���,������HUB����ʾHUB�˿���
} _RootHubDev;
typedef struct
{
UINT8 DeviceStatus; // �豸״̬,0-���豸,1-���豸����δ��ʼ��,2-���豸����ʼ��ö��ʧ��,3-���豸�ҳ�ʼ��ö�ٳɹ�
UINT8 DeviceAddress; // �豸��������USB��ַ
UINT8 DeviceSpeed; // 0Ϊ����,��0Ϊȫ��
UINT8 DeviceType; // �豸����
UINT16 DeviceVID;
UINT16 DevicePID;
UINT8 GpVar[4]; // ͨ�ñ���
} _DevOnHubPort; // �ٶ�:������1���ⲿHUB,ÿ���ⲿHUB������HUB_MAX_PORTS���˿�(���˲���)
extern _RootHubDev ThisUsbDev;
extern _DevOnHubPort DevOnHubPort[HUB_MAX_PORTS]; // �ٶ�:������1���ⲿHUB,ÿ���ⲿHUB������HUB_MAX_PORTS���˿�(���˲���)
extern uint8_t UsbDevEndp0Size; // USB�豸�Ķ˵�0���������ߴ� */
extern uint8_t FoundNewDev;
extern uint8_t *pHOST_RX_RAM_Addr;
extern uint8_t *pHOST_TX_RAM_Addr;
extern _RootHubDev ThisUsb2Dev;
extern _DevOnHubPort DevOnU2HubPort[HUB_MAX_PORTS]; // �ٶ�:������1���ⲿHUB,ÿ���ⲿHUB������HUB_MAX_PORTS���˿�(���˲���)
extern uint8_t Usb2DevEndp0Size; // USB�豸�Ķ˵�0���������ߴ� */
extern uint8_t FoundNewU2Dev;
extern uint8_t *pU2HOST_RX_RAM_Addr;
extern uint8_t *pU2HOST_TX_RAM_Addr;
#define pSetupReq ((PUSB_SETUP_REQ)pHOST_TX_RAM_Addr)
#define pU2SetupReq ((PUSB_SETUP_REQ)pU2HOST_TX_RAM_Addr)
extern uint8_t Com_Buffer[];
extern uint8_t U2Com_Buffer[];
/* ����ΪUSB���������� */
extern const uint8_t SetupGetDevDescr[]; // ��ȡ�豸������*/
extern const uint8_t SetupGetCfgDescr[]; // ��ȡ����������*/
extern const uint8_t SetupSetUsbAddr[]; // ����USB��ַ*/
extern const uint8_t SetupSetUsbConfig[]; // ����USB����*/
extern const uint8_t SetupSetUsbInterface[]; // ����USB�ӿ�����*/
extern const uint8_t SetupClrEndpStall[]; // �����˵�STALL*/
extern const uint8_t SetupGetU2DevDescr[]; // ��ȡ�豸������*/
extern const uint8_t SetupGetU2CfgDescr[]; // ��ȡ����������*/
extern const uint8_t SetupSetUsb2Addr[]; // ����USB��ַ*/
extern const uint8_t SetupSetUsb2Config[]; // ����USB����*/
extern const uint8_t SetupSetUsb2Interface[]; // ����USB�ӿ�����*/
extern const uint8_t SetupClrU2EndpStall[]; // �����˵�STALL*/
/**
* @brief رROOT-HUB˿,ʵӲѾԶر,˴ֻһЩ״̬
*/
void DisableRootHubPort(void);
/**
* @brief ROOT-HUB״̬,ROOT-HUB˿ڵ¼
* γ,еDisableRootHubPort(),˿ڹر,¼,Ӧ˿ڵ״̬λ
*
* @return ERR_SUCCESSΪû,ERR_USB_CONNECTΪ,ERR_USB_DISCONΪϿ
*/
uint8_t AnalyzeRootHub(void);
/**
* @brief USBǰUSBַ
*
* @param addr - USBַ
*/
void SetHostUsbAddr(uint8_t addr);
/**
* @brief õǰUSBٶ
*
* @param FullSpeed - USBٶ
*/
void SetUsbSpeed(uint8_t FullSpeed);
/**
* @brief ,λ,Ϊö׼,ΪĬΪȫ
*/
void ResetRootHubPort(void);
/**
* @brief ʹROOT-HUB˿,ӦbUH_PORT_EN1˿,Ͽܵ·ʧ
*
* @return ERR_SUCCESSΪ,ERR_USB_DISCONΪ
*/
uint8_t EnableRootHubPort(void);
/**
* @brief ȴUSBж
*
* @return ERR_SUCCESS ݽջ߷ͳɹ,ERR_USB_UNKNOWN ݽջ߷ʧ
*/
uint8_t WaitUSB_Interrupt(void);
/**
* @brief ,ĿĶ˵ַ/PID,ͬ־,20uλNAKʱ(0,0xFFFF),0ɹ,ʱ/
* ӳ,ʵӦ,Ϊٶ,ӦöԱӳŻ
*
* @param endp_pid - ƺ͵ַ, 4λtoken_pid, 4λǶ˵ַ
* @param tog - ͬ־
* @param timeout - ʱʱ
*
* @return ERR_USB_UNKNOWN ʱӲ
* ERR_USB_DISCON Ͽ
* ERR_USB_CONNECT
* ERR_SUCCESS
*/
uint8_t USBHostTransact(uint8_t endp_pid, uint8_t tog, uint32_t timeout);
/**
* @brief ִпƴ,8ֽpSetupReq,DataBufΪѡշ
*
* @param DataBuf - Ҫպͷ,ôDataBufָЧڴź
* @param RetLen - ʵʳɹշܳȱRetLenָֽڱ
*
* @return ERR_USB_BUF_OVER IN״̬׶γ
* ERR_SUCCESS ݽɹ
*/
uint8_t HostCtrlTransfer(uint8_t *DataBuf, uint8_t *RetLen);
/**
* @brief ƿƴ
*
* @param pReqPkt - ַ
*/
void CopySetupReqPkg(const uint8_t *pReqPkt);
/**
* @brief ȡ, pHOST_TX_RAM_Addr
*
* @return ERR_USB_BUF_OVER ȴ
* ERR_SUCCESS ɹ
*/
uint8_t CtrlGetDeviceDescr(void);
/**
* @brief ȡ, pHOST_TX_RAM_Addr
*
* @return ERR_USB_BUF_OVER ȴ
* ERR_SUCCESS ɹ
*/
uint8_t CtrlGetConfigDescr(void);
/**
* @brief USBַ
*
* @param addr - ַ
*
* @return ERR_SUCCESS ɹ
*/
uint8_t CtrlSetUsbAddress(uint8_t addr);
/**
* @brief USB
*
* @param cfg - ֵ
*
* @return ERR_SUCCESS ɹ
*/
uint8_t CtrlSetUsbConfig(uint8_t cfg);
/**
* @brief ˵STALL
*
* @param endp - ˵ַ
*
* @return ERR_SUCCESS ɹ
*/
uint8_t CtrlClearEndpStall(uint8_t endp);
/**
* @brief USBӿ
*
* @param cfg - ֵ
*
* @return ERR_SUCCESS ɹ
*/
uint8_t CtrlSetUsbIntercace(uint8_t cfg);
/**
* @brief USBܳʼ
*/
void USB_HostInit(void);
uint8_t EnumAllHubPort(void);// ö������ROOT-HUB�˿����ⲿHUB���Ķ���USB�豸
void SelectHubPort(uint8_t HubPortIndex); // HubPortIndex=0ѡ������ָ����ROOT-HUB�˿�,����ѡ������ָ����ROOT-HUB�˿ڵ��ⲿHUB��ָ���˿�
uint16_t SearchTypeDevice(uint8_t type); // ��ROOT-HUB�Լ��ⲿHUB���˿�������ָ�����͵��豸���ڵĶ˿ں�,�����˿ں�Ϊ0xFFFF��δ������.
uint8_t SETorOFFNumLock(uint8_t *buf); // NumLock�ĵ����ж�
/*************************************************************/
/**
* @brief ʼָROOT-HUB˿ڵUSB
*
* @return
*/
uint8_t InitRootDevice(void);
/**
* @brief ȡHID,TxBuffer
*
* @return
*/
uint8_t CtrlGetHIDDeviceReport(uint8_t infc);
/**
* @brief ȡHUB,Com_Buffer
*
* @return
*/
uint8_t CtrlGetHubDescr(void);
/**
* @brief ѯHUB˿״̬,Com_Buffer
*
* @param HubPortIndex - ˿ں
*
* @return
*/
uint8_t HubGetPortStatus(uint8_t HubPortIndex);
/**
* @brief HUB˿
*
* @param HubPortIndex - ˿ں
* @param FeatureSelt - ˿
*
* @return
*/
uint8_t HubSetPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt);
/**
* @brief HUB˿
*
* @param HubPortIndex - ˿ں
* @param FeatureSelt - ˿
*
* @return
*/
uint8_t HubClearPortFeature(uint8_t HubPortIndex, uint8_t FeatureSelt);
#ifdef __cplusplus
}
#endif
#endif // __CH59x_USBHOST_H__