Hi,
I am trying to setup L2CAP channel in ble_app_uart. I referred the object transfer example and did the initialization of L2CAP parameters during ble_stack_init() both in central and peripheral.
ble_cfg_t ble_cfg; // Set L2CAP channel configuration. ble_cfg.conn_cfg.conn_cfg_tag = APP_BLE_CONN_CFG_TAG; ble_cfg.conn_cfg.params.l2cap_conn_cfg.rx_mps = 60; ble_cfg.conn_cfg.params.l2cap_conn_cfg.rx_queue_size = 1; ble_cfg.conn_cfg.params.l2cap_conn_cfg.tx_mps = 40; ble_cfg.conn_cfg.params.l2cap_conn_cfg.tx_queue_size = 1; ble_cfg.conn_cfg.params.l2cap_conn_cfg.ch_count = 1; err_code = sd_ble_cfg_set(BLE_CONN_CFG_L2CAP, &ble_cfg, ram_start); APP_ERROR_CHECK(err_code);
After completing the NUS discovery the l2cap channel setup API is invoked in the central device
printf("L2CAP channel setup.\r\n"); ble_l2cap_ch_setup_params_t params; params.rx_params.rx_mps = 60; params.rx_params.rx_mtu = 30; params.rx_params.sdu_buf.p_data = NULL; params.le_psm = 0x0025; // Used when requesting setup of an L2CAP channel, ignored otherwise. params.status = 0; // Used when requesting setup of an L2CAP channel, ignored otherwise. uint16_t cid = BLE_L2CAP_CID_INVALID; err_code = sd_ble_l2cap_ch_setup(ble_conn_handle, &cid, ¶ms); APP_ERROR_CHECK(err_code); printf("L2CAP channel setup completed channel: %d\r\n", cid);
At the peripheral device BLE_L2CAP_EVT_CH_SETUP_REQUEST event is getting and BLE_L2CAP_EVT_CH_SETUP event also received after channel setup.
if (p_ble_evt->evt.l2cap_evt.params.ch_setup_request.le_psm != 0x0025) { ch_setup_params.status = BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED; printf("l2cap setup request for PSM 0x%x, rejecting since OTS PSM is 0x%x", p_ble_evt->evt.l2cap_evt.params.ch_setup_request.le_psm, BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED); } else { ch_setup_params.status = BLE_L2CAP_CH_STATUS_CODE_SUCCESS; ch_setup_params.rx_params.rx_mps = 0; if (ch_setup_params.rx_params.rx_mps < BLE_L2CAP_MPS_MIN) { ch_setup_params.rx_params.rx_mps = BLE_L2CAP_MPS_MIN; } ch_setup_params.rx_params.rx_mtu = 0; if (ch_setup_params.rx_params.rx_mtu < BLE_L2CAP_MTU_MIN) { ch_setup_params.rx_params.rx_mtu = BLE_L2CAP_MTU_MIN; } ch_setup_params.rx_params.sdu_buf.p_data = NULL; } uint16_t local_cid; local_cid = p_ble_evt->evt.l2cap_evt.local_cid; err_code = sd_ble_l2cap_ch_setup(p_ble_evt->evt.l2cap_evt.conn_handle, &local_cid, &ch_setup_params); if (err_code != NRF_SUCCESS) { printf("Rejected L2CAP Channel cid:%d \r\n", local_cid); } printf("Accepted L2CAP Channel cid:%d \r\n", local_cid);
But the BLE_L2CAP_EVT_CH_SETUP event is not received at central device. (Further data transmission from peripheral to central are also not working).
Did i miss some configurations? Any support will be greatly appreciated.
Thanks