libs/libc: add lib_dumpvbuffer support
e.g: Encapsulation Type: Bluetooth H4: add packet type dump support From: lib_dumpvbuffer(NULL, data, len); [ 1.567100] 0000 03 0c 00 ... [ 1.890100] 0000 0e 04 01 03 0c 00 ...... [ 1.890100] 0000 03 10 00 ... [ 1.892900] 0000 0e 0c 01 03 10 00 ff ff 8f fe db ff 5b 87 ............[. [ 1.892900] 0000 01 10 00 ... [ 1.894900] 0000 0e 0c 01 01 10 00 06 bb 22 06 0a 00 bb 22 ........"...." [ 1.894900] 0000 02 10 00 ... [ 1.901900] 0000 0e 44 01 02 10 00 ff ff ff 03 fe ff ff ff ff ff .D.............. [ 1.901900] 0010 ff ff f3 0f e8 fe 3f f7 83 ff 1c 00 00 00 61 f7 ......?.......a. [ 1.901900] 0020 ff ff 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 1.901900] 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 1.901900] 0040 00 00 00 00 00 00 ...... To: struct iovec bufs[2]; bufs[0].iov_base = &type; bufs[0].iov_len = 1; bufs[1].iov_base = data; bufs[1].iov_len = len; lib_dumpvbuffer(NULL, bufs, 2); [ 3.711400] 0000 01 03 0c 00 .... [ 4.035400] 0000 04 0e 04 01 03 0c 00 ....... [ 4.035400] 0000 01 03 10 00 .... [ 4.037400] 0000 04 0e 0c 01 03 10 00 ff ff 8f fe db ff 5b 87 .............[. [ 4.037400] 0000 01 01 10 00 .... [ 4.039400] 0000 04 0e 0c 01 01 10 00 06 bb 22 06 0a 00 bb 22 ........."...." [ 4.039400] 0000 01 02 10 00 .... [ 4.046400] 0000 04 0e 44 01 02 10 00 ff ff ff 03 fe ff ff ff ff ..D............. [ 4.046400] 0010 ff ff ff f3 0f e8 fe 3f f7 83 ff 1c 00 00 00 61 .......?.......a [ 4.046400] 0020 f7 ff ff 7f 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 4.046400] 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 4.046400] 0040 00 00 00 00 00 00 00 ....... Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
parent
826e74a13d
commit
2980792efd
@ -51,6 +51,7 @@
|
||||
#endif
|
||||
|
||||
#include <syslog.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
@ -1022,6 +1023,11 @@ extern "C"
|
||||
void lib_dumpbuffer(FAR const char *msg, FAR const uint8_t *buffer,
|
||||
unsigned int buflen);
|
||||
|
||||
/* Do a pretty buffer dump from multiple buffers. */
|
||||
|
||||
void lib_dumpvbuffer(FAR const char *msg, FAR const struct iovec *iov,
|
||||
int iovcnt);
|
||||
|
||||
/* The system logging interfaces are normally accessed via the macros
|
||||
* provided above. If the cross-compiler's C pre-processor supports a
|
||||
* variable number of macro arguments, then those macros below will map all
|
||||
|
@ -63,7 +63,7 @@ endif
|
||||
# Add the miscellaneous C files to the build
|
||||
|
||||
CSRCS += lib_crc64.c lib_crc32.c lib_crc16.c lib_crc8.c lib_crc8ccitt.c
|
||||
CSRCS += lib_dumpbuffer.c lib_match.c lib_debug.c
|
||||
CSRCS += lib_dumpbuffer.c lib_dumpvbuffer.c lib_match.c lib_debug.c
|
||||
|
||||
# Keyboard driver encoder/decoder
|
||||
|
||||
|
@ -1,35 +1,20 @@
|
||||
/****************************************************************************
|
||||
* libs/libc/misc/lib_dumpbuffer.c
|
||||
*
|
||||
* Copyright (C) 2009, 2011, 2014, 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
* 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
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
@ -43,43 +28,6 @@
|
||||
#include <stdint.h>
|
||||
#include <debug.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* 32 bytes displayed per line */
|
||||
#define _NITEMS (16)
|
||||
|
||||
/* 16 * (2 hex chars + 1 blank) + 1 space */
|
||||
#define _ASCIICHAR_OFFSET (_NITEMS * 3 + 1)
|
||||
|
||||
/* _ASCIICHAR_OFFSET + 16 ASCII char, 1 NULL */
|
||||
#define _LINESIZE (_ASCIICHAR_OFFSET + _NITEMS + 1)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lib_nibble
|
||||
*
|
||||
* Description:
|
||||
* Convert a binary nibble to a hexadecimal character.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static char lib_nibble(unsigned char nibble)
|
||||
{
|
||||
if (nibble < 10)
|
||||
{
|
||||
return '0' + nibble;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 'a' + nibble - 10;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
@ -98,54 +46,11 @@ static char lib_nibble(unsigned char nibble)
|
||||
void lib_dumpbuffer(FAR const char *msg, FAR const uint8_t *buffer,
|
||||
unsigned int buflen)
|
||||
{
|
||||
char buf[_LINESIZE];
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
unsigned int k;
|
||||
|
||||
if (msg)
|
||||
struct iovec buf =
|
||||
{
|
||||
syslog(LOG_INFO, "%s (%p):\n", msg, buffer);
|
||||
}
|
||||
.iov_base = (FAR char *)buffer,
|
||||
.iov_len = buflen,
|
||||
};
|
||||
|
||||
for (i = 0; i < buflen; i += _NITEMS)
|
||||
{
|
||||
FAR char *ptr = buf;
|
||||
|
||||
/* Generate hex values: 2 * _NITEMS + 1 bytes */
|
||||
|
||||
for (j = 0; j < _NITEMS; j++)
|
||||
{
|
||||
k = i + j;
|
||||
|
||||
if (k < buflen)
|
||||
{
|
||||
*ptr++ = lib_nibble((buffer[k] >> 4) & 0xf);
|
||||
*ptr++ = lib_nibble(buffer[k] & 0xf);
|
||||
|
||||
/* Generate printable characters */
|
||||
|
||||
if (buffer[k] >= 0x20 && buffer[k] < 0x7f)
|
||||
{
|
||||
buf[_ASCIICHAR_OFFSET + j] = buffer[k];
|
||||
}
|
||||
else
|
||||
{
|
||||
buf[_ASCIICHAR_OFFSET + j] = '.';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*ptr++ = ' ';
|
||||
*ptr++ = ' ';
|
||||
buf[_ASCIICHAR_OFFSET + j] = '\0';
|
||||
}
|
||||
|
||||
*ptr++ = ' ';
|
||||
}
|
||||
|
||||
buf[_ASCIICHAR_OFFSET - 1] = ' '; /* Plus 1 byte */
|
||||
buf[_ASCIICHAR_OFFSET + _NITEMS] = '\0';
|
||||
syslog(LOG_INFO, "%04x %s\n", i, buf);
|
||||
}
|
||||
lib_dumpvbuffer(msg, &buf, 1);
|
||||
}
|
||||
|
142
libs/libc/misc/lib_dumpvbuffer.c
Normal file
142
libs/libc/misc/lib_dumpvbuffer.c
Normal file
@ -0,0 +1,142 @@
|
||||
/****************************************************************************
|
||||
* libs/libc/misc/lib_dumpvbuffer.c
|
||||
*
|
||||
* 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 <nuttx/compiler.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <debug.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* 32 bytes displayed per line */
|
||||
#define _NITEMS (16)
|
||||
|
||||
/* 16 * (2 hex chars + 1 blank) + 1 space */
|
||||
#define _ASCIICHAR_OFFSET (_NITEMS * 3 + 1)
|
||||
|
||||
/* _ASCIICHAR_OFFSET + 16 ASCII char, 1 NULL */
|
||||
#define _LINESIZE (_ASCIICHAR_OFFSET + _NITEMS + 1)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lib_nibble
|
||||
*
|
||||
* Description:
|
||||
* Convert a binary nibble to a hexadecimal character.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static char lib_nibble(unsigned char nibble)
|
||||
{
|
||||
if (nibble < 10)
|
||||
{
|
||||
return '0' + nibble;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 'a' + nibble - 10;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lib_dumpvbuffer
|
||||
*
|
||||
* Description:
|
||||
* Do a pretty buffer dump from multiple buffers.
|
||||
*
|
||||
* A fairly large on-stack buffer is used for the case where timestamps are
|
||||
* applied to each line.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void lib_dumpvbuffer(FAR const char *msg, FAR const struct iovec *iov,
|
||||
int iovcnt)
|
||||
{
|
||||
FAR const struct iovec *piov = iov;
|
||||
FAR const uint8_t *iov_buf;
|
||||
unsigned int len = 0;
|
||||
char line[_LINESIZE];
|
||||
unsigned int nitems;
|
||||
unsigned int i = 0;
|
||||
FAR char *ptr;
|
||||
|
||||
if (msg)
|
||||
{
|
||||
syslog(LOG_INFO, "%s (%p):\n", msg, iov->iov_base);
|
||||
}
|
||||
|
||||
/* Initialize the separator and terminator */
|
||||
|
||||
line[_ASCIICHAR_OFFSET - 1] = ' ';
|
||||
line[_LINESIZE - 1] = '\0';
|
||||
|
||||
while (piov != &iov[iovcnt] && piov->iov_len)
|
||||
{
|
||||
iov_buf = piov->iov_base;
|
||||
ptr = line;
|
||||
|
||||
for (nitems = 0; nitems < _NITEMS; nitems++)
|
||||
{
|
||||
*ptr++ = lib_nibble((iov_buf[len] >> 4) & 0xf);
|
||||
*ptr++ = lib_nibble(iov_buf[len] & 0xf);
|
||||
*ptr++ = ' ';
|
||||
|
||||
/* Generate printable characters */
|
||||
|
||||
if (iov_buf[len] >= 0x20 && iov_buf[len] < 0x7f)
|
||||
{
|
||||
line[_ASCIICHAR_OFFSET + nitems] = iov_buf[len];
|
||||
}
|
||||
else
|
||||
{
|
||||
line[_ASCIICHAR_OFFSET + nitems] = '.';
|
||||
}
|
||||
|
||||
if (++len == piov->iov_len)
|
||||
{
|
||||
len = 0;
|
||||
if (++piov == &iov[iovcnt])
|
||||
{
|
||||
memset(ptr, ' ', (_NITEMS - nitems) * 3);
|
||||
memset(&line[_ASCIICHAR_OFFSET + nitems], ' ',
|
||||
_NITEMS - nitems);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
syslog(LOG_INFO, "%04x %s\n", i++ * _NITEMS, line);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user