Separated FET protocol quirks into flags.
This commit is contained in:
parent
0b94a97c97
commit
41375ba084
50
fet.c
50
fet.c
|
@ -38,11 +38,17 @@
|
||||||
#include "olimex.h"
|
#include "olimex.h"
|
||||||
#include "rf2500.h"
|
#include "rf2500.h"
|
||||||
|
|
||||||
typedef enum {
|
/* Send data in separate packets, as in the RF2500 */
|
||||||
PROTOCOL_UIF,
|
#define FET_PROTO_SEPARATE_DATA 0x01
|
||||||
PROTOCOL_RF2500,
|
|
||||||
PROTOCOL_OLIMEX
|
/* Received packets have an extra trailing byte */
|
||||||
} protocol_t;
|
#define FET_PROTO_EXTRA_RECV 0x02
|
||||||
|
|
||||||
|
/* Command packets have no leading \x7e */
|
||||||
|
#define FET_PROTO_NOLEAD_SEND 0x04
|
||||||
|
|
||||||
|
/* The new identify method should always be used */
|
||||||
|
#define FET_PROTO_IDENTIFY_NEW 0x08
|
||||||
|
|
||||||
#define MAX_PARAMS 16
|
#define MAX_PARAMS 16
|
||||||
#define MAX_BLOCK_SIZE 4096
|
#define MAX_BLOCK_SIZE 4096
|
||||||
|
@ -51,7 +57,7 @@ struct fet_device {
|
||||||
struct device base;
|
struct device base;
|
||||||
|
|
||||||
transport_t transport;
|
transport_t transport;
|
||||||
protocol_t protocol;
|
int flags;
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
/* Device-specific information */
|
/* Device-specific information */
|
||||||
|
@ -334,7 +340,7 @@ too_short:
|
||||||
*/
|
*/
|
||||||
static int recv_packet(struct fet_device *dev)
|
static int recv_packet(struct fet_device *dev)
|
||||||
{
|
{
|
||||||
int pkt_extra = (dev->protocol == PROTOCOL_OLIMEX) ? 3 : 2;
|
int pkt_extra = (dev->flags & FET_PROTO_EXTRA_RECV) ? 3 : 2;
|
||||||
int plen = LE_WORD(dev->fet_buf, 0);
|
int plen = LE_WORD(dev->fet_buf, 0);
|
||||||
|
|
||||||
/* If there's a packet still here from last time, get rid of it */
|
/* If there's a packet still here from last time, get rid of it */
|
||||||
|
@ -424,7 +430,7 @@ static int send_command(struct fet_device *dev, int command_code,
|
||||||
/* Copy into buf, escaping special characters and adding
|
/* Copy into buf, escaping special characters and adding
|
||||||
* delimeters.
|
* delimeters.
|
||||||
*/
|
*/
|
||||||
if (dev->protocol != PROTOCOL_OLIMEX)
|
if (!(dev->flags & FET_PROTO_NOLEAD_SEND))
|
||||||
buf[i++] = 0x7e;
|
buf[i++] = 0x7e;
|
||||||
|
|
||||||
for (j = 0; j < len; j++) {
|
for (j = 0; j < len; j++) {
|
||||||
|
@ -459,7 +465,7 @@ static int xfer(struct fet_device *dev,
|
||||||
params[i] = va_arg(ap, uint32_t);
|
params[i] = va_arg(ap, uint32_t);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if (data && (dev->protocol == PROTOCOL_RF2500)) {
|
if (data && (dev->flags & FET_PROTO_SEPARATE_DATA)) {
|
||||||
assert (nparams + 1 <= MAX_PARAMS);
|
assert (nparams + 1 <= MAX_PARAMS);
|
||||||
params[nparams++] = datalen;
|
params[nparams++] = datalen;
|
||||||
|
|
||||||
|
@ -567,7 +573,7 @@ static int identify_new(struct fet_device *dev, const char *force_id)
|
||||||
|
|
||||||
static int do_identify(struct fet_device *dev, const char *force_id)
|
static int do_identify(struct fet_device *dev, const char *force_id)
|
||||||
{
|
{
|
||||||
if (dev->protocol == PROTOCOL_OLIMEX)
|
if (dev->flags & FET_PROTO_IDENTIFY_NEW)
|
||||||
return identify_new(dev, force_id);
|
return identify_new(dev, force_id);
|
||||||
|
|
||||||
if (dev->version < 20300000)
|
if (dev->version < 20300000)
|
||||||
|
@ -943,11 +949,11 @@ static int do_configure(struct fet_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
int try_open(struct fet_device *dev, const struct device_args *args,
|
int try_open(struct fet_device *dev, const struct device_args *args,
|
||||||
protocol_t protocol, int send_reset)
|
int send_reset)
|
||||||
{
|
{
|
||||||
transport_t transport = dev->transport;
|
transport_t transport = dev->transport;
|
||||||
|
|
||||||
if (protocol == PROTOCOL_OLIMEX) {
|
if (dev->flags & FET_PROTO_NOLEAD_SEND) {
|
||||||
printc("Resetting Olimex command processor...\n");
|
printc("Resetting Olimex command processor...\n");
|
||||||
transport->send(dev->transport, (const uint8_t *)"\x7e", 1);
|
transport->send(dev->transport, (const uint8_t *)"\x7e", 1);
|
||||||
usleep(5000);
|
usleep(5000);
|
||||||
|
@ -994,7 +1000,7 @@ int try_open(struct fet_device *dev, const struct device_args *args,
|
||||||
}
|
}
|
||||||
|
|
||||||
static device_t fet_open(const struct device_args *args,
|
static device_t fet_open(const struct device_args *args,
|
||||||
protocol_t protocol, transport_t transport,
|
int flags, transport_t transport,
|
||||||
const struct device_class *type)
|
const struct device_class *type)
|
||||||
{
|
{
|
||||||
struct fet_device *dev = malloc(sizeof(*dev));
|
struct fet_device *dev = malloc(sizeof(*dev));
|
||||||
|
@ -1009,12 +1015,12 @@ static device_t fet_open(const struct device_args *args,
|
||||||
|
|
||||||
dev->base.type = type;
|
dev->base.type = type;
|
||||||
dev->transport = transport;
|
dev->transport = transport;
|
||||||
dev->protocol = protocol;
|
dev->flags = flags;
|
||||||
|
|
||||||
if (try_open(dev, args, protocol, 0) < 0) {
|
if (try_open(dev, args, 0) < 0) {
|
||||||
usleep(500000);
|
usleep(500000);
|
||||||
printc("Trying again...\n");
|
printc("Trying again...\n");
|
||||||
if (try_open(dev, args, protocol, 1) < 0)
|
if (try_open(dev, args, 1) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1045,7 +1051,7 @@ static device_t fet_open_rf2500(const struct device_args *args)
|
||||||
if (!trans)
|
if (!trans)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return fet_open(args, PROTOCOL_RF2500, trans, &device_rf2500);
|
return fet_open(args, FET_PROTO_SEPARATE_DATA, trans, &device_rf2500);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct device_class device_rf2500 = {
|
const struct device_class device_rf2500 = {
|
||||||
|
@ -1075,7 +1081,9 @@ static device_t fet_open_olimex(const struct device_args *args)
|
||||||
if (!trans)
|
if (!trans)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return fet_open(args, PROTOCOL_OLIMEX, trans, &device_olimex);
|
return fet_open(args, FET_PROTO_NOLEAD_SEND | FET_PROTO_EXTRA_RECV |
|
||||||
|
FET_PROTO_IDENTIFY_NEW,
|
||||||
|
trans, &device_olimex);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct device_class device_olimex = {
|
const struct device_class device_olimex = {
|
||||||
|
@ -1106,7 +1114,9 @@ static device_t fet_open_olimex_iso(const struct device_args *args)
|
||||||
if (!trans)
|
if (!trans)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return fet_open(args, PROTOCOL_OLIMEX, trans, &device_olimex_iso);
|
return fet_open(args, FET_PROTO_NOLEAD_SEND | FET_PROTO_EXTRA_RECV |
|
||||||
|
FET_PROTO_IDENTIFY_NEW,
|
||||||
|
trans, &device_olimex_iso);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct device_class device_olimex_iso = {
|
const struct device_class device_olimex_iso = {
|
||||||
|
@ -1137,7 +1147,7 @@ static device_t fet_open_uif(const struct device_args *args)
|
||||||
if (!trans)
|
if (!trans)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return fet_open(args, PROTOCOL_UIF, trans, &device_uif);
|
return fet_open(args, 0, trans, &device_uif);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct device_class device_uif = {
|
const struct device_class device_uif = {
|
||||||
|
|
Loading…
Reference in New Issue