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.
 
 
 
 
 
 

93 lines
3.2 KiB

/*
* 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
* ----- ------     --------    --------------------------------------
* 1.0 zhugengyu 2022/2/7 init commit
*/
#ifndef FUSB_GENERIC_HUB_H
#define FUSB_GENERIC_HUB_H
#include "fusb_private.h"
#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