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

Implementation of the I3C Interface. More...

#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include "no_os_i3c.h"
#include "no_os_error.h"
#include "no_os_mutex.h"
#include "no_os_alloc.h"
Include dependency graph for no_os_i3c.c:

Functions

int no_os_i3c_init (struct no_os_i3c_desc **desc, const struct no_os_i3c_init_param *param)
 Initialize the I3C device. If the bus of the I3C device is not initialized, it will call to init it.
 
int no_os_i3c_init_bus (struct no_os_i3c_bus_desc **desc, const struct no_os_i3c_bus_init_param *param)
 Initialize the I3C bus.
 
int no_os_i3c_remove (struct no_os_i3c_desc *desc)
 Free the resources allocated by no_os_i3c_init().
 
int no_os_i3c_remove_bus (struct no_os_i3c_bus_desc *desc)
 Free the resources allocated by no_os_i3c_init_bus. Must remove all devices first, if not, -EBUSY is returned.
 
int no_os_i3c_do_daa (struct no_os_i3c_bus_desc *desc, bool rstdaa)
 Do DAA to assign the dynamic addresses.
 
int no_os_i3c_send_ccc (struct no_os_i3c_bus_desc *desc, uint8_t addr, uint32_t ccc, uint8_t *data)
 Send CCC, either to a device device or broadcast to all.
 
int no_os_i3c_send_direct_ccc (struct no_os_i3c_desc *desc, uint32_t ccc, uint8_t *data)
 Send CCC to device device.
 
int no_os_i3c_write (struct no_os_i3c_desc *desc, uint8_t *data, uint8_t size)
 Write data to device device.
 
int no_os_i3c_read (struct no_os_i3c_desc *desc, uint8_t *data, uint8_t size)
 Read data from device device.
 
int no_os_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)
 Read and write the device.
 
int no_os_i3c_conf_irq (struct no_os_i3c_bus_desc *desc, uint8_t irq, bool en)
 Configure I3C interrupts.
 
int no_os_i3c_async_irq (struct no_os_i3c_bus_desc *desc, bool en)
 Enable I3C non-blocking interrupts.
 
int no_os_i3c_wait_irq (struct no_os_i3c_bus_desc *desc, uint8_t irq)
 Wait I3C interrupt. Set async_irq on call to false to ensure single entry point.
 
int no_os_i3c_call_irq (struct no_os_i3c_bus_desc *desc)
 Non-blocking I3C interrupt. Since a payload is always retrieved with it, also update the no_os_i3c_ccc_info fields.
 
uint8_t no_os_i3c_addr_get_free (struct no_os_i3c_bus_desc *desc, uint8_t start_addr)
 Get a free address.
 
void no_os_i3c_addr_set_status (struct no_os_i3c_bus_desc *desc, uint8_t addr, enum no_os_i3c_slot_status status)
 Set status of an address.
 
void no_os_i3c_attach_callback (struct no_os_i3c_desc *desc, void(*callback)(struct no_os_i3c_desc *, uint32_t, uint32_t))
 Attach event callback.
 
void no_os_i3c_detach_callback (struct no_os_i3c_desc *desc)
 Detach event callback.
 
int32_t no_os_i3c_transfer_dma_async (struct no_os_i3c_desc *desc, struct no_os_i3c_msg *msgs, uint32_t len, void(*callback)(void *), void *ctx)
 Transfer a list of messages using DMA. Non-blocking, invokes a callback after the last message is concluded.
 
int32_t no_os_i3c_transfer_abort (struct no_os_i3c_desc *desc)
 Abort the ongoing DMA transaction.
 

Variables

struct no_os_i3c_bus_desc * i3c_table [NO_OS_I3C_MAX_BUS_NUMBER+1] = {NULL}
 i3c_table contains the pointers towards the I3C buses.
 

Detailed Description

Implementation of the I3C Interface.

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

◆ no_os_i3c_addr_get_free()

uint8_t no_os_i3c_addr_get_free ( struct no_os_i3c_bus_desc * desc,
uint8_t start_addr )

Get a free address.

Parameters
desc- The I3C bus descriptor.
start_addr- Start address to search from.
Returns
The free address or 0 if no address is available.

◆ no_os_i3c_addr_set_status()

void no_os_i3c_addr_set_status ( struct no_os_i3c_bus_desc * desc,
uint8_t addr,
enum no_os_i3c_slot_status status )

Set status of an address.

Parameters
desc- The I3C bus descriptor.
addr- The address to set.
status- The value to write.

◆ no_os_i3c_async_irq()

int no_os_i3c_async_irq ( struct no_os_i3c_bus_desc * desc,
bool en )

Enable I3C non-blocking interrupts.

Parameters
desc- The I3C descriptor.
en- 1 to enable, 0 to disable async callback.
Returns
0 in case of success, -EINVAL otherwise.

◆ no_os_i3c_attach_callback()

void no_os_i3c_attach_callback ( struct no_os_i3c_desc * desc,
void(* callback )(struct no_os_i3c_desc *, uint32_t, uint32_t) )

Attach event callback.

Parameters
desc- The I3C device descriptor.
callback- Method to call on event.

◆ no_os_i3c_call_irq()

int no_os_i3c_call_irq ( struct no_os_i3c_bus_desc * desc)

Non-blocking I3C interrupt. Since a payload is always retrieved with it, also update the no_os_i3c_ccc_info fields.

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

◆ no_os_i3c_conf_irq()

int no_os_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.
en- 1 to enable, 0 to disable irq type.
Returns
0 in case of success, -1 otherwise.

◆ no_os_i3c_detach_callback()

void no_os_i3c_detach_callback ( struct no_os_i3c_desc * desc)

Detach event callback.

Parameters
desc- The I3C device descriptor.

◆ no_os_i3c_do_daa()

int no_os_i3c_do_daa ( struct no_os_i3c_bus_desc * desc,
bool rstdaa )

Do DAA to assign the dynamic addresses.

Parameters
desc- The I3C descriptor.
rstdaa- Do RSTDAA CCC before the DAA.
Returns
0 in case of success, error code otherwise.

◆ no_os_i3c_init()

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

Initialize the I3C device. If the bus of the I3C device is not initialized, it will call to init it.

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

◆ no_os_i3c_init_bus()

int no_os_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 bus parameters.
Returns
0 in case of success, error code otherwise.

◆ no_os_i3c_read()

int no_os_i3c_read ( struct no_os_i3c_desc * desc,
uint8_t * data,
uint8_t size )

Read data from device device.

Parameters
desc- The I3C descriptor.
data- The buffer with the received data.
size- Number of bytes to read.
Returns
0 in case of success, error code otherwise.

◆ no_os_i3c_remove()

int no_os_i3c_remove ( struct no_os_i3c_desc * desc)

Free the resources allocated by no_os_i3c_init().

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

◆ no_os_i3c_remove_bus()

int no_os_i3c_remove_bus ( struct no_os_i3c_bus_desc * desc)

Free the resources allocated by no_os_i3c_init_bus. Must remove all devices first, if not, -EBUSY is returned.

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

◆ no_os_i3c_send_ccc()

int no_os_i3c_send_ccc ( struct no_os_i3c_bus_desc * desc,
uint8_t addr,
uint32_t ccc,
uint8_t * data )

Send CCC, either to a device device or broadcast to all.

Parameters
desc- The I3C descriptor.
addr- Device address or broadcast address.
ccc- CCC RnW, CCC Length, CCC ID.
data- The buffer with the transmitted/received data.
Returns
0 in case of success, error code otherwise.

◆ no_os_i3c_send_direct_ccc()

int no_os_i3c_send_direct_ccc ( struct no_os_i3c_desc * desc,
uint32_t ccc,
uint8_t * data )

Send CCC to device device.

Parameters
desc- The I3C descriptor.
ccc- CCC RnW, CCC length, CCC id.
data- The buffer with the transmitted/received data.
Returns
0 in case of success, error code otherwise.

◆ no_os_i3c_transfer_abort()

int32_t no_os_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.

◆ no_os_i3c_transfer_dma_async()

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

Transfer a list of messages using DMA. Non-blocking, invokes a callback after the last message is concluded.

Parameters
desc- The I3C descriptor.
msgs- The list of messages to transfer.
len- The number of messages to transfer.
callback- The callback to invoke after the transfer is concluded.
ctx- The context to pass to the callback.
Returns
0 in case of success, errno codes otherwise.

◆ no_os_i3c_wait_irq()

int no_os_i3c_wait_irq ( struct no_os_i3c_bus_desc * desc,
uint8_t irq )

Wait I3C interrupt. Set async_irq on call to false to ensure single entry point.

Parameters
desc- The I3C descriptor.
irq- The interrupt to wait for.
Returns
0 in case of success, -EINVAL if in async mode or error codes.

◆ no_os_i3c_write()

int no_os_i3c_write ( struct no_os_i3c_desc * desc,
uint8_t * data,
uint8_t size )

Write data to device device.

Parameters
desc- The I3C descriptor.
data- The buffer with the transmitted data.
size- Number of bytes to write.
Returns
0 in case of success, error code otherwise.

◆ no_os_i3c_write_and_read()

int no_os_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 )

Read and write the device.

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, -1 otherwise.

Variable Documentation

◆ i3c_table

i3c_table contains the pointers towards the I3C buses.