Morse Micro IoT SDK  2.10.4
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
297
309
319
326
336
346
355
374
377{
380};
381
388
395
402
408{
419};
420
437struct mmpkt *mmhal_wlan_alloc_mmpkt_for_tx(uint8_t pkt_class,
438 uint32_t space_at_start,
439 uint32_t space_at_end,
440 uint32_t metadata_length);
441
457struct mmpkt *mmhal_wlan_alloc_mmpkt_for_rx(uint8_t pkt_class,
458 uint32_t capacity,
459 uint32_t metadata_length);
460
467#ifndef MMHAL_WLAN_MMPKT_TX_MAX_SIZE
468#define MMHAL_WLAN_MMPKT_TX_MAX_SIZE (1668)
469#endif
470
475#ifndef MMHAL_WLAN_MMPKT_RX_MAX_SIZE
476#define MMHAL_WLAN_MMPKT_RX_MAX_SIZE (1672)
477#endif
478
482#ifndef MMPKTMEM_TX_POOL_N_BLOCKS
483#define MMPKTMEM_TX_POOL_N_BLOCKS (20)
484#endif
485
491#ifndef MMPKTMEM_RX_POOL_N_BLOCKS
492#define MMPKTMEM_RX_POOL_N_BLOCKS (23)
493#endif
494
508{
527};
528
535
548int mmhal_wlan_sdio_cmd(uint8_t cmd_idx, uint32_t arg, uint32_t *rsp);
549
554{
557 uint32_t sdio_arg;
559 const uint8_t *data;
568 uint16_t block_size;
569};
570
579
584{
587 uint32_t sdio_arg;
589 uint8_t *data;
598 uint16_t block_size;
599};
600
609
618/*
619 * SDIO argument definition, per SDIO Specification Version 4.10, Part E1, Section 5.3.
620 */
621
624{
626 MMHAL_SDIO_WRITE = (1ul << 31),
627};
628
631{
632 MMHAL_SDIO_FUNCTION_0 = 0,
633 MMHAL_SDIO_FUNCTION_1 = (1ul << 28),
634 MMHAL_SDIO_FUNCTION_2 = (2ul << 28),
635};
636
639{
640 MMHAL_SDIO_MODE_BYTE = 0,
641 MMHAL_SDIO_MODE_BLOCK = (1ul << 27),
642};
643
646{
651};
652
654#define MMHAL_SDIO_ADDRESS_OFFSET (9)
656#define MMHAL_SDIO_ADDRESS_MAX ((1ul << 18) - 1)
657
659#define MMHAL_SDIO_COUNT_OFFSET (0)
661#define MMHAL_SDIO_COUNT_MAX ((1ul << 10) - 1)
662
664#define MMHAL_SDIO_CMD52_DATA_OFFSET (0)
665
677static inline uint32_t mmhal_make_cmd52_arg(enum mmhal_sdio_rw rw,
678 enum mmhal_sdio_function fn,
679 uint32_t address,
680 uint8_t write_data)
681{
682 uint32_t arg;
683
684 arg = rw | fn;
685 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
686 arg |= (write_data << MMHAL_SDIO_CMD52_DATA_OFFSET);
687 return arg;
688}
689
704static inline uint32_t mmhal_make_cmd53_arg(enum mmhal_sdio_rw rw,
705 enum mmhal_sdio_function fn,
706 enum mmhal_sdio_mode mode,
707 uint32_t address,
708 uint16_t count)
709{
710 uint32_t arg;
711
712 arg = rw | fn | MMHAL_SDIO_OPCODE_INC_ADDR | mode;
713 arg |= (address << MMHAL_SDIO_ADDRESS_OFFSET);
714 arg |= (count << MMHAL_SDIO_COUNT_OFFSET);
715 return arg;
716}
717
722#ifdef __cplusplus
723}
724#endif
725
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:373
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:408
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:413
@ MMHAL_WLAN_PKT_DATA_TID7
Data TID7.
Definition: mmhal_wlan.h:416
@ MMHAL_WLAN_PKT_DATA_TID6
Data TID6.
Definition: mmhal_wlan.h:415
@ MMHAL_WLAN_PKT_MANAGEMENT
802.11 Management and other important frames
Definition: mmhal_wlan.h:417
@ MMHAL_WLAN_PKT_COMMAND
Commands from driver to chip.
Definition: mmhal_wlan.h:418
@ MMHAL_WLAN_PKT_DATA_TID5
Data TID5.
Definition: mmhal_wlan.h:414
@ MMHAL_WLAN_PKT_DATA_TID2
Data TID2.
Definition: mmhal_wlan.h:411
@ MMHAL_WLAN_PKT_DATA_TID3
Data TID3.
Definition: mmhal_wlan.h:412
@ MMHAL_WLAN_PKT_DATA_TID0
Data TID0.
Definition: mmhal_wlan.h:409
@ MMHAL_WLAN_PKT_DATA_TID1
Data TID1.
Definition: mmhal_wlan.h:410
mmhal_sdio_opcode
SDIO CMD53 OP code.
Definition: mmhal_wlan.h:646
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:704
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:677
mmhal_sdio_mode
SDIO CMD53 block mode.
Definition: mmhal_wlan.h:639
mmhal_sdio_rw
SDIO CMD52/CMD53 R/W flag.
Definition: mmhal_wlan.h:624
#define MMHAL_SDIO_CMD52_DATA_OFFSET
CMD52 Data (8 bit) offset.
Definition: mmhal_wlan.h:664
mmhal_sdio_function
SDIO CMD52/CMD53 function number.
Definition: mmhal_wlan.h:631
#define MMHAL_SDIO_COUNT_OFFSET
CMD53 Byte/block count offset (9 bit).
Definition: mmhal_wlan.h:659
#define MMHAL_SDIO_ADDRESS_OFFSET
CMD52/53 Register Address (17 bit) offset.
Definition: mmhal_wlan.h:654
@ MMHAL_SDIO_OPCODE_INC_ADDR
Increment address by 1 after each byte.
Definition: mmhal_wlan.h:650
@ MMHAL_SDIO_OPCODE_FIXED_ADDR
Operate on a single, fixed address.
Definition: mmhal_wlan.h:648
@ MMHAL_SDIO_MODE_BLOCK
Byte mode.
Definition: mmhal_wlan.h:641
@ MMHAL_SDIO_READ
Read operation.
Definition: mmhal_wlan.h:625
@ MMHAL_SDIO_WRITE
Write operation.
Definition: mmhal_wlan.h:626
@ MMHAL_SDIO_FUNCTION_1
Function 0.
Definition: mmhal_wlan.h:633
@ MMHAL_SDIO_FUNCTION_2
Function 1.
Definition: mmhal_wlan.h:634
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:508
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:510
@ MMHAL_SDIO_HW_ERROR
Local hardware error (e.g., issue with SDIO controller).
Definition: mmhal_wlan.h:512
@ MMHAL_SDIO_CMD_CRC_ERROR
CRC error executing SDIO command.
Definition: mmhal_wlan.h:516
@ MMHAL_SDIO_DATA_OVERRUN
Overflow reading from SDIO controller FIFO.
Definition: mmhal_wlan.h:524
@ MMHAL_SDIO_DATA_UNDERFLOW
Underflow filling SDIO controller FIFO.
Definition: mmhal_wlan.h:522
@ MMHAL_SDIO_OTHER_ERROR
Another error not covered by the above error codes.
Definition: mmhal_wlan.h:526
@ MMHAL_SDIO_DATA_TIMEOUT
Timeout transferring data.
Definition: mmhal_wlan.h:518
@ MMHAL_SDIO_DATA_CRC_ERROR
CRC error transferring data.
Definition: mmhal_wlan.h:520
@ MMHAL_SDIO_CMD_TIMEOUT
Timeout executing SDIO command.
Definition: mmhal_wlan.h:514
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.
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:2955
char buf[1408]
Statically allocated buffer for HTTP GET request, just under 1 packet size.
Definition: sslclient.c:176
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:377
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:379
Arguments structure for mmhal_wlan_sdio_cmd53_read().
Definition: mmhal_wlan.h:584
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:598
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:587
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:592
uint8_t * data
Pointer to the data buffer to receive the data.
Definition: mmhal_wlan.h:589
Arguments structure for mmhal_wlan_sdio_cmd53_write().
Definition: mmhal_wlan.h:554
const uint8_t * data
Pointer to the data buffer.
Definition: mmhal_wlan.h:559
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:568
uint16_t transfer_length
Transfer length measured in blocks if block_size is non-zero otherwise in bytes.
Definition: mmhal_wlan.h:562
uint32_t sdio_arg
The SDIO argument.
Definition: mmhal_wlan.h:557