no-OS
Loading...
Searching...
No Matches
stm32_i3c.c File Reference

Implementation of stm32 I3C driver. More...

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "no_os_util.h"
#include "no_os_alloc.h"
#include "no_os_i3c.h"
#include "stm32_i3c.h"
#include "stm32_dma.h"
Include dependency graph for stm32_i3c.c:

Classes

struct  stm32_i3c_dma_ctx
 STM32 platform specific I3C DMA context descriptor. More...
 

Functions

void stm32_i3c_dma_callback (struct no_os_dma_xfer_desc *old_xfer, struct no_os_dma_xfer_desc *next_xfer, void *ctx)
 DMA callback handler.
 
void HAL_I3C_TgtReqDynamicAddrCallback (I3C_HandleTypeDef *hi3c, uint64_t targetPayload)
 I3C target request a dynamic address callback. When called, assigns a dynamic address to the target.
 
void HAL_I3C_CtrlDAACpltCallback (I3C_HandleTypeDef *hi3c)
 Controller dynamic address assignment Complete callback.
 
void HAL_I3C_CtrlTxCpltCallback (I3C_HandleTypeDef *hi3c)
 Controller Transmit Complete callback.
 
void HAL_I3C_CtrlRxCpltCallback (I3C_HandleTypeDef *hi3c)
 Controller Reception Complete callback.
 
void HAL_I3C_ErrorCallback (I3C_HandleTypeDef *hi3c)
 
void HAL_I3C_CtrlMultipleXferCpltCallback (I3C_HandleTypeDef *hi3c)
 
void HAL_I3C_NotifyCallback (I3C_HandleTypeDef *hi3c, uint32_t eventId)
 
int stm32_i3c_init (struct no_os_i3c_desc *desc, const struct no_os_i3c_init_param *param)
 Initialize the I3C device.
 
int stm32_i3c_init_bus (struct no_os_i3c_bus_desc *desc, const struct no_os_i3c_bus_init_param *param)
 Initialize the I3C bus.
 
int stm32_i3c_do_daa (struct no_os_i3c_bus_desc *desc, bool rstdaa)
 Do I3C DAA to assign the dynamic addresses.
 
int stm32_i3c_remove (struct no_os_i3c_desc *desc)
 Free the resources allocated by stm32_i3c_init().
 
int stm32_i3c_remove_bus (struct no_os_i3c_bus_desc *desc)
 Deinit I3C bus and free resources allocated by stm32_i3c_init_bus().
 
int stm32_i3c_send_ccc (struct no_os_i3c_bus_desc *desc, uint8_t addr, uint8_t id, bool rnw, bool defining, uint8_t *data, uint8_t size)
 Send CCC as bus. Retrieve data is only valid for unicast commands. Multi frames are not supported such as:
 
int stm32_i3c_write (struct no_os_i3c_desc *desc, uint8_t *data, uint8_t data_len)
 I3C private write transaction as bus.
 
int stm32_i3c_read (struct no_os_i3c_desc *desc, uint8_t *data, uint8_t data_len)
 I3C private read transaction as bus.
 
int stm32_i3c_write_and_read (struct no_os_i3c_desc *desc, uint8_t *tx_data, uint8_t tx_data_len, uint8_t *rx_data, uint8_t rx_data_len)
 I3C private write and read transaction as bus.
 
int stm32_i3c_is_dev_ready (struct no_os_i3c_desc *desc)
 Check if I3C device is ready.
 
int stm32_i3c_conf_irq (struct no_os_i3c_bus_desc *desc, uint8_t irq, bool en)
 Configure I3C interrupts.
 
int stm32_i3c_get_ccc_info (struct no_os_i3c_bus_desc *desc, uint8_t irq)
 Update I3C CCC info.
 
int32_t stm32_i3c_transfer_dma_async (struct no_os_i3c_desc *desc, struct no_os_i3c_msg *msgs, uint32_t len, void(*callback)(void *), void *ctx)
 Configure and start a series of transfers using DMA.
 
int32_t stm32_i3c_transfer_abort (struct no_os_i3c_desc *desc)
 Abort the ongoing DMA transaction.
 

Variables

volatile bool i3c_dma_cplt [NO_OS_I3C_MAX_BUS_NUMBER] = {false}
 
const struct no_os_i3c_platform_ops stm32_i3c_ops
 stm32 platform specific I3C platform ops structure.
 

Detailed Description

Implementation of stm32 I3C driver.

Author
Jorge Marques (jorge.nosp@m..mar.nosp@m.ques@.nosp@m.anal.nosp@m.og.co.nosp@m.m)

Copyright 2024(c) Analog Devices, Inc.

SPDX-License-Identifier: BSD-3-Clause

Function Documentation

◆ HAL_I3C_CtrlDAACpltCallback()

void HAL_I3C_CtrlDAACpltCallback ( I3C_HandleTypeDef * hi3c)

Controller dynamic address assignment Complete callback.

Parameters
hi3c- Pointer to an I3C_HandleTypeDef structure that contains the configuration information for the specified I3C.

◆ HAL_I3C_CtrlMultipleXferCpltCallback()

void HAL_I3C_CtrlMultipleXferCpltCallback ( I3C_HandleTypeDef * hi3c)

◆ HAL_I3C_CtrlRxCpltCallback()

void HAL_I3C_CtrlRxCpltCallback ( I3C_HandleTypeDef * hi3c)

Controller Reception Complete callback.

Parameters
hi3c- Pointer to an I3C_HandleTypeDef structure that contains the configuration information for the specified I3C.

◆ HAL_I3C_CtrlTxCpltCallback()

void HAL_I3C_CtrlTxCpltCallback ( I3C_HandleTypeDef * hi3c)

Controller Transmit Complete callback.

Parameters
hi3c- Pointer to an I3C_HandleTypeDef structure that contains the configuration information for the specified I3C.

◆ HAL_I3C_ErrorCallback()

void HAL_I3C_ErrorCallback ( I3C_HandleTypeDef * hi3c)

◆ HAL_I3C_NotifyCallback()

void HAL_I3C_NotifyCallback ( I3C_HandleTypeDef * hi3c,
uint32_t eventId )

◆ HAL_I3C_TgtReqDynamicAddrCallback()

void HAL_I3C_TgtReqDynamicAddrCallback ( I3C_HandleTypeDef * hi3c,
uint64_t targetPayload )

I3C target request a dynamic address callback. When called, assigns a dynamic address to the target.

Parameters
hi3c- Pointer to an I3C_HandleTypeDef structure that contains the configuration information for the specified I3C.
targetPayload- The {BCR, DCR, PID} yielded by the device during the DAA.

◆ stm32_i3c_conf_irq()

int stm32_i3c_conf_irq ( struct no_os_i3c_bus_desc * desc,
uint8_t irq,
bool en )

Configure I3C interrupts.

Parameters
desc- The I3C descriptor.
irq- The interrupt type to enable/disable.
en- 1 to enable, 0 to disable irq type.
Returns
0 in case of success, error code otherwise.

◆ stm32_i3c_dma_callback()

void stm32_i3c_dma_callback ( struct no_os_dma_xfer_desc * old_xfer,
struct no_os_dma_xfer_desc * next_xfer,
void * ctx )

DMA callback handler.

Parameters
old_xfer- Completed DMA xfer descriptor.
next_xfer- DMA xfer descriptor to be configured.
ctx- The DMA callback context

◆ stm32_i3c_do_daa()

int stm32_i3c_do_daa ( struct no_os_i3c_bus_desc * desc,
bool rstdaa )

Do I3C DAA to assign the dynamic addresses.

Parameters
desc- The I3C bus descriptor.
rstdaa- Unassigned the DA of devices already assigned.
Returns
0 in case of success, error code otherwise.

◆ stm32_i3c_get_ccc_info()

int stm32_i3c_get_ccc_info ( struct no_os_i3c_bus_desc * desc,
uint8_t irq )

Update I3C CCC info.

Parameters
desc- The I3C descriptor.
irq- The interrupt type to update the field.
Returns
0 in case of success, error code otherwise.

◆ stm32_i3c_init()

int stm32_i3c_init ( struct no_os_i3c_desc * desc,
const struct no_os_i3c_init_param * param )

Initialize the I3C device.

Parameters
desc- The I3C device descriptor.
param- The structure that contains the I3C parameters (unused).
Returns
0 in case of success, error code otherwise.

◆ stm32_i3c_init_bus()

int stm32_i3c_init_bus ( struct no_os_i3c_bus_desc * desc,
const struct no_os_i3c_bus_init_param * param )

Initialize the I3C bus.

Parameters
desc- The I3C bus descriptor.
param- The structure that contains the I3C parameters.
Returns
0 in case of success, error code otherwise.

◆ stm32_i3c_is_dev_ready()

int stm32_i3c_is_dev_ready ( struct no_os_i3c_desc * desc)

Check if I3C device is ready.

Parameters
desc- The I3C descriptor.
Returns
0 in case of success, -EIO in case of error.

◆ stm32_i3c_read()

int stm32_i3c_read ( struct no_os_i3c_desc * desc,
uint8_t * data,
uint8_t data_len )

I3C private read transaction as bus.

Parameters
desc- The I3C descriptor.
data- The buffer where received data is to be stored.
data_len- Number of bytes to receive.
Returns
0 in case of success, -EINVAL or -EIO otherwise.

◆ stm32_i3c_remove()

int stm32_i3c_remove ( struct no_os_i3c_desc * desc)

Free the resources allocated by stm32_i3c_init().

Parameters
desc- The I3C device descriptor.
Returns
0 in case of success, -EINVAL otherwise.

◆ stm32_i3c_remove_bus()

int stm32_i3c_remove_bus ( struct no_os_i3c_bus_desc * desc)

Deinit I3C bus and free resources allocated by stm32_i3c_init_bus().

Parameters
desc- The I3C bus descriptor.
Returns
0 in case of success, -EINVAL otherwise.

◆ stm32_i3c_send_ccc()

int stm32_i3c_send_ccc ( struct no_os_i3c_bus_desc * desc,
uint8_t addr,
uint8_t id,
bool rnw,
bool defining,
uint8_t * data,
uint8_t size )

Send CCC as bus. Retrieve data is only valid for unicast commands. Multi frames are not supported such as:

  • Read CCCs with a defining bytes.
    Parameters
    desc- The I3C descriptor.
    addr- Address to send to.
    id- CCC ID.
    rnw- True if the CCC should retrieve data from the device.
    defining- Contain defining byte.
    data- The buffer with the data to transmit.
    size- Number of bytes in the buffer.
    Returns
    0 in case of success, error code otherwise.

◆ stm32_i3c_transfer_abort()

int32_t stm32_i3c_transfer_abort ( struct no_os_i3c_desc * desc)

Abort the ongoing DMA transaction.

Parameters
desc- The I3C descriptor.
Returns
0 in case of success, errno codes otherwise.

◆ stm32_i3c_transfer_dma_async()

int32_t stm32_i3c_transfer_dma_async ( struct no_os_i3c_desc * desc,
struct no_os_i3c_msg * msgs,
uint32_t len,
void(* callback )(void *),
void * ctx )

Configure and start a series of transfers using DMA.

Parameters
desc- The I3C descriptor.
msgs- The messages array.
len- Number of messages.
callback- Function to be invoked after transfers.
ctx- User defined parameter for the callback function.
Returns
0 in case of success, errno codes otherwise.

◆ stm32_i3c_write()

int stm32_i3c_write ( struct no_os_i3c_desc * desc,
uint8_t * data,
uint8_t data_len )

I3C private write transaction as bus.

Parameters
desc- The I3C descriptor.
data- The buffer with the data to transmit.
data_len- Number of bytes in the buffer.
Returns
0 in case of success, -EINVAL or -EIO otherwise.

◆ stm32_i3c_write_and_read()

int stm32_i3c_write_and_read ( struct no_os_i3c_desc * desc,
uint8_t * tx_data,
uint8_t tx_data_len,
uint8_t * rx_data,
uint8_t rx_data_len )

I3C private write and read transaction as bus.

Parameters
desc- The I3C descriptor.
tx_data- The buffer with the transmitted data.
tx_data_len- Number of bytes to write.
rx_data- The buffer with the received data.
rx_data_len- Number of bytes to read.
Returns
0 in case of success, -EINVAL or -EIO otherwise.

Variable Documentation

◆ i3c_dma_cplt

volatile bool i3c_dma_cplt[NO_OS_I3C_MAX_BUS_NUMBER] = {false}

◆ stm32_i3c_ops

const struct no_os_i3c_platform_ops stm32_i3c_ops
Initial value:
= {
.i3c_ops_init_bus = &stm32_i3c_init_bus,
.i3c_ops_init = &stm32_i3c_init,
.i3c_ops_do_daa = &stm32_i3c_do_daa,
.i3c_ops_send_ccc = &stm32_i3c_send_ccc,
.i3c_ops_write = &stm32_i3c_write,
.i3c_ops_read = &stm32_i3c_read,
.i3c_ops_write_and_read = &stm32_i3c_write_and_read,
.i3c_ops_remove_bus = &stm32_i3c_remove_bus,
.i3c_ops_remove = &stm32_i3c_remove,
.i3c_ops_is_dev_ready = &stm32_i3c_is_dev_ready,
.i3c_ops_conf_irq = &stm32_i3c_conf_irq,
.i3c_ops_get_ccc_info = &stm32_i3c_get_ccc_info,
.i3c_ops_transfer_dma_async = &stm32_i3c_transfer_dma_async,
.i3c_ops_transfer_abort = &stm32_i3c_transfer_abort,
}
int stm32_i3c_get_ccc_info(struct no_os_i3c_bus_desc *desc, uint8_t irq)
Update I3C CCC info.
Definition stm32_i3c.c:614
int32_t stm32_i3c_transfer_abort(struct no_os_i3c_desc *desc)
Abort the ongoing DMA transaction.
Definition stm32_i3c.c:818
int stm32_i3c_write(struct no_os_i3c_desc *desc, uint8_t *data, uint8_t data_len)
I3C private write transaction as bus.
Definition stm32_i3c.c:426
int stm32_i3c_write_and_read(struct no_os_i3c_desc *desc, uint8_t *tx_data, uint8_t tx_data_len, uint8_t *rx_data, uint8_t rx_data_len)
I3C private write and read transaction as bus.
Definition stm32_i3c.c:510
int stm32_i3c_remove_bus(struct no_os_i3c_bus_desc *desc)
Deinit I3C bus and free resources allocated by stm32_i3c_init_bus().
Definition stm32_i3c.c:299
int stm32_i3c_read(struct no_os_i3c_desc *desc, uint8_t *data, uint8_t data_len)
I3C private read transaction as bus.
Definition stm32_i3c.c:468
int stm32_i3c_init_bus(struct no_os_i3c_bus_desc *desc, const struct no_os_i3c_bus_init_param *param)
Initialize the I3C bus.
Definition stm32_i3c.c:210
int stm32_i3c_is_dev_ready(struct no_os_i3c_desc *desc)
Check if I3C device is ready.
Definition stm32_i3c.c:552
int stm32_i3c_init(struct no_os_i3c_desc *desc, const struct no_os_i3c_init_param *param)
Initialize the I3C device.
Definition stm32_i3c.c:181
int stm32_i3c_do_daa(struct no_os_i3c_bus_desc *desc, bool rstdaa)
Do I3C DAA to assign the dynamic addresses.
Definition stm32_i3c.c:256
int stm32_i3c_remove(struct no_os_i3c_desc *desc)
Free the resources allocated by stm32_i3c_init().
Definition stm32_i3c.c:281
int32_t stm32_i3c_transfer_dma_async(struct no_os_i3c_desc *desc, struct no_os_i3c_msg *msgs, uint32_t len, void(*callback)(void *), void *ctx)
Configure and start a series of transfers using DMA.
Definition stm32_i3c.c:656
int stm32_i3c_send_ccc(struct no_os_i3c_bus_desc *desc, uint8_t addr, uint8_t id, bool rnw, bool defining, uint8_t *data, uint8_t size)
Send CCC as bus. Retrieve data is only valid for unicast commands. Multi frames are not supported suc...
Definition stm32_i3c.c:330
int stm32_i3c_conf_irq(struct no_os_i3c_bus_desc *desc, uint8_t irq, bool en)
Configure I3C interrupts.
Definition stm32_i3c.c:573

stm32 platform specific I3C platform ops structure.

STM32 specific I3C platform ops structure.