blob: f67821fa5c5662ecf07ce77fde0257ca0ad08367 [file] [log] [blame]
/****************************************************************************
* arch/arm/src/stm32wb/stm32wb_mbox.h
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_ARM_SRC_STM32WB_STM32WB_MBOX_H
#define __ARCH_ARM_SRC_STM32WB_STM32WB_MBOX_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
#include <nuttx/wireless/bluetooth/bt_hci.h>
#include "stm32wb_mbox_list.h"
#include "stm32wb_mbox_shci.h"
/****************************************************************************
* Pre-Processor Declarations
****************************************************************************/
/* Mailbox channels */
#define STM32WB_MBOX_BLEEVT_CHANNEL 1
#define STM32WB_MBOX_BLECMD_CHANNEL 1
#define STM32WB_MBOX_SYSEVT_CHANNEL 2
#define STM32WB_MBOX_SYSCMD_CHANNEL 2
#define STM32WB_MBOX_EVT_RELEASE_CHANNEL 4
#define STM32WB_MBOX_BLEACL_CHANNEL 6
/* Mailbox packet types */
#define STM32WB_MBOX_HCICMD 0x01
#define STM32WB_MBOX_HCIACL 0x02
#define STM32WB_MBOX_HCIEVT 0x04
#define STM32WB_MBOX_SYSCMD 0x10
#define STM32WB_MBOX_SYSEVT 0x12
#define STM32WB_MBOX_SYSACK 0xe0
/* Mailbox configuration helpers */
#define STM32WB_MBOX_BLE_ATT_DEFAULT_MTU 23
#define STM32WB_MBOX_C2_MEM_BLOCK_SZ 32
#define DIV_UP(a, b) (((a) + (b) - 1) / (b))
#define STM32WB_MBOX_DEFAULT_BLE_PREP_WRITE_NUM(max_mtu) \
(DIV_UP((max_mtu), STM32WB_MBOX_BLE_ATT_DEFAULT_MTU - 5) * 2)
#define STM32WB_MBOX_DEFAULT_C2_MEM_BLOCK_NUM(max_mtu, max_conn, pw) \
((pw) + ((max_conn) + 1) * (DIV_UP((max_mtu) + 4, STM32WB_MBOX_C2_MEM_BLOCK_SZ) + 2))
/****************************************************************************
* Public Types
****************************************************************************/
/* Mailbox data transfer packets */
begin_packed_struct struct stm32wb_mbox_evt_s
{
uint8_t type;
union
{
struct bt_hci_evt_hdr_s evt_hdr;
struct bt_hci_acl_hdr_s acl_hdr;
};
} end_packed_struct;
begin_packed_struct struct stm32wb_mbox_cmd_s
{
stm32wb_mbox_list_t list_hdr;
uint8_t type;
union
{
struct bt_hci_cmd_hdr_s cmd_hdr;
struct bt_hci_acl_hdr_s acl_hdr;
};
} end_packed_struct;
/* Mailbox receive event handler type */
typedef int (*stm32wb_mbox_evt_handler_t)(struct stm32wb_mbox_evt_s *);
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: stm32wb_mboxinitialize
*
* Description:
* Initialize mailbox driver memory.
*
* Input Parameters:
* evt_handler - the function to call on event receive
*
****************************************************************************/
void stm32wb_mboxinitialize(stm32wb_mbox_evt_handler_t evt_handler);
/****************************************************************************
* Name: stm32wb_mboxenable
*
* Description:
* Enable mailbox hardware and start communication. The CPU2 responses
* with C2Ready event on success.
*
****************************************************************************/
void stm32wb_mboxenable(void);
/****************************************************************************
* Name: stm32wb_mbox_syscmd
*
* Description:
* Send command over mailbox system channel. Command data must be
* prepended with HCI header.
*
****************************************************************************/
int stm32wb_mbox_syscmd(void *data, size_t len);
/****************************************************************************
* Name: stm32wb_mbox_blecmd
*
* Description:
* Send command over mailbox BLE channel. Command data must be
* prepended with HCI header.
*
****************************************************************************/
int stm32wb_mbox_blecmd(void *data, size_t len);
/****************************************************************************
* Name: stm32wb_mbox_bleacl
*
* Description:
* Send BLE ACL data over mailbox BLE ACL channel. Data must be
* prepended with HCI ACL header.
*
****************************************************************************/
int stm32wb_mbox_bleacl(void *data, size_t len);
/****************************************************************************
* Name: stm32wb_mbox_bleinit
*
* Description:
* Initialize and start BLE subsystem with provided configuration params.
*
****************************************************************************/
void stm32wb_mbox_bleinit(struct stm32wb_shci_ble_init_cfg_s *params);
#endif /* __ARCH_ARM_SRC_STM32WB_STM32WB_MBOX_H */