49 lines
1.9 KiB
Diff
49 lines
1.9 KiB
Diff
|
From d10422fafd9eececfa6755617c41b05f895e5a5b Mon Sep 17 00:00:00 2001
|
||
|
From: Dylan Van Assche <me@dylanvanassche.be>
|
||
|
Date: Thu, 14 Apr 2022 21:03:37 +0200
|
||
|
Subject: [PATCH 15/26] bluetooth: support AT+CREG?
|
||
|
|
||
|
AT+CREG? is not officialy supported by the Bluetooth HFP 1.8 spec,
|
||
|
but some car multimedia systems use it. AT+CREG? reports if the phone
|
||
|
has network available or not with a +CREG response.
|
||
|
---
|
||
|
src/modules/bluetooth/backend-native.c | 22 ++++++++++++++++++++++
|
||
|
1 file changed, 22 insertions(+)
|
||
|
|
||
|
diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
|
||
|
index 1eaa36b4a..2fa769d07 100644
|
||
|
--- a/src/modules/bluetooth/backend-native.c
|
||
|
+++ b/src/modules/bluetooth/backend-native.c
|
||
|
@@ -770,6 +770,28 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf
|
||
|
pa_assert_not_reached();
|
||
|
}
|
||
|
|
||
|
+ /*
|
||
|
+ * Out-of-spec Bluetooth HFP 1.8 AT commands.
|
||
|
+ * Some car multimedia systems implement the HFP spec,
|
||
|
+ * but also use out-of-spec AT commands which are normally supported
|
||
|
+ * by any 3GPP compliant modem such as:
|
||
|
+ * - AT+CREG?: Get service status
|
||
|
+ * - AT+CGMM: Get modem model
|
||
|
+ * - AT+CGMI: Get modem manufacturer
|
||
|
+ * - AT+CGMR: Get modem revision
|
||
|
+ * - AT+CGSN: Get modem IMEI
|
||
|
+ *
|
||
|
+ * These AT commands are additionally supported if ModemManager is available.
|
||
|
+ */
|
||
|
+ if (strstr(buf, "AT+CREG?")) {
|
||
|
+ if (discovery->native_backend->modemmanager && pa_modemmanager_has_modem(discovery->native_backend->modemmanager)) {
|
||
|
+ rfcomm_write_response(fd, "+CREG: 0,%d", pa_modemmanager_has_service(discovery->native_backend->modemmanager));
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ rfcomm_write_error(discovery->native_backend, fd, CMEE_NO_CONNECTION_TO_PHONE);
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
/* first-time initialize selected codec to CVSD */
|
||
|
if (c->selected_codec == 0)
|
||
|
c->selected_codec = 1;
|
||
|
--
|
||
|
2.35.1
|
||
|
|