Morse Micro IoT SDK  2.11.2
mmhal_wlan.h
1/*
2 * Copyright 2023 Morse Micro
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
24#pragma once
25
26#include <stdbool.h>
27#include <stddef.h>
28#include <stdint.h>
29#include <time.h>
30#include "mmpkt.h"
31#include "mmwlan.h"
32
33#ifdef __cplusplus
34extern "C"
35{
36#endif
37
41typedef void (*mmhal_irq_handler_t)(void);
42
55void mmhal_wlan_init(void);
56
66
68extern const struct mmhal_chip mmhal_mm6108;
69
71extern const struct mmhal_chip mmhal_mm8108;
72
83const struct mmhal_chip *mmhal_get_chip(void);
84
96void mmhal_read_mac_addr(uint8_t *mac_addr);
97
102
107
117
124
134
179{
181 const uint8_t *buf;
183 uint32_t len;
192 void (*free_cb)(void *arg);
194 void *free_arg;
195};
196
199#define MMHAL_WLAN_FW_BCF_MIN_READ_LENGTH (4)
200
218void mmhal_wlan_read_bcf_file(uint32_t offset, uint32_t requested_len, struct mmhal_robuf *robuf);
219
236void mmhal_wlan_read_fw_file(uint32_t offset, uint32_t requested_len, struct mmhal_robuf *robuf);
237
256
261
269uint8_t mmhal_wlan_spi_rw(uint8_t data);
270
277void mmhal_wlan_spi_read_buf(uint8_t *buf, unsigned len);
278
287void mmhal_wlan_spi_write_buf(const uint8_t *buf, unsigned len);
288
296void mmhal_wlan_assert_reset(bool assert_reset);
297
306
318
328
335
345
355
364
383
386{
389};
390
397
404
411
417{
428};
429
446struct mmpkt *mmhal_wlan_alloc_mmpkt_for_tx(uint8_t pkt_class,
447 uint32_t space_at_start,
448 uint32_t space_at_end,
449 uint32_t metadata_length);
450
466struct mmpkt *mmhal_wlan_alloc_mmpkt_for_rx(uint8_t pkt_class,
467 uint32_t capacity,
468 uint32_t metadata_length);
469
476#ifndef MMHAL_WLAN_MMPKT_TX_MAX_SIZE
477#define MMHAL_WLAN_MMPKT_TX_MAX_SIZE (1668)
478#endif
479
484#ifndef MMHAL_WLAN_MMPKT_RX_MAX_SIZE
485#define MMHAL_WLAN_MMPKT_RX_MAX_SIZE (1672)
486#endif
487
491#ifndef MMPKTMEM_TX_POOL_N_BLOCKS
492#define MMPKTMEM_TX_POOL_N_BLOCKS (20)
493#endif
494
500#ifndef MMPKTMEM_RX_POOL_N_BLOCKS
501#define MMPKTMEM_RX_POOL_N_BLOCKS (23)
502#endif
503
517{
536};
537
544
557int mmhal_wlan_sdio_cmd(uint8_t cmd_idx, uint32_t arg, uint32_t *rsp);
558
563{
566 uint32_t sdio_arg;
568 const uint8_t *data;
577 uint16_t block_size;
578};
579
588
593{
596 uint32_t sdio_arg;
598 uint8_t *data;
607 uint16_t block_size;
608};
609
618
627/*
628 * SDIO argument definition, per SDIO Specification Version 4.10, Part E1, Section 5.3.
629 */
630
633{
635 MMHAL_SDIO_WRITE = (1ul << 31),
636};
637
640{
641 MMHAL_SDIO_FUNCTION_0 = 0,
642 MMHAL_SDIO_FUNCTION_1 = (1ul << 28),
643 MMHAL_SDIO_FUNCTION_2 = (2ul << 28),
644};
645
648{
649 MMHAL_SDIO_MODE_BYTE = 0,
650 MMHAL_SDIO_MODE_BLOCK = (1ul << 27),
651};
652
655{
660};
661
663#define MMHAL_SDIO_ADDRESS_OFFSET (9)
665#define MMHAL_SDIO_ADDRESS_MAX ((1ul << 18) - 1)
666
668#define MMHAL_SDIO_COUNT_OFFSET (0)
670#define MMHAL_SDIO_COUNT_MAX ((1ul << 10) - 1)
671
673#define MMHAL_SDIO_CMD52_DATA_OFFSET (0)
674
686static inline uint32_t mmhal_make_cmd52_arg(enum mmhal_sdio_rw rw,
687 enum mmhal_sdio_function fn,
688 uint32_t address,
689 uint8_t write_data)
690{
691 uint32_t arg;
692
693 arg = rw | fn;
694 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
695 arg |= (write_data << MMHAL_SDIO_CMD52_DATA_OFFSET);
696 return arg;
697}
698
713static inline uint32_t mmhal_make_cmd53_arg(enum mmhal_sdio_rw rw,
714 enum mmhal_sdio_function fn,
715 enum mmhal_sdio_mode mode,
716 uint32_t address,
717 uint16_t count)
718{
719 uint32_t arg;
720
721 arg = rw | fn | MMHAL_SDIO_OPCODE_INC_ADDR | mode;
722 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
723 arg |= (count << MMHAL_SDIO_COUNT_OFFSET);
724 return arg;
725}
726
731#ifdef __cplusplus
732}
733#endif
734
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:382
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:417
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:422
@ MMHAL_WLAN_PKT_DATA_TID7
Data TID7.
Definition: mmhal_wlan.h:425
@ MMHAL_WLAN_PKT_DATA_TID6
Data TID6.
Definition: mmhal_wlan.h:424
@ MMHAL_WLAN_PKT_MANAGEMENT
802.11 Management and other important frames
Definition: mmhal_wlan.h:426
@ MMHAL_WLAN_PKT_COMMAND
Commands from driver to chip.
Definition: mmhal_wlan.h:427
@ MMHAL_WLAN_PKT_DATA_TID5
Data TID5.
Definition: mmhal_wlan.h:423
@ MMHAL_WLAN_PKT_DATA_TID2
Data TID2.
Definition: mmhal_wlan.h:420
@ MMHAL_WLAN_PKT_DATA_TID3
Data TID3.
Definition: mmhal_wlan.h:421
@ MMHAL_WLAN_PKT_DATA_TID0
Data TID0.
Definition: mmhal_wlan.h:418
@ MMHAL_WLAN_PKT_DATA_TID1
Data TID1.
Definition: mmhal_wlan.h:419
mmhal_sdio_opcode
SDIO CMD53 OP code.
Definition: mmhal_wlan.h:655
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:713
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:686
mmhal_sdio_mode
SDIO CMD53 block mode.
Definition: mmhal_wlan.h:648
mmhal_sdio_rw
SDIO CMD52/CMD53 R/W flag.
Definition: mmhal_wlan.h:633
#define MMHAL_SDIO_CMD52_DATA_OFFSET
CMD52 Data (8 bit) offset.
Definition: mmhal_wlan.h:673
mmhal_sdio_function
SDIO CMD52/CMD53 function number.
Definition: mmhal_wlan.h:640
#define MMHAL_SDIO_COUNT_OFFSET
CMD53 Byte/block count offset (9 bit).
Definition: mmhal_wlan.h:668
#define MMHAL_SDIO_ADDRESS_OFFSET
CMD52/53 Register Address (17 bit) offset.
Definition: mmhal_wlan.h:663
@ MMHAL_SDIO_OPCODE_INC_ADDR
Increment address by 1 after each byte.
Definition: mmhal_wlan.h:659
@ MMHAL_SDIO_OPCODE_FIXED_ADDR
Operate on a single, fixed address.
Definition: mmhal_wlan.h:657
@ MMHAL_SDIO_MODE_BLOCK
Byte mode.
Definition: mmhal_wlan.h:650
@ MMHAL_SDIO_READ
Read operation.
Definition: mmhal_wlan.h:634
@ MMHAL_SDIO_WRITE
Write operation.
Definition: mmhal_wlan.h:635
@ MMHAL_SDIO_FUNCTION_1
Function 0.
Definition: mmhal_wlan.h:642
@ MMHAL_SDIO_FUNCTION_2
Function 1.
Definition: mmhal_wlan.h:643
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:517
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:519
@ MMHAL_SDIO_HW_ERROR
Local hardware error (e.g., issue with SDIO controller).
Definition: mmhal_wlan.h:521
@ MMHAL_SDIO_CMD_CRC_ERROR
CRC error executing SDIO command.
Definition: mmhal_wlan.h:525
@ MMHAL_SDIO_DATA_OVERRUN
Overflow reading from SDIO controller FIFO.
Definition: mmhal_wlan.h:533
@ MMHAL_SDIO_DATA_UNDERFLOW
Underflow filling SDIO controller FIFO.
Definition: mmhal_wlan.h:531
@ MMHAL_SDIO_OTHER_ERROR
Another error not covered by the above error codes.
Definition: mmhal_wlan.h:535
@ MMHAL_SDIO_DATA_TIMEOUT
Timeout transferring data.
Definition: mmhal_wlan.h:527
@ MMHAL_SDIO_DATA_CRC_ERROR
CRC error transferring data.
Definition: mmhal_wlan.h:529
@ MMHAL_SDIO_CMD_TIMEOUT
Timeout executing SDIO command.
Definition: mmhal_wlan.h:523
void mmhal_wlan_register_spi_irq_handler(mmhal_irq_handler_t handler)
Register a handler for SPI interrupts.
void mmhal_wlan_assert_reset(bool assert_reset)
Put the WLAN transceiver into a reset state.
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.
const struct mmhal_chip mmhal_mm6108
Morse chip type: MM6108.
const struct mmhal_chip mmhal_mm8108
Morse chip type: MM8108.
const struct mmhal_chip * mmhal_get_chip(void)
Get the type of Morse chip that is in use.
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:41
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:2541
static unsigned char buf[1024]
Statically allocated buffer for MQTT.
Definition: mqttdemo.c:153
Read-only buffer data structure.
Definition: mmhal_wlan.h:179
const uint8_t * buf
Pointer to the start of the read-only buffer.
Definition: mmhal_wlan.h:181
uint32_t len
Length of the buffer contents.
Definition: mmhal_wlan.h:183
void * free_arg
Optional argument to free_cb.
Definition: mmhal_wlan.h:194
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:192
Initialization arguments passed to mmhal_wlan_pktmem_init().
Definition: mmhal_wlan.h:386
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:388
Arguments structure for mmhal_wlan_sdio_cmd53_read().
Definition: mmhal_wlan.h:593
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:607
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:596
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:601
uint8_t * data
Pointer to the data buffer to receive the data.
Definition: mmhal_wlan.h:598
Arguments structure for mmhal_wlan_sdio_cmd53_write().
Definition: mmhal_wlan.h:563
const uint8_t * data
Pointer to the data buffer.
Definition: mmhal_wlan.h:568
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:577
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:571
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:566
Core mmpkt data structure.
Definition: mmpkt.h:88