{"id":9062,"date":"2019-01-04T19:30:33","date_gmt":"2019-01-04T19:30:33","guid":{"rendered":"http:\/\/blog.bachi.net\/?p=9062"},"modified":"2022-04-17T07:30:14","modified_gmt":"2022-04-17T07:30:14","slug":"nrf5-sdk-softdevice","status":"publish","type":"post","link":"https:\/\/blog.bachi.net\/?p=9062","title":{"rendered":"nRF5 SDK: SoftDevice"},"content":{"rendered":"<p><a href=\"https:\/\/infocenter.nordicsemi.com\/topic\/ug_gsg_ses\/UG\/gsg\/softdevices.html\">SoftDevices<\/a><\/p>\n<table border=\"1\" cellpadding=\"4\" cellspacing=\"0\">\n<thead>\n<tr>\n<th colspan=\"1\" rowspan=\"1\">Protocol<\/th>\n<th colspan=\"1\" rowspan=\"1\">Role<\/th>\n<th colspan=\"1\" rowspan=\"1\">Chip<\/th>\n<th colspan=\"1\" rowspan=\"1\">SoftDevice<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td colspan=\"1\" rowspan=\"7\"><span>Bluetooth Low Energy<\/span><\/td>\n<td colspan=\"1\" rowspan=\"3\">Peripheral<\/td>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF51422<\/li>\n<li>nRF51822<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S110<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52810<\/li>\n<li>nRF52832<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S112<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52833<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S113<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">Central or Peripheral<\/td>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF51422<\/li>\n<li>nRF51822<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S120<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"3\">Central and Peripheral<\/td>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF51422<\/li>\n<li>nRF51822<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S130<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52832<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S132<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52833<\/li>\n<li>nRF52840<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S140<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"2\">ANT<\/td>\n<td colspan=\"1\" rowspan=\"2\">&nbsp;<\/td>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF51422<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S210<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52832<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S212<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"4\"><span>Bluetooth Low Energy<\/span> and ANT<\/td>\n<td colspan=\"1\" rowspan=\"1\">Peripheral<\/td>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF51422<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S310<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">Peripheral and Broadcaster<\/td>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52810<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S312<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"2\">All roles<\/td>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52832<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S332<\/td>\n<\/tr>\n<tr>\n<td colspan=\"1\" rowspan=\"1\">\n<ul>\n<li>nRF52840<\/li>\n<\/ul>\n<\/td>\n<td colspan=\"1\" rowspan=\"1\">S340<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>ARM Assembly<\/h3>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nSVCALL(SD_BLE_ENABLE,\r\n       uint32_t,\r\n       sd_ble_enable(uint32_t * p_app_ram_base)\r\n);\r\n\r\n#define SVCALL(number, return_type, signature)          \\\r\n  static return_type signature                          \\\r\n  {                                                     \\\r\n    __asm(                                              \\\r\n        &quot;svc %0\\n&quot;                                      \\\r\n        &quot;bx r14&quot; : : &quot;I&quot; (GCC_CAST_CPP number) : &quot;r0&quot;   \\\r\n    ); \r\n<\/pre>\n<p><a href=\"http:\/\/www.ethernut.de\/de\/documents\/arm-inline-asm.html\">ARM GCC Inline Assembler Kochbuch<\/a><br \/>\n<a href=\"http:\/\/www.ethernut.de\/en\/documents\/arm-inline-asm.html\">ARM GCC Inline Assembler Cookbook<\/a><br \/>\n<a href=\"https:\/\/gcc.gnu.org\/onlinedocs\/gcc\/Extended-Asm.html\">GCC Extended Asm &#8211; Assembler Instructions with C Expression Operands<\/a><br \/>\n<a href=\"http:\/\/www.ic.unicamp.br\/~celio\/mc404-s2-2015\/docs\/ARM-GCC-Inline-Assembler-Cookbook.pdf\">ARM GCC Inline Assembler Cookbook<\/a> (PDF)<br \/>\n<a href=\"http:\/\/infocenter.arm.com\/help\/index.jsp?topic=\/com.arm.doc.100748_0606_00_en\/ddx1471430827125.html\">Writing inline assembly code<\/a><\/p>\n<h3>Stack Trace<\/h3>\n<h4><code>sd_softdevice_enable()<\/code><\/h4>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ncomponents\\libraries\\util\\app_error_weak.c\r\nvoid app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info)\r\n\r\nnrf_sdm.h   uint32_t     sd_softdevice_enable(&amp;clock_lf_cfg, app_error_fault_handler)\r\nnrf_sdh.c   ret_code_t   nrf_sdh_enable_request(void)\r\nmain.c      void         ble_stack_init(void)\r\nmain.c      int          main(void)\r\n<\/pre>\n<h4><code>ble_evt_handler()<\/code><\/h4>\n<p><a href=\"https:\/\/gcc.gnu.org\/onlinedocs\/gcc-3.2\/gcc\/Variable-Attributes.html\">Specifying Attributes of Variables &#8211; section<\/a><br \/>\n<a href=\"https:\/\/www.embeddedrelated.com\/showarticle\/900.php\">Analyzing the Linker Map file with a little help from the ELF and the DWARF<\/a><br \/>\n<a href=\"https:\/\/github.com\/govind-mukundan\/MapViewer\">github.com\/govind-mukundan\/MapViewer<\/a>, A windows application to view and analyze information from the linker generated Map file<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nstatic nrf_sdh_ble_evt_observer_t m_ble_observer\r\n__attribute__ ((section(&quot;.sdh_ble_observers3&quot;)))\r\n__attribute__((used)) = {\r\n    .handler   = ble_evt_handler,\r\n    .p_context = NULL\r\n}\r\n\r\ncomponents\\libraries\\experimental_section_vars\\nrf_section.h\r\n============================================================\r\n\r\nsection_name = sdh_ble_observers3\r\nsection_var  = static nrf_sdh_ble_evt_observer_t m_ble_observer\r\n\r\n#define NRF_SECTION_ITEM_REGISTER(section_name, section_var) \\\r\n    section_var __attribute__ ((section(&quot;.&quot; STRINGIFY(section_name)))) __attribute__((used))\r\n\r\n\r\ncomponents\\libraries\\experimental_section_vars\\nrf_section_iter.h\r\n=================================================================\r\n\r\n#define NRF_SECTION_SET_ITEM_REGISTER(_name, _priority, _var)\r\n    NRF_SECTION_ITEM_REGISTER(CONCAT_2(_name, _priority), _var)\r\n\r\ncomponents\\softdevice\\common\\nrf_sdh_ble.h\r\n==========================================\r\n\r\n                             _name    = m_ble_observer\r\n                             _prio    = 3\r\n                             _handler = ble_evt_handler,\r\n                             _context = NULL\r\n#define NRF_SDH_BLE_OBSERVER(_name, _prio, _handler, _context)\r\nNRF_SECTION_SET_ITEM_REGISTER(\r\n    sdh_ble_observers,\r\n    _prio,\r\n    static nrf_sdh_ble_evt_observer_t _name\r\n) =\r\n{\r\n    .handler   = _handler,\r\n    .p_context = _context\r\n}\r\n\r\nmain.c\r\n======\r\n\r\n#define APP_BLE_OBSERVER_PRIO           3\r\n\r\n\/\/ Register a handler for BLE events.\r\nNRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);\r\n<\/pre>\n<h4><code>on_adv_evt()<\/code><\/h4>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\/\\*\\*&lt;&#x5B;a-zA-Z .\\\\@_]*\\*\/\r\n&#x5B;,]?&#x5B; ]*\/\\*\\*&lt;&#x5B;a-zA-Z ();,.\\\\@_]*\\*\/\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nble_advertising_t    p_advertising-&gt;adv_handle\r\nble_advertising_t    p_advertising-&gt;evt_handler\r\nble_advertising_t    p_advertising-&gt;error_handler\r\n\r\nuint32_t sd_ble_gap_adv_set_configure(...)\r\nuint32_t ble_advertising_init(...)\r\nvoid     advertising_init() -&gt; init.evt_handler = on_adv_evt\r\nint      main(void)\r\n\r\nstatic void on_adv_evt(ble_adv_evt_t ble_adv_evt)\r\nstatic void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)\r\n\r\ntypedef enum {\r\n  BLE_ADV_EVT_IDLE\r\n  BLE_ADV_EVT_DIRECTED_HIGH_DUTY\r\n  BLE_ADV_EVT_DIRECTED\r\n  BLE_ADV_EVT_FAST\r\n  BLE_ADV_EVT_SLOW\r\n  BLE_ADV_EVT_FAST_WHITELIST\r\n  BLE_ADV_EVT_SLOW_WHITELIST\r\n  BLE_ADV_EVT_WHITELIST_REQUEST\r\n  BLE_ADV_EVT_PEER_ADDR_REQUEST\r\n} ble_adv_evt_t;\r\n\r\nenum BLE_GAP_EVTS {\r\n  BLE_GAP_EVT_CONNECTED\r\n  BLE_GAP_EVT_DISCONNECTED\r\n  BLE_GAP_EVT_CONN_PARAM_UPDATE\r\n  BLE_GAP_EVT_SEC_PARAMS_REQUEST\r\n  BLE_GAP_EVT_SEC_INFO_REQUEST\r\n  BLE_GAP_EVT_PASSKEY_DISPLAY\r\n  BLE_GAP_EVT_KEY_PRESSED\r\n  BLE_GAP_EVT_AUTH_KEY_REQUEST\r\n  BLE_GAP_EVT_LESC_DHKEY_REQUEST\r\n  BLE_GAP_EVT_AUTH_STATUS\r\n  BLE_GAP_EVT_CONN_SEC_UPDATE\r\n  BLE_GAP_EVT_TIMEOUT\r\n  BLE_GAP_EVT_RSSI_CHANGED\r\n  BLE_GAP_EVT_ADV_REPORT\r\n  BLE_GAP_EVT_SEC_REQUEST\r\n  BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST\r\n  BLE_GAP_EVT_SCAN_REQ_REPORT\r\n  BLE_GAP_EVT_PHY_UPDATE_REQUEST\r\n  BLE_GAP_EVT_PHY_UPDATE\r\n  BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST\r\n  BLE_GAP_EVT_DATA_LENGTH_UPDATE\r\n  BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT\r\n  BLE_GAP_EVT_ADV_SET_TERMINATED\r\n};\r\n\r\nenum BLE_GATTC_EVTS {\r\n  BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE\r\n  BLE_GATTC_EVT_REL_DISC_RSP\r\n  BLE_GATTC_EVT_CHAR_DISC_RSP\r\n  BLE_GATTC_EVT_DESC_DISC_RSP\r\n  BLE_GATTC_EVT_ATTR_INFO_DISC_RSP\r\n  BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP\r\n  BLE_GATTC_EVT_READ_RSP\r\n  BLE_GATTC_EVT_CHAR_VALS_READ_RSP\r\n  BLE_GATTC_EVT_WRITE_RSP\r\n  BLE_GATTC_EVT_HVX\r\n  BLE_GATTC_EVT_EXCHANGE_MTU_RSP\r\n  BLE_GATTC_EVT_TIMEOUT\r\n  BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE\r\n};\r\n<\/pre>\n<h3>S132<\/h3>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/ble.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/ble.h\">\r\nuint32_t sd_ble_enable(uint32_t * p_app_ram_base)\r\nuint32_t sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)\r\nuint32_t sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)\r\nuint32_t sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)\r\nuint32_t sd_ble_uuid_vs_remove(uint8_t *p_uuid_type)\r\nuint32_t sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)\r\nuint32_t sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)\r\nuint32_t sd_ble_version_get(ble_version_t *p_version)\r\nuint32_t sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)\r\nuint32_t sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)\r\nuint32_t sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)\r\n<\/pre>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/ble_gap.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/ble_gap.h\">\r\nuint32_t sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)\r\nuint32_t sd_ble_gap_addr_get(ble_gap_addr_t *p_addr)\r\nuint32_t sd_ble_gap_adv_addr_get(uint8_t adv_handle, ble_gap_addr_t *p_addr)\r\nuint32_t sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len)\r\nuint32_t sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len)\r\nuint32_t sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)\r\nuint32_t sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)\r\nuint32_t sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)\r\nuint32_t sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)\r\nuint32_t sd_ble_gap_adv_stop(uint8_t adv_handle)\r\nuint32_t sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)\r\nuint32_t sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)\r\nuint32_t sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)\r\nuint32_t sd_ble_gap_appearance_set(uint16_t appearance)\r\nuint32_t sd_ble_gap_appearance_get(uint16_t *p_appearance)\r\nuint32_t sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params)\r\nuint32_t sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params)\r\nuint32_t sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len)\r\nuint32_t sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len)\r\nuint32_t sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)\r\nuint32_t sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)\r\nuint32_t sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)\r\nuint32_t sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)\r\nuint32_t sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)\r\nuint32_t sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own)\r\nuint32_t sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)\r\nuint32_t sd_ble_gap_encrypt(uint16_t conn_handle, ble_gap_master_id_t const *p_master_id, ble_gap_enc_info_t const *p_enc_info)\r\nuint32_t sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info)\r\nuint32_t sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec)\r\nuint32_t sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)\r\nuint32_t sd_ble_gap_rssi_stop(uint16_t conn_handle)\r\nuint32_t sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)\r\nuint32_t sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)\r\nuint32_t sd_ble_gap_scan_stop(void)\r\nuint32_t sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)\r\nuint32_t sd_ble_gap_connect_cancel(void)\r\nuint32_t sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)\r\nuint32_t sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)\r\nuint32_t sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)\r\nuint32_t sd_ble_gap_qos_channel_survey_stop(void)\r\n<\/pre>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/ble_gattc.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/ble_gattc.h\">\r\nuint32_t sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)\r\nuint32_t sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)\r\nuint32_t sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)\r\nuint32_t sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)\r\nuint32_t sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)\r\nuint32_t sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)\r\nuint32_t sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)\r\nuint32_t sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)\r\nuint32_t sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)\r\nuint32_t sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)\r\nuint32_t sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)\r\n<\/pre>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/ble_gatts.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/ble_gatts.h\">\r\nuint32_t sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)\r\nuint32_t sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)\r\nuint32_t sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)\r\nuint32_t sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)\r\nuint32_t sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)\r\nuint32_t sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)\r\nuint32_t sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)\r\nuint32_t sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)\r\nuint32_t sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)\r\nuint32_t sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)\r\nuint32_t sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)\r\nuint32_t sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)\r\nuint32_t sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)\r\nuint32_t sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)\r\n<\/pre>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/ble_l2cap.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/ble_l2cap.h\">\r\nuint32_t sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)\r\nuint32_t sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)\r\nuint32_t sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)\r\nuint32_t sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)\r\nuint32_t sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)\r\n<\/pre>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/nrf52\/nrf_mbr.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/nrf52\/nrf_mbr.h\">\r\nuint32_t sd_mbr_command(sd_mbr_command_t* param)\r\n<\/pre>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/nrf_sdm.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/nrf_sdm.h\">\r\nuint32_t sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)\r\nuint32_t sd_softdevice_disable(void)\r\nuint32_t sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)\r\nuint32_t sd_softdevice_vector_table_base_set(uint32_t address)\r\n<\/pre>\n<pre class=\"brush: cpp; title: components\/softdevice\/s132\/headers\/nrf_soc.h; notranslate\" title=\"components\/softdevice\/s132\/headers\/nrf_soc.h\">\r\nuint32_t sd_mutex_new(nrf_mutex_t * p_mutex)\r\nuint32_t sd_mutex_acquire(nrf_mutex_t * p_mutex)\r\nuint32_t sd_mutex_release(nrf_mutex_t * p_mutex)\r\nuint32_t sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)\r\nuint32_t sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)\r\nuint32_t sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)\r\nuint32_t sd_power_reset_reason_get(uint32_t * p_reset_reason)\r\nuint32_t sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)\r\nuint32_t sd_power_mode_set(uint8_t power_mode)\r\nuint32_t sd_power_system_off(void)\r\nuint32_t sd_power_pof_enable(uint8_t pof_enable)\r\nuint32_t sd_power_pof_threshold_set(uint8_t threshold)\r\nuint32_t sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)\r\nuint32_t sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)\r\nuint32_t sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)\r\nuint32_t sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)\r\nuint32_t sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)\r\nuint32_t sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)\r\nuint32_t sd_power_dcdc_mode_set(uint8_t dcdc_mode)\r\nuint32_t sd_clock_hfclk_request(void)\r\nuint32_t sd_clock_hfclk_release(void)\r\nuint32_t sd_clock_hfclk_is_running(uint32_t * p_is_running)\r\nuint32_t sd_app_evt_wait(void)\r\nuint32_t sd_ppi_channel_enable_get(uint32_t * p_channel_enable)\r\nuint32_t sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)\r\nuint32_t sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)\r\nuint32_t sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)\r\nuint32_t sd_ppi_group_task_enable(uint8_t group_num)\r\nuint32_t sd_ppi_group_task_disable(uint8_t group_num)\r\nuint32_t sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)\r\nuint32_t sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)\r\nuint32_t sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)\r\nuint32_t sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)\r\nuint32_t sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)\r\nuint32_t sd_evt_get(uint32_t * p_evt_id)\r\nuint32_t sd_temp_get(int32_t * p_temp)\r\nuint32_t sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)\r\nuint32_t sd_flash_page_erase(uint32_t page_number)\r\nuint32_t sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)\r\nuint32_t sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)\r\nuint32_t sd_radio_session_close(void)\r\nuint32_t sd_radio_request(nrf_radio_request_t const * p_request)\r\nuint32_t sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)\r\n<\/pre>\n<pre class=\"brush: plain; title: a; notranslate\" title=\"a\">\r\na\r\n<\/pre>\n<pre class=\"brush: plain; title: b; notranslate\" title=\"b\">\r\nb\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>SoftDevices Protocol Role Chip SoftDevice Bluetooth Low Energy Peripheral nRF51422 nRF51822 S110 nRF52810 nRF52832 S112 nRF52833 S113 Central or Peripheral nRF51422 nRF51822 S120 Central and Peripheral nRF51422 nRF51822 S130 nRF52832 S132 nRF52833 nRF52840 S140 ANT &nbsp; nRF51422 S210 nRF52832 S212 Bluetooth Low Energy and ANT Peripheral nRF51422 S310 Peripheral and Broadcaster nRF52810 S312 All roles [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9062","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/9062","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9062"}],"version-history":[{"count":11,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/9062\/revisions"}],"predecessor-version":[{"id":13089,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/9062\/revisions\/13089"}],"wp:attachment":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}