libnx/nx/include/switch/services/uart.h
2023-10-21 00:18:04 +02:00

252 lines
8.8 KiB
C

/**
* @file uart.h
* @brief UART service IPC wrapper.
* @author yellows8
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../kernel/event.h"
#include "../sf/service.h"
/// UartPort
typedef enum {
UartPort_Bluetooth = 1, ///< Bluetooth
UartPort_JoyConR = 2, ///< Joy-Con(R)
UartPort_JoyConL = 3, ///< Joy-Con(L)
UartPort_MCU = 4, ///< MCU
} UartPort;
/// UartPortForDev
typedef enum {
UartPortForDev_JoyConR = 1, ///< Joy-Con(R)
UartPortForDev_JoyConL = 2, ///< Joy-Con(L)
UartPortForDev_Bluetooth = 3, ///< Bluetooth
} UartPortForDev;
/// FlowControlMode
typedef enum {
UartFlowControlMode_None = 0, ///< None
UartFlowControlMode_Hardware = 1, ///< Hardware
} UartFlowControlMode;
/// PortEventType
typedef enum {
UartPortEventType_SendBufferEmpty = 0, ///< SendBufferEmpty
UartPortEventType_SendBufferReady = 1, ///< SendBufferReady
UartPortEventType_ReceiveBufferReady = 2, ///< ReceiveBufferReady
UartPortEventType_ReceiveEnd = 3, ///< ReceiveEnd
} UartPortEventType;
/// PortSession
typedef struct {
Service s; ///< IPortSession
} UartPortSession;
/// Initialize uart.
Result uartInitialize(void);
/// Exit uart.
void uartExit(void);
/// Gets the Service object for the actual uart service session.
Service* uartGetServiceSession(void);
/**
* @brief HasPort
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPort
* @param[out] out Output success flag.
*/
Result uartHasPort(UartPort port, bool *out);
/**
* @brief HasPortForDev
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPortForDev
* @param[out] out Output success flag.
*/
Result uartHasPortForDev(UartPortForDev port, bool *out);
/**
* @brief IsSupportedBaudRate
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPort
* @param[in] baud_rate BaudRate
* @param[out] out Output success flag.
*/
Result uartIsSupportedBaudRate(UartPort port, u32 baud_rate, bool *out);
/**
* @brief IsSupportedBaudRateForDev
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPortForDev
* @param[in] baud_rate BaudRate
* @param[out] out Output success flag.
*/
Result uartIsSupportedBaudRateForDev(UartPortForDev port, u32 baud_rate, bool *out);
/**
* @brief IsSupportedFlowControlMode
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPort
* @param[in] flow_control_mode \ref UartFlowControlMode
* @param[out] out Output success flag.
*/
Result uartIsSupportedFlowControlMode(UartPort port, UartFlowControlMode flow_control_mode, bool *out);
/**
* @brief IsSupportedFlowControlModeForDev
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPortForDev
* @param[in] flow_control_mode \ref UartFlowControlMode
* @param[out] out Output success flag.
*/
Result uartIsSupportedFlowControlModeForDev(UartPortForDev port, UartFlowControlMode flow_control_mode, bool *out);
/**
* @brief Creates an \ref UartPortSession.
* @note Use \ref uartPortSessionOpenPort or \ref uartPortSessionOpenPortForDev before using any other cmds.
* @param[out] s \ref UartPortSession
*/
Result uartCreatePortSession(UartPortSession *s);
/**
* @brief IsSupportedPortEvent
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPort
* @param[in] port_event_type \ref UartPortEventType
* @param[out] out Output success flag.
*/
Result uartIsSupportedPortEvent(UartPort port, UartPortEventType port_event_type, bool *out);
/**
* @brief IsSupportedPortEventForDev
* @note Only available on [1.0.0-16.1.0].
* @param[in] port \ref UartPortForDev
* @param[in] port_event_type \ref UartPortEventType
* @param[out] out Output success flag.
*/
Result uartIsSupportedPortEventForDev(UartPortForDev port, UartPortEventType port_event_type, bool *out);
/**
* @brief IsSupportedDeviceVariation
* @note Only available on [7.0.0-16.1.0].
* @param[in] port \ref UartPort
* @param[in] device_variation DeviceVariation
* @param[out] out Output success flag.
*/
Result uartIsSupportedDeviceVariation(UartPort port, u32 device_variation, bool *out);
/**
* @brief IsSupportedDeviceVariationForDev
* @note Only available on [7.0.0-16.1.0].
* @param[in] port \ref UartPortForDev
* @param[in] device_variation DeviceVariation
* @param[out] out Output success flag.
*/
Result uartIsSupportedDeviceVariationForDev(UartPortForDev port, u32 device_variation, bool *out);
///@name IPortSession
///@{
/**
* @brief Close an \ref UartPortSession.
* @param s \ref UartPortSession
*/
void uartPortSessionClose(UartPortSession* s);
/**
* @brief OpenPort
* @note This is not usable when the specified \ref UartPort is already being used.
* @param s \ref UartPortSession
* @param[out] out Output success flag.
* @param[in] port \ref UartPort
* @param[in] baud_rate BaudRate
* @param[in] flow_control_mode \ref UartFlowControlMode
* @param[in] device_variation [7.0.0+] DeviceVariation
* @param[in] is_invert_tx [6.0.0+] IsInvertTx
* @param[in] is_invert_rx [6.0.0+] IsInvertRx
* @param[in] is_invert_rts [6.0.0+] IsInvertRts
* @param[in] is_invert_cts [6.0.0+] IsInvertCts
* @param[in] send_buffer Send buffer, must be 0x1000-byte aligned.
* @param[in] send_buffer_length Send buffer size, must be 0x1000-byte aligned.
* @param[in] receive_buffer Receive buffer, must be 0x1000-byte aligned.
* @param[in] receive_buffer_length Receive buffer size, must be 0x1000-byte aligned.
*/
Result uartPortSessionOpenPort(UartPortSession* s, bool *out, UartPort port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length);
/**
* @brief OpenPortForDev
* @note See the notes for \ref uartPortSessionOpenPort.
* @param s \ref UartPortSession
* @param[out] out Output success flag.
* @param[in] port \ref UartPortForDev
* @param[in] baud_rate BaudRate
* @param[in] flow_control_mode \ref UartFlowControlMode
* @param[in] device_variation [7.0.0+] DeviceVariation
* @param[in] is_invert_tx [6.0.0+] IsInvertTx
* @param[in] is_invert_rx [6.0.0+] IsInvertRx
* @param[in] is_invert_rts [6.0.0+] IsInvertRts
* @param[in] is_invert_cts [6.0.0+] IsInvertCts
* @param[in] send_buffer Send buffer, must be 0x1000-byte aligned.
* @param[in] send_buffer_length Send buffer size, must be 0x1000-byte aligned.
* @param[in] receive_buffer Receive buffer, must be 0x1000-byte aligned.
* @param[in] receive_buffer_length Receive buffer size, must be 0x1000-byte aligned.
*/
Result uartPortSessionOpenPortForDev(UartPortSession* s, bool *out, UartPortForDev port, u32 baud_rate, UartFlowControlMode flow_control_mode, u32 device_variation, bool is_invert_tx, bool is_invert_rx, bool is_invert_rts, bool is_invert_cts, void* send_buffer, u64 send_buffer_length, void* receive_buffer, u64 receive_buffer_length);
/**
* @brief GetWritableLength
* @param s \ref UartPortSession
* @param[out] out Output WritableLength.
*/
Result uartPortSessionGetWritableLength(UartPortSession* s, u64 *out);
/**
* @brief Send
* @param s \ref UartPortSession
* @param[in] in_data Input data buffer.
* @param[in] size Input data buffer size.
* @param[out] out Output size.
*/
Result uartPortSessionSend(UartPortSession* s, const void* in_data, size_t size, u64 *out);
/**
* @brief GetReadableLength
* @param s \ref UartPortSession
* @param[out] out Output ReadableLength.
*/
Result uartPortSessionGetReadableLength(UartPortSession* s, u64 *out);
/**
* @brief Receive
* @param s \ref UartPortSession
* @param[out] out_data Output data buffer.
* @param[in] size Output data buffer size.
* @param[out] out Output size.
*/
Result uartPortSessionReceive(UartPortSession* s, void* out_data, size_t size, u64 *out);
/**
* @brief BindPortEvent
* @note The Event must be closed by the user after using \ref uartPortSessionUnbindPortEvent.
* @param s \ref UartPortSession
* @param[in] port_event_type \ref UartPortEventType
* @param[in] threshold Threshold
* @param[out] out Output success flag.
* @param[out] out_event Output Event with autoclear=false.
*/
Result uartPortSessionBindPortEvent(UartPortSession* s, UartPortEventType port_event_type, s64 threshold, bool *out, Event *out_event);
/**
* @brief UnbindPortEvent
* @param s \ref UartPortSession
* @param[in] port_event_type \ref UartPortEventType
* @param[out] out Output success flag.
*/
Result uartPortSessionUnbindPortEvent(UartPortSession* s, UartPortEventType port_event_type, bool *out);
///@}