mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-23 11:43:24 +00:00
cc256x: allow to select custom init script for next power up
This commit is contained in:
parent
caf56077b9
commit
e2ee49ead8
@ -63,6 +63,7 @@
|
|||||||
|
|
||||||
#include "btstack_config.h"
|
#include "btstack_config.h"
|
||||||
#include "btstack_chipset_cc256x.h"
|
#include "btstack_chipset_cc256x.h"
|
||||||
|
#include "btstack_debug.h"
|
||||||
|
|
||||||
#include <stddef.h> /* NULL */
|
#include <stddef.h> /* NULL */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -79,13 +80,24 @@
|
|||||||
#include "btstack_control.h"
|
#include "btstack_control.h"
|
||||||
|
|
||||||
|
|
||||||
// actual init script provided by seperate .c file
|
// default init script provided by separate .c file
|
||||||
extern const uint8_t cc256x_init_script[];
|
extern const uint8_t cc256x_init_script[];
|
||||||
extern const uint32_t cc256x_init_script_size;
|
extern const uint32_t cc256x_init_script_size;
|
||||||
|
|
||||||
// init script
|
// custom init script set by btstack_chipset_cc256x_set_init_script
|
||||||
static uint32_t init_script_offset = 0;
|
// used to select init scripts before each power up
|
||||||
static int16_t init_power_in_dB = 13; // 13 dBm
|
static const uint8_t * custom_init_script;
|
||||||
|
static uint32_t custom_init_script_size;
|
||||||
|
|
||||||
|
// init script to use: either cc256x_init_script or custom_init_script
|
||||||
|
static const uint8_t * init_script;
|
||||||
|
static uint32_t init_script_size;
|
||||||
|
|
||||||
|
// power in db - set by btstack_chipset_cc256x_set_power
|
||||||
|
static int16_t init_power_in_dB = 13; // 13 dBm
|
||||||
|
|
||||||
|
// upload position
|
||||||
|
static uint32_t init_script_offset = 0;
|
||||||
|
|
||||||
// support for SCO over HCI
|
// support for SCO over HCI
|
||||||
#ifdef ENABLE_SCO_OVER_HCI
|
#ifdef ENABLE_SCO_OVER_HCI
|
||||||
@ -149,6 +161,15 @@ static const uint8_t hci_route_sco_over_hci[] = {
|
|||||||
|
|
||||||
static void chipset_init(const void * config){
|
static void chipset_init(const void * config){
|
||||||
init_script_offset = 0;
|
init_script_offset = 0;
|
||||||
|
if (custom_init_script){
|
||||||
|
log_info("cc256x: using custom init script");
|
||||||
|
init_script = custom_init_script;
|
||||||
|
init_script_size = custom_init_script_size;
|
||||||
|
} else {
|
||||||
|
log_info("cc256x: using default init script");
|
||||||
|
init_script = cc256x_init_script;
|
||||||
|
init_script_size = cc256x_init_script_size;
|
||||||
|
}
|
||||||
#ifdef ENABLE_SCO_OVER_HCI
|
#ifdef ENABLE_SCO_OVER_HCI
|
||||||
init_send_route_sco_over_hci = 1;
|
init_send_route_sco_over_hci = 1;
|
||||||
#endif
|
#endif
|
||||||
@ -274,7 +295,7 @@ static void update_init_script_command(uint8_t *hci_cmd_buffer){
|
|||||||
}
|
}
|
||||||
|
|
||||||
static btstack_chipset_result_t chipset_next_command(uint8_t * hci_cmd_buffer){
|
static btstack_chipset_result_t chipset_next_command(uint8_t * hci_cmd_buffer){
|
||||||
if (init_script_offset >= cc256x_init_script_size) {
|
if (init_script_offset >= init_script_size) {
|
||||||
|
|
||||||
#ifdef ENABLE_SCO_OVER_HCI
|
#ifdef ENABLE_SCO_OVER_HCI
|
||||||
// append send route SCO over HCI if requested
|
// append send route SCO over HCI if requested
|
||||||
@ -303,15 +324,15 @@ static btstack_chipset_result_t chipset_next_command(uint8_t * hci_cmd_buffer){
|
|||||||
#elif defined (__AVR__)
|
#elif defined (__AVR__)
|
||||||
|
|
||||||
// workaround: use memcpy_P to access init script in lower 64 kB of flash
|
// workaround: use memcpy_P to access init script in lower 64 kB of flash
|
||||||
memcpy_P(&hci_cmd_buffer[0], &cc256x_init_script[init_script_offset], 3);
|
memcpy_P(&hci_cmd_buffer[0], &init_script[init_script_offset], 3);
|
||||||
init_script_offset += 3;
|
init_script_offset += 3;
|
||||||
int payload_len = hci_cmd_buffer[2];
|
int payload_len = hci_cmd_buffer[2];
|
||||||
memcpy_P(&hci_cmd_buffer[3], &cc256x_init_script[init_script_offset], payload_len);
|
memcpy_P(&hci_cmd_buffer[3], &init_script[init_script_offset], payload_len);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// use memcpy with pointer
|
// use memcpy with pointer
|
||||||
uint8_t * init_script_ptr = (uint8_t*) &cc256x_init_script[0];
|
uint8_t * init_script_ptr = (uint8_t*) &init_script[0];
|
||||||
memcpy(&hci_cmd_buffer[0], init_script_ptr + init_script_offset, 3); // cmd header
|
memcpy(&hci_cmd_buffer[0], init_script_ptr + init_script_offset, 3); // cmd header
|
||||||
init_script_offset += 3;
|
init_script_offset += 3;
|
||||||
int payload_len = hci_cmd_buffer[2];
|
int payload_len = hci_cmd_buffer[2];
|
||||||
@ -333,6 +354,11 @@ void btstack_chipset_cc256x_set_power(int16_t power_in_dB){
|
|||||||
init_power_in_dB = power_in_dB;
|
init_power_in_dB = power_in_dB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void btstack_chipset_cc256x_set_init_script(uint8_t * data, uint32_t size){
|
||||||
|
custom_init_script = data;
|
||||||
|
custom_init_script_size = size;
|
||||||
|
}
|
||||||
|
|
||||||
static const btstack_chipset_t btstack_chipset_cc256x = {
|
static const btstack_chipset_t btstack_chipset_cc256x = {
|
||||||
"CC256x",
|
"CC256x",
|
||||||
chipset_init,
|
chipset_init,
|
||||||
|
@ -65,6 +65,17 @@ const btstack_chipset_t * btstack_chipset_cc256x_instance(void);
|
|||||||
*/
|
*/
|
||||||
uint16_t btstack_chipset_cc256x_lmp_subversion(void);
|
uint16_t btstack_chipset_cc256x_lmp_subversion(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set init script to use for next power up
|
||||||
|
*
|
||||||
|
* Note: Only needed when switching between different add-ons (BLE, AVRP, ANT+)
|
||||||
|
* Note: Not supported by MSP430 "init script at 0x10000" workaround
|
||||||
|
*
|
||||||
|
* @param init_script_data or 0 for default script
|
||||||
|
* @param init_script_size or 0 for default script
|
||||||
|
*/
|
||||||
|
void btstack_chipset_cc256x_set_init_script(uint8_t * data, uint32_t size);
|
||||||
|
|
||||||
#if defined __cplusplus
|
#if defined __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user