2015-02-19 22:00:12 -05:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <limits.h>
|
|
|
|
#include "port.h"
|
|
|
|
#include "ploader.h"
|
|
|
|
#include "osint.h"
|
|
|
|
|
|
|
|
/* CheckPort state structure */
|
|
|
|
typedef struct {
|
|
|
|
PL_state *state;
|
|
|
|
int baud;
|
|
|
|
int verbose;
|
|
|
|
char *actualport;
|
|
|
|
} CheckPortInfo;
|
|
|
|
|
|
|
|
void ShowPorts(PL_state *state, char *prefix);
|
|
|
|
int InitPort(PL_state *state, char *prefix, char *port, int baud, int verbose, char *actualport);
|
|
|
|
|
|
|
|
static int ShowPort(const char *port, void *data);
|
|
|
|
static int CheckPort(const char *port, void *data);
|
|
|
|
static int OpenPort(PL_state *state, const char *port, int baud);
|
|
|
|
static void cb_reset(void *data);
|
|
|
|
static int cb_tx(void *data, uint8_t* buf, int n);
|
|
|
|
static int cb_rx_timeout(void *data, uint8_t* buf, int n, int timeout);
|
|
|
|
static void cb_msleep(void *data, int msecs);
|
|
|
|
static void cb_progress(void *data, int phase);
|
|
|
|
|
|
|
|
void InitPortState(PL_state *state)
|
|
|
|
{
|
|
|
|
PL_Init(state);
|
|
|
|
state->reset = cb_reset;
|
|
|
|
state->tx = cb_tx;
|
|
|
|
state->rx_timeout = cb_rx_timeout;
|
|
|
|
state->progress = cb_progress;
|
|
|
|
state->msleep = cb_msleep;
|
|
|
|
#ifdef RASPBERRY_PI
|
|
|
|
{
|
|
|
|
char cmd[20] = "gpio,17,0";
|
|
|
|
// use_reset_method uses strtok to parse the string so it can't be a constant
|
|
|
|
use_reset_method(cmd);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void ShowPorts(PL_state *state, char *prefix)
|
|
|
|
{
|
|
|
|
serial_find(prefix, ShowPort, state);
|
|
|
|
}
|
|
|
|
|
|
|
|
int InitPort(PL_state *state, char *prefix, char *port, int baud, int verbose, char *actualport)
|
|
|
|
{
|
|
|
|
int result;
|
|
|
|
|
|
|
|
if (port) {
|
|
|
|
if (actualport) {
|
|
|
|
strncpy(actualport, port, PATH_MAX - 1);
|
|
|
|
actualport[PATH_MAX - 1] = '\0';
|
|
|
|
}
|
|
|
|
result = OpenPort(state, port, baud);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
CheckPortInfo info;
|
|
|
|
info.state = state;
|
|
|
|
info.baud = baud;
|
|
|
|
info.verbose = verbose;
|
|
|
|
info.actualport = actualport;
|
|
|
|
if (serial_find(prefix, CheckPort, &info) == 0)
|
|
|
|
result = CHECK_PORT_OK;
|
|
|
|
else
|
|
|
|
result = CHECK_PORT_NO_PROPELLER;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int ShowPort(const char *port, void *data)
|
|
|
|
{
|
|
|
|
printf("%s\n", port);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int CheckPort(const char *port, void *data)
|
|
|
|
{
|
|
|
|
CheckPortInfo *info = (CheckPortInfo*)data;
|
|
|
|
int rc;
|
2017-07-03 08:23:32 -04:00
|
|
|
if (info->verbose) {
|
|
|
|
printf("Trying %s \n", port);
|
|
|
|
fflush(stdout);
|
|
|
|
}
|
2015-02-19 22:00:12 -05:00
|
|
|
if ((rc = OpenPort(info->state, port, info->baud)) != CHECK_PORT_OK)
|
|
|
|
return rc;
|
|
|
|
if (info->actualport) {
|
|
|
|
strncpy(info->actualport, port, PATH_MAX - 1);
|
|
|
|
info->actualport[PATH_MAX - 1] = '\0';
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int OpenPort(PL_state *state, const char *port, int baud)
|
|
|
|
{
|
|
|
|
/* open the port */
|
|
|
|
if (serial_init(port, baud) == 0)
|
|
|
|
return CHECK_PORT_OPEN_FAILED;
|
|
|
|
|
|
|
|
/* check for a propeller on this port */
|
|
|
|
if (PL_HardwareFound(state, &state->version) != LOAD_STS_OK) {
|
|
|
|
serial_done();
|
|
|
|
return CHECK_PORT_NO_PROPELLER;
|
|
|
|
}
|
|
|
|
|
|
|
|
return CHECK_PORT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void cb_reset(void *data)
|
|
|
|
{
|
|
|
|
hwreset();
|
|
|
|
}
|
|
|
|
|
|
|
|
static int cb_tx(void *data, uint8_t* buf, int n)
|
|
|
|
{
|
|
|
|
return tx(buf, n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int cb_rx_timeout(void *data, uint8_t* buf, int n, int timeout)
|
|
|
|
{
|
|
|
|
return rx_timeout(buf, n, timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void cb_msleep(void *data, int msecs)
|
|
|
|
{
|
|
|
|
msleep(msecs);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void cb_progress(void *data, int phase)
|
|
|
|
{
|
|
|
|
switch (phase) {
|
|
|
|
case LOAD_PHASE_HANDSHAKE:
|
|
|
|
break;
|
|
|
|
case LOAD_PHASE_RESPONSE:
|
|
|
|
break;
|
|
|
|
case LOAD_PHASE_VERSION:
|
|
|
|
break;
|
|
|
|
case LOAD_PHASE_HANDSHAKE_DONE:
|
|
|
|
break;
|
|
|
|
case LOAD_PHASE_PROGRAM:
|
|
|
|
printf("Loading hub memory ... ");
|
|
|
|
fflush(stdout);
|
|
|
|
break;
|
|
|
|
case LOAD_PHASE_EEPROM_WRITE:
|
|
|
|
printf("OK\nWriting EEPROM ... ");
|
|
|
|
fflush(stdout);
|
|
|
|
break;
|
|
|
|
case LOAD_PHASE_EEPROM_VERIFY:
|
|
|
|
printf("OK\nVerifying EEPROM ... ");
|
|
|
|
fflush(stdout);
|
|
|
|
break;
|
|
|
|
case LOAD_PHASE_DONE:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|