驱动phy_device结构中 supported成员是什么意思? phydev->supported的值是怎么获得的?

迷茫的蜉蝣 2020-07-08 04:06:47
最近在做phy芯片的工作,其中驱动中phydev->supported 代表fiber copper的位是错误的, 该位始终为copper,我们的应该是fiber。
无论怎么修改都是copper,我想请教的是:
1. phydev->supported代表的是什么?
2. phydev->supported的值是怎么得到的?获取的硬件信息?还是在哪被赋值了?
3. 如果phydev->suppoerted错误说明什么?怎么修改?
...全文
12355 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiwei11234567890 2021-09-08
  • 打赏
  • 举报
回复

supported 是phy支持的协议和特性. 速率,模式,EEE等等.

bakbad 2020-07-23
  • 打赏
  • 举报
回复
楼主,你好,大胆回复一下哈!
1、phydev->supported代表的应该是phy设备的支持能力,比如支持10M、100M、1000M这种;
2、它的值是在初始化的时候得到的,具体几下面的代码贴图;
3、修改的话可以在这个初始化的函数里面尝试去修改。

通用phy

int genphy_config_init(struct phy_device *phydev)
{
int val;
u32 features;

features = (SUPPORTED_TP | SUPPORTED_MII
| SUPPORTED_AUI | SUPPORTED_FIBRE |
SUPPORTED_BNC);

/* Do we support autonegotiation? */
val = phy_read(phydev, MII_BMSR);
if (val < 0)
return val;

if (val & BMSR_ANEGCAPABLE)
features |= SUPPORTED_Autoneg;

if (val & BMSR_100FULL)
features |= SUPPORTED_100baseT_Full;
if (val & BMSR_100HALF)
features |= SUPPORTED_100baseT_Half;
if (val & BMSR_10FULL)
features |= SUPPORTED_10baseT_Full;
if (val & BMSR_10HALF)
features |= SUPPORTED_10baseT_Half;

if (val & BMSR_ESTATEN) {
val = phy_read(phydev, MII_ESTATUS);
if (val < 0)
return val;

if (val & ESTATUS_1000_TFULL)
features |= SUPPORTED_1000baseT_Full;
if (val & ESTATUS_1000_THALF)
features |= SUPPORTED_1000baseT_Half;
}

phydev->supported &= features;
phydev->advertising &= features;

return 0;
}



ar8035 phy:

static int at803x_config_init(struct phy_device *phydev)
{
int val;
int ret;
u32 features;

features = SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_AUI |
SUPPORTED_FIBRE | SUPPORTED_BNC;

val = phy_read(phydev, MII_BMSR);
if (val < 0)
return val;

if (val & BMSR_ANEGCAPABLE)
features |= SUPPORTED_Autoneg;
if (val & BMSR_100FULL)
features |= SUPPORTED_100baseT_Full;
if (val & BMSR_100HALF)
features |= SUPPORTED_100baseT_Half;
if (val & BMSR_10FULL)
features |= SUPPORTED_10baseT_Full;
if (val & BMSR_10HALF)
features |= SUPPORTED_10baseT_Half;

if (val & BMSR_ESTATEN) {
val = phy_read(phydev, MII_ESTATUS);
if (val < 0)
return val;

if (val & ESTATUS_1000_TFULL)
features |= SUPPORTED_1000baseT_Full;
if (val & ESTATUS_1000_THALF)
features |= SUPPORTED_1000baseT_Half;
}

phydev->supported = features;
phydev->advertising = features;

if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
ret = phy_write(phydev, AT803X_DEBUG_ADDR,
AT803X_DEBUG_SYSTEM_MODE_CTRL);
if (ret)
return ret;
ret = phy_write(phydev, AT803X_DEBUG_DATA,
AT803X_DEBUG_RGMII_TX_CLK_DLY);
if (ret)
return ret;
}

return 0;
}


其它的phy应该也是在类似的函数中对phydev->supported这个字段进行初始化的
课程大纲1-什么是 AutoSAR 为什么要学习 AutoSAR2-AutoSAR课程大纲3-用Linux操作系统思维理解AutoSAR4-AutoSAR出现的背景和行业状况5-AutoSAR运行的硬件环境ECU6-AutoSAR优势和代码演示7-AutoSAR开发方法论8-汽车电子岗位介绍9-AUTOSAR工具链讲解10-BSW概述-111-BSW概述-212-CAN总线物理层讲解-113-CAN总线物理层讲解-214-CAN总线物理层讲解-标准和仲裁机制15-CAN总线物理层讲解-数据帧16-CAN总线物理层讲解-错误检测机制17-CAN总线物理层讲解-位时间和同步18-CAN总线DBC文件讲解19-AutoSAR通信概述-通信服务架构120-AutoSAR通信概述-通信服务架构221-AutoSAR通信概述-PDU和收发数据流22-CAN总线网络传输层CanTp讲解-Can诊断网络分层23-CAN总线网络传输层CanTp讲解-CanTp组帧拆帧过程-124-CAN总线网络传输层CanTp讲解-CanTp组帧拆帧过程-225-CAN总线网络传输层CanTp讲解-CanTp时间参数和诊断数据流26-车载以太网第一讲-车载以太网基础知识MAC PHY27-车载以太网第一讲-车载以太网和工业以太网区别28-车载以太网在Autosar上的应用-以太网协议栈软件架构29-车载以太网在AutoSAR上的应用-Soad PduR30-LIN总线入门到精通第一讲-Lin总线基础知识31-LIN总线入门到精通第一讲-Lin协议格式32-LIN总线入门到精通第一讲-Lin帧类型33-LIN总线的通信矩阵和LDF文件讲解34-LIN总线在AutoSAR上的应用35-Lin总线诊断应用-LinTp传输层36-Lin总线诊断应用-Lin主节点诊断流程37-SPI总线基础知识38-AutoSAR SPI应用39-协议数据单元PDU和服务数据单元SDU40-Pdu Router(PduR)模块详解41-Com模块讲解-报文和信号42-Com模块讲解-COM内部实现原理43-诊断功能第一讲-诊断基础知识44-诊断功能第二讲-UDS服务讲解-UDS基础知识45-诊断功能第二讲-UDS服务讲解-物理寻址和功能寻址46-诊断功能第二讲-UDS服务讲解-具体服务讲解-147-诊断功能第二讲-UDS服务讲解-具体服务讲解-248-诊断功能第二讲-DCM模块讲解49-诊断功能第四讲-OBD服务50-存储知识和AUTOSAR存储架构51-AUTOSAR 存储服务之Fee换页策略52-Autosar BswM模块讲解53-AutoSAR OS和OSEK OS54-AutoSAR应用软件层-RTE层概述55-AutoSAR应用软件层-AppL层概述

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧