Simulator compiles, to be tested.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@10078 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
e3498cf082
commit
07fc57b2c8
|
@ -156,8 +156,7 @@ UINCDIR =
|
|||
ULIBDIR =
|
||||
|
||||
# List all user libraries here
|
||||
ULIBS = -lws2_32
|
||||
|
||||
ULIBS =
|
||||
#
|
||||
# End of user defines
|
||||
##############################################################################
|
||||
|
|
|
@ -43,7 +43,7 @@ BaseChannel CD1;
|
|||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
static size_t write(void *ip, const uint8_t *bp, size_t n) {
|
||||
static size_t _write(void *ip, const uint8_t *bp, size_t n) {
|
||||
size_t ret;
|
||||
|
||||
(void)ip;
|
||||
|
@ -53,14 +53,14 @@ static size_t write(void *ip, const uint8_t *bp, size_t n) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
static size_t read(void *ip, uint8_t *bp, size_t n) {
|
||||
static size_t _read(void *ip, uint8_t *bp, size_t n) {
|
||||
|
||||
(void)ip;
|
||||
|
||||
return fread(bp, 1, n, stdin);
|
||||
}
|
||||
|
||||
static msg_t put(void *ip, uint8_t b) {
|
||||
static msg_t _put(void *ip, uint8_t b) {
|
||||
|
||||
(void)ip;
|
||||
|
||||
|
@ -69,14 +69,14 @@ static msg_t put(void *ip, uint8_t b) {
|
|||
return MSG_OK;
|
||||
}
|
||||
|
||||
static msg_t get(void *ip) {
|
||||
static msg_t _get(void *ip) {
|
||||
|
||||
(void)ip;
|
||||
|
||||
return fgetc(stdin);
|
||||
}
|
||||
|
||||
static msg_t putt(void *ip, uint8_t b, systime_t time) {
|
||||
static msg_t _putt(void *ip, uint8_t b, systime_t time) {
|
||||
|
||||
(void)ip;
|
||||
(void)time;
|
||||
|
@ -86,7 +86,7 @@ static msg_t putt(void *ip, uint8_t b, systime_t time) {
|
|||
return MSG_OK;
|
||||
}
|
||||
|
||||
static msg_t gett(void *ip, systime_t time) {
|
||||
static msg_t _gett(void *ip, systime_t time) {
|
||||
|
||||
(void)ip;
|
||||
(void)time;
|
||||
|
@ -94,7 +94,7 @@ static msg_t gett(void *ip, systime_t time) {
|
|||
return fgetc(stdin);
|
||||
}
|
||||
|
||||
static size_t writet(void *ip, const uint8_t *bp, size_t n, systime_t time) {
|
||||
static size_t _writet(void *ip, const uint8_t *bp, size_t n, systime_t time) {
|
||||
size_t ret;
|
||||
|
||||
(void)ip;
|
||||
|
@ -105,7 +105,7 @@ static size_t writet(void *ip, const uint8_t *bp, size_t n, systime_t time) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
static size_t readt(void *ip, uint8_t *bp, size_t n, systime_t time) {
|
||||
static size_t _readt(void *ip, uint8_t *bp, size_t n, systime_t time) {
|
||||
|
||||
(void)ip;
|
||||
(void)time;
|
||||
|
@ -114,8 +114,8 @@ static size_t readt(void *ip, uint8_t *bp, size_t n, systime_t time) {
|
|||
}
|
||||
|
||||
static const struct BaseChannelVMT vmt = {
|
||||
write, read, put, get,
|
||||
putt, gett, writet, readt
|
||||
_write, _read, _put, _get,
|
||||
_putt, _gett, _writet, _readt
|
||||
};
|
||||
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -22,6 +22,10 @@
|
|||
* @{
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -32,8 +36,8 @@
|
|||
/* Driver local variables and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
static LARGE_INTEGER nextcnt;
|
||||
static LARGE_INTEGER slice;
|
||||
static struct timeval nextcnt;
|
||||
static struct timeval tick = {0UL, 1000000UL / OSAL_ST_FREQUENCY};
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
|
@ -51,31 +55,21 @@ static LARGE_INTEGER slice;
|
|||
* @brief Low level HAL driver initialization.
|
||||
*/
|
||||
void hal_lld_init(void) {
|
||||
WSADATA wsaData;
|
||||
|
||||
/* Initialization.*/
|
||||
if (WSAStartup(2, &wsaData) != 0) {
|
||||
printf("Unable to locate a winsock DLL\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("ChibiOS/RT simulator (Win32)\n");
|
||||
if (!QueryPerformanceFrequency(&slice)) {
|
||||
printf("QueryPerformanceFrequency() error");
|
||||
exit(1);
|
||||
}
|
||||
slice.QuadPart /= CH_CFG_ST_FREQUENCY;
|
||||
QueryPerformanceCounter(&nextcnt);
|
||||
nextcnt.QuadPart += slice.QuadPart;
|
||||
|
||||
fflush(stdout);
|
||||
#if defined(__APPLE__)
|
||||
puts("ChibiOS/RT simulator (OS X)\n");
|
||||
#else
|
||||
puts("ChibiOS/RT simulator (Linux)\n");
|
||||
#endif
|
||||
gettimeofday(&nextcnt, NULL);
|
||||
timeradd(&nextcnt, &tick, &nextcnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Interrupt simulation.
|
||||
*/
|
||||
void _sim_check_for_interrupts(void) {
|
||||
LARGE_INTEGER n;
|
||||
struct timeval tv;
|
||||
|
||||
#if HAL_USE_SERIAL
|
||||
if (sd_lld_interrupt_pending()) {
|
||||
|
@ -87,10 +81,9 @@ void _sim_check_for_interrupts(void) {
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Interrupt Timer simulation (10ms interval).*/
|
||||
QueryPerformanceCounter(&n);
|
||||
if (n.QuadPart > nextcnt.QuadPart) {
|
||||
nextcnt.QuadPart += slice.QuadPart;
|
||||
gettimeofday(&tv, NULL);
|
||||
if (timercmp(&tv, &nextcnt, >=)) {
|
||||
timeradd(&nextcnt, &tick, &nextcnt);
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
|
|
|
@ -25,7 +25,15 @@
|
|||
#ifndef HAL_LLD_H
|
||||
#define HAL_LLD_H
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -35,7 +43,11 @@
|
|||
/**
|
||||
* @brief Platform name.
|
||||
*/
|
||||
#if defined(WIN32)
|
||||
#define PLATFORM_NAME "Win32 Simulator"
|
||||
#else
|
||||
#define PLATFORM_NAME "Posix Simulator"
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver pre-compile time settings. */
|
||||
|
|
|
@ -22,6 +22,10 @@
|
|||
* @{
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
#if HAL_USE_SERIAL || defined(__DOXYGEN__)
|
||||
|
@ -31,11 +35,12 @@
|
|||
/*===========================================================================*/
|
||||
|
||||
/** @brief Serial driver 1 identifier.*/
|
||||
#if USE_WIN32_SERIAL1 || defined(__DOXYGEN__)
|
||||
#if USE_SIM_SERIAL1 || defined(__DOXYGEN__)
|
||||
SerialDriver SD1;
|
||||
#endif
|
||||
|
||||
/** @brief Serial driver 2 identifier.*/
|
||||
#if USE_WIN32_SERIAL2 || defined(__DOXYGEN__)
|
||||
#if USE_SIM_SERIAL2 || defined(__DOXYGEN__)
|
||||
SerialDriver SD2;
|
||||
#endif
|
||||
|
||||
|
@ -47,8 +52,6 @@ SerialDriver SD2;
|
|||
static const SerialConfig default_config = {
|
||||
};
|
||||
|
||||
static u_long nb = 1;
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
@ -56,6 +59,8 @@ static u_long nb = 1;
|
|||
static void init(SerialDriver *sdp, uint16_t port) {
|
||||
struct sockaddr_in sad;
|
||||
struct protoent *prtp;
|
||||
int sockval = 1;
|
||||
socklen_t socklen = sizeof(sockval);
|
||||
|
||||
if ((prtp = getprotobyname("tcp")) == NULL) {
|
||||
printf("%s: Error mapping protocol name to protocol number\n", sdp->com_name);
|
||||
|
@ -63,12 +68,21 @@ static void init(SerialDriver *sdp, uint16_t port) {
|
|||
}
|
||||
|
||||
sdp->com_listen = socket(PF_INET, SOCK_STREAM, prtp->p_proto);
|
||||
if (sdp->com_listen == INVALID_SOCKET) {
|
||||
if (sdp->com_listen == -1) {
|
||||
printf("%s: Error creating simulator socket\n", sdp->com_name);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
if (ioctlsocket(sdp->com_listen, FIONBIO, &nb) != 0) {
|
||||
setsockopt(sdp->com_listen, SOL_SOCKET, SO_REUSEADDR, &sockval, socklen);
|
||||
|
||||
#if 0
|
||||
if (ioctl(sdp->com_listen, FIONBIO, &nb) != 0) {
|
||||
printf("%s: Unable to setup non blocking mode on socket\n", sdp->com_name);
|
||||
goto abort;
|
||||
}
|
||||
#endif
|
||||
int flags = fcntl(sdp->com_listen, F_GETFL, 0);
|
||||
if (fcntl(sdp->com_listen, F_SETFL, flags | O_NONBLOCK) != 0) {
|
||||
printf("%s: Unable to setup non blocking mode on socket\n", sdp->com_name);
|
||||
goto abort;
|
||||
}
|
||||
|
@ -90,69 +104,75 @@ static void init(SerialDriver *sdp, uint16_t port) {
|
|||
return;
|
||||
|
||||
abort:
|
||||
if (sdp->com_listen != INVALID_SOCKET)
|
||||
closesocket(sdp->com_listen);
|
||||
WSACleanup();
|
||||
if (sdp->com_listen != -1)
|
||||
close(sdp->com_listen);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static bool connint(SerialDriver *sdp) {
|
||||
|
||||
if (sdp->com_data == INVALID_SOCKET) {
|
||||
if (sdp->com_data == -1) {
|
||||
struct sockaddr addr;
|
||||
int addrlen = sizeof(addr);
|
||||
socklen_t addrlen = sizeof(addr);
|
||||
|
||||
if ((sdp->com_data = accept(sdp->com_listen, &addr, &addrlen)) == INVALID_SOCKET)
|
||||
if ((sdp->com_data = accept(sdp->com_listen, &addr, &addrlen)) == -1)
|
||||
return FALSE;
|
||||
|
||||
if (ioctlsocket(sdp->com_data, FIONBIO, &nb) != 0) {
|
||||
#if 0
|
||||
if (ioctl(sdp->com_data, FIONBIO, &nb) != 0) {
|
||||
printf("%s: Unable to setup non blocking mode on data socket\n", sdp->com_name);
|
||||
goto abort;
|
||||
}
|
||||
chSysLockFromISR();
|
||||
#endif
|
||||
int flags = fcntl(sdp->com_data, F_GETFL, 0);
|
||||
if (fcntl(sdp->com_data, F_SETFL, flags | O_NONBLOCK) != 0) {
|
||||
printf("%s: Unable to setup non blocking mode on data socket\n", sdp->com_name);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
osalSysLockFromISR();
|
||||
chnAddFlagsI(sdp, CHN_CONNECTED);
|
||||
chSysUnlockFromISR();
|
||||
osalSysUnlockFromISR();
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
abort:
|
||||
if (sdp->com_listen != INVALID_SOCKET)
|
||||
closesocket(sdp->com_listen);
|
||||
if (sdp->com_data != INVALID_SOCKET)
|
||||
closesocket(sdp->com_data);
|
||||
WSACleanup();
|
||||
if (sdp->com_listen != -1)
|
||||
close(sdp->com_listen);
|
||||
if (sdp->com_data != -1)
|
||||
close(sdp->com_data);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static bool inint(SerialDriver *sdp) {
|
||||
|
||||
if (sdp->com_data != INVALID_SOCKET) {
|
||||
if (sdp->com_data != -1) {
|
||||
int i;
|
||||
uint8_t data[32];
|
||||
|
||||
/*
|
||||
* Input.
|
||||
*/
|
||||
int n = recv(sdp->com_data, (char *)data, sizeof(data), 0);
|
||||
int n = recv(sdp->com_data, data, sizeof(data), 0);
|
||||
switch (n) {
|
||||
case 0:
|
||||
closesocket(sdp->com_data);
|
||||
sdp->com_data = INVALID_SOCKET;
|
||||
chSysLockFromISR();
|
||||
close(sdp->com_data);
|
||||
sdp->com_data = -1;
|
||||
osalSysLockFromISR();
|
||||
chnAddFlagsI(sdp, CHN_DISCONNECTED);
|
||||
chSysUnlockFromISR();
|
||||
osalSysUnlockFromISR();
|
||||
return FALSE;
|
||||
case SOCKET_ERROR:
|
||||
if (WSAGetLastError() == WSAEWOULDBLOCK)
|
||||
case -1:
|
||||
if (errno == EWOULDBLOCK)
|
||||
return FALSE;
|
||||
closesocket(sdp->com_data);
|
||||
sdp->com_data = INVALID_SOCKET;
|
||||
close(sdp->com_data);
|
||||
sdp->com_data = -1;
|
||||
return FALSE;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
chSysLockFromISR();
|
||||
osalSysLockFromISR();
|
||||
sdIncomingDataI(sdp, data[i]);
|
||||
chSysUnlockFromISR();
|
||||
osalSysUnlockFromISR();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -161,33 +181,33 @@ static bool inint(SerialDriver *sdp) {
|
|||
|
||||
static bool outint(SerialDriver *sdp) {
|
||||
|
||||
if (sdp->com_data != INVALID_SOCKET) {
|
||||
if (sdp->com_data != -1) {
|
||||
int n;
|
||||
uint8_t data[1];
|
||||
|
||||
/*
|
||||
* Input.
|
||||
*/
|
||||
chSysLockFromISR();
|
||||
osalSysLockFromISR();
|
||||
n = sdRequestDataI(sdp);
|
||||
chSysUnlockFromISR();
|
||||
osalSysUnlockFromISR();
|
||||
if (n < 0)
|
||||
return FALSE;
|
||||
data[0] = (uint8_t)n;
|
||||
n = send(sdp->com_data, (char *)data, sizeof(data), 0);
|
||||
n = send(sdp->com_data, data, sizeof(data), 0);
|
||||
switch (n) {
|
||||
case 0:
|
||||
closesocket(sdp->com_data);
|
||||
sdp->com_data = INVALID_SOCKET;
|
||||
chSysLockFromISR();
|
||||
close(sdp->com_data);
|
||||
sdp->com_data = -1;
|
||||
osalSysLockFromISR();
|
||||
chnAddFlagsI(sdp, CHN_DISCONNECTED);
|
||||
chSysUnlockFromISR();
|
||||
osalSysUnlockFromISR();
|
||||
return FALSE;
|
||||
case SOCKET_ERROR:
|
||||
if (WSAGetLastError() == WSAEWOULDBLOCK)
|
||||
case -1:
|
||||
if (errno == EWOULDBLOCK)
|
||||
return FALSE;
|
||||
closesocket(sdp->com_data);
|
||||
sdp->com_data = INVALID_SOCKET;
|
||||
close(sdp->com_data);
|
||||
sdp->com_data = -1;
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
|
@ -208,17 +228,17 @@ static bool outint(SerialDriver *sdp) {
|
|||
*/
|
||||
void sd_lld_init(void) {
|
||||
|
||||
#if USE_WIN32_SERIAL1
|
||||
#if USE_SIM_SERIAL1
|
||||
sdObjectInit(&SD1, NULL, NULL);
|
||||
SD1.com_listen = INVALID_SOCKET;
|
||||
SD1.com_data = INVALID_SOCKET;
|
||||
SD1.com_listen = -1;
|
||||
SD1.com_data = -1;
|
||||
SD1.com_name = "SD1";
|
||||
#endif
|
||||
|
||||
#if USE_WIN32_SERIAL2
|
||||
#if USE_SIM_SERIAL2
|
||||
sdObjectInit(&SD2, NULL, NULL);
|
||||
SD2.com_listen = INVALID_SOCKET;
|
||||
SD2.com_data = INVALID_SOCKET;
|
||||
SD2.com_listen = -1;
|
||||
SD2.com_data = -1;
|
||||
SD2.com_name = "SD2";
|
||||
#endif
|
||||
}
|
||||
|
@ -236,14 +256,14 @@ void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) {
|
|||
if (config == NULL)
|
||||
config = &default_config;
|
||||
|
||||
#if USE_WIN32_SERIAL1
|
||||
#if USE_SIM_SERIAL1
|
||||
if (sdp == &SD1)
|
||||
init(&SD1, SD1_PORT);
|
||||
init(&SD1, SIM_SD1_PORT);
|
||||
#endif
|
||||
|
||||
#if USE_WIN32_SERIAL2
|
||||
#if USE_SIM_SERIAL2
|
||||
if (sdp == &SD2)
|
||||
init(&SD2, SD2_PORT);
|
||||
init(&SD2, SIM_SD2_PORT);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -260,19 +280,15 @@ void sd_lld_stop(SerialDriver *sdp) {
|
|||
}
|
||||
|
||||
bool sd_lld_interrupt_pending(void) {
|
||||
bool b = false;
|
||||
bool b;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
OSAL_IRQ_PROLOGUE();
|
||||
|
||||
#if USE_WIN32_SERIAL1
|
||||
b |= connint(&SD1) || inint(&SD1) || outint(&SD1);
|
||||
#endif
|
||||
b = connint(&SD1) || connint(&SD2) ||
|
||||
inint(&SD1) || inint(&SD2) ||
|
||||
outint(&SD1) || outint(&SD2);
|
||||
|
||||
#if USE_WIN32_SERIAL2
|
||||
b |= connint(&SD2) || inint(&SD2) || outint(&SD2);
|
||||
#endif
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
OSAL_IRQ_EPILOGUE();
|
||||
|
||||
return b;
|
||||
}
|
||||
|
|
|
@ -45,8 +45,8 @@
|
|||
* @details If set to @p TRUE the support for SD1 is included.
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#if !defined(USE_WIN32_SERIAL1) || defined(__DOXYGEN__)
|
||||
#define USE_WIN32_SERIAL1 TRUE
|
||||
#if !defined(USE_SIM_SERIAL1) || defined(__DOXYGEN__)
|
||||
#define USE_SIM_SERIAL1 TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -54,22 +54,22 @@
|
|||
* @details If set to @p TRUE the support for SD2 is included.
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#if !defined(USE_WIN32_SERIAL2) || defined(__DOXYGEN__)
|
||||
#define USE_WIN32_SERIAL2 TRUE
|
||||
#if !defined(USE_SIM_SERIAL2) || defined(__DOXYGEN__)
|
||||
#define USE_SIM_SERIAL2 TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Listen port for SD1.
|
||||
*/
|
||||
#if !defined(SD1_PORT) || defined(__DOXYGEN__)
|
||||
#define SD1_PORT 29001
|
||||
#define SIM_SD1_PORT 29001
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Listen port for SD2.
|
||||
*/
|
||||
#if !defined(SD2_PORT) || defined(__DOXYGEN__)
|
||||
#define SD2_PORT 29002
|
||||
#define SIM_SD2_PORT 29002
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -108,9 +108,9 @@ typedef struct {
|
|||
uint8_t ob[SERIAL_BUFFERS_SIZE]; \
|
||||
/* End of the mandatory fields.*/ \
|
||||
/* Listen socket for simulated serial port.*/ \
|
||||
SOCKET com_listen; \
|
||||
int com_listen; \
|
||||
/* Data socket for simulated serial port.*/ \
|
||||
SOCKET com_data; \
|
||||
int com_data; \
|
||||
/* Port readable name.*/ \
|
||||
const char *com_name;
|
||||
|
||||
|
@ -118,10 +118,10 @@ typedef struct {
|
|||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#if USE_WIN32_SERIAL1 && !defined(__DOXYGEN__)
|
||||
#if USE_SIM_SERIAL1 && !defined(__DOXYGEN__)
|
||||
extern SerialDriver SD1;
|
||||
#endif
|
||||
#if USE_WIN32_SERIAL2 && !defined(__DOXYGEN__)
|
||||
#if USE_SIM_SERIAL2 && !defined(__DOXYGEN__)
|
||||
extern SerialDriver SD2;
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue