2022-11-10 22:22:48 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copyright : (C) 2022 Phytium Information Technology, Inc.
|
|
|
|
|
* All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
|
|
|
|
|
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
|
|
|
|
|
* either version 1.0 of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
|
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
* See the Phytium Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* FilePath: fusb_generic_hub.h
|
|
|
|
|
* Date: 2022-02-11 13:33:11
|
|
|
|
|
* LastEditTime: 2022-02-18 09:20:23
|
|
|
|
|
* Description: This files is for definition of generic hub function
|
|
|
|
|
*
|
|
|
|
|
* Modify History:
|
|
|
|
|
* Ver Who Date Changes
|
|
|
|
|
* ----- ------ -------- --------------------------------------
|
2023-05-11 10:25:21 +08:00
|
|
|
|
* 1.0 zhugengyu 2022/2/7 init commit
|
2022-11-10 22:22:48 +08:00
|
|
|
|
*/
|
|
|
|
|
|
2023-05-11 10:25:21 +08:00
|
|
|
|
#ifndef FUSB_GENERIC_HUB_H
|
|
|
|
|
#define FUSB_GENERIC_HUB_H
|
|
|
|
|
|
|
|
|
|
#include "fusb_private.h"
|
2022-11-10 22:22:48 +08:00
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C"
|
|
|
|
|
{
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
/* negative results denote an error */
|
|
|
|
|
|
|
|
|
|
/* returns 1 if the hub's status changed since the last call (optional) */
|
|
|
|
|
FUsbTransCode(*hub_status_changed)(FUsbDev *);
|
|
|
|
|
/* returns 1 if the port's status changed since the last call */
|
|
|
|
|
FUsbTransCode(*port_status_changed)(FUsbDev *, int port);
|
|
|
|
|
/* returns 1 if something is connected to the port */
|
|
|
|
|
FUsbTransCode(*port_connected)(FUsbDev *, int port);
|
|
|
|
|
/* returns 1 if port is currently resetting */
|
|
|
|
|
FUsbTransCode(*port_in_reset)(FUsbDev *, int port);
|
|
|
|
|
/* returns 1 if the port is enabled */
|
|
|
|
|
FUsbTransCode(*port_enabled)(FUsbDev *, int port);
|
|
|
|
|
/* returns speed if port is enabled, negative value if not */
|
|
|
|
|
FUsbSpeed(*port_speed)(FUsbDev *, int port);
|
|
|
|
|
|
|
|
|
|
/* enables (powers up) a port (optional) */
|
|
|
|
|
FUsbTransCode(*enable_port)(FUsbDev *, int port);
|
|
|
|
|
/* disables (powers down) a port (optional) */
|
|
|
|
|
FUsbTransCode(*disable_port)(FUsbDev *, int port);
|
|
|
|
|
/* starts a port reset (required if reset_port is set to a generic one from below) */
|
|
|
|
|
FUsbTransCode(*start_port_reset)(FUsbDev *, int port);
|
|
|
|
|
|
|
|
|
|
/* performs a port reset (optional, generic implementations below) */
|
|
|
|
|
FUsbTransCode(*reset_port)(FUsbDev *, int port);
|
|
|
|
|
} FUsbGenericHubOps;
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
int num_ports;
|
|
|
|
|
/* port numbers are always 1 based,
|
|
|
|
|
so we waste one int for convenience */
|
|
|
|
|
int *ports; /* allocated to sizeof(*ports)*(num_ports+1) */
|
|
|
|
|
#define FUSB_NO_DEV_ADDR -1
|
|
|
|
|
|
|
|
|
|
const FUsbGenericHubOps *ops;
|
|
|
|
|
|
|
|
|
|
void *data;
|
|
|
|
|
} FUsbGenericHub;
|
|
|
|
|
|
|
|
|
|
void FUsbGenericHubDestory(FUsbDev *);
|
|
|
|
|
int FUsbGenericHubWaitForPort(FUsbDev *const dev, const int port,
|
|
|
|
|
const int wait_for,
|
|
|
|
|
int (*const port_op)(FUsbDev *, int),
|
|
|
|
|
int timeout_steps, const int step_us);
|
|
|
|
|
int FUsbGenericHubResetPort(FUsbDev *, int port);
|
|
|
|
|
int FUsbGenericHubScanPort(FUsbDev *, int port);
|
|
|
|
|
/* the provided generic_hub_ops struct has to be static */
|
|
|
|
|
int FUsbGenericHubInit(FUsbDev *, int num_ports, const FUsbGenericHubOps *);
|
|
|
|
|
|
|
|
|
|
#define FUSB_GEN_HUB_GET(FUsbDev) ((FUsbGenericHub *)(FUsbDev)->data)
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|