Added CPU identification to BSL interface.

This commit is contained in:
Daniel Beer 2010-01-08 20:19:53 +13:00
parent 1baa04a565
commit e0055a9b68
5 changed files with 53 additions and 63 deletions

20
bsl.c
View File

@ -26,6 +26,7 @@
#include <unistd.h>
#include "device.h"
#include "util.h"
static const struct fet_transport *trans;
@ -293,7 +294,26 @@ const struct device *fet_open_bl(const struct fet_transport *tr)
return NULL;
}
if (memcmp(buf, "\x06\x00\x24\x00\x00\x00\x61\x01", 8)) {
fprintf(stderr, "bsl: bootloader start returned error %d\n",
buf[5]);
return NULL;
}
usleep(500000);
/* Show chip info */
if (bsl_xfer(CMD_TX_DATA, 0xff0, NULL, 0x10) < 0) {
fprintf(stderr, "bsl: failed to read chip info\n");
return NULL;
}
if (reply_len < 0x16) {
fprintf(stderr, "bsl: missing chip info\n");
return NULL;
}
print_devid((reply_buf[4] << 8) | reply_buf[5]);
printf("BSL version is %d.%02d\n", reply_buf[16], reply_buf[17]);
return &bsl_device;
}

66
fet.c
View File

@ -505,55 +505,8 @@ static int xfer(int command_code, const u_int8_t *data, int datalen,
static int fet_version;
/* Reply data taken from uif430 */
#define ID_REPLY_LEN 18
static const struct {
const u_int8_t reply[ID_REPLY_LEN];
const char *idtext;
} id_table[] = {
{
.reply = {0xF2, 0x49, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x02, 0x01, 0x00, 0xF3, 0x2B,
0x80, 0x00},
.idtext = "MSP430F249"
},
{
.reply = {0xF1, 0x49, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xF0, 0x1A,
0x10, 0x00},
.idtext = "MSP430F149"
},
{
.reply = {0xF1, 0x6C, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x61, 0x01, 0x00, 0xD1, 0x4D,
0x80, 0x00},
.idtext = "MSP430F1611"
},
{
.reply = {0xf2, 0x27, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x01, 0x01, 0x04, 0xb1, 0x62,
0x80, 0x00},
.idtext = "MSP430F2274"
},
{
.reply = {0xf2, 0x27, 0x41, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x01, 0x01, 0x04, 0xb1, 0x61,
0x80, 0x00},
.idtext = "MSP430F2274"
},
{
.reply = {0xf2, 0x01, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00,
0x00, 0x00},
.idtext = "MSP430F20x3"
}
};
static int do_identify(void)
{
int i;
if (fet_version < 20300000) {
char idtext[64];
@ -561,34 +514,25 @@ static int do_identify(void)
return -1;
if (!fet_reply.data) {
fprintf(stderr, "do_indentify: missing info\n");
fprintf(stderr, "fet: missing info\n");
return -1;
}
memcpy(idtext, fet_reply.data + 4, 32);
idtext[32] = 0;
printf("Device is %s\n", idtext);
printf("Device: %s\n", idtext);
return 0;
}
if (xfer(0x28, NULL, 0, 2, 0, 0) < 0)
return -1;
if (!fet_reply.data) {
fprintf(stderr, "do_indentify: missing info\n");
if (fet_reply.datalen < 2) {
fprintf(stderr, "fet: missing info\n");
return -1;
}
if (fet_reply.datalen >= ID_REPLY_LEN)
for (i = 0; i < ARRAY_LEN(id_table); i++)
if (!memcmp(id_table[i].reply, fet_reply.data,
ID_REPLY_LEN)) {
printf("Device is %s\n", id_table[i].idtext);
return 0;
}
printf("warning: unknown device data:\n");
hexdump(0, fet_reply.data, fet_reply.datalen);
print_devid((fet_reply.data[0] << 8) | fet_reply.data[1]);
return 0;
}

4
uif.c
View File

@ -81,12 +81,12 @@ static int serial_recv(u_int8_t *data, int max_len)
r = read(serial_fd, data, max_len);
if (r < 0 && errno != EINTR) {
perror("bls: read error");
perror("uif: read error");
return -1;
}
if (!r) {
fprintf(stderr, "bls: read timeout\n");
fprintf(stderr, "uif: read timeout\n");
return -1;
}
} while (r <= 0);

24
util.c
View File

@ -49,3 +49,27 @@ void hexdump(int addr, const u_int8_t *data, int len)
offset += i;
}
}
static struct {
u_int16_t id;
const char *id_text;
} id_table[] = {
{0xF249, "MSP430F249"},
{0xF149, "MSP430F149"},
{0xF16C, "MSP430F1611"},
{0xF227, "MSP430F2274"},
{0xF201, "MSP430F20x3"}
};
void print_devid(u_int16_t id)
{
int i = 0;
while (i < ARRAY_LEN(id_table) && id_table[i].id != id)
i++;
if (i < ARRAY_LEN(id_table))
printf("Device: %s\n", id_table[i].id_text);
else
printf("Unknown device ID: 0x%04x\n", id);
}

2
util.h
View File

@ -25,4 +25,6 @@ void hexdump(int addr, const u_int8_t *data, int len);
#define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
void print_devid(const u_int16_t id);
#endif