nuttx-apps/canutils/lely-canopen/0001-NuttX-port.patch
2022-10-22 23:31:26 +08:00

513 lines
15 KiB
Diff

From 2232cb2e64241fd56293a6bcc51365dd220bdd5d Mon Sep 17 00:00:00 2001
From: raiden00pl <raiden00@railab.me>
Date: Thu, 6 Oct 2022 15:12:49 +0200
Subject: [PATCH] NuttX port tools/coctl.c: eliminate multiple definitions of
poll error for flat address space systems
tools/coctl.c: use readline instead of getline
tools/coctl.c: fix printf warnings
fix compiler warnings related to 'struct __frbuf'
warning: 'struct __frbuf' declared inside parameter list will not be visible outside of this definition or declaration
warning: 'struct __fwbuf' declared inside parameter list will not be visible outside of this definition or declaration
src/io/poll.c: NuttX support
src/util/frbuf.c: NuttX support
src/util/fwbuf.c: NuttX support
src/can/socket.c: NuttX support
src/io/can.c: add support for NuttX
---
include/lely/co/val.h | 2 +-
src/can/socket.c | 7 +++-
src/io/can.c | 93 ++++++++++++++++++++++++++++++++++++++++++-
src/io/poll.c | 2 +-
src/util/frbuf.c | 18 ++++-----
src/util/fwbuf.c | 27 +++++++------
tools/coctl.c | 22 +++++-----
7 files changed, 134 insertions(+), 37 deletions(-)
diff --git a/include/lely/co/val.h b/include/lely/co/val.h
index 2629763d..b5cee564 100644
--- a/include/lely/co/val.h
+++ b/include/lely/co/val.h
@@ -28,7 +28,7 @@
#include <float.h>
#include <stddef.h>
-#if !LELY_NO_CO_DCF || !LELY_NO_CO_OBJ_FILE
+#if !LELY_NO_STDIO
// The read file buffer from <lely/util/frbuf.h>
struct __frbuf;
// The write file buffer from <lely/util/fwbuf.h>
diff --git a/src/can/socket.c b/src/can/socket.c
index 4fc133dd..b059c849 100644
--- a/src/can/socket.c
+++ b/src/can/socket.c
@@ -39,6 +39,11 @@
#include <linux/can/error.h>
#endif
+#ifdef __NuttX__
+#include <nuttx/can.h>
+#include <netpacket/can.h>
+#endif
+
int
can_frame_is_error(const struct can_frame *frame, enum can_state *pstate,
enum can_error *perror)
@@ -51,7 +56,7 @@ can_frame_is_error(const struct can_frame *frame, enum can_state *pstate,
enum can_state state = pstate ? *pstate : CAN_STATE_ACTIVE;
enum can_error error = perror ? *perror : 0;
-#ifdef HAVE_LINUX_CAN_ERROR_H
+#if defined(HAVE_LINUX_CAN_ERROR_H) || defined(__NuttX__)
if (frame->can_dlc != CAN_ERR_DLC) {
set_errnum(ERRNUM_INVAL);
return -1;
diff --git a/src/io/can.c b/src/io/can.c
index ca7e7d95..35d9a9f2 100644
--- a/src/io/can.c
+++ b/src/io/can.c
@@ -26,7 +26,7 @@
#if !LELY_NO_STDIO
#include <lely/util/errnum.h>
-#if !LELY_NO_CAN && defined(__linux__) && HAVE_LINUX_CAN_H
+#if !LELY_NO_CAN && ((defined(__linux__) && HAVE_LINUX_CAN_H) || defined(__NuttX__))
#include <lely/can/socket.h>
#endif
#include "handle.h"
@@ -38,7 +38,7 @@
#include <assert.h>
#include <string.h>
-#if defined(__linux__) && HAVE_LINUX_CAN_H
+#if (defined(__linux__) && HAVE_LINUX_CAN_H) || defined(__NuttX__)
#ifdef HAVE_LINUX_CAN_ERROR_H
#include <linux/can/error.h>
@@ -56,6 +56,13 @@
#include <linux/can/raw.h>
#endif
+#ifdef __NuttX__
+#include <sys/ioctl.h>
+#include <nuttx/can.h>
+#include <netpacket/can.h>
+#include <net/if.h>
+#endif
+
/// A CAN device.
struct can {
/// The I/O device base handle.
@@ -656,6 +663,88 @@ io_can_set_txqlen(io_handle_t handle, size_t txqlen)
#endif // HAVE_LINUX_CAN_NETLINK_H && HAVE_LINUX_RTNETLINK_H
+#if defined(__NuttX__)
+int
+io_can_get_ec(io_handle_t handle, uint16_t *ptxec, uint16_t *prxec)
+{
+ /* tx error count */
+
+ *ptxec = 0;
+
+ /* rx error count */
+
+ *prxec = 0;
+
+ return 0;
+}
+
+int
+io_can_get_bitrate(io_handle_t handle, uint32_t *pbitrate)
+{
+ if (!handle) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (handle->vtab != &can_vtab) {
+ errno = ENXIO;
+ return -1;
+ }
+ struct can *can = (struct can *)handle;
+ struct ifreq ifr;
+ if_indextoname(can->ifindex, ifr.ifr_name);
+
+ if (ioctl(handle->fd, SIOCGCANBITRATE, &ifr) == -1) {
+ return -1;
+ }
+
+ *pbitrate = ifr.ifr_ifru.ifru_can_data.arbi_bitrate * 1000;
+
+ return 0;
+}
+
+int
+io_can_set_bitrate(io_handle_t handle, uint32_t bitrate)
+{
+ if (!handle) {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (handle->vtab != &can_vtab) {
+ errno = ENXIO;
+ return -1;
+ }
+ struct can *can = (struct can *)handle;
+ struct ifreq ifr;
+ if_indextoname(can->ifindex, ifr.ifr_name);
+
+ ifr.ifr_ifru.ifru_can_data.arbi_bitrate = bitrate / 1000;
+ ifr.ifr_ifru.ifru_can_data.data_bitrate = bitrate / 1000;
+ ifr.ifr_ifru.ifru_can_data.arbi_samplep = 0;
+ ifr.ifr_ifru.ifru_can_data.data_samplep = 0;
+
+ if (ioctl(handle->fd, SIOCSCANBITRATE, &ifr) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+io_can_get_txqlen(io_handle_t handle, size_t *ptxqlen)
+{
+ return -1;
+}
+
+int
+io_can_set_txqlen(io_handle_t handle, size_t txqlen)
+{
+ return -1;
+}
+
+#endif // __NuttX__
+
static void
can_fini(struct io_handle *handle)
{
diff --git a/src/io/poll.c b/src/io/poll.c
index d474e337..e07b36ce 100644
--- a/src/io/poll.c
+++ b/src/io/poll.c
@@ -261,7 +261,7 @@ io_poll_watch(io_poll_t *poll, io_handle_t handle, struct io_event *event,
assert(handle->vtab);
switch (handle->vtab->type) {
-#if defined(__linux__) && defined(HAVE_LINUX_CAN_H)
+#if (defined(__linux__) && defined(HAVE_LINUX_CAN_H)) || defined(__NuttX__)
case IO_TYPE_CAN:
#endif
#if _POSIX_C_SOURCE >= 200112L
diff --git a/src/util/frbuf.c b/src/util/frbuf.c
index 73a15bc8..403901a5 100644
--- a/src/util/frbuf.c
+++ b/src/util/frbuf.c
@@ -57,7 +57,7 @@ struct __frbuf {
HANDLE hFileMappingObject;
/// The base address of the file mapping.
LPVOID lpBaseAddress;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
/// The file descriptor.
int fd;
/// The base address of the current file mapping.
@@ -75,7 +75,7 @@ struct __frbuf {
void *
__frbuf_alloc(void)
{
- void *ptr = malloc(sizeof(struct __frbuf));
+ void *ptr = zalloc(sizeof(struct __frbuf));
if (!ptr)
set_errc(errno2c(errno));
return ptr;
@@ -102,7 +102,7 @@ __frbuf_init(struct __frbuf *buf, const char *filename)
buf->hFileMappingObject = INVALID_HANDLE_VALUE;
buf->lpBaseAddress = NULL;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
buf->fd = open(filename, O_RDONLY | O_CLOEXEC);
if (buf->fd == -1)
return NULL;
@@ -125,7 +125,7 @@ __frbuf_fini(struct __frbuf *buf)
#if _WIN32
CloseHandle(buf->hFile);
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
close(buf->fd);
#else
fclose(buf->stream);
@@ -176,7 +176,7 @@ frbuf_get_size(frbuf_t *buf)
if (!GetFileSizeEx(buf->hFile, &FileSize))
return -1;
return FileSize.QuadPart;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
#ifdef __linux__
struct stat64 stat;
if (fstat64(buf->fd, &stat) == -1)
@@ -221,7 +221,7 @@ frbuf_get_pos(frbuf_t *buf)
if (!SetFilePointerEx(buf->hFile, li, &li, FILE_CURRENT))
return -1;
return li.QuadPart;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
#ifdef __linux__
return lseek64(buf->fd, 0, SEEK_CUR);
#else
@@ -250,7 +250,7 @@ frbuf_set_pos(frbuf_t *buf, intmax_t pos)
if (!SetFilePointerEx(buf->hFile, li, &li, FILE_BEGIN))
return -1;
return li.QuadPart;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
#ifdef __linux__
return lseek64(buf->fd, pos, SEEK_SET);
#else
@@ -283,7 +283,7 @@ frbuf_read(frbuf_t *buf, void *ptr, size_t size)
if (!ReadFile(buf->hFile, ptr, size, &nNumberOfBytesRead, NULL))
return -1;
return nNumberOfBytesRead;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
ssize_t result;
do
result = read(buf->fd, ptr, size);
@@ -347,7 +347,7 @@ error_ReadFile:
error_get_pos:
SetLastError(dwErrCode);
return result;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
ssize_t result;
#ifdef __linux__
do
diff --git a/src/util/fwbuf.c b/src/util/fwbuf.c
index 22c61fd7..26b7e03b 100644
--- a/src/util/fwbuf.c
+++ b/src/util/fwbuf.c
@@ -72,7 +72,7 @@ struct __fwbuf {
LPVOID lpBaseAddress;
/// The number of bytes mapped at <b>lpBaseAddress</b>.
SIZE_T dwNumberOfBytesToMap;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
/// A pointer to the name of the temporary file.
char *tmpname;
/// The file descriptor of the directory containing the temporary file.
@@ -175,7 +175,7 @@ error_GetTempFileNameA:
error_strdup:
SetLastError(dwErrCode);
return NULL;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
int errsv = 0;
buf->filename = strdup(filename);
@@ -295,7 +295,7 @@ __fwbuf_fini(struct __fwbuf *buf)
fwbuf_commit(buf);
set_errc(errc);
-#if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
free(buf->tmpname);
#endif
free(buf->filename);
@@ -348,7 +348,7 @@ fwbuf_get_size(fwbuf_t *buf)
return -1;
}
return FileSize.QuadPart;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
#ifdef __linux__
struct stat64 stat;
if (fstat64(buf->fd, &stat) == -1) {
@@ -388,7 +388,7 @@ fwbuf_set_size(fwbuf_t *buf, intmax_t size)
return -1;
return 0;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
#ifdef __linux__
if (ftruncate64(buf->fd, size) == -1) {
#else
@@ -424,7 +424,7 @@ fwbuf_get_pos(fwbuf_t *buf)
return -1;
}
return li.QuadPart;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
#ifdef __linux__
intmax_t pos = lseek64(buf->fd, 0, SEEK_CUR);
#else
@@ -456,7 +456,8 @@ fwbuf_set_pos(fwbuf_t *buf, intmax_t pos)
return -1;
}
return li.QuadPart;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+/* #elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) */
+#elif !defined(__NuttX__)
#ifdef __linux__
pos = lseek64(buf->fd, pos, SEEK_SET);
#else
@@ -503,7 +504,7 @@ fwbuf_write(fwbuf_t *buf, const void *ptr, size_t size)
return -1;
}
return nNumberOfBytesWritten;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
ssize_t result;
do
result = write(buf->fd, ptr, size);
@@ -587,7 +588,7 @@ error_get_pos:
error_pos:
SetLastError(buf->dwErrCode);
return result;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
ssize_t result;
#ifdef __linux__
do
@@ -931,7 +932,7 @@ fwbuf_clearerr(fwbuf_t *buf)
#if _WIN32
buf->dwErrCode = 0;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
buf->errsv = 0;
#else
buf->errnum = 0;
@@ -947,7 +948,7 @@ fwbuf_error(fwbuf_t *buf)
if (buf->dwErrCode)
SetLastError(buf->dwErrCode);
return !!buf->dwErrCode;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
if (buf->errsv)
errno = buf->errsv;
return !!buf->errsv;
@@ -966,7 +967,7 @@ fwbuf_cancel(fwbuf_t *buf)
#if _WIN32
if (!buf->dwErrCode)
buf->dwErrCode = ERROR_OPERATION_ABORTED;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
if (!buf->errsv)
buf->errsv = ECANCELED;
#else
@@ -1013,7 +1014,7 @@ fwbuf_commit(fwbuf_t *buf)
done:
SetLastError(buf->dwErrCode = dwErrCode);
return result;
-#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
+#elif _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__) && !defined(__NuttX__)
int errsv = errno;
if (buf->fd == -1)
diff --git a/tools/coctl.c b/tools/coctl.c
index 351b81c0..5f851b50 100644
--- a/tools/coctl.c
+++ b/tools/coctl.c
@@ -39,6 +39,9 @@
#include <signal.h>
#include <stdlib.h>
#include <string.h>
+#include <inttypes.h>
+
+#include <system/readline.h>
#if _WIN32
#include <io.h>
@@ -90,7 +93,7 @@ int io_thrd_start(void *arg);
void co_net_err(struct co_net *net);
struct co_net net[CO_GW_NUM_NET];
-io_poll_t *poll;
+static io_poll_t *poll;
int flags;
int inhibit = INHIBIT;
@@ -315,8 +318,8 @@ main(int argc, char *argv[])
errno = errsv;
int eof = 0;
- char *line = NULL;
- size_t n = 0;
+#define LINE_SIZE 100
+ char line[LINE_SIZE];
co_unsigned32_t seq = 1;
char *cmd = NULL;
while (!done) {
@@ -358,11 +361,11 @@ main(int argc, char *argv[])
if (cmd)
printf("... ");
else
- printf("[%u] ", seq);
+ printf("[%" PRIu32 "] ", seq);
fflush(stdout);
}
// Keep reading lines until end-of-file.
- if (getline(&line, &n, stdin) == -1) {
+ if (readline(line, LINE_SIZE-1, stdin, stdout) == -1) {
if (tty)
fputc('\n', stdout);
if (ferror(stdin)) {
@@ -409,7 +412,7 @@ main(int argc, char *argv[])
free(cmd);
cmd = tmp;
} else {
- if (asprintf(&cmd, "[%u] %s", seq, line)
+ if (asprintf(&cmd, "[%" PRIu32 "] %s", seq, line)
== -1) {
cmd = NULL;
break;
@@ -431,7 +434,7 @@ main(int argc, char *argv[])
result = asprintf(&tmp, "%s%s%s",
recv_buf, cmd, line);
else
- result = asprintf(&tmp, "%s[%u] %s",
+ result = asprintf(&tmp, "%s[%" PRIu32 "] %s",
recv_buf, seq, line);
if (result < 0) {
mtx_unlock(&recv_mtx);
@@ -444,7 +447,7 @@ main(int argc, char *argv[])
result = asprintf(&recv_buf, "%s%s",
cmd, line);
else
- result = asprintf(&recv_buf, "[%u] %s",
+ result = asprintf(&recv_buf, "[%" PRIu32 "] %s",
seq, line);
if (result < 0) {
recv_buf = NULL;
@@ -466,7 +469,6 @@ main(int argc, char *argv[])
}
}
free(cmd);
- free(line);
io_poll_signal(poll, 1);
thrd_join(thr, NULL);
@@ -561,7 +563,7 @@ gw_rate(co_unsigned16_t id, co_unsigned16_t rate, void *data)
return;
bitrate = rate * 1000;
if (io_can_set_bitrate(net[id - 1].handle, bitrate) == -1)
- diag(DIAG_ERROR, 0, "unable to set bitrate of %s to %u bit/s",
+ diag(DIAG_ERROR, 0, "unable to set bitrate of %s to %" PRIu32 " bit/s",
net[id - 1].can_path, bitrate);
}
--
2.37.2