1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-18 19:13:51 +01:00
RIOT/pkg/tinyusb/cdc_acm_stdio/cdc_acm_stdio.c
Gunar Schorcht c0d027156a pkg/tinyusb: board reset feature moved
The board reset function can be used on any CDC ACM interface. It is not necessary that the tinyUSB CDC ACM STDIO is used. Therefore, the board reset function is now a feature of the CDC ACM interface that don't require any other functionality.
2023-01-03 10:05:54 +01:00

79 lines
1.4 KiB
C

/*
* Copyright (C) 2022 ML!PA Consulting GmbH
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup pkg_tinyusb
* @{
*
* @file
* @brief CDC ACM stdio implementation for tinyUSB CDC ACM
*
* This file implements a USB CDC ACM callback and read/write functions.
*
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
*
* @}
*/
#define USB_H_USER_IS_RIOT_INTERNAL
#include <stdio.h>
#include <sys/types.h>
#include "tusb.h"
#include "tinyusb.h"
#if MODULE_VFS
#include "vfs.h"
#endif
static mutex_t data_lock = MUTEX_INIT_LOCKED;
void stdio_init(void)
{
/* Initialize this side of the CDC ACM pipe */
#if MODULE_VFS
vfs_bind_stdio();
#endif
}
#if IS_USED(MODULE_STDIO_AVAILABLE)
int stdio_available(void)
{
return tud_cdc_available();
}
#endif
ssize_t stdio_read(void* buffer, size_t len)
{
mutex_lock(&data_lock);
return tud_cdc_read(buffer, len);
}
ssize_t stdio_write(const void* buffer, size_t len)
{
const char *start = buffer;
while (tud_cdc_connected() && len) {
size_t n = tud_cdc_write(buffer, len);
buffer = (char *)buffer + n;
len -= n;
};
tud_cdc_write_flush();
return (char *)buffer - start;
}
void tud_cdc_rx_cb(uint8_t itf)
{
(void)itf;
mutex_unlock(&data_lock);
}