Morse Micro IoT SDK  2.9.7
mmhal_wlan.h
1/*
2 * Copyright 2023 Morse Micro
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7
25#pragma once
26
27#include <stdbool.h>
28#include <stddef.h>
29#include <stdint.h>
30#include <time.h>
31#include "mmpkt.h"
32#include "mmwlan.h"
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38
42typedef void (*mmhal_irq_handler_t)(void);
43
56void mmhal_wlan_init(void);
57
67
79void mmhal_read_mac_addr(uint8_t *mac_addr);
80
85
90
100
107
117
162{
164 const uint8_t *buf;
166 uint32_t len;
175 void (*free_cb)(void *arg);
177 void *free_arg;
178};
179
182#define MMHAL_WLAN_FW_BCF_MIN_READ_LENGTH (4)
183
201void mmhal_wlan_read_bcf_file(uint32_t offset, uint32_t requested_len, struct mmhal_robuf *robuf);
202
219void mmhal_wlan_read_fw_file(uint32_t offset, uint32_t requested_len, struct mmhal_robuf *robuf);
220
221
240
245
253uint8_t mmhal_wlan_spi_rw(uint8_t data);
254
261void mmhal_wlan_spi_read_buf(uint8_t *buf, unsigned len);
262
271void mmhal_wlan_spi_write_buf(const uint8_t *buf, unsigned len);
272
281
293
303
310
320
330
339
359
362{
365};
366
373
380
387
393{
404};
405
422struct mmpkt *mmhal_wlan_alloc_mmpkt_for_tx(uint8_t pkt_class,
423 uint32_t space_at_start, uint32_t space_at_end,
424 uint32_t metadata_length);
425
441struct mmpkt *mmhal_wlan_alloc_mmpkt_for_rx(uint8_t pkt_class,
442 uint32_t capacity, uint32_t metadata_length);
443
450#define MMHAL_WLAN_MMPKT_TX_MAX_SIZE (1664)
451
456#define MMHAL_WLAN_MMPKT_RX_MAX_SIZE (1668)
457
461#ifndef MMPKTMEM_TX_POOL_N_BLOCKS
462#define MMPKTMEM_TX_POOL_N_BLOCKS (20)
463#endif
464
470#ifndef MMPKTMEM_RX_POOL_N_BLOCKS
471#define MMPKTMEM_RX_POOL_N_BLOCKS (23)
472#endif
473
474
488{
507};
508
515
528int mmhal_wlan_sdio_cmd(uint8_t cmd_idx, uint32_t arg, uint32_t *rsp);
529
534{
537 uint32_t sdio_arg;
539 const uint8_t *data;
548 uint16_t block_size;
549};
550
559
564{
567 uint32_t sdio_arg;
569 uint8_t *data;
578 uint16_t block_size;
579};
580
589
590
600/*
601 * SDIO argument definition, per SDIO Specification Version 4.10, Part E1, Section 5.3.
602 */
603
606{
608 MMHAL_SDIO_WRITE = (1ul << 31),
609};
610
613{
614 MMHAL_SDIO_FUNCTION_0 = 0,
615 MMHAL_SDIO_FUNCTION_1 = (1ul << 28),
616 MMHAL_SDIO_FUNCTION_2 = (2ul << 28),
617};
618
621{
622 MMHAL_SDIO_MODE_BYTE = 0,
623 MMHAL_SDIO_MODE_BLOCK = (1ul << 27),
624};
625
628{
633};
634
636#define MMHAL_SDIO_ADDRESS_OFFSET (9)
638#define MMHAL_SDIO_ADDRESS_MAX ((1ul << 18) - 1)
639
641#define MMHAL_SDIO_COUNT_OFFSET (0)
643#define MMHAL_SDIO_COUNT_MAX ((1ul << 10) - 1)
644
646#define MMHAL_SDIO_CMD52_DATA_OFFSET (0)
647
659static inline uint32_t mmhal_make_cmd52_arg(enum mmhal_sdio_rw rw, enum mmhal_sdio_function fn,
660 uint32_t address, uint8_t write_data)
661{
662 uint32_t arg;
663
664 arg = rw | fn;
665 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
666 arg |= (write_data << MMHAL_SDIO_CMD52_DATA_OFFSET);
667 return arg;
668}
669
684static inline uint32_t mmhal_make_cmd53_arg(enum mmhal_sdio_rw rw, enum mmhal_sdio_function fn,
685 enum mmhal_sdio_mode mode, uint32_t address,
686 uint16_t count)
687{
688 uint32_t arg;
689
690 arg = rw | fn | MMHAL_SDIO_OPCODE_INC_ADDR | mode;
691 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
692 arg |= (count << MMHAL_SDIO_COUNT_OFFSET);
693 return arg;
694}
695
701#ifdef __cplusplus
702}
703#endif
704
void(* mmhal_wlan_pktmem_tx_flow_control_cb_t)(void)
Flow control callback that can be invoked by the transmit packet memory manager to pause and resume t...
Definition: mmhal_wlan.h:358
enum mmwlan_tx_flow_control_state mmhal_wlan_pktmem_tx_flow_control_state(void)
Gets the current TX flow control state.
struct mmpkt * mmhal_wlan_alloc_mmpkt_for_tx(uint8_t pkt_class, uint32_t space_at_start, uint32_t space_at_end, uint32_t metadata_length)
Allocates an mmpkt for transmission.
void mmhal_wlan_pktmem_init(struct mmhal_wlan_pktmem_init_args *args)
Invoked by the driver to initialize the packet memory in the HAL.
mmhal_wlan_pkt_class
Enumeration of packet classes used by mmhal_wlan_alloc_mmpkt_for_tx().
Definition: mmhal_wlan.h:393
void mmhal_wlan_pktmem_deinit(void)
Invoked by the driver to deinitialize the packet memory in the HAL.
struct mmpkt * mmhal_wlan_alloc_mmpkt_for_rx(uint8_t pkt_class, uint32_t capacity, uint32_t metadata_length)
Allocates an mmpkt for reception.
@ MMHAL_WLAN_PKT_DATA_TID4
Data TID4.
Definition: mmhal_wlan.h:398
@ MMHAL_WLAN_PKT_DATA_TID7
Data TID7.
Definition: mmhal_wlan.h:401
@ MMHAL_WLAN_PKT_DATA_TID6
Data TID6.
Definition: mmhal_wlan.h:400
@ MMHAL_WLAN_PKT_MANAGEMENT
802.11 Management and other important frames
Definition: mmhal_wlan.h:402
@ MMHAL_WLAN_PKT_COMMAND
Commands from driver to chip.
Definition: mmhal_wlan.h:403
@ MMHAL_WLAN_PKT_DATA_TID5
Data TID5.
Definition: mmhal_wlan.h:399
@ MMHAL_WLAN_PKT_DATA_TID2
Data TID2.
Definition: mmhal_wlan.h:396
@ MMHAL_WLAN_PKT_DATA_TID3
Data TID3.
Definition: mmhal_wlan.h:397
@ MMHAL_WLAN_PKT_DATA_TID0
Data TID0.
Definition: mmhal_wlan.h:394
@ MMHAL_WLAN_PKT_DATA_TID1
Data TID1.
Definition: mmhal_wlan.h:395
mmhal_sdio_opcode
SDIO CMD53 OP code.
Definition: mmhal_wlan.h:628
static uint32_t mmhal_make_cmd53_arg(enum mmhal_sdio_rw rw, enum mmhal_sdio_function fn, enum mmhal_sdio_mode mode, uint32_t address, uint16_t count)
Construct an SDIO CMD53 argument based on the given arguments.
Definition: mmhal_wlan.h:684
static uint32_t mmhal_make_cmd52_arg(enum mmhal_sdio_rw rw, enum mmhal_sdio_function fn, uint32_t address, uint8_t write_data)
Construct an SDIO CMD52 argument based on the given arguments.
Definition: mmhal_wlan.h:659
mmhal_sdio_mode
SDIO CMD53 block mode.
Definition: mmhal_wlan.h:621
mmhal_sdio_rw
SDIO CMD52/CMD53 R/W flag.
Definition: mmhal_wlan.h:606
#define MMHAL_SDIO_CMD52_DATA_OFFSET
CMD52 Data (8 bit) offset.
Definition: mmhal_wlan.h:646
mmhal_sdio_function
SDIO CMD52/CMD53 function number.
Definition: mmhal_wlan.h:613
#define MMHAL_SDIO_COUNT_OFFSET
CMD53 Byte/block count offset (9 bit).
Definition: mmhal_wlan.h:641
#define MMHAL_SDIO_ADDRESS_OFFSET
CMD52/53 Register Address (17 bit) offset.
Definition: mmhal_wlan.h:636
@ MMHAL_SDIO_OPCODE_INC_ADDR
Increment address by 1 after each byte.
Definition: mmhal_wlan.h:632
@ MMHAL_SDIO_OPCODE_FIXED_ADDR
Operate on a single, fixed address.
Definition: mmhal_wlan.h:630
@ MMHAL_SDIO_MODE_BLOCK
Byte mode.
Definition: mmhal_wlan.h:623
@ MMHAL_SDIO_READ
Read operation.
Definition: mmhal_wlan.h:607
@ MMHAL_SDIO_WRITE
Write operation.
Definition: mmhal_wlan.h:608
@ MMHAL_SDIO_FUNCTION_1
Function 0.
Definition: mmhal_wlan.h:615
@ MMHAL_SDIO_FUNCTION_2
Function 1.
Definition: mmhal_wlan.h:616
int mmhal_wlan_sdio_cmd53_read(const struct mmhal_wlan_sdio_cmd53_read_args *args)
Execute an SDIO CMD53 read.
mmhal_sdio_error_codes
Enumeration of error codes that may be returned from mmhal_wlan_sdio_XXX() functions.
Definition: mmhal_wlan.h:488
int mmhal_wlan_sdio_cmd53_write(const struct mmhal_wlan_sdio_cmd53_write_args *args)
Execute an SDIO CMD53 write.
int mmhal_wlan_sdio_cmd(uint8_t cmd_idx, uint32_t arg, uint32_t *rsp)
Execute an SDIO command without data.
int mmhal_wlan_sdio_startup(void)
Perform transport specific startup.
@ MMHAL_SDIO_INVALID_ARGUMENT
Invalid argument given (e.g., incorrect buffer alignment).
Definition: mmhal_wlan.h:490
@ MMHAL_SDIO_HW_ERROR
Local hardware error (e.g., issue with SDIO controller).
Definition: mmhal_wlan.h:492
@ MMHAL_SDIO_CMD_CRC_ERROR
CRC error executing SDIO command.
Definition: mmhal_wlan.h:496
@ MMHAL_SDIO_DATA_OVERRUN
Overflow reading from SDIO controller FIFO.
Definition: mmhal_wlan.h:504
@ MMHAL_SDIO_DATA_UNDERFLOW
Underflow filling SDIO controller FIFO.
Definition: mmhal_wlan.h:502
@ MMHAL_SDIO_OTHER_ERROR
Another error not covered by the above error codes.
Definition: mmhal_wlan.h:506
@ MMHAL_SDIO_DATA_TIMEOUT
Timeout transferring data.
Definition: mmhal_wlan.h:498
@ MMHAL_SDIO_DATA_CRC_ERROR
CRC error transferring data.
Definition: mmhal_wlan.h:500
@ MMHAL_SDIO_CMD_TIMEOUT
Timeout executing SDIO command.
Definition: mmhal_wlan.h:494
void mmhal_wlan_register_spi_irq_handler(mmhal_irq_handler_t handler)
Register a handler for SPI interrupts.
bool mmhal_wlan_ext_xtal_init_is_required(void)
Invoked by the driver to check whether the external crystal initialization sequence is required.
void mmhal_wlan_set_spi_irq_enabled(bool enabled)
Sets whether the SPI interrupt is enabled.
uint8_t mmhal_wlan_spi_rw(uint8_t data)
Simultaneously read and write on the SPI bus.
void mmhal_wlan_clear_spi_irq(void)
Clear the SPI IRQ.
void mmhal_wlan_spi_cs_assert(void)
Assert the WLAN SPI chip select pin.
void mmhal_wlan_send_training_seq(void)
Issue the training sequence.
void mmhal_wlan_spi_read_buf(uint8_t *buf, unsigned len)
Receive multiple octets of data from SPI bus.
bool mmhal_wlan_spi_irq_is_asserted(void)
Tests whether the SPI interrupt pin is currently asserted.
void mmhal_wlan_spi_cs_deassert(void)
Deassert the WLAN SPI chip select pin.
void mmhal_wlan_spi_write_buf(const uint8_t *buf, unsigned len)
Transmit multiple octets of data to SPI bus.
void mmhal_wlan_hard_reset(void)
Hard reset the chip by asserting and then releasing the reset pin.
void mmhal_wlan_wake_deassert(void)
Deassert the WLAN wake pin.
void mmhal_wlan_wake_assert(void)
Assert the WLAN wake pin.
void mmhal_wlan_read_bcf_file(uint32_t offset, uint32_t requested_len, struct mmhal_robuf *robuf)
Retrieves the content of the Morse Micro Board Configuration File and places it into the given buffer...
void mmhal_wlan_register_busy_irq_handler(mmhal_irq_handler_t handler)
Register a handler for busy interrupts.
void mmhal_wlan_deinit(void)
Deinitialize the WLAN HAL.
void mmhal_read_mac_addr(uint8_t *mac_addr)
Get MAC address override.
void mmhal_wlan_set_busy_irq_enabled(bool enabled)
Sets whether the busy interrupt is enabled.
bool mmhal_wlan_busy_is_asserted(void)
Tests whether the busy pin is currently asserted.
void(* mmhal_irq_handler_t)(void)
Function prototype for interrupt handler callbacks.
Definition: mmhal_wlan.h:42
void mmhal_wlan_init(void)
Initialize the WLAN HAL.
void mmhal_wlan_read_fw_file(uint32_t offset, uint32_t requested_len, struct mmhal_robuf *robuf)
Retrieves the content of the Morse Micro Chip Firmware and places it into the given buffer.
mmwlan_tx_flow_control_state
Enumeration of states that can be returned by the transmit flow control callback (as registered by mm...
Definition: mmwlan.h:2540
char buf[1408]
Statically allocated buffer for HTTP GET request, just under 1 packet size.
Definition: sslclient.c:177
Read-only buffer data structure.
Definition: mmhal_wlan.h:162
const uint8_t * buf
Pointer to the start of the read-only buffer.
Definition: mmhal_wlan.h:164
uint32_t len
Length of the buffer contents.
Definition: mmhal_wlan.h:166
void * free_arg
Optional argument to free_cb.
Definition: mmhal_wlan.h:177
void(* free_cb)(void *arg)
Optional callback to be invoked by the consumer to release the buffer when it is no longer required.
Definition: mmhal_wlan.h:175
Initialization arguments passed to mmhal_wlan_pktmem_init().
Definition: mmhal_wlan.h:362
mmhal_wlan_pktmem_tx_flow_control_cb_t tx_flow_control_cb
Flow control callback that can be used by the transmit packet memory manager.
Definition: mmhal_wlan.h:364
Arguments structure for mmhal_wlan_sdio_cmd53_read().
Definition: mmhal_wlan.h:564
uint16_t block_size
If non-zero this indicates that the data should be transferred in block mode with the given block siz...
Definition: mmhal_wlan.h:578
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:567
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:572
uint8_t * data
Pointer to the data buffer to receive the data.
Definition: mmhal_wlan.h:569
Arguments structure for mmhal_wlan_sdio_cmd53_write().
Definition: mmhal_wlan.h:534
const uint8_t * data
Pointer to the data buffer.
Definition: mmhal_wlan.h:539
uint16_t block_size
If non-zero this indicates that the data should be transferred in block mode with the given block siz...
Definition: mmhal_wlan.h:548
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:542
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:537
Core mmpkt data structure.
Definition: mmpkt.h:79