hci: set bd addr after init script to make it work with bcm

This commit is contained in:
Matthias Ringwald 2016-01-02 22:32:54 +01:00
parent 3d1b0dfb98
commit 53860077ca
2 changed files with 51 additions and 54 deletions

View File

@ -903,13 +903,6 @@ static void hci_initializing_run(void){
hci_stack->substate = HCI_INIT_W4_SEND_RESET_ST_WARM_BOOT;
hci_send_cmd(&hci_reset);
break;
case HCI_INIT_SET_BD_ADDR:
log_info("Set Public BD ADDR to %s", bd_addr_to_str(hci_stack->custom_bd_addr));
hci_stack->control->set_bd_addr_cmd(hci_stack->config, hci_stack->custom_bd_addr, hci_stack->hci_packet_buffer);
hci_stack->last_cmd_opcode = READ_BT_16(hci_stack->hci_packet_buffer, 0);
hci_stack->substate = HCI_INIT_W4_SET_BD_ADDR;
hci_send_cmd_packet(hci_stack->hci_packet_buffer, 3 + hci_stack->hci_packet_buffer[2]);
break;
case HCI_INIT_SEND_BAUD_CHANGE:
hci_stack->control->baudrate_cmd(hci_stack->config, ((hci_uart_config_t *)hci_stack->config)->baudrate_main, hci_stack->hci_packet_buffer);
hci_stack->last_cmd_opcode = READ_BT_16(hci_stack->hci_packet_buffer, 0);
@ -950,19 +943,26 @@ static void hci_initializing_run(void){
log_info("hci_run: init script done");
}
// otherwise continue
hci_stack->substate = HCI_INIT_W4_READ_BD_ADDR;
hci_send_cmd(&hci_read_bd_addr);
break;
case HCI_INIT_READ_LOCAL_SUPPORTED_COMMANDS:
hci_stack->substate = HCI_INIT_W4_READ_LOCAL_SUPPORTED_COMMANDS;
hci_send_cmd(&hci_read_local_supported_commands);
break;
case HCI_INIT_SET_BD_ADDR:
log_info("Set Public BD ADDR to %s", bd_addr_to_str(hci_stack->custom_bd_addr));
hci_stack->control->set_bd_addr_cmd(hci_stack->config, hci_stack->custom_bd_addr, hci_stack->hci_packet_buffer);
hci_stack->last_cmd_opcode = READ_BT_16(hci_stack->hci_packet_buffer, 0);
hci_stack->substate = HCI_INIT_W4_SET_BD_ADDR;
hci_send_cmd_packet(hci_stack->hci_packet_buffer, 3 + hci_stack->hci_packet_buffer[2]);
break;
case HCI_INIT_READ_BD_ADDR:
hci_stack->substate = HCI_INIT_W4_READ_BD_ADDR;
hci_send_cmd(&hci_read_bd_addr);
break;
case HCI_INIT_READ_BUFFER_SIZE:
hci_stack->substate = HCI_INIT_W4_READ_BUFFER_SIZE;
hci_send_cmd(&hci_read_buffer_size);
break;
case HCI_INIT_READ_LOCAL_SUPPORTED_FEATUES:
hci_stack->substate = HCI_INIT_W4_READ_LOCAL_SUPPORTED_FEATUES;
case HCI_INIT_READ_LOCAL_SUPPORTED_FEATURES:
hci_stack->substate = HCI_INIT_W4_READ_LOCAL_SUPPORTED_FEATURES;
hci_send_cmd(&hci_read_local_supported_features);
break;
case HCI_INIT_SET_EVENT_MASK:
@ -1090,38 +1090,11 @@ static void hci_initializing_event_handler(uint8_t * packet, uint16_t size){
run_loop_remove_timer(&hci_stack->timeout);
break;
case HCI_INIT_W4_SEND_READ_LOCAL_VERSION_INFORMATION:
if (need_addr_change){
hci_stack->substate = HCI_INIT_SET_BD_ADDR;
return;
}
// skipping addr change
if (need_baud_change){
hci_stack->substate = HCI_INIT_SEND_BAUD_CHANGE;
return;
}
// also skip baud change
hci_stack->substate = HCI_INIT_CUSTOM_INIT;
return;
case HCI_INIT_W4_SET_BD_ADDR:
// for STLC2500D, bd addr change only gets active after sending reset command
if (hci_stack->manufacturer == 0x0030){
hci_stack->substate = HCI_INIT_SEND_RESET_ST_WARM_BOOT;
return;
}
// skipping warm boot on STLC2500D
if (need_baud_change){
hci_stack->substate = HCI_INIT_SEND_BAUD_CHANGE;
return;
}
// skipping baud change
hci_stack->substate = HCI_INIT_CUSTOM_INIT;
return;
case HCI_INIT_W4_SEND_RESET_ST_WARM_BOOT:
if (need_baud_change){
hci_stack->substate = HCI_INIT_SEND_BAUD_CHANGE;
return;
}
// skipping baud change
// skip baud change
hci_stack->substate = HCI_INIT_CUSTOM_INIT;
return;
case HCI_INIT_W4_SEND_BAUD_CHANGE:
@ -1143,9 +1116,32 @@ static void hci_initializing_event_handler(uint8_t * packet, uint16_t size){
hci_stack->substate = HCI_INIT_CUSTOM_INIT;
return;
case HCI_INIT_W4_READ_LOCAL_SUPPORTED_COMMANDS:
// skip read buffer size if not supported
if (hci_stack->local_supported_commands[0] & 0x01) break;
hci_stack->substate = HCI_INIT_READ_LOCAL_SUPPORTED_FEATUES;
if (need_addr_change){
hci_stack->substate = HCI_INIT_SET_BD_ADDR;
return;
}
hci_stack->substate = HCI_INIT_READ_BD_ADDR;
return;
case HCI_INIT_W4_SET_BD_ADDR:
// for STLC2500D, bd addr change only gets active after sending reset command
if (hci_stack->manufacturer == 0x0030){
hci_stack->substate = HCI_INIT_SEND_RESET_ST_WARM_BOOT;
return;
}
// skipping st warm boot
hci_stack->substate = HCI_INIT_READ_BD_ADDR;
return;
case HCI_INIT_W4_SEND_RESET_ST_WARM_BOOT:
hci_stack->substate = HCI_INIT_READ_BD_ADDR;
return;
case HCI_INIT_W4_READ_BD_ADDR:
// only read buffer size if supported
if (hci_stack->local_supported_commands[0] & 0x01) {
hci_stack->substate = HCI_INIT_READ_BUFFER_SIZE;
return;
}
// skipping read buffer size
hci_stack->substate = HCI_INIT_READ_LOCAL_SUPPORTED_FEATURES;
return;
case HCI_INIT_W4_SET_EVENT_MASK:
// skip Classic init commands for LE only chipsets

View File

@ -426,12 +426,6 @@ typedef enum hci_init_state{
HCI_INIT_SEND_READ_LOCAL_VERSION_INFORMATION,
HCI_INIT_W4_SEND_READ_LOCAL_VERSION_INFORMATION,
HCI_INIT_SET_BD_ADDR,
HCI_INIT_W4_SET_BD_ADDR,
HCI_INIT_SEND_RESET_ST_WARM_BOOT,
HCI_INIT_W4_SEND_RESET_ST_WARM_BOOT,
HCI_INIT_SEND_BAUD_CHANGE,
HCI_INIT_W4_SEND_BAUD_CHANGE,
HCI_INIT_CUSTOM_INIT,
@ -439,15 +433,22 @@ typedef enum hci_init_state{
HCI_INIT_SEND_RESET_CSR_WARM_BOOT,
HCI_INIT_W4_CUSTOM_INIT_CSR_WARM_BOOT,
HCI_INIT_READ_BD_ADDR,
HCI_INIT_W4_READ_BD_ADDR,
HCI_INIT_READ_LOCAL_SUPPORTED_COMMANDS,
HCI_INIT_W4_READ_LOCAL_SUPPORTED_COMMANDS,
HCI_INIT_SET_BD_ADDR,
HCI_INIT_W4_SET_BD_ADDR,
HCI_INIT_SEND_RESET_ST_WARM_BOOT,
HCI_INIT_W4_SEND_RESET_ST_WARM_BOOT,
HCI_INIT_READ_BD_ADDR,
HCI_INIT_W4_READ_BD_ADDR,
HCI_INIT_READ_BUFFER_SIZE,
HCI_INIT_W4_READ_BUFFER_SIZE,
HCI_INIT_READ_LOCAL_SUPPORTED_FEATUES,
HCI_INIT_W4_READ_LOCAL_SUPPORTED_FEATUES,
HCI_INIT_READ_LOCAL_SUPPORTED_FEATURES,
HCI_INIT_W4_READ_LOCAL_SUPPORTED_FEATURES,
HCI_INIT_SET_EVENT_MASK,
HCI_INIT_W4_SET_EVENT_MASK,
HCI_INIT_WRITE_SIMPLE_PAIRING_MODE,