Compare with EdgeFast Bluetooth PAL#
This document provides a detailed comparison between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL, highlighting the differences in features, examples, and APIs.
Features comparison#
The following table compares the features between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
Feature |
EdgeFast Open |
EdgeFast Bluetooth PAL |
|---|---|---|
Bluetooth Core Specification |
5.3 |
5.0 |
Bluetooth Host Stack |
Zephyr-based |
Proprietary with Zephyr API compatible |
Bluetooth Controller |
Supported (NXP controller) |
Supported (NXP controller) |
Mode |
LE and Classic |
LE and Classic |
Protocol Support |
L2CAP, GAP, GATT, RFCOMM, SDP, SM, SPP |
L2CAP, GAP, GATT, RFCOMM, SM, SPP |
Classic Profiles |
A2DP, HFP, AVRCP, AVRCP Cover Art, GOEP, BIP, MAP, PBAP |
A2DP, HFP, AVRCP, MAP, PBAP |
LE Profiles |
HTP, PXP, IPSP, HPS, GATT-based services |
HTP, PXP, IPSP, HPS |
Enhanced Attribute (EATT) |
Supported |
Supported |
LE Audio |
Supported |
Supported |
Examples comparison#
The following table compares the available examples between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
Example |
EdgeFast Open |
EdgeFast Bluetooth PAL |
|---|---|---|
a2dp_bridge |
Supported |
Not supported |
a2dp_sink |
Supported |
Supported |
a2dp_source |
Supported |
Supported |
bmr_4bis |
Supported |
Supported |
bms_4bis |
Supported |
Supported |
broadcast_media_receiver |
Supported |
Supported |
broadcast_media_sender |
Supported |
Supported |
call_gateway |
Supported |
Supported |
call_terminal |
Supported |
Supported |
central_fmp |
Supported |
Supported |
central_hpc |
Supported |
Supported |
central_ht |
Supported |
Supported |
central_ipsp |
Supported |
Supported |
central_pxm |
Supported |
Supported |
central_tip |
Supported |
Supported |
handsfree |
Supported |
Supported |
handsfree_ag |
Supported |
Supported |
map_mce |
Supported |
Supported |
map_mse |
Supported |
Supported |
pbap_pce |
Supported |
Supported |
pbap_pse |
Supported |
Supported |
peripheral_beacon |
Supported |
Supported |
peripheral_fmp |
Supported |
Supported |
peripheral_hps |
Supported |
Supported |
peripheral_ht |
Supported |
Supported |
peripheral_ipsp |
Supported |
Supported |
peripheral_pxr |
Supported |
Supported |
peripheral_tip |
Supported |
Supported |
sco_bridge |
Supported |
Not supported |
shell |
Supported |
Supported |
spp |
Supported |
Supported |
tmap_central |
Supported |
Supported |
tmap_peripheral |
Supported |
Supported |
umr2bms |
Supported |
Supported |
umr_4cis |
Supported |
Supported |
ums_4cis |
Supported |
Supported |
ums_microphone |
Supported |
Supported |
unicast_media_receiver |
Supported |
Supported |
unicast_media_sender |
Supported |
Supported |
wifi_cli_over_ble_wu |
Supported |
Supported |
wireless_uart |
Supported |
Supported |
APIs comparison#
Workflow#
The following workflow compares the key different of API between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
The following diagram is a typical Egdefast Open workflow:

The following diagram is a typical EdgeFast Bluetooth PAL workflow:

API Differences#
Core Protocols#
Core Protocols Comparison#
There are no differences in the following protocols, including GAP, SM, SPP, and L2CAP (CBFC).
L2CAP Classic Comparison#
The following table compares the L2CAP Classic differences between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
Feature |
EdgeFast Open |
EdgeFast Bluetooth PAL |
|---|---|---|
Connection-oriented channels in Basic Mode |
Supported |
Supported |
Connection-oriented channels in Retransmission Mode |
Supported |
Not supported |
Connection-oriented channels in Flow control Mode |
Supported |
Not supported |
Connection-oriented channels in Enhanced Retransmission Mode |
Supported |
Supported |
Connection-oriented channels in Streaming Mode |
Supported |
Supported |
Connectionless data channel in Basic L2CAP mode |
Supported |
Not supported |
Signaling packet ECHO |
Supported |
Not supported |
The following compares the L2CAP Classic differences between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
Aspect |
EdgeFast Open |
EdgeFast Bluetooth PAL |
|---|---|---|
L2CAP architecture |
Zephyr native L2CAP |
PAL adds explicit L2CAP config negotiation |
Channel config |
Static fields in chan.rx.* |
Callback‑based config exchange |
Mode negotiation |
Implicit |
Explicit (get_cfg / cfg_req / cfg_rsp) |
Who drives config |
Local side before connect |
Both sides during config phase |
L2CAP Classic on EdgeFast Open#
static int l2cap_recv(struct bt_l2cap_chan *chan, struct net_buf *buf)
{
}
static void l2cap_connected(struct bt_l2cap_chan *chan)
{
}
static void l2cap_disconnected(struct bt_l2cap_chan *chan)
{
}
static struct net_buf *l2cap_alloc_buf(struct bt_l2cap_chan *chan)
{
}
#if defined(CONFIG_BT_L2CAP_SEG_RECV)
static void seg_recv(struct bt_l2cap_chan *chan, size_t sdu_len, off_t seg_offset,
struct net_buf_simple *seg)
{
}
#endif /* CONFIG_BT_L2CAP_SEG_RECV */
static const struct bt_l2cap_chan_ops l2cap_ops = {
.alloc_buf = l2cap_alloc_buf,
.recv = l2cap_recv,
.connected = l2cap_connected,
.disconnected = l2cap_disconnected,
#if defined(CONFIG_BT_L2CAP_SEG_RECV)
.seg_recv = seg_recv,
#endif /* CONFIG_BT_L2CAP_SEG_RECV */
};
static struct bt_l2cap_br_chan chan = {
.chan.ops = &l2cap_ops,
.rx.mtu = DATA_BREDR_MTU,
},
chan.rx.mode = <Mode>;
chan.rx.max_transmit = <max_transmit>;
chan.rx.optional = <Mode optional settings>;
chan.rx.extended_control = <extended_control>;
chan.rx.max_window = <max_window>;
int err = bt_l2cap_chan_connect(default_conn, &chan.chan, psm);
if (err < 0) {
PRINTF("Unable to connect to psm %u (err %d)\n", psm, err);
} else {
PRINTF("L2CAP connection pending\n");
}
L2CAP Classic on EdgeFast Bluetooth PAL#
void l2cap_mode_get_cfg(struct bt_l2cap_chan *chan, struct bt_l2cap_cfg_options *cfg)
{
/* Channel configuration handler */
/* `cfg` argument needs to be filled with the configuration options */
}
void l2cap_mode_cfg_req(struct bt_l2cap_chan *chan, struct bt_l2cap_cfg_options *cfg, struct bt_l2cap_cfg_options *rsp)
{
/* Channel configuration response handler */
/* `rsp` argument needs to be filled with the response configuration options */
}
void l2cap_mode_cfg_rsp(struct bt_l2cap_chan *chan, struct bt_l2cap_cfg_options *rsp)
{
/* Channel configuration response handler */
}
static const struct bt_l2cap_chan_ops l2cap_mode_ops = {
.alloc_buf = l2cap_alloc_buf,
.recv = l2cap_recv,
.connected = l2cap_connected,
.disconnected = l2cap_disconnected,
.get_cfg = l2cap_mode_get_cfg,
.cfg_req = l2cap_mode_cfg_req,
.cfg_rsp = l2cap_mode_cfg_rsp
};
static struct bt_l2cap_br_chan chan = {
.chan.ops = &l2cap_mode_ops,
.rx.mtu = DATA_BREDR_MTU,
},
int err = bt_l2cap_chan_connect(default_conn, &chan.chan, psm);
if (err < 0) {
PRINTF("Unable to connect to psm %u (err %d)\n", psm, err);
} else {
PRINTF("L2CAP connection pending\n");
}
Parent topic:Core Protocols Comparison
SDP#
The following compares the SDP differences between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
Feature |
EdgeFast Open |
EdgeFast Bluetooth PAL |
|---|---|---|
SDP record discovery |
Support Attribute ID list and range settings |
Not supported |
SDP record parse |
bt_sdp_record_parse |
Not supported |
Check attribute |
bt_sdp_has_attr |
Not supported |
Parse attribute value |
bt_sdp_get_attr bt_sdp_attr_value_parse bt_sdp_attr_has_uuid bt_sdp_attr_read |
Not supported |
Parse Additional Protocol Descriptor List attribute |
bt_sdp_attr_addl_proto_parse bt_sdp_attr_addl_proto_count bt_sdp_attr_addl_proto_read |
Not supported |
Parent topic:Core Protocols Comparison
Parent topic:Compare with EdgeFast Bluetooth PAL
LE Profiles#
No differences between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL for LE profiles.
LE Audio Profiles#
No differences between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL for LE Audio profiles.
Classic Profiles#
The following compares the available Classic profiles between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
A2DP#
AVRCP#
HFP#
MAP#
PBAP#
PBAP Comparison#
The following compares the PBAP differences between EdgeFast Open Bluetooth Host stack and EdgeFast Bluetooth PAL.
1. Architectural Differences (Core Changes)#
Dimension |
EdgeFast Open |
EdgeFast Bluetooth PAL |
Migration impact |
|---|---|---|---|
API abstraction |
PDU-/protocol-driven: most APIs take only |
Parameter-driven: function parameters directly carry |
Old: “pass parameters”; New: “build PDUs + add headers + parse buffers”. |
Header construction |
Application builds 100% of headers (Name/Type/AppParams/SRMP/Body/EndBody/auth, etc.) |
OBEX/PBAP headers are built internally based on API parameters; application mainly reserves headroom |
Main migration task: map old API parameters into a sequence of |
Connection responsibility |
Clearly split: transport bearer (RFCOMM/L2CAP) + OBEX CONNECT/DISCONNECT/ABORT PDU handling |
Connect APIs often bundle object creation, authentication, feature info, and transport setup |
Connection procedure becomes longer (one or two extra steps). |
Segmentation/chunking |
Final-bit / End-of-Body and segmentation are decided by the application’s PDU construction; PBAP APIs only transmit |
Driven by |
Requires redesign of “first packet / subsequent packet / last packet” strategy. |
SRMP (“wait”) |
Not a parameter anymore; application adds SRMP header |
|
|
Name/path |
Not a function parameter; carried in the OBEX Name header inside |
|
|
Authentication |
New provides nonce/digest/verify helpers; auth headers are added by the application |
Old callback includes |
Auth shifts from “configuration/struct callback” to “parse challenge + compute + add headers”. |
2. PCE (Client) API Alignment Differences (Function Level)#
Function |
EdgeFast Open API ( |
EdgeFast Bluetooth PAL API ( |
Key differences (incl. migration notes) |
|---|---|---|---|
Callback registration / init |
(No equivalent global |
|
Old: global callback registration; New: more instance-oriented, |
RFCOMM connect (SCN/channel) |
|
|
Old creates/returns the PCE object and takes |
L2CAP connect (PSM) |
|
|
Same pattern as RFCOMM connect. |
Disconnect (high-level) |
|
|
New requires application-provided |
Disconnect (transport bearer) |
|
(No dedicated API) |
New separates bearer teardown from OBEX DISCONNECT PDU. |
OBEX CONNECT (PBAP session) |
|
(Typically implicit in old connect flow) |
Application must construct the OBEX CONNECT PDU and headers via |
ABORT |
|
|
Application constructs ABORT PDU headers. |
Pull Phonebook |
|
|
|
SetPath |
|
|
Old passes |
Pull vCard Listing |
|
|
Same as Pull Phonebook: parameters → headers. |
Pull vCard Entry |
|
|
Same as above. |
Get max packet length |
(No same-name API found) |
|
Old provides direct query; New may obtain it via OBEX CONNECT negotiation (e.g., MOPl) or OBEX layer APIs. |
Helper: parse App Params |
(No same-name macro in |
|
New encourages direct OBEX/AppParams header manipulation/parsing by the application. |
Helper: get Body |
(No same-name macro in |
|
New callbacks deliver |
3. PSE (Server) API Alignment Differences (Function Level)#
Function |
EdgeFast Open API ( |
EdgeFast Bluetooth PAL API ( |
Key differences (incl. migration notes) |
|---|---|---|---|
Callback registration / init |
|
|
New requires a PSE instance, i.e., a more instance-based server model. |
Server bearer registration |
|
(Not provided in old header) |
New adds explicit RFCOMM/L2CAP server registration and accept model. |
Disconnect |
|
|
New is response/PDU oriented; application builds the response PDU and headers. |
CONNECT/ABORT response |
|
(More abstracted in old version) |
New requires explicit response PDU construction and transmission. |
Pull phonebook response |
|
|
|
SetPath response |
|
|
New requires a response |
Pull vCard listing response |
|
|
|
Pull vCard entry response |
|
|
Same as above. |
Get max packet length |
(No same-name API found) |
|
New may rely on OBEX/GOEP layer APIs. |
Get peer supported features |
(No same-name API found) |
|
New may expose this via negotiation/callback/buffer parsing or internal state. |
5. Callback Model Differences: From “High-level Events” to “Protocol Events + Buffer-driven”#
5.1 PCE callbacks#
Aspect |
EdgeFast Open |
EdgeFast Bluetooth PAL |
Migration impact |
|---|---|---|---|
Bearer connected |
|
|
New distinguishes bearer type and provides |
Bearer disconnected |
|
|
The disconnect reason/result is more reflected in protocol |
OBEX CONNECT result |
|
(Not typically exposed explicitly) |
New exposes negotiated parameters and delivers the raw buffer. |
pull/set/abort callbacks |
uniformly |
result + buf (some callbacks without buf) |
Application must parse OBEX headers/body from |
Auth info retrieval |
(Not present) |
|
New expects application-driven OBEX auth header handling (parse challenge, compute, add response). |
5.2 PSE callbacks#
Aspect |
EdgeFast Open |
EdgeFast Bluetooth PAL |
Migration impact |
|---|---|---|---|
Pull request callback params |
|
|
New requires parsing Name/Type/AppParams/SRMP/segmentation from |
SetPath request |
|
|
Flags are standardized; folder name is parsed from Name header in |
connect/disconnect/abort |
New provides buffer-level callbacks and explicit response APIs |
More abstracted |
New behaves like an OBEX server role: app participates in handshake and PDU construction. |
6. Migration Mapping: “Old parameters” → “New headers (obex_add_header_xxx)”#
Old parameter/concept |
EdgeFast Open |
EdgeFast Bluetooth PAL |
Application action (conceptual) |
|---|---|---|---|
|
Not a function parameter anymore |
API parameter |
Add/parse OBEX Name header in request/response PDUs. |
|
|
Often internal in old stack |
Add OBEX Type header ( |
App Parameters (filter/format/order/search, etc.) |
enums in |
via |
Encode/decode PBAP AppParams TLVs inside the OBEX App Parameters header. |
|
Not present as parameter |
|
Add/parse SRMP header to control Server Response Mode Parameter. |
|
Not present as parameter |
|
Express segmentation via PDU construction (Final-bit, Body vs End-of-Body, multi-PDU flow). |
|
unified |
|
Choose OBEX response code based on whether more PDUs follow; build Body/End-of-Body accordingly. |
|
nonce/digest/verify helpers |
connect parameter or |
Build OBEX auth headers in PDUs; compute/verify using provided helpers. |
|
not in prototypes |
connect parameter or explicit getter |
Likely obtained via negotiation/SDP/buffer parsing/internal state; avoid injecting via connect signature. |
7. Newly Added / Enhanced APIs & Capabilities in EdgeFast Open#
Item |
EdgeFast Open API/structure |
Value |
|---|---|---|
PDU allocation helper |
|
Provides a PDU container to be populated by the application via |
PSE bearer server registration |
|
More complete server integration model (multi-connection / custom accept). |
OBEX-level response APIs (PSE) |
|
Application can explicitly control OBEX response codes and attached headers. |
Authentication utilities |
|
Facilitates application-implemented OBEX/PBAP authentication headers and validation. |
8. Migration Recommendations (High-level)#
Refactor connection sequencing (PCE):
Establish bearer first:
bt_pbap_pce_rfcomm_connectorbt_pbap_pce_l2cap_connectThen build the OBEX CONNECT PDU (application uses
obex_add_header_xxx()) and callbt_pbap_pce_connect
Change request transmission to “build PDU first, then call PBAP API”:
bt_pbap_pce_create_pdu()→obex_add_header_xxx()(Name/Type/AppParams/SRMP/Body…) →bt_pbap_pce_pull_*()
Change response sending (PSE) to “application fully owns headers/body/end-of-body”:
Request callbacks deliver only
buf; parse Name/Type/AppParamsBuild response
buf: add Body/End-of-Body and required headers viaobex_add_header_xxx()→ callbt_pbap_pse_*_rsp()
Segmentation/CONTINUE strategy migration:
Old:
flag + wait + resultNew: application decides whether to include End-of-Body, whether more PDUs follow, and selects
rsp_code(CONTINUE/SUCCESS)
Authentication migration:
Old:
get_auth_info+struct bt_pbap_authNew: application parses OBEX auth challenge headers, computes digests via
bt_pbap_calculate_*, and adds auth response/challenge headers viaobex_add_header_xxx()
Parent topic:Compare with EdgeFast Bluetooth PAL
Parent topic:Overview