|
285 | 285 | ble_ll_cs_hci_set_def_settings(const uint8_t *cmdbuf, uint8_t cmdlen,
|
286 | 286 | uint8_t *rspbuf, uint8_t *rsplen)
|
287 | 287 | {
|
288 |
| - return BLE_ERR_UNSUPPORTED; |
| 288 | + const struct ble_hci_le_cs_set_def_settings_cp *cmd = (const void *)cmdbuf; |
| 289 | + struct ble_hci_le_cs_set_def_settings_rp *rsp = (void *)rspbuf; |
| 290 | + const struct ble_ll_cs_supp_cap *cap = &g_ble_ll_cs_local_cap; |
| 291 | + struct ble_ll_conn_sm *connsm; |
| 292 | + struct ble_ll_cs_sm *cssm; |
| 293 | + |
| 294 | + connsm = ble_ll_conn_find_by_handle(le16toh(cmd->conn_handle)); |
| 295 | + if (!connsm) { |
| 296 | + return BLE_ERR_UNK_CONN_ID; |
| 297 | + } |
| 298 | + |
| 299 | + cssm = connsm->cssm; |
| 300 | + |
| 301 | + /* Check if a disabled role is used in CS configs */ |
| 302 | + for (int i = 0; i < ARRAY_SIZE(cssm->config); i++) { |
| 303 | + struct ble_ll_cs_config *conf = &cssm->config[i]; |
| 304 | + |
| 305 | + if (conf->config_enabled && (1 << conf->role) & ~cmd->role_enable) { |
| 306 | + return BLE_ERR_INV_HCI_CMD_PARMS; |
| 307 | + } |
| 308 | + } |
| 309 | + |
| 310 | + if ((cmd->role_enable & ~cap->roles_supported) != 0 || |
| 311 | + (cap->number_of_antennas < cmd->cs_sync_antenna_selection && |
| 312 | + cmd->cs_sync_antenna_selection < 0xFE)) { |
| 313 | + /* Unsupported role or antenna selection used */ |
| 314 | + return BLE_ERR_UNSUPPORTED; |
| 315 | + } |
| 316 | + |
| 317 | + cssm->roles_enabled = cmd->role_enable; |
| 318 | + cssm->cs_sync_antenna_selection = cmd->cs_sync_antenna_selection; |
| 319 | + |
| 320 | + /* Allowed Transmit_Power_Level range: -127 to +20, |
| 321 | + * (Complement system + special meaning for 0x7E and 0x7F) |
| 322 | + */ |
| 323 | + if (!(IN_RANGE(cmd->max_tx_power, 0x00, 0x14) || |
| 324 | + IN_RANGE(cmd->max_tx_power, 0x7E, 0xFF))) { |
| 325 | + return BLE_ERR_INV_HCI_CMD_PARMS; |
| 326 | + } |
| 327 | + |
| 328 | + if (cmd->max_tx_power == 0x7E) { |
| 329 | + /* TODO: Set transmitter to minimum transmit power level |
| 330 | + * supported by the board. |
| 331 | + */ |
| 332 | + cssm->max_tx_power = 0x80; |
| 333 | + } else if (cmd->max_tx_power == 0x7F) { |
| 334 | + /* TODO: Set transmitter to maximum transmit power level |
| 335 | + * supported by the board. |
| 336 | + */ |
| 337 | + cssm->max_tx_power = 0x14; |
| 338 | + } else { |
| 339 | + /* TODO: Set transmitter to the nearest transmit power level |
| 340 | + * supported by the board. |
| 341 | + */ |
| 342 | + cssm->max_tx_power = cmd->max_tx_power; |
| 343 | + } |
| 344 | + |
| 345 | + rsp->conn_handle = cmd->conn_handle; |
| 346 | + *rsplen = sizeof(*rsp); |
| 347 | + |
| 348 | + return BLE_ERR_SUCCESS; |
289 | 349 | }
|
290 | 350 |
|
291 | 351 | int
|
|
0 commit comments