12665a0dc1
This patch set provides support for T1S ethernet device - LAN8651. For SPI communication the implementation of Open Alliance TC6 specification is used. The driver implementation focuses mostly on reducing memory footprint, as the used SoC (STM32G491) for development has only 32 KiB RAM in total. Signed-off-by: Lukasz Majewski <lukma@denx.de>
78 lines
2.3 KiB
C
78 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2023 DENX Software Engineering GmbH
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef ETH_LAN865X_PRIV_H__
|
|
#define ETH_LAN865X_PRIV_H__
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/drivers/gpio.h>
|
|
#include <zephyr/drivers/spi.h>
|
|
#include <zephyr/net/net_if.h>
|
|
#include <ethernet/eth_stats.h>
|
|
#include "oa_tc6.h"
|
|
|
|
#define LAN865X_SPI_MAX_FREQUENCY 25000000U
|
|
#define LAN865X_HW_BOOT_DELAY_MS 7
|
|
#define LAN8650_DEVID 0x8650
|
|
#define LAN8651_DEVID 0x8651
|
|
#define LAN865X_REV_MASK GENMASK(3, 0)
|
|
#define LAN865X_RESET_TIMEOUT 10
|
|
|
|
/* Memory Map Sector (MMS) 1 (0x1) */
|
|
#define LAN865x_MAC_NCR MMS_REG(0x1, 0x000)
|
|
#define LAN865x_MAC_NCR_TXEN BIT(3)
|
|
#define LAN865x_MAC_NCR_RXEN BIT(2)
|
|
#define LAN865x_MAC_NCFGR MMS_REG(0x1, 0x001)
|
|
#define LAN865x_MAC_NCFGR_CAF BIT(4)
|
|
#define LAN865x_MAC_SAB1 MMS_REG(0x1, 0x022)
|
|
#define LAN865x_MAC_SAB2 MMS_REG(0x1, 0x024)
|
|
#define LAN865x_MAC_SAT2 MMS_REG(0x1, 0x025)
|
|
|
|
#define LAN865x_MAC_TXRX_ON 1
|
|
#define LAN865x_MAC_TXRX_OFF 0
|
|
|
|
/* Memory Map Sector (MMS) 10 (0xA) */
|
|
#define LAN865x_DEVID MMS_REG(0xA, 0x094)
|
|
|
|
struct lan865x_config {
|
|
struct spi_dt_spec spi;
|
|
struct gpio_dt_spec interrupt;
|
|
struct gpio_dt_spec reset;
|
|
int32_t timeout;
|
|
|
|
/* PLCA */
|
|
bool plca_enable : 1; /* 1 - PLCA enable, 0 - CSMA/CD enable */
|
|
uint8_t plca_node_id /* PLCA node id range: 0 to 254 */;
|
|
uint8_t plca_node_count; /* PLCA node count range: 1 to 255 */
|
|
uint8_t plca_burst_count; /* PLCA burst count range: 0x0 to 0xFF */
|
|
uint8_t plca_burst_timer; /* PLCA burst timer */
|
|
uint8_t plca_to_timer; /* PLCA TO value */
|
|
|
|
/* MAC */
|
|
bool tx_cut_through_mode; /* 1 - tx cut through, 0 - Store and forward */
|
|
bool rx_cut_through_mode; /* 1 - rx cut through, 0 - Store and forward */
|
|
};
|
|
|
|
struct lan865x_data {
|
|
struct net_if *iface;
|
|
struct gpio_callback gpio_int_callback;
|
|
struct k_sem tx_rx_sem;
|
|
struct k_sem int_sem;
|
|
struct oa_tc6 *tc6;
|
|
uint16_t chip_id;
|
|
uint8_t silicon_rev;
|
|
uint8_t mac_address[6];
|
|
bool iface_initialized;
|
|
bool reset;
|
|
|
|
K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_ETH_LAN865X_IRQ_THREAD_STACK_SIZE);
|
|
struct k_thread thread;
|
|
k_tid_t tid_int;
|
|
};
|
|
|
|
#endif /* ETH_LAN865X_PRIV_H__ */
|