5eebfbb441
In this case, the buffer already contains a frame ready to be send
490 lines
13 KiB
C
490 lines
13 KiB
C
/****************************************************************************
|
|
* apps/include/logging/nxscope/nxscope.h
|
|
*
|
|
* 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __APPS_INCLUDE_LOGGING_NXSCOPE_NXSCOPE_H
|
|
#define __APPS_INCLUDE_LOGGING_NXSCOPE_NXSCOPE_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
#include <nuttx/compiler.h>
|
|
|
|
#include <pthread.h>
|
|
#include <stdint.h>
|
|
|
|
#include <logging/nxscope/nxscope_chan.h>
|
|
#include <logging/nxscope/nxscope_intf.h>
|
|
#include <logging/nxscope/nxscope_proto.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
#define NXSCOPE_ENABLE_LEN (sizeof(struct nxscope_enable_data_s))
|
|
#define NXSCOPE_DIV_LEN (sizeof(struct nxscope_div_data_s))
|
|
#define NXSCOPE_START_LEN (sizeof(struct nxscope_start_data_s))
|
|
|
|
/* MSB bit in the channel type means a critical channel */
|
|
|
|
#define NXSCOPE_IS_CRICHAN(chtype) (chtype & 0x80)
|
|
|
|
/****************************************************************************
|
|
* Public Types
|
|
****************************************************************************/
|
|
|
|
/* Nxscope header ID */
|
|
|
|
enum nxscope_hdr_id_e
|
|
{
|
|
NXSCOPE_HDRID_UNDEF = 0, /* Reserved */
|
|
|
|
/* Stream frames */
|
|
|
|
NXSCOPE_HDRID_STREAM = 1, /* Stream data */
|
|
|
|
/* Get frames */
|
|
|
|
NXSCOPE_HDRID_CMNINFO = 2, /* Get nxscope common info */
|
|
NXSCOPE_HDRID_CHINFO = 3, /* Get nxscope channel info */
|
|
|
|
/* Special frames */
|
|
|
|
NXSCOPE_HDRID_ACK = 4, /* ACK/NACK */
|
|
|
|
/* Set frames.
|
|
*
|
|
* If CONFIG_LOGGING_NXSCOPE_ACKFRAMES=y this requests must
|
|
* be confirmed with ACK frames to report success or failure.
|
|
*/
|
|
|
|
NXSCOPE_HDRID_START = 5, /* Start/stop stream.
|
|
* NOTE: this frame do not follow
|
|
* 'struct nxscope_set_frame_s' format
|
|
*/
|
|
NXSCOPE_HDRID_ENABLE = 6, /* Snable/disable channels */
|
|
NXSCOPE_HDRID_DIV = 7, /* Channels divider */
|
|
|
|
/* User defined frames.
|
|
* Must be alway the last element.
|
|
*/
|
|
|
|
NXSCOPE_HDRID_USER = 8
|
|
};
|
|
|
|
/* Nxscope flags */
|
|
|
|
enum nxscope_info_flags_e
|
|
{
|
|
NXSCOPE_FLAGS_DIVIDER_SUPPORT = (1 << 0),
|
|
NXSCOPE_FLAGS_ACK_SUPPORT = (1 << 1),
|
|
NXSCOPE_FLAGS_RES2 = (1 << 2),
|
|
NXSCOPE_FLAGS_RES3 = (1 << 3),
|
|
NXSCOPE_FLAGS_RES4 = (1 << 4),
|
|
NXSCOPE_FLAGS_RES5 = (1 << 5),
|
|
NXSCOPE_FLAGS_RES6 = (1 << 6),
|
|
NXSCOPE_FLAGS_RES7 = (1 << 7),
|
|
};
|
|
|
|
/* Nxscope stream flags */
|
|
|
|
enum nxscope_stream_flags_s
|
|
{
|
|
NXSCOPE_STREAM_FLAGS_OVERFLOW = (1 << 0)
|
|
};
|
|
|
|
/* Nxscope start frame data */
|
|
|
|
begin_packed_struct struct nxscope_start_data_s
|
|
{
|
|
uint8_t start; /* Start/stop flag */
|
|
} end_packed_struct;
|
|
|
|
/* Nxscope enable channel data */
|
|
|
|
begin_packed_struct struct nxscope_enable_ch_data_s
|
|
{
|
|
uint8_t en; /* Channel enable */
|
|
} end_packed_struct;
|
|
|
|
/* Nxscope divider channel data */
|
|
|
|
begin_packed_struct struct nxscope_div_ch_data_s
|
|
{
|
|
uint8_t div; /* Channel divider - starts from 0 */
|
|
} end_packed_struct;
|
|
|
|
/* Nxscope enable frame data */
|
|
|
|
begin_packed_struct struct nxscope_enable_data_s
|
|
{
|
|
struct nxscope_enable_ch_data_s ch[1]; /* Chmax elements */
|
|
} end_packed_struct;
|
|
|
|
/* Nxscope divider frame data */
|
|
|
|
begin_packed_struct struct nxscope_div_data_s
|
|
{
|
|
struct nxscope_div_ch_data_s ch[1]; /* Chmax elements */
|
|
} end_packed_struct;
|
|
|
|
/* Set channel frame */
|
|
|
|
enum nxscope_set_frame_req_s
|
|
{
|
|
NXSCOPE_SET_REQ_SINGLE = 0, /* Single channel request */
|
|
NXSCOPE_SET_REQ_BULK = 1, /* Set different values for all channels */
|
|
NXSCOPE_SET_REQ_ALL = 2 /* Set one value for all channles */
|
|
};
|
|
|
|
/* Set frame common data */
|
|
|
|
begin_packed_struct struct nxscope_set_frame_s
|
|
{
|
|
uint8_t req; /* Request type */
|
|
uint8_t chan; /* Channel id */
|
|
uint8_t data[1]; /* n bytes data - depends on the request type */
|
|
} end_packed_struct;
|
|
|
|
/* Chanel type */
|
|
|
|
begin_packed_struct struct nxscope_chinfo_type_s
|
|
{
|
|
uint8_t dtype:5; /* Data type */
|
|
uint8_t _res:2; /* Reserved for future use */
|
|
uint8_t cri:1; /* Criticial channel - no buffering */
|
|
} end_packed_struct;
|
|
|
|
/* Chanel type union */
|
|
|
|
union nxscope_chinfo_type_u
|
|
{
|
|
struct nxscope_chinfo_type_s s;
|
|
uint8_t u8;
|
|
};
|
|
|
|
/* Nxscope channel info */
|
|
|
|
begin_packed_struct struct nxscope_chinfo_s
|
|
{
|
|
uint8_t enable; /* Enable flag */
|
|
union nxscope_chinfo_type_u type; /* Channel data type */
|
|
uint8_t vdim; /* Vector dimention */
|
|
uint8_t div; /* Divider - starts from 0 */
|
|
uint8_t mlen; /* Metadata size */
|
|
FAR char *name; /* Chanel name */
|
|
} end_packed_struct;
|
|
|
|
/* Nxscope info common */
|
|
|
|
begin_packed_struct struct nxscope_info_cmn_s
|
|
{
|
|
uint8_t chmax; /* Supported channels */
|
|
uint8_t flags; /* Flags (enum nxscope_info_flags_e) */
|
|
uint8_t rx_padding; /* RX padding (>0 if used) */
|
|
} end_packed_struct;
|
|
|
|
/* Nxscope sample hdr:
|
|
*
|
|
* +----------+-------------+----------+
|
|
* | channel | sample data | metadata |
|
|
* +----------+-------------+----------+
|
|
* | 1B | n bytes [1] | m bytes |
|
|
* +----------+-------------+----------+
|
|
*
|
|
* [1] - sizeof(channel_type) * channel_vdim
|
|
* NOTE: sample data always little-endian !
|
|
*
|
|
*/
|
|
|
|
struct nxscope_sample_s
|
|
{
|
|
uint8_t chan; /* 1 byte: Channel id - starts from 0 */
|
|
/* n bytes: Data */
|
|
/* m bytes: Metadata */
|
|
};
|
|
|
|
/* Nxscope stream data:
|
|
*
|
|
* +----------+--------------+
|
|
* | flags | samples data |
|
|
* +----------+--------------+
|
|
* | 1B | n bytes |
|
|
* +----------+--------------+
|
|
*
|
|
*/
|
|
|
|
struct nxscope_stream_s
|
|
{
|
|
uint8_t flags; /* stream flags */
|
|
struct nxscope_sample_s samples[1]; /* stream samples */
|
|
};
|
|
|
|
/* Nxscope callbacks */
|
|
|
|
struct nxscope_callbacks_s
|
|
{
|
|
/* User-defined id callback */
|
|
|
|
FAR void *userid_priv;
|
|
CODE int (*userid)(FAR void *priv, uint8_t id, FAR uint8_t *buff);
|
|
|
|
/* Start request callback */
|
|
|
|
FAR void *start_priv;
|
|
CODE int (*start)(FAR void *priv, bool start);
|
|
};
|
|
|
|
/* Nxscope general configuration */
|
|
|
|
struct nxscope_cfg_s
|
|
{
|
|
/* NOTE: It is possible to configure separate interface
|
|
* and protocol for control commands and data stream.
|
|
*/
|
|
|
|
/* Interface implementation for commands */
|
|
|
|
FAR struct nxscope_intf_s *intf_cmd;
|
|
|
|
/* Interface implementation for stream data */
|
|
|
|
FAR struct nxscope_intf_s *intf_stream;
|
|
|
|
/* Protocol implementation for commands */
|
|
|
|
FAR struct nxscope_proto_s *proto_cmd;
|
|
|
|
/* Protocol implementation for stream data */
|
|
|
|
FAR struct nxscope_proto_s *proto_stream;
|
|
|
|
/* Callbacks */
|
|
|
|
FAR struct nxscope_callbacks_s *callbacks;
|
|
|
|
/* Number of suppoted channels */
|
|
|
|
uint8_t channels;
|
|
|
|
/* Stream buffer len */
|
|
|
|
size_t streambuf_len;
|
|
|
|
/* RX buffer len */
|
|
|
|
size_t rxbuf_len;
|
|
|
|
#ifdef CONFIG_LOGGING_NXSCOPE_CRICHANNELS
|
|
/* Critical buffer len.
|
|
*
|
|
* It's the user's responsibility to correctly choose this value.
|
|
* The minimal buffer size for critical channels can be calculate
|
|
* with this formula:
|
|
* buff_size = max(proto_stream->hdrlen + 1 + type_size * vdim +
|
|
* meta_len + proto_stream->footlen)
|
|
*
|
|
* where max() means the maximum value from all initialized critical
|
|
* channels.
|
|
*
|
|
* When CONFIG_DEBUG_FEATURES is enabled the correct buffer size is
|
|
* verified in run-time.
|
|
*/
|
|
|
|
size_t cribuf_len;
|
|
#endif
|
|
|
|
/* RX padding.
|
|
*
|
|
* This option will be provided for client in common info data
|
|
* and can be useful if we use DMA for receiving frames
|
|
*/
|
|
|
|
uint8_t rx_padding;
|
|
};
|
|
|
|
/* Nxscope data */
|
|
|
|
struct nxscope_s
|
|
{
|
|
/* Nxscope interface handlers */
|
|
|
|
FAR struct nxscope_intf_s *intf_cmd;
|
|
FAR struct nxscope_intf_s *intf_stream;
|
|
|
|
/* Nxscope protocol handlers */
|
|
|
|
FAR struct nxscope_proto_s *proto_cmd;
|
|
FAR struct nxscope_proto_s *proto_stream;
|
|
|
|
/* Callbacks */
|
|
|
|
FAR struct nxscope_callbacks_s *callbacks;
|
|
|
|
/* Nxscope common info */
|
|
|
|
struct nxscope_info_cmn_s cmninfo;
|
|
|
|
/* Channels info, chmax elements */
|
|
|
|
FAR struct nxscope_chinfo_s *chinfo;
|
|
size_t chinfo_size;
|
|
|
|
/* Nxscope data */
|
|
|
|
#ifdef CONFIG_LOGGING_NXSCOPE_DIVIDER
|
|
FAR uint32_t *cntr;
|
|
#endif
|
|
uint8_t start;
|
|
|
|
/* Stream data */
|
|
|
|
FAR uint8_t *streambuf;
|
|
size_t streambuf_len;
|
|
size_t stream_i;
|
|
bool stream_retry;
|
|
|
|
#ifdef CONFIG_LOGGING_NXSCOPE_CRICHANNELS
|
|
/* Critical buffer data */
|
|
|
|
FAR uint8_t *cribuf;
|
|
size_t cribuf_len;
|
|
#endif
|
|
|
|
/* RX data buffer */
|
|
|
|
FAR uint8_t *rxbuf;
|
|
size_t rxbuf_len;
|
|
size_t rxbuf_i;
|
|
|
|
/* TX data buffer */
|
|
|
|
FAR uint8_t *txbuf;
|
|
size_t txbuf_len;
|
|
|
|
/* Exclusive access */
|
|
|
|
pthread_mutex_t lock;
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: nxscope_init
|
|
*
|
|
* Description:
|
|
* Initialize a nxscope instance
|
|
*
|
|
* Input Parameters:
|
|
* s - a pointer to a nxscope instance
|
|
* cfg - a pointer to a nxscope configuration data
|
|
*
|
|
****************************************************************************/
|
|
|
|
int nxscope_init(FAR struct nxscope_s *s, FAR struct nxscope_cfg_s *cfg);
|
|
|
|
/****************************************************************************
|
|
* Name: nxscope_deinit
|
|
*
|
|
* Description:
|
|
* De-initialize a nxscope instance
|
|
*
|
|
* Input Parameters:
|
|
* s - a pointer to a nxscope instance
|
|
*
|
|
****************************************************************************/
|
|
|
|
void nxscope_deinit(FAR struct nxscope_s *s);
|
|
|
|
/****************************************************************************
|
|
* Name: nxscope_lock
|
|
*
|
|
* Description:
|
|
* Lock a nxscope instance
|
|
*
|
|
* Input Parameters:
|
|
* s - a pointer to a nxscope instance
|
|
*
|
|
****************************************************************************/
|
|
|
|
void nxscope_lock(FAR struct nxscope_s *s);
|
|
|
|
/****************************************************************************
|
|
* Name: nxscope_unlock
|
|
*
|
|
* Description:
|
|
* Unlock a nxscope instance
|
|
*
|
|
* Input Parameters:
|
|
* s - a pointer to a nxscope instance
|
|
*
|
|
****************************************************************************/
|
|
|
|
void nxscope_unlock(FAR struct nxscope_s *s);
|
|
|
|
/****************************************************************************
|
|
* Name: nxscope_stream
|
|
*
|
|
* Description:
|
|
* Send nxscope stream data.
|
|
*
|
|
* NOTE: It's the user's responsibility to periodically call this function.
|
|
*
|
|
* Input Parameters:
|
|
* s - a pointer to a nxscope instance
|
|
*
|
|
****************************************************************************/
|
|
|
|
int nxscope_stream(FAR struct nxscope_s *s);
|
|
|
|
/****************************************************************************
|
|
* Name: nxscope_recv
|
|
*
|
|
* Description:
|
|
* Receive and handle nxscope protocol data.
|
|
*
|
|
* NOTE: It's the user's responsibility to periodically call this function.
|
|
*
|
|
* Input Parameters:
|
|
* s - a pointer to a nxscope instance
|
|
*
|
|
****************************************************************************/
|
|
|
|
int nxscope_recv(FAR struct nxscope_s *s);
|
|
|
|
/****************************************************************************
|
|
* Name: nxscope_stream_start
|
|
*
|
|
* Description:
|
|
* Start/stop data stream
|
|
*
|
|
* Input Parameters:
|
|
* s - a pointer to a nxscope instance
|
|
* start - start/stop
|
|
*
|
|
****************************************************************************/
|
|
|
|
int nxscope_stream_start(FAR struct nxscope_s *s, bool start);
|
|
|
|
#endif /* __APPS_INCLUDE_LOGGING_NXSCOPE_NXSCOPE_H */
|