Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/* uart.h - Nordic BLE UART based Bluetooth driver */

/*
 * Copyright (c) 2015-2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * IPC Uart power management driver.
 */
extern struct driver ipc_uart_ns16550_driver;

int nble_open(void);

/**
 * This function triggers the sending of PDU buffer over UART.
 *
 * This constructs an IPC message header and triggers the sending of it and
 * message buffer. If a transmission is already ongoing, it will fail.
 * In this case upper layer needs to queue the message buffer.
 *
 * @param dev structure of the opened device
 * @param handle structure of opened IPC uart channel
 * @param len length of message to send
 * @param p_data message buffer to send
 *
 * @return IPC_UART_ERROR_OK TX has been initiated, IPC_UART_TX_BUSY a
 * transmission is already going, message needs to be queued
 *
 * @note This function needs to be executed with (UART) irq off to avoid
 * preemption from uart_ipc_isr causing state variable corruption.
 * It also called from uart_ipc_isr() to send the next IPC message.
 */
int ipc_uart_ns16550_send_pdu(struct device *dev, void *handle, int len,
			      void *p_data);

/**
 * This function registers a callback function being called on TX start/end.
 *
 * This constructs an IPC message header and triggers the sending of it and
 * message buffer. If a transmission is already ongoing, it will fail. In
 * this case upper layer needs to queue the message buffer.
 *
 * @param dev structure of the opened device
 * @param cb callback function for OOB sleep mode handling called at tx start
 * and end
 * @param param parameter passed to cb when being called
 */
void ipc_uart_ns16550_set_tx_cb(struct device *dev, void (*cb)(bool, void*),
				void *param);

/**
 * Opens a UART channel for QRK/BLE Core IPC, and defines the callback function
 * for receiving IPC messages.
 *
 * @param channel IPC channel ID to use
 * @param cb      Callback to handle messages
 *
 * @return
 *         - Pointer to channel structure if success,
 *         - NULL if opening fails.
 */
void *ipc_uart_channel_open(int channel, int (*cb)(int chan, int request,
						   int len, void *data));

/**
 * The frame is a message.
 */
#define IPC_MSG_TYPE_MESSAGE 0x1

/**
 * Requests to free a message.
 */
#define IPC_MSG_TYPE_FREE    0x2

/**
 * Sets the MessageBox as synchronized.
 */
#define IPC_MSG_TYPE_SYNC    0x3

/**
 * Allocates a port.
 *
 * This request is always flowing from a slave to the master.
 */
#define IPC_REQUEST_ALLOC_PORT         0x10

/**
 * Registers a service.
 *
 * This request is always flowing from a slave to the master.
 */
#define IPC_REQUEST_REGISTER_SERVICE   0x11

/**
 * Unregisters a service.
 */
#define IPC_REQUEST_DEREGISTER_SERVICE 0x12

/**
 * The message is for test commands engine.
 */
#define IPC_REQUEST_REG_TCMD_ENGINE    0x13

/**
 * Registers a Service Manager Proxy to the Service Manager.
 *
 * This request always flow from a slave to the master.
 */
#define IPC_REQUEST_REGISTER_PROXY     0x14

/**
 * Notifies a panic (for log dump).
 */
#define IPC_PANIC_NOTIFICATION         0x15

/**
 * The message is for power management.
 */
#define IPC_REQUEST_POWER_MANAGEMENT   0x16

/**
 * Sends the log of a slave to the master (for log aggregation).
 */
#define IPC_REQUEST_LOGGER             0x17

/**
 * The message is for power management (deep sleep).
 */
#define IPC_REQUEST_INFRA_PM           0x18