use vendor specific baudrate cmdn if baudrate_main is specified

This commit is contained in:
matthias.ringwald 2011-06-05 09:58:33 +00:00
parent 83a9c1a5f4
commit c7492964e9

View File

@ -38,7 +38,6 @@
#include "hci.h" #include "hci.h"
#include <unistd.h>
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
@ -73,6 +72,7 @@ hci_connection_t * connection_for_handle(hci_con_handle_t con_handle){
} }
static void hci_connection_timeout_handler(timer_source_t *timer){ static void hci_connection_timeout_handler(timer_source_t *timer){
#ifdef HAVE_TIME
hci_connection_t * connection = linked_item_get_user(&timer->item); hci_connection_t * connection = linked_item_get_user(&timer->item);
struct timeval tv; struct timeval tv;
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
@ -85,10 +85,13 @@ static void hci_connection_timeout_handler(timer_source_t *timer){
timer->timeout.tv_sec = connection->timestamp.tv_sec + HCI_CONNECTION_TIMEOUT_MS/1000; timer->timeout.tv_sec = connection->timestamp.tv_sec + HCI_CONNECTION_TIMEOUT_MS/1000;
} }
run_loop_add_timer(timer); run_loop_add_timer(timer);
#endif
} }
static void hci_connection_timestamp(hci_connection_t *connection){ static void hci_connection_timestamp(hci_connection_t *connection){
#ifdef HAVE_TIME
gettimeofday(&connection->timestamp, NULL); gettimeofday(&connection->timestamp, NULL);
#endif
} }
/** /**
@ -102,9 +105,11 @@ static hci_connection_t * create_connection_for_addr(bd_addr_t addr){
BD_ADDR_COPY(conn->address, addr); BD_ADDR_COPY(conn->address, addr);
conn->con_handle = 0xffff; conn->con_handle = 0xffff;
conn->authentication_flags = 0; conn->authentication_flags = 0;
#ifdef HAVE_TIME
linked_item_set_user(&conn->timeout.item, conn); linked_item_set_user(&conn->timeout.item, conn);
conn->timeout.process = hci_connection_timeout_handler; conn->timeout.process = hci_connection_timeout_handler;
hci_connection_timestamp(conn); hci_connection_timestamp(conn);
#endif
conn->acl_recombination_length = 0; conn->acl_recombination_length = 0;
conn->acl_recombination_pos = 0; conn->acl_recombination_pos = 0;
conn->num_acl_packets_sent = 0; conn->num_acl_packets_sent = 0;
@ -313,7 +318,9 @@ static void hci_shutdown_connection(hci_connection_t *conn){
// cancel all l2cap connections // cancel all l2cap connections
hci_emit_disconnection_complete(conn->con_handle, 0x16); // terminated by local host hci_emit_disconnection_complete(conn->con_handle, 0x16); // terminated by local host
#ifdef HAVE_TIME
run_loop_remove_timer(&conn->timeout); run_loop_remove_timer(&conn->timeout);
#endif
linked_list_remove(&hci_stack.connections, (linked_item_t *) conn); linked_list_remove(&hci_stack.connections, (linked_item_t *) conn);
free( conn ); free( conn );
@ -401,10 +408,11 @@ static void event_handler(uint8_t *packet, int size){
conn->state = OPEN; conn->state = OPEN;
conn->con_handle = READ_BT_16(packet, 3); conn->con_handle = READ_BT_16(packet, 3);
#ifdef HAVE_TIME
gettimeofday(&conn->timestamp, NULL); gettimeofday(&conn->timestamp, NULL);
run_loop_set_timer(&conn->timeout, HCI_CONNECTION_TIMEOUT_MS); run_loop_set_timer(&conn->timeout, HCI_CONNECTION_TIMEOUT_MS);
run_loop_add_timer(&conn->timeout); run_loop_add_timer(&conn->timeout);
#endif
log_dbg("New connection: handle %u, ", conn->con_handle); log_dbg("New connection: handle %u, ", conn->con_handle);
print_bd_addr( conn->address ); print_bd_addr( conn->address );
log_dbg("\n"); log_dbg("\n");
@ -819,34 +827,48 @@ void hci_run(){
return; return;
} }
switch (hci_stack.substate >> 1){ switch (hci_stack.substate >> 1){
case 0: case 0: // RESET
hci_send_cmd(&hci_reset); hci_send_cmd(&hci_reset);
if (hci_stack.config == 0 || ((hci_uart_config_t *)hci_stack.config)->baudrate_main == 0){
// skip baud change
hci_stack.substate = 4; // >> 1 = 2
}
break; break;
case 1: case 1: // SEND BAUD CHANGE
hci_stack.control->baudrate_cmd(hci_stack.config, ((hci_uart_config_t *)hci_stack.config)->baudrate_main, hci_stack.hci_cmd_buffer);
hci_send_cmd_packet(hci_stack.hci_cmd_buffer, 3 + hci_stack.hci_cmd_buffer[2]);
break;
case 2: // LOCAL BAUD CHANGE
hci_stack.hci_transport->set_baudrate(((hci_uart_config_t *)hci_stack.config)->baudrate_main);
hci_stack.substate += 2;
// break missing here for fall through
case 3:
// custom initialization // custom initialization
if (hci_stack.control && hci_stack.control->next_command){ if (hci_stack.control && hci_stack.control->next_command){
uint8_t * cmd = (*hci_stack.control->next_command)(hci_stack.config); uint8_t * cmd = (*hci_stack.control->next_command)(hci_stack.config);
if (cmd) { if (cmd) {
int size = 3 + cmd[2]; int size = 3 + cmd[2];
hci_stack.hci_transport->send_packet(HCI_COMMAND_DATA_PACKET, cmd, size); hci_stack.hci_transport->send_packet(HCI_COMMAND_DATA_PACKET, cmd, size);
hci_stack.substate = 0; // more init commands hci_stack.substate = 4; // more init commands
break; break;
} }
printf("hci_run: init script done\n\r");
} }
// otherwise continue // otherwise continue
hci_send_cmd(&hci_read_bd_addr); hci_send_cmd(&hci_read_bd_addr);
break; break;
case 2: case 4:
hci_send_cmd(&hci_read_buffer_size); hci_send_cmd(&hci_read_buffer_size);
break; break;
case 3: case 5:
// ca. 15 sec // ca. 15 sec
hci_send_cmd(&hci_write_page_timeout, 0x6000); hci_send_cmd(&hci_write_page_timeout, 0x6000);
break; break;
case 4: case 6:
hci_send_cmd(&hci_write_scan_enable, 2 | hci_stack.discoverable); // page scan hci_send_cmd(&hci_write_scan_enable, 2 | hci_stack.discoverable); // page scan
break; break;
case 5: case 7:
#ifndef EMBEDDED #ifndef EMBEDDED
{ {
char hostname[30]; char hostname[30];
@ -855,12 +877,12 @@ void hci_run(){
hci_send_cmd(&hci_write_local_name, hostname); hci_send_cmd(&hci_write_local_name, hostname);
break; break;
} }
case 6: case 8:
#ifdef USE_BLUETOOL #ifdef USE_BLUETOOL
hci_send_cmd(&hci_write_class_of_device, 0x007a020c); // Smartphone hci_send_cmd(&hci_write_class_of_device, 0x007a020c); // Smartphone
break; break;
case 7: case 9:
#endif #endif
#endif #endif
// done. // done.
@ -879,7 +901,7 @@ void hci_run(){
// close all open connections // close all open connections
connection = (hci_connection_t *) hci_stack.connections; connection = (hci_connection_t *) hci_stack.connections;
if (connection){ if (connection){
log_dbg("HCI_STATE_HALTING, connection %u, handle %u\n", (int) connection, connection->con_handle); log_dbg("HCI_STATE_HALTING, connection %lu, handle %u\n", (uintptr_t) connection, connection->con_handle);
// send disconnect // send disconnect
hci_send_cmd(&hci_disconnect, connection->con_handle, 0x13); // remote closed connection hci_send_cmd(&hci_disconnect, connection->con_handle, 0x13); // remote closed connection
@ -904,7 +926,7 @@ void hci_run(){
// close all open connections // close all open connections
connection = (hci_connection_t *) hci_stack.connections; connection = (hci_connection_t *) hci_stack.connections;
if (connection){ if (connection){
log_dbg("HCI_STATE_FALLING_ASLEEP, connection %u, handle %u\n", (int) connection, connection->con_handle); log_dbg("HCI_STATE_FALLING_ASLEEP, connection %lu, handle %u\n", (uintptr_t) connection, connection->con_handle);
// send disconnect // send disconnect
hci_send_cmd(&hci_disconnect, connection->con_handle, 0x13); // remote closed connection hci_send_cmd(&hci_disconnect, connection->con_handle, 0x13); // remote closed connection