@@ -2176,4 +2176,149 @@ ble_ll_set_default_sync_transfer_params(const uint8_t *cmdbuf, uint8_t len)
21762176 return BLE_ERR_SUCCESS ;
21772177}
21782178#endif
2179+
2180+ #if MYNEWT_VAL (BLE_LL_CFG_FEAT_LL_POWER_CONTROL )
2181+ int
2182+ ble_ll_conn_hci_enhanced_read_tx_power_level (const uint8_t * cmdbuf , uint8_t len ,
2183+ uint8_t * rspbuf , uint8_t * rsplen )
2184+ {
2185+ const struct ble_hci_le_enh_read_transmit_power_level_cp * cmd = (const void * ) cmdbuf ;
2186+ struct ble_hci_le_enh_read_transmit_power_level_rp * rsp = (void * ) rspbuf ;
2187+ struct ble_ll_conn_sm * connsm ;
2188+ uint8_t phy_mode ;
2189+ int rc ;
2190+
2191+ if (len != sizeof (* cmd )) {
2192+ rc = BLE_ERR_INV_HCI_CMD_PARMS ;
2193+ goto done ;
2194+ }
2195+
2196+ switch (cmd -> phy ) {
2197+ case 0x1 :
2198+ phy_mode = BLE_PHY_MODE_1M ;
2199+ break ;
2200+ #if MYNEWT_VAL (BLE_PHY_2M )
2201+ case 0x2 :
2202+ phy_mode = BLE_PHY_MODE_2M ;
2203+ break ;
2204+ #endif
2205+ #if MYNEWT_VAL (BLE_PHY_CODED )
2206+ case 0x3 :
2207+ phy_mode = BLE_PHY_MODE_CODED_500KBPS ;
2208+ break ;
2209+ case 0x4 :
2210+ phy_mode = BLE_PHY_MODE_CODED_125KBPS ;
2211+ break ;
2212+ #endif
2213+ default :
2214+ rc = BLE_ERR_UNSUPPORTED ;
2215+ goto done ;
2216+ }
2217+
2218+ connsm = ble_ll_conn_find_by_handle (le16toh (cmd -> conn_handle ));
2219+ if (!connsm ) {
2220+ rc = BLE_ERR_UNK_CONN_ID ;
2221+ goto done ;
2222+ }
2223+
2224+ rsp -> phy = cmd -> phy ;
2225+ rsp -> curr_tx_power_level = connsm -> pwr_ctrl .local_tx_power [phy_mode ];
2226+ rsp -> max_tx_power_level = ble_phy_tx_power_round (INT8_MAX );
2227+
2228+ rc = BLE_ERR_SUCCESS ;
2229+ done :
2230+ * rsplen = sizeof (* rsp );
2231+ rsp -> conn_handle = cmd -> conn_handle ;
2232+ return rc ;
2233+ }
2234+
2235+ int
2236+ ble_ll_conn_hci_read_remote_tx_power_level (const uint8_t * cmdbuf , uint8_t len )
2237+ {
2238+ const struct ble_hci_le_read_remote_transmit_power_level_cp * cmd = (const void * ) cmdbuf ;
2239+ struct ble_ll_conn_sm * connsm ;
2240+
2241+ if (len != sizeof (* cmd )) {
2242+ return BLE_ERR_INV_HCI_CMD_PARMS ;
2243+ }
2244+
2245+ connsm = ble_ll_conn_find_by_handle (le16toh (cmd -> conn_handle ));
2246+ if (!connsm ) {
2247+ return BLE_ERR_UNK_CONN_ID ;
2248+ }
2249+
2250+ switch (cmd -> phy ) {
2251+ case 0x1 :
2252+ connsm -> pwr_ctrl .req_phy_mode = BLE_PHY_MODE_1M ;
2253+ break ;
2254+ #if MYNEWT_VAL (BLE_PHY_2M )
2255+ case 0x2 :
2256+ connsm -> pwr_ctrl .req_phy_mode = BLE_PHY_MODE_2M ;
2257+ break ;
2258+ #endif
2259+ #if MYNEWT_VAL (BLE_PHY_CODED )
2260+ case 0x3 :
2261+ connsm -> pwr_ctrl .req_phy_mode = BLE_PHY_MODE_CODED_500KBPS ;
2262+ break ;
2263+ case 0x4 :
2264+ connsm -> pwr_ctrl .req_phy_mode = BLE_PHY_MODE_CODED_125KBPS ;
2265+ break ;
2266+ #endif
2267+ default :
2268+ return BLE_ERR_UNSUPPORTED ;
2269+ }
2270+
2271+ connsm -> flags .power_request_host_w4event = 1 ;
2272+
2273+ ble_ll_ctrl_proc_start (connsm , BLE_LL_CTRL_PROC_POWER_CTRL_REQ , NULL );
2274+
2275+ return BLE_ERR_SUCCESS ;
2276+ }
2277+
2278+ int
2279+ ble_ll_conn_hci_set_tx_power_report_enable (const uint8_t * cmdbuf , uint8_t len ,
2280+ uint8_t * rspbuf , uint8_t * rsplen )
2281+ {
2282+ const struct ble_hci_le_set_transmit_power_report_enable_cp * cmd = (const void * ) cmdbuf ;
2283+ struct ble_hci_le_set_transmit_power_report_enable_rp * rsp = (void * ) rspbuf ;
2284+ struct ble_ll_conn_sm * connsm ;
2285+ uint8_t send_req ;
2286+ int i ;
2287+ int rc ;
2288+
2289+ if (len != sizeof (* cmd )) {
2290+ rc = BLE_ERR_INV_HCI_CMD_PARMS ;
2291+ goto done ;
2292+ }
2293+
2294+ connsm = ble_ll_conn_find_by_handle (le16toh (cmd -> conn_handle ));
2295+ if (!connsm ) {
2296+ rc = BLE_ERR_UNK_CONN_ID ;
2297+ goto done ;
2298+ }
2299+
2300+ connsm -> pwr_ctrl .local_reports_enabled = cmd -> local_enable ;
2301+ connsm -> pwr_ctrl .remote_reports_enabled = cmd -> remote_enable ;
2302+
2303+ send_req = 1 ;
2304+ for (i = 0 ; i < BLE_PHY_NUM_MODE ; i ++ ) {
2305+ if (connsm -> pwr_ctrl .remote_tx_power [i ] != 127 ) {
2306+ send_req = 0 ;
2307+ break ;
2308+ }
2309+ }
2310+
2311+ if (send_req ) {
2312+ connsm -> pwr_ctrl .req_phy_mode = connsm -> phy_data .rx_phy_mode ;
2313+ ble_ll_ctrl_proc_start (connsm , BLE_LL_CTRL_PROC_POWER_CTRL_REQ , NULL );
2314+ }
2315+
2316+ rc = BLE_ERR_SUCCESS ;
2317+
2318+ done :
2319+ * rsplen = sizeof (* rsp );
2320+ rsp -> conn_handle = cmd -> conn_handle ;
2321+ return rc ;
2322+ }
2323+ #endif
21792324#endif
0 commit comments