104 lines
1.8 KiB
C
104 lines
1.8 KiB
C
|
/*
|
||
|
* Copyright (c) 2022 Nordic Semiconductor ASA
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
#include <errno.h>
|
||
|
#include <zephyr/sys/util.h>
|
||
|
#include "usbh_internal.h"
|
||
|
|
||
|
#include <zephyr/logging/log.h>
|
||
|
LOG_MODULE_REGISTER(uhs_api, CONFIG_USBH_LOG_LEVEL);
|
||
|
|
||
|
int usbh_init(struct usbh_contex *uhs_ctx)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
k_mutex_lock(&uhs_ctx->mutex, K_FOREVER);
|
||
|
|
||
|
if (!device_is_ready(uhs_ctx->dev)) {
|
||
|
LOG_ERR("USB host controller is not ready");
|
||
|
ret = -ENODEV;
|
||
|
goto init_exit;
|
||
|
}
|
||
|
|
||
|
if (uhc_is_initialized(uhs_ctx->dev)) {
|
||
|
LOG_WRN("USB host controller is already initialized");
|
||
|
ret = -EALREADY;
|
||
|
goto init_exit;
|
||
|
}
|
||
|
|
||
|
ret = usbh_init_device_intl(uhs_ctx);
|
||
|
|
||
|
init_exit:
|
||
|
k_mutex_unlock(&uhs_ctx->mutex);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
int usbh_enable(struct usbh_contex *uhs_ctx)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
k_mutex_lock(&uhs_ctx->mutex, K_FOREVER);
|
||
|
|
||
|
if (!uhc_is_initialized(uhs_ctx->dev)) {
|
||
|
LOG_WRN("USB host controller is not initialized");
|
||
|
ret = -EPERM;
|
||
|
goto enable_exit;
|
||
|
}
|
||
|
|
||
|
if (uhc_is_enabled(uhs_ctx->dev)) {
|
||
|
LOG_WRN("USB host controller is already enabled");
|
||
|
ret = -EALREADY;
|
||
|
goto enable_exit;
|
||
|
}
|
||
|
|
||
|
ret = uhc_enable(uhs_ctx->dev);
|
||
|
if (ret != 0) {
|
||
|
LOG_ERR("Failed to enable controller");
|
||
|
goto enable_exit;
|
||
|
}
|
||
|
|
||
|
enable_exit:
|
||
|
k_mutex_unlock(&uhs_ctx->mutex);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
int usbh_disable(struct usbh_contex *uhs_ctx)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
if (!uhc_is_enabled(uhs_ctx->dev)) {
|
||
|
LOG_WRN("USB host controller is already disabled");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
k_mutex_lock(&uhs_ctx->mutex, K_FOREVER);
|
||
|
|
||
|
ret = uhc_disable(uhs_ctx->dev);
|
||
|
if (ret) {
|
||
|
LOG_ERR("Failed to disable USB controller");
|
||
|
}
|
||
|
|
||
|
k_mutex_unlock(&uhs_ctx->mutex);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int usbh_shutdown(struct usbh_contex *const uhs_ctx)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
k_mutex_lock(&uhs_ctx->mutex, K_FOREVER);
|
||
|
|
||
|
ret = uhc_shutdown(uhs_ctx->dev);
|
||
|
if (ret) {
|
||
|
LOG_ERR("Failed to shutdown USB device");
|
||
|
}
|
||
|
|
||
|
k_mutex_unlock(&uhs_ctx->mutex);
|
||
|
|
||
|
return ret;
|
||
|
}
|