--- bdaddr.c 2005-05-09 14:33:24.000000000 -0400 +++ bdaddr-jlw.c 2005-08-19 12:15:03.000000000 -0400 @@ -103,6 +103,40 @@ } #endif +static int csr_cold_reset(int dd) +{ + unsigned char cmd[] = { 0x02, 0x00, /* message type */ + 0x09, 0x00, /* message length */ + 0x00, 0x00, /* seqno for pairing response */ + 0x01, 0x40, /* varid for cold reset */ + 0x00, 0x00, /* status */ + /* payload follows, must be at least at least + 4 uint16s in length accordind to BCCMD */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + unsigned char cp[254], rp[254]; + struct hci_request rq; + + memset(&cp, 0, sizeof(cp)); + cp[0] = 0xc2; + memcpy(cp + 1, cmd, sizeof(cmd)); + + memset(&rq, 0, sizeof(rq)); + rq.ogf = OGF_VENDOR_CMD; + rq.ocf = 0x00; + rq.event = EVT_VENDOR; + rq.cparam = cp; + rq.clen = sizeof(cmd) + 1; + rq.rparam = rp; + rq.rlen = sizeof(rp); + + if (hci_send_req(dd, &rq, 2000) < 0) + return -1; + + return 0; +} + + static int csr_write_bd_addr(int dd, bdaddr_t *bdaddr) { unsigned char cmd[] = { 0x02, 0x00, 0x0c, 0x00, 0x11, 0x47, 0x03, 0x70, @@ -291,7 +325,16 @@ exit(1); } - printf("Address changed - Reset device now\n"); + if (ver.manufacturer == 10) { /* CSR devices */ + if (csr_cold_reset(dd) != 0) { + fprintf(stderr, "Error resetting card, remove and insert manually.\n"); + exit(1); + } else { + printf("Address changed - card reset successfully\n"); + } + } else { /* non-CSR devices */ + printf("Address changed - Reset device now\n"); + } //ioctl(dd, HCIDEVRESET, dev); //ioctl(dd, HCIDEVDOWN, dev);