Morse Micro IoT SDK  2.6.4-esp32
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
298
305
315
325
334
356
359{
362};
363
370
377
383{
394};
395
412struct mmpkt *mmhal_wlan_alloc_mmpkt_for_tx(uint8_t pkt_class,
413 uint32_t space_at_start, uint32_t space_at_end,
414 uint32_t metadata_length);
415
425struct mmpkt *mmhal_wlan_alloc_mmpkt_for_rx(uint32_t capacity, uint32_t metadata_length);
426
442{
461};
462
469
482int mmhal_wlan_sdio_cmd(uint8_t cmd_idx, uint32_t arg, uint32_t *rsp);
483
488{
491 uint32_t sdio_arg;
493 const uint8_t *data;
502 uint16_t block_size;
503};
504
513
518{
521 uint32_t sdio_arg;
523 uint8_t *data;
532 uint16_t block_size;
533};
534
543
544
554/*
555 * SDIO argument definition, per SDIO Specification Version 4.10, Part E1, Section 5.3.
556 */
557
560{
562 MMHAL_SDIO_WRITE = (1ul << 31),
563};
564
567{
568 MMHAL_SDIO_FUNCTION_0 = 0,
569 MMHAL_SDIO_FUNCTION_1 = (1ul << 28),
570 MMHAL_SDIO_FUNCTION_2 = (2ul << 28),
571};
572
575{
576 MMHAL_SDIO_MODE_BYTE = 0,
577 MMHAL_SDIO_MODE_BLOCK = (1ul << 27),
578};
579
582{
587};
588
590#define MMHAL_SDIO_ADDRESS_OFFSET (9)
592#define MMHAL_SDIO_ADDRESS_MAX ((1ul << 18) - 1)
593
595#define MMHAL_SDIO_COUNT_OFFSET (0)
597#define MMHAL_SDIO_COUNT_MAX ((1ul << 10) - 1)
598
600#define MMHAL_SDIO_CMD52_DATA_OFFSET (0)
601
613static inline uint32_t mmhal_make_cmd52_arg(enum mmhal_sdio_rw rw, enum mmhal_sdio_function fn,
614 uint32_t address, uint8_t write_data)
615{
616 uint32_t arg;
617
618 arg = rw | fn;
619 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
620 arg |= (write_data << MMHAL_SDIO_CMD52_DATA_OFFSET);
621 return arg;
622}
623
638static inline uint32_t mmhal_make_cmd53_arg(enum mmhal_sdio_rw rw, enum mmhal_sdio_function fn,
639 enum mmhal_sdio_mode mode, uint32_t address,
640 uint16_t count)
641{
642 uint32_t arg;
643
644 arg = rw | fn | MMHAL_SDIO_OPCODE_INC_ADDR | mode;
645 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
646 arg |= (count << MMHAL_SDIO_COUNT_OFFSET);
647 return arg;
648}
649
655#ifdef __cplusplus
656}
657#endif
658
void(* mmhal_wlan_pktmem_tx_flow_control_cb_t)(enum mmwlan_tx_flow_control_state state)
Flow control callback that can be invoked by the transmit packet memory manager to pause and resume t...
Definition: mmhal_wlan.h:355
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:383
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(uint32_t capacity, uint32_t metadata_length)
Allocates an mmpkt for reception.
@ MMHAL_WLAN_PKT_DATA_TID4
Data TID4.
Definition: mmhal_wlan.h:388
@ MMHAL_WLAN_PKT_DATA_TID7
Data TID7.
Definition: mmhal_wlan.h:391
@ MMHAL_WLAN_PKT_DATA_TID6
Data TID6.
Definition: mmhal_wlan.h:390
@ MMHAL_WLAN_PKT_MANAGEMENT
802.11 Management and other important frames
Definition: mmhal_wlan.h:392
@ MMHAL_WLAN_PKT_COMMAND
Commands from driver to chip.
Definition: mmhal_wlan.h:393
@ MMHAL_WLAN_PKT_DATA_TID5
Data TID5.
Definition: mmhal_wlan.h:389
@ MMHAL_WLAN_PKT_DATA_TID2
Data TID2.
Definition: mmhal_wlan.h:386
@ MMHAL_WLAN_PKT_DATA_TID3
Data TID3.
Definition: mmhal_wlan.h:387
@ MMHAL_WLAN_PKT_DATA_TID0
Data TID0.
Definition: mmhal_wlan.h:384
@ MMHAL_WLAN_PKT_DATA_TID1
Data TID1.
Definition: mmhal_wlan.h:385
mmhal_sdio_opcode
SDIO CMD53 OP code.
Definition: mmhal_wlan.h:582
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:638
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:613
mmhal_sdio_mode
SDIO CMD53 block mode.
Definition: mmhal_wlan.h:575
mmhal_sdio_rw
SDIO CMD52/CMD53 R/W flag.
Definition: mmhal_wlan.h:560
#define MMHAL_SDIO_CMD52_DATA_OFFSET
CMD52 Data (8 bit) offset.
Definition: mmhal_wlan.h:600
mmhal_sdio_function
SDIO CMD52/CMD53 function number.
Definition: mmhal_wlan.h:567
#define MMHAL_SDIO_COUNT_OFFSET
CMD53 Byte/block count offset (9 bit).
Definition: mmhal_wlan.h:595
#define MMHAL_SDIO_ADDRESS_OFFSET
CMD52/53 Register Address (17 bit) offset.
Definition: mmhal_wlan.h:590
@ MMHAL_SDIO_OPCODE_INC_ADDR
Increment address by 1 after each byte.
Definition: mmhal_wlan.h:586
@ MMHAL_SDIO_OPCODE_FIXED_ADDR
Operate on a single, fixed address.
Definition: mmhal_wlan.h:584
@ MMHAL_SDIO_MODE_BLOCK
Byte mode.
Definition: mmhal_wlan.h:577
@ MMHAL_SDIO_READ
Read operation.
Definition: mmhal_wlan.h:561
@ MMHAL_SDIO_WRITE
Write operation.
Definition: mmhal_wlan.h:562
@ MMHAL_SDIO_FUNCTION_1
Function 0.
Definition: mmhal_wlan.h:569
@ MMHAL_SDIO_FUNCTION_2
Function 1.
Definition: mmhal_wlan.h:570
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:442
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:444
@ MMHAL_SDIO_HW_ERROR
Local hardware error (e.g., issue with SDIO controller).
Definition: mmhal_wlan.h:446
@ MMHAL_SDIO_CMD_CRC_ERROR
CRC error executing SDIO command.
Definition: mmhal_wlan.h:450
@ MMHAL_SDIO_DATA_OVERRUN
Overflow reading from SDIO controller FIFO.
Definition: mmhal_wlan.h:458
@ MMHAL_SDIO_DATA_UNDERFLOW
Underflow filling SDIO controller FIFO.
Definition: mmhal_wlan.h:456
@ MMHAL_SDIO_OTHER_ERROR
Another error not covered by the above error codes.
Definition: mmhal_wlan.h:460
@ MMHAL_SDIO_DATA_TIMEOUT
Timeout transferring data.
Definition: mmhal_wlan.h:452
@ MMHAL_SDIO_DATA_CRC_ERROR
CRC error transferring data.
Definition: mmhal_wlan.h:454
@ MMHAL_SDIO_CMD_TIMEOUT
Timeout executing SDIO command.
Definition: mmhal_wlan.h:448
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 required to put the transceiver into SPI mode.
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:2005
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:359
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:361
Arguments structure for mmhal_wlan_sdio_cmd53_read().
Definition: mmhal_wlan.h:518
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:532
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:521
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:526
uint8_t * data
Pointer to the data buffer to receive the data.
Definition: mmhal_wlan.h:523
Arguments structure for mmhal_wlan_sdio_cmd53_write().
Definition: mmhal_wlan.h:488
const uint8_t * data
Pointer to the data buffer.
Definition: mmhal_wlan.h:493
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:502
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:496
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:491
Core mmpkt data structure.
Definition: mmpkt.h:79