Files
nuttx-apps/examples/i2schar/i2schar_transmitter.c
Tiago Medicci 61e82925dc examples/i2schar: Implement loopback mode check
This commit implements the loopback mode for the i2schar example
application. This mode - available only when both RX and TX are
enabled - allows the user to test the I2S buses when the TX pin is
connected to the RX pin. This is done by pre-filling a buffer with
known data (additionally, it checks the peripheral's data width to
format the data in the buffer accordingly) and passing it for both
the transmitter and the receiver threads. This buffer is written to
the TX and the received buffer is compared to the known buffer.

Signed-off-by: Tiago Medicci <tiago.medicci@espressif.com>
2025-08-28 21:58:41 +08:00

155 lines
4.8 KiB
C

/****************************************************************************
* apps/examples/i2schar/i2schar_transmitter.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
#include <pthread.h>
#include <errno.h>
#include <debug.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <nuttx/audio/audio.h>
#include "i2schar.h"
#ifdef CONFIG_EXAMPLES_I2SCHAR_TX
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: i2schar_transmitter()
*
* Description:
* This is the entry point for the transmitter thread.
*
****************************************************************************/
pthread_addr_t i2schar_transmitter(pthread_addr_t arg)
{
FAR struct ap_buffer_s *apb;
FAR struct ap_buffer_s *transmitter_apb = (FAR struct ap_buffer_s *)arg;
int bufsize;
int nwritten;
int fd;
int i;
/* Open the I2S character device */
fd = open(g_i2schar.devpath, O_WRONLY);
if (fd < 0)
{
int errcode = errno;
printf("i2schar_transmitter: ERROR: failed to open %s: %d\n",
g_i2schar.devpath, errcode);
pthread_exit(NULL);
}
/* Loop for the requested number of times */
for (i = 0; i < g_i2schar.txcount; i++)
{
/* Use the provided transmitter buffer */
apb = transmitter_apb;
bufsize = sizeof(struct ap_buffer_s) + CONFIG_EXAMPLES_I2SCHAR_BUFSIZE;
/* Then send the buffer */
do
{
/* Flush any output before writing */
fflush(stdout);
/* Write the buffer to the I2S character driver */
nwritten = write(fd, apb, bufsize);
if (nwritten < 0)
{
int errcode = errno;
if (errcode != EINTR)
{
printf("i2schar_transmitter: ERROR: write failed: %d\n",
errcode);
close(fd);
pthread_exit(NULL);
}
}
else if (nwritten != bufsize)
{
printf("i2schar_transmitter: ERROR: partial write: %d\n",
nwritten);
close(fd);
pthread_exit(NULL);
}
else
{
printf("i2schar_transmitter: Send buffer %d\n", i + 1);
}
}
while (nwritten != bufsize);
/* Make sure that the receiver thread has a chance to run */
pthread_yield();
}
close(fd);
return NULL;
}
#endif /* CONFIG_EXAMPLES_I2SCHAR_TX */