ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_ether_phy.c
Go to the documentation of this file.
1
20
21#include "ra8_ether_phy.h"
22
23#include <stdint.h>
24
25#include "ra8_attributes.h"
26#include "ra8_check.h"
27#include "ra8_err.h"
28#include "ra8_log.h"
29
31static const char* s_tag = "EPHY";
32
37
49
58
60
84{
85 ra8_err_t err = s_state.io.write(s_state.io.ctx,
86 s_state.phy_address,
89 if (err != k_ra8_ok) {
90 return err;
91 }
92 for (uint8_t i = 0U; i < k_ra8_ether_phy_reset_poll_max; ++i) {
93 uint16_t reg = 0U;
94 err = s_state.io.read(s_state.io.ctx, s_state.phy_address, k_ra8_ether_phy_reg_control, &reg);
95 if (err != k_ra8_ok) {
96 return err;
97 }
98 if ((reg & k_ra8_ether_phy_bmcr_reset) == 0U) {
99 return k_ra8_ok;
100 }
101 }
103}
104
106{
107 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
108 RA8_CHECK_NULL_PTR(cfg->io.read, s_tag, "io.read required");
109 RA8_CHECK_NULL_PTR(cfg->io.write, s_tag, "io.write required");
112 }
113 if (s_state.opened) {
114 return k_ra8_err_exists;
115 }
116 s_state.opened = true;
117 s_state.phy_address = cfg->phy_address;
118 s_state.mii_type = cfg->mii_type;
119 s_state.reset_wait_us = cfg->reset_wait_us;
120 s_state.io = cfg->io;
121 s_state.last_bmsr = 0U;
122
123 /* Issue BMCR reset and poll for self-clear. */
125 if (err != k_ra8_ok) {
126 s_state.opened = false;
127 return err;
128 }
129 ra8_log_info_val(s_tag, "phy ready addr", (uint32_t)cfg->phy_address);
130 return k_ra8_ok;
131}
132
134{
135 if (!s_state.opened) {
137 }
138 s_state.opened = false;
139 return k_ra8_ok;
140}
141
142ra8_err_t ra8_ether_phy_mdio_read(uint8_t reg_addr, uint16_t* out_data)
143{
144 RA8_CHECK_NULL_PTR(out_data, s_tag, "out_data must not be nullptr");
145 if (!s_state.opened) {
147 }
148 if (reg_addr > k_ra8_ether_phy_reg_max) {
150 }
151 return s_state.io.read(s_state.io.ctx, s_state.phy_address, reg_addr, out_data);
152}
153
154ra8_err_t ra8_ether_phy_mdio_write(uint8_t reg_addr, uint16_t data)
155{
156 if (!s_state.opened) {
158 }
159 if (reg_addr > k_ra8_ether_phy_reg_max) {
161 }
162 return s_state.io.write(s_state.io.ctx, s_state.phy_address, reg_addr, data);
163}
164
166{
167 if (!s_state.opened) {
169 }
170 /* Re-arm AN: enable + restart. */
171 const uint16_t bmcr =
173 return s_state.io.write(s_state.io.ctx, s_state.phy_address, k_ra8_ether_phy_reg_control, bmcr);
174}
175
177{
178 RA8_CHECK_NULL_PTR(out, s_tag, "out must not be nullptr");
179 if (!s_state.opened) {
181 }
182 uint16_t bmsr = 0U;
183 ra8_err_t err =
184 s_state.io.read(s_state.io.ctx, s_state.phy_address, k_ra8_ether_phy_reg_status, &bmsr);
185 if (err != k_ra8_ok) {
186 return err;
187 }
188 s_state.last_bmsr = bmsr;
189 out->bmsr = bmsr;
190 out->link_up = (uint8_t)(((bmsr & k_ra8_ether_phy_bmsr_link_up) != 0U) ? 1U : 0U);
191 out->auto_neg_done = (uint8_t)(((bmsr & k_ra8_ether_phy_bmsr_an_complete) != 0U) ? 1U : 0U);
193 if ((out->link_up != 0U) && (out->auto_neg_done != 0U)) {
194 /* Inspect partner ability for resolved speed/duplex. */
195 uint16_t lpa = 0U;
196 err =
197 s_state.io.read(s_state.io.ctx, s_state.phy_address, k_ra8_ether_phy_reg_an_partner, &lpa);
198 if (err == k_ra8_ok) {
199 if ((lpa & k_ra8_ether_phy_anar_100full) != 0U) {
201 } else if ((lpa & k_ra8_ether_phy_anar_100half) != 0U) {
203 } else if ((lpa & k_ra8_ether_phy_anar_10full) != 0U) {
205 } else if ((lpa & k_ra8_ether_phy_anar_10half) != 0U) {
207 }
208 }
209 }
210 return k_ra8_ok;
211}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_err_exists
Item already exists – cannot create again.
Definition ra8_err.h:216
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
Definition ra8_err.h:161
@ k_ra8_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
Definition ra8_err.h:304
@ k_ra8_err_not_initialized
Module not initialized – _init() not yet called successfully.
Definition ra8_err.h:235
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
static ra8_err_t internal_reset_and_wait(void)
Issue BMCR.RESET to the PHY and poll until it self-clears.
ra8_err_t ra8_ether_phy_open(const ra8_ether_phy_cfg_t *cfg)
Open and reset a PHY.
ra8_err_t ra8_ether_phy_auto_negotiate_start(void)
Kick off auto-negotiation by re-arming BMCR.
ra8_ether_phy_priv_t
@ k_ra8_ether_phy_reset_poll_max
RA8 ether PHY reset poll maximum.
@ k_ra8_ether_phy_reg_max
RA8 ether PHY register maximum.
ra8_err_t ra8_ether_phy_link_status_get(ra8_ether_phy_link_t *out)
Poll the BMSR for auto-negotiation completion + link-up.
ra8_err_t ra8_ether_phy_close(void)
Close the driver.
ra8_ether_phy_bits_t
@ k_ra8_ether_phy_bmcr_an_enable
RA8 ether PHY bmcr an enable.
@ k_ra8_ether_phy_bmsr_an_complete
RA8 ether PHY bmsr an complete.
@ k_ra8_ether_phy_anar_10full
RA8 ether PHY anar 10full.
@ k_ra8_ether_phy_anar_100half
RA8 ether PHY anar 100half.
@ k_ra8_ether_phy_anar_10half
RA8 ether PHY anar 10half.
@ k_ra8_ether_phy_bmsr_link_up
RA8 ether PHY bmsr link up.
@ k_ra8_ether_phy_bmcr_reset
RA8 ether PHY bmcr reset.
@ k_ra8_ether_phy_anar_100full
RA8 ether PHY anar 100full.
@ k_ra8_ether_phy_bmcr_an_restart
RA8 ether PHY bmcr an restart.
ra8_err_t ra8_ether_phy_mdio_write(uint8_t reg_addr, uint16_t data)
Write a Clause-22 PHY register.
ra8_err_t ra8_ether_phy_mdio_read(uint8_t reg_addr, uint16_t *out_data)
Read a Clause-22 PHY register.
Generic Ethernet PHY abstraction (MDIO Clause-22 + auto-neg).
@ k_ra8_ether_phy_speed_10h
RA8 ether PHY speed 10h.
@ k_ra8_ether_phy_speed_no_link
RA8 ether PHY speed no link.
@ k_ra8_ether_phy_speed_100f
RA8 ether PHY speed 100f.
@ k_ra8_ether_phy_speed_10f
RA8 ether PHY speed 10f.
@ k_ra8_ether_phy_speed_100h
RA8 ether PHY speed 100h.
@ k_ra8_ether_phy_reg_an_partner
Link Partner Ability.
@ k_ra8_ether_phy_reg_status
BMSR.
@ k_ra8_ether_phy_reg_control
BMCR.
ra8_ether_phy_mii_t
Media-independent interface type seen on the MAC side.
@ k_ra8_ether_phy_addr_max
RA8 ether PHY address maximum.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
Definition ra8_log.h:366
static uint32_t s_state
Configuration descriptor for ra8_ether_phy_open.
ra8_ether_phy_io_t io
Pluggable MDIO bus.
ra8_ether_phy_mii_t mii_type
Interface type.
uint16_t reset_wait_us
Wait after reset.
uint8_t phy_address
5-bit MDIO PHY address.
uint16_t reset_wait_us
Reset wait us.
ra8_ether_phy_io_t io
Io.
ra8_ether_phy_mii_t mii_type
Mii type.
uint8_t phy_address
PHY address.
uint16_t last_bmsr
Last bmsr.
Pluggable MDIO bus interface.
ra8_err_t(* write)(void *ctx, uint8_t phy_addr, uint8_t reg_addr, uint16_t data)
Write a 16-bit Clause-22 register.
ra8_err_t(* read)(void *ctx, uint8_t phy_addr, uint8_t reg_addr, uint16_t *out_data)
Read a 16-bit Clause-22 register.