Commit Graph

14942 Commits

Author SHA1 Message Date
Lyle Zhu
94de015498 Bluetooth: HFP_AG: Enable 3-way feature
Add a configuration `BT_HFP_AG_3WAY_CALL` to control the feature.

Add a configuration `BT_HFP_AG_MAX_CALLS` to define supported maximum
calls.

Add a structure `struct bt_hfp_ag_call` to manage the call.

Add the call object to callback `outgoing`, and`incoming`.

Use call object to replace AG object for callbacks `incoming_held`,
`ringing`, `accept`, `reject`, and `terminate`.

Add callback `held` to notify the call held status.

Use call object to replace AG object for function
`bt_hfp_ag_hold_incoming`, `bt_hfp_ag_reject`, `bt_hfp_ag_accept`,
`bt_hfp_ag_terminate`, `bt_hfp_ag_remote_ringing`,
`bt_hfp_ag_remote_reject`, `bt_hfp_ag_remote_accept`, and
`bt_hfp_ag_remote_terminate`.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
bbc0f1fa57 Bluetooth: HFP_HF: Code clean
Remove useless function `bt_hfp_hf_send_cmd`.
And related callback `cmd_complete_cb`.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
3ac6bfeb4a Bluetooth: HFP_AG: Hold incoming call
Add a flag `BT_HFP_AG_INCOMING_HELD` to identify the incoming call is
held.

Add a function `bt_hfp_ag_hold_incoming` to put the incoming call on
hold.

Add a callback `incoming_held` to notify the application the incoming
is held.

Handle AT command `AT+BTRH=x` to hold/accept/reject the incoming call.

Improve function `bt_hfp_hf_accept` to accept the held incoming call.

Improve function `bt_hfp_hf_reject` to reject the held incoming call.

Improve function `bt_hfp_hf_terminate` to terminate the held incoming
call.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
754bc39b07 Bluetooth: HFP_HF: Hold incoming call
Add a flag `BT_HFP_HF_FLAG_INCOMING_HELD` to identify the incoming call
is held.

Add a function `bt_hfp_hf_hold_incoming` to put the incoming call on
hold.

Handle the response `+BTRH` to get the incoming call status.

Add a callback `incoming_held` to notify the application the incoming
is held.

Remove callback `call_setup`. Add callback `outgoing` for call_setup=1,
`incoming` for call_setup=2, and `remote_ringing` for call_setup=3.

Remove callback `call`. Add callback `accept`, `reject`, `terminate`,
and `incoming_held`.
`accept` is triggered if the call is active.
`reject` is triggered if the incoming/
outgoing is not accepted but call is terminated.
`terminate` is triggered if the accepted is terminated.
`incoming_held` is triggered if the incoming call is held.

Improve function `bt_hfp_hf_accept` to accept the held incoming call.

Improve function `bt_hfp_hf_reject` to reject the held incoming call.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
074b8ae409 Bluetooth: HFP_HF: Turn off AG's EC and NR
Add a configuration `CONFIG_BT_HFP_HF_ECNR` to enable "EC and/or NR
function" of HFP HF.

Add a function `bt_hfp_hf_turn_off_ecnr` to turn off AG's EC and NR.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
ee20fc31a3 Bluetooth: HFP_AG: Handle command AT+NREC=0
Add a configuration to support "EC and/or NR function" of HFP AG.

Add a callback `ecnr_turn_off` to notify the application that "EC and/
or NR function" has been turned off.

Handle AT command AT+NREC=0. Only if the feature enabled, and the
callback `ecnr_turn_off` provided, the result code `OK` will be
responded.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
43d048e695 Bluetooth: HFP_HF: Support last number recalling
Add a function `bt_hfp_hf_redial` to initiate outgoing voice calls by
recalling the last number dialed by the AG.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
aec1f563df Bluetooth: HFP_HF: Support memory dialing
Add a function `bt_hfp_hf_memory_dial` to initiate outgoing voice
calls using the memory dialing feature of the AG.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
8164620378 Bluetooth: HFP_HF: Support phone number calling
Add a function `bt_hfp_hf_number_call` to initiate outgoing voice calls
by providing the destination phone number to the AG.

Add a callback `dialing` to notify the application the result from AG.

Add a flag `BT_HFP_HF_FLAG_DIALING` to make sure there is only one
dialing call at the same time.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
c1a856c1bd Bluetooth: HFP_AG: Add number dialing callback
Add phone number dialing callback if the ATDNnnn AT command is
received from HFP HF.
If the callback is NULL, the ATDNnnn AT command cannot be
supported by the HFP AG.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
d074c6a42b Bluetooth: HFP_HF: Add a function to terminate the call
Add a function `bt_hfp_hf_terminate` to terminate the active call.

Add a flag BT_HFP_HF_FLAG_ACTIVE to identify the call is active. Set
the flag if the call value is 1.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
02bcfad64e Bluetooth: HFP_HF: Add a function to reject the call
Add a function `bt_hfp_hf_reject` to reject the incoming call.

Add a flag BT_HFP_HF_FLAG_INCOMING to identify the incoming call.
Set the flag if the call_setup value is 1.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
28d8dc4376 Bluetooth: HFP_AG: Improve inband ringtone setting
Add a function `bt_hfp_ag_inband_ringtone` to enable/disable inband
ringtone.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
6307172cbb Bluetooth: HFP_HF: Improve codec negotiation
Add the configuration `BT_HFP_HF_CODEC_NEG` to configure the codec
negotiation feature.

Add a configuration `BT_HFP_HF_CODEC_MSBC` to support mSBC codec.

Add a configuration `BT_HFP_HF_CODEC_LC3_SWB` to support LC3 SWB codec.

Add a function `bt_hfp_hf_audio_connect` to trigger audio connection
sequence.

Add a function `bt_hfp_hf_select_codec` to response the codec
negotiation request.

Add a function `bt_hfp_hf_set_codecs` to notify the AG supported Codec
IDs of HF.

Handle unsolicited response `+BCS` sent from AG.

Send supported Codec IDs supported by HF if the SLC is established.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
7f791554a6 Bluetooth: HFP_AG: Improve codec negotiation
Add a configuration BT_HFP_AG_CODEC_NEG to configure the feature.

Add a function bt_hfp_ag_audio_connect to setup the codec negotiation
procedure.

Improve AT+BAC and AT+BCC handle.

Add callback codec_negotiate to notify the application of codec
negotiation result.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
4a82422a66 Bluetooth: HFP_HF: Add a function to accept the call
Add a function `bt_hfp_hf_accept` to accept the incoming call.

Add a flag BT_HFP_HF_FLAG_INCOMING to identify the incoming call.
Set the flag if the call_setup value is 1.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
51c3b193cd Bluetooth: HFP_AG: Support network operator update
Expose a function to set the network operator and mode.

Response the AT+COPS? command with set mode and operator.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
4f74344959 Bluetooth: HHF_HF: Support read network operator
Add function `bt_hfp_hf_get_operator` to read the currently network
operator of AG.

Add callback `operator` to notify the application of the response.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
6a13044649 Bluetooth: HFP_HF: Send AT+VGM and AT+VGS after SLC established
Send AT command AT+VGM and AT+VGS after SLC established.

The `VGM` and `VGS` can be set by calling function `bt_hfp_hf_vgs` and
`bt_hfp_hf_vgs` in HF connection callback.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
525e7b805c Bluetooth: HFP_AG: Support remote audio volume control
Handle AT commands AT+VGM and AT+VGS.

Add function to notify microphone and speaker gain.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
c6d2d0e817 Bluetooth: HFP_HF: Notify in-band ring setting
Handle the unsolicited result code +BSIR issued by the AG to indicate
to the HF that the in-band ring tone setting has been locally changed.

Add a callback `inband_ring` to notify the in-band ring tone setting.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
ee5acfe06c Bluetooth: HFP_HF: Add function to set vgm and vgs
Add function bt_hfp_hf_vgm to configure Gain of Microphone.

Add function bt_hfp_hf_vgs to configure Gain of Speaker.

These functions are controlled by configuration
`CONFIG_BT_HFP_HF_VOLUME`.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
ad7fd30ecd Bluetooth: HFP_HF: handle unsolicited result code +VGS/+VGM
Handle the unsolicited result code +VGS and +VGM if the configuration
`CONFIG_BT_HFP_HF_VOLUME` is enabled.

Add a callback `vgm` to notify the application speaker microphone
notification if the configuration `CONFIG_BT_HFP_HF_VOLUME` is enabled.

Add a callback `vgs` to notify the application speaker gain
notification if the configuration `CONFIG_BT_HFP_HF_VOLUME` is enabled.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
ee2fddefcf Bluetooth: HFP_HF: Add function bt_hfp_hf_cli
Add tx pending queue to queue call AT commands.

Add a function bt_hfp_hf_cli to enable/disable CLI notification.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Lyle Zhu
8c61b9cea6 Bluetooth: HFP_HF: Support unsolicited result code +CLIP
Handle the unsolicited result code +CLIP.

Add a callback `clip` to notify the application if the configuration
`CONFIG_BT_HFP_HF_CLI` is enabled.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-03 06:24:32 +02:00
Jeremy Bettis
29dd0144b7 toolchain: llvm: Use clang's __INTN_C/__UINTN_C macros for clang 20.1+
Use the builtin intn macros for 20.1+, as 20.0 doesn't include them.
20.0 wasn't an official release.

Signed-off-by: Jeremy Bettis <jbettis@google.com>
2025-04-02 18:27:00 -07:00
Jilay Pandya
d18f49132c drivers: stepper: refactor enable(dev,flag) to enable & disable
refactoring enable function into enable and disable increasing readability
and increasing coherence with other stepper apis in terms of
nomenclature

Signed-off-by: Jilay Pandya <jilay.pandya@outlook.com>
2025-04-03 00:03:29 +02:00
Bjarki Arge Andreasen
791db47d51 dts: bindings: clock: add nordic,nrfs-audiopll
Introduce Nordic NRFS AudioPLL bindings.

Signed-off-by: Bjarki Arge Andreasen <bjarki.andreasen@nordicsemi.no>
2025-04-03 00:03:14 +02:00
Raffael Rostagno
034c0cb977 drivers: intc: esp32: Shared allocator for Xtensa and RISCV
Update interrupt allocator to use the same driver for both
Xtensa and RISCV devices.

Signed-off-by: Raffael Rostagno <raffael.rostagno@espressif.com>
Signed-off-by: Sylvio Alves <sylvio.alves@espressif.com>
2025-04-02 19:02:27 +02:00
Adrien Ricciardi
c53fb67f56 task_wdt: Add suspend and resume API functions
The goal is to be able to use the Task Watchdog on a system that is also
using power management to reach low-power modes. In some low-power modes,
the watchdog channels can't be feed anymore.

The task_wdt_suspend() function allows to prepare the Task Watchdog for
a system low-power mode, in which the hardware watchdog (if enabled) is
also suspended.

The task_wdt_resume() function will reschedule the internal timer that
manages the channels, feed all channels and also the hardware watchdog.
Thus, the application is good to go and has enough time to feed the
channels by itself.

Signed-off-by: Adrien Ricciardi <aricciardi@baylibre.com>
2025-04-02 13:05:14 +02:00
TOKITA Hiroshi
1ebffbdabb include: zephyr: dt-bindings: gpio: Add arduino-header-r3 defines
To make the pin names of the Arduino header easier to understand,
we will introduce a macro definition for the pin names.

We will use this to update the definition of `arduino_uno_r4`.

Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
2025-04-02 12:56:06 +02:00
Jeppe Odgaard
0dffe7cc7e drivers: dac: Add TI DAC161S997 driver
Initial DAC driver for TI DAC161S997. This is a 1 channel 16 bit
DAC designed for 4-20 mA loops.

Signed-off-by: Jeppe Odgaard <jeppe.odgaard@prevas.dk>
2025-04-02 12:53:03 +02:00
Hieu Nguyen
303376a76b drivers: pinctrl: Add support for RZ/T2M
This is the initial commit to support pinctrl driver for Renesas RZ/T2M
Corrected space in the comment.

Signed-off-by: Hieu Nguyen <hieu.nguyen.ym@bp.renesas.com>
Signed-off-by: Nhut Nguyen <nhut.nguyen.kc@renesas.com>
Signed-off-by: Binh Nguyen <binh.nguyen.xw@renesas.com>
2025-04-02 12:52:54 +02:00
Yishai Jaffe
010d33c239 cfb: typo fixes
Fixed CFB_DISPLAY_HEIGH typo to CFB_DISPLAY_HEIGHT.
Fixed widht typo to width.
Fixed "cfb draw point" shell command's help message to "<x> <y>" instead
of "<x> <y0>".

Signed-off-by: Yishai Jaffe <yishai1999@gmail.com>
2025-04-02 10:30:50 +02:00
Hubert Miś
502982bf03 drv: ft8xx: extend single-letter function argument names
Replace single-letter function argument names in the FT8xx coprocessor
API with full names of the arguments for better code clarity.

The arguments in the ft8xx_reference_api.h are left as single-ltters to
keep the same function declarations as described in the FT8xx
programming guides.

Signed-off-by: Hubert Miś <hubert.mis@gmail.com>
2025-04-02 05:29:46 +02:00
Luis Ubieda
9df68a4c48 sensor: pat9136: Add basic functionality
- Basic support with Read/Decode API for one-shot reads.
- Supported channels:
    - SENSOR_CHAN_POS_DX.
    - SENSOR_CHAN_POS_DY.
    - SENSOR_CHAN_POS_DXYZ.
    - SENSOR_CHAN_POS_DX_MM (private channel).
    - SENSOR_CHAN_POS_DY_MM (private channel).
    - SENSOR_CHAN_POS_DXYZ_MM (private channel).

Signed-off-by: Luis Ubieda <luisf@croxel.com>
2025-04-02 05:29:23 +02:00
Lyle Zhu
8d819954e8 Bluetooth: Classic: Refactor query and deletion of bonding information
In current implementation, the bonding information of classic is
queried by calling the function `bt_foreach_bond()`. And the bonding
information of classic is deleted by calling `bt_unpair()`.

There are two issues if the LE and classic are bonded at same time for
dual mode peer device.
Issue 1, for the function `bt_foreach_bond()`, there are two bonding
information will be found. But there is no way to find which bonding
information belongs to LE or classic.
Issue 2, For the function `bt_unpair()`, all bonding information will
be deleted if the passed address is the public address. But there is
no way to delete the bonding information of LE or classic.

Remove the calling of function `bt_foreach_bond_br()` from the
function `bt_foreach_bond()`. And rename it to `bt_br_foreach_bond()`,
and public it as an API to query the bonding information of classic.

Remove the calling of function `bt_keys_link_key_clear_addr()` from
the function `bt_unpair()`. Add an API `bt_br_unpair()` to delete the
bonding information of classic.

Add a `br_bond_deleted` to structure `bt_conn_auth_info_cb` for
classic. The callback will be triggered if the bonding information has
been deleted by the function `bt_br_unpair()`.

Add a `clear` shell command for classic to delete the bonding
information.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
2025-04-01 22:18:40 +02:00
Patrik Sieverding
3eb6016e74 drivers: i2c: add function to check if an I2C_IODEV is ready
The i2c driver is missing the option to check if a I2C_IODEV is ready for
use. The proposed function works the same as the check for a SPI_IODDEV
to keep the use consistent across different bus systems.

Signed-off-by: Patrik Sieverding <sieverdp@uni-bremen.de>
2025-04-01 22:14:59 +02:00
Nicolas Pitre
11021cdd4f kernel: sys_heap: decouple realloc from aligned_realloc
When sys_heap_realloc() is expressed in terms of sys_heap_aligned_realloc()
it invokes a longer aligned allocation code path with an extra runtime
overhead even though no alignment is necessary.

Let's reference and invoke the aligned allocation code path only when an
actual aligned allocation is requested. This opens the possibility for
the linker to garbage-collect the aligning code otherwise.

Improve realloc documentation while at it.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
2025-04-01 22:13:04 +02:00
Nicolas Pitre
9da06456f2 kernel: kheap: decouple simple alloc from aligned_alloc
When k_heap_alloc() is expressed in terms of k_heap_aligned_alloc()
it invokes a longer aligned allocation code path with an extra runtime
overhead even though no alignment is necessary.

Let's reference and invoke the aligned allocation code path only when an
actual aligned allocation is requested. This opens the possibility for
the linker to garbage-collect the aligning code otherwise.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
2025-04-01 22:13:04 +02:00
Robert Lubos
7fbdc6d734 net: lib: mqtt: Add extra MQTT 5.0 ifdefs to prevent compile errors
Add some extra ifdefs around MQTT 5.0 specific structures to prevent
compiler errors due to undefined symbols in certain configurations.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
2025-04-01 16:27:41 +02:00
Ryan Chu
c9240cc99f bluetooth: host: Report status of Channel Sounding complete events
If the HCI status of a complete event is not BT_HCI_ERR_SUCCESS,
the remaining parameters could be invalid.

In this case, the params is passed as NULL pointer to the callbacks.
- LE CS Read Remote Supported Capabilities Complete event
- LE CS Read Remote FAE Table Complete event
- LE CS Config Complete event
- LE CS Security Enable Complete event
- LE CS Procedure Enable Complete event

This change avoids forwarding the invalid fileds to the applications.

Signed-off-by: Ryan Chu <ryan.chu@nordicsemi.no>
2025-04-01 16:26:58 +02:00
Krzysztof Chruściński
c8d7d577a6 logging: frontend_stmesp: Fix string addresses from remote core
When decoding logs from a remote core with memory that APP can
access, wrong address of an array with string addresses was used.
Log message contains index of a string and APP strings array was
used instead of remote core. Extend STMESP logging so that address
of string array of a remote core is send during startup to the APP
and APP is using this array to decode strings from remote cores.
Bug applies only to PPR and FLPR as APP has no access to RAD memory.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
2025-04-01 16:26:50 +02:00
Sudan Landge
d4d09225ca arch: arm: fix ci failure
This is to fix ci failure caused by commit d5d4d57

In the above commit, it's wrongly assumed that ROM_ADDR and RAM_ADDR
are same **only** when CONFIG_XIP is not defined.
Since aarch64 was taken as reference in the review,
we missed to see that CONFIG_FLASH_SIZE is also part of the condition
to define ROM_ADDR as RAM_ADDR.
CONFIG_XIP is not defined for qemu_cortex_a9/xc7z007s however,
CONFIG_FLASH_SIZE is not 0 so the assumption fails
and the required reset to RAM_ADDR is not applied leading to the test
failure.

Signed-off-by: Sudan Landge <sudan.landge@arm.com>
2025-04-01 16:26:12 +02:00
Jonathon Penix
e72f35b5bd toolchain: llvm: Use clang's __INTN_C/__UINTN_C macros for clang 20+
clang recently began providing predefined __INTN_C/__UINTN_C macros
resulting in macro redefinition warnings in toolchain/llvm.h. This
change was landed in clang in late Jan. 2025 and clang/LLVM 20 is the
first official release that has this support (see the PR linked below).

Prefer the definitions provided by clang and avoid redefining these macros
for clang versions 20 and later to avoid said warnings.

Link: https://github.com/llvm/llvm-project/pull/123514

Signed-off-by: Jonathon Penix <jpenix@quicinc.com>
2025-03-31 14:43:56 +02:00
Emil Hammarström
01ba1bf8ce fs: zms: clarify need to re-mount after zms_clear
Clarify that the file system needs to be re-mounted after clearing.
It was not clear that zms_clear both cleared and unmounted the fs.

Signed-off-by: Emil Hammarström <emil.hammarstrom1@assaabloy.com>
2025-03-31 14:32:08 +02:00
Simon Maurer
d5d4d5791f arch: arm: cortex_a_r/cortex_m: fix text region overlap with ram in !XIP
ROM_ADDR and RAM_ADDR is same when CONFIG_XIP is not defined.
If we reset the location for RAMABLE region to RAM_ADDR text region,
which is part of rom, overlaps with initial ram region.
This commit tries to avoid this incorrect behaviour for cortex_a
and cortex_m

Signed-off-by: Simon Maurer <mail@maurer.systems>
2025-03-31 14:31:36 +02:00
Håvard Reierstad
47f5d1b898 Bluetooth: docs: Add enum names to bt.h and gatt.h
Adds enum names to `bluetooth.h` and `gatt.h` to make them easier to
reference. Adds Doxygen references where relevant.

Signed-off-by: Håvard Reierstad <haavard.reierstad@nordicsemi.no>
2025-03-31 11:30:48 +02:00
Chew Zeh Yang
fa1e385b77 drivers: udc_ambiq: fix compilation issue after dwc2 header removal
udc_ambiq was using USB test mode definition in dwc2 header, which
the include was removed, hence compilation now fails. This commit
fixes the compilation failure.

Signed-off-by: Chew Zeh Yang <zeon.chew@ambiq.com>
2025-03-31 08:06:47 +02:00
Tomasz Bursztyka
e8185990ac include: debug: Fix indentation in coredump.h
A nano fix in the header.

Signed-off-by: Tomasz Bursztyka <tobu@bang-olufsen.dk>
2025-03-29 07:44:11 -04:00