mirror of https://github.com/ARMmbed/mbed-os.git
add tx power to cordio hci driver
parent
698fc09b4c
commit
056f46d629
|
@ -364,6 +364,10 @@ ble_error_t CordioHCIDriver::rf_test_end()
|
|||
return BLE_ERROR_NO_MEM;
|
||||
}
|
||||
|
||||
ble_error_t CordioHCIDriver::set_tx_power(int8_t level_db) {
|
||||
return BLE_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
} // namespace cordio
|
||||
} // namespace vendor
|
||||
} // namespace ble
|
||||
|
|
|
@ -187,6 +187,16 @@ public:
|
|||
*/
|
||||
ble_error_t rf_test_end();
|
||||
|
||||
/**
|
||||
* Set desired transmit power. Value equal or bigger will be used from available levels.
|
||||
* Consult chip documentation for available values. Actual TX power is not guaranteed
|
||||
* and is down to the implementation.
|
||||
*
|
||||
* @param level_db Signal level in dBm.
|
||||
* @return BLE_ERROR_NONE on success.
|
||||
*/
|
||||
virtual ble_error_t set_tx_power(int8_t level_db);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Return a default set of memory pool that the Cordio stack can use.
|
||||
|
|
|
@ -67,6 +67,10 @@
|
|||
"route_unhandled_command_complete_events": {
|
||||
"help": "If enabled the stack will forward to the user all HCI events not handled by the stack.",
|
||||
"value": 1
|
||||
},
|
||||
"preferred-tx-power": {
|
||||
"help": "Preferred value of tx power in dbm (-128,127). This value is not guaranteed and relies on existing support in the HCI driver.",
|
||||
"value": 0
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "ble/blecommon.h"
|
||||
#include "CordioBLE.h"
|
||||
#include "CordioHCIDriver.h"
|
||||
#include "CordioHCITransportDriver.h"
|
||||
|
@ -131,6 +132,39 @@ public:
|
|||
HciResetCmd();
|
||||
}
|
||||
|
||||
static uint8_t convert_db_to_tx_power_index(int8_t level_db) {
|
||||
const int8_t conversion[] = {
|
||||
-40, -21, -20, -19,
|
||||
-18, -16, -15, -14,
|
||||
-13, -12, -11, -10,
|
||||
-9, -8, -7, -6,
|
||||
-5, -4, -3, -2,
|
||||
-1, -1, -1, -1,
|
||||
0, 0, 1, 2,
|
||||
3, 4, 5, 6
|
||||
};
|
||||
|
||||
uint8_t index;
|
||||
for (index = 0; index < sizeof(conversion); ++index) {
|
||||
if (level_db <= conversion[index]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
virtual ble_error_t set_tx_power(int8_t level_db) {
|
||||
|
||||
|
||||
uint8_t buf[2];
|
||||
buf[0] = 0x1; // Enable high power mode - deprecated and ignored on STM32WB
|
||||
buf[1] = convert_db_to_tx_power_index(level_db);
|
||||
|
||||
HciVendorSpecificCmd(ACI_HAL_SET_TX_POWER_LEVEL, 2, buf);
|
||||
|
||||
return BLE_ERROR_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see CordioHCIDriver::handle_reset_sequence
|
||||
*/
|
||||
|
@ -177,7 +211,7 @@ public:
|
|||
} else {
|
||||
tr_info("could not find BDaddr");
|
||||
/* Skip to next step */
|
||||
aciSetTxPowerLevel();
|
||||
set_tx_power(MBED_CONF_CORDIO_PREFERRED_TX_POWER);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -185,7 +219,7 @@ public:
|
|||
tr_debug("Bluetooth Device address set");
|
||||
/* set the event mask to control which events are generated by the
|
||||
* controller for the host */
|
||||
aciSetTxPowerLevel();
|
||||
set_tx_power(MBED_CONF_CORDIO_PREFERRED_TX_POWER);
|
||||
break;
|
||||
|
||||
|
||||
|
@ -359,16 +393,6 @@ public:
|
|||
|
||||
private:
|
||||
uint8_t bd_addr[6];
|
||||
void aciSetTxPowerLevel()
|
||||
{
|
||||
uint8_t *pBuf = hciCmdAlloc(ACI_HAL_SET_TX_POWER_LEVEL, 2);
|
||||
if (!pBuf) {
|
||||
return;
|
||||
}
|
||||
pBuf[HCI_CMD_HDR_LEN] = 0x1;
|
||||
pBuf[HCI_CMD_HDR_LEN + 1] = 0x18;
|
||||
hciCmdSend(pBuf);
|
||||
}
|
||||
|
||||
void aciReadConfigParameter(uint8_t offset)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue