diff options
Diffstat (limited to 'tools/hciattach_st.c')
-rw-r--r-- | tools/hciattach_st.c | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/tools/hciattach_st.c b/tools/hciattach_st.c index 98179d71..ee3ca2a7 100644 --- a/tools/hciattach_st.c +++ b/tools/hciattach_st.c @@ -32,20 +32,32 @@ #include <stdint.h> #include <string.h> +static int debug = 0; + static int do_command(int fd, uint8_t ogf, uint16_t ocf, uint8_t *cparam, int clen, uint8_t *rparam, int rlen) { - uint16_t opcode = (uint16_t) ((ocf & 0x03ff) | (ogf << 10)); + //uint16_t opcode = (uint16_t) ((ocf & 0x03ff) | (ogf << 10)); unsigned char cp[254], rp[254]; int len, size, offset = 3; - memset(cp, 0, sizeof(cp)); cp[0] = 0x01; - cp[1] = opcode & 0xff; - cp[2] = opcode >> 8; - cp[3] = 0x00; + cp[1] = ocf & 0xff; + cp[2] = ogf << 2 | ocf >> 8; + cp[3] = clen; + + if (clen > 0) + memcpy(cp + 4, cparam, clen); + + if (debug) { + int i; + printf("[<"); + for (i = 0; i < clen + 4; i++) + printf(" %02x", cp[i]); + printf("]\n"); + } - if (write(fd, cp, 4) < 0) + if (write(fd, cp, clen + 4) < 0) return -1; do { @@ -61,18 +73,28 @@ static int do_command(int fd, uint8_t ogf, uint16_t ocf, offset += len; } while (offset < rp[2] + 3); + if (debug) { + int i; + printf("[>"); + for (i = 0; i < offset; i++) + printf(" %02x", rp[i]); + printf("]\n"); + } + if (rp[0] != 0x04) { errno = EIO; return -1; } switch (rp[1]) { - case 0x0e: + case 0x0e: /* command complete */ if (rp[6] != 0x00) return -ENXIO; offset = 3 + 4; size = rp[2] - 4; break; + case 0x0f: /* command status */ + /* fall through */ default: offset = 3; size = rp[2]; @@ -89,16 +111,30 @@ static int do_command(int fd, uint8_t ogf, uint16_t ocf, int stlc2500_init(int fd) { + unsigned char cmd[16]; unsigned char buf[254]; int len; len = do_command(fd, 0x04, 0x0001, NULL, 0, buf, sizeof(buf)); - //printf("STLC2500 R%d.%d\n", buf[2], buf[1]); + printf("Patch: STLC2500_R%d_%02d_*.ptc\n", buf[2], buf[1]); len = do_command(fd, 0xff, 0x000f, NULL, 0, buf, sizeof(buf)); - printf("%s\n", buf + 3); + printf("%s\n", buf); + + cmd[0] = 0xfe; + cmd[1] = 0x06; + cmd[2] = 0xba; + cmd[3] = 0xab; + cmd[4] = 0x00; + cmd[5] = 0xe1; + cmd[6] = 0x80; + cmd[7] = 0x00; + + len = do_command(fd, 0xff, 0x0022, cmd, 8, buf, sizeof(buf)); + + len = do_command(fd, 0x03, 0x0003, NULL, 0, buf, sizeof(buf)); return 0; } |