WIFI|软体 茶凳浅谈 高通WIN QSDK - IPQ6000 与 88Q2112 的相遇

Qualcomm IPQ 系列的Ethernet IC 搭配的有 QCA8075, QCA8081 … 等等Qualcomm自家出产的芯片。QSDK中内建可以支持的3rd party芯片,却寥寥可数。日前,客户使用车载以太网 - 88Q2112 - Marvell与IPQ6000做搭配。将之记录下来,以供参考。
 

方块图:
 

block

把原本reference board上的QCA8075、QCA8081都换成Marvell的88Q2112。传输界面走的protocol也由SGMII+ 、 PSGMII换成SGMII。
 

IPQ60x8与88Q2112之间有两个界面,一个是MDC/MDIO的控制界面,一个是GMII的资料传输界面。
 

使用user guide提到的方式,修改DTS

MII node :
 

qca8081

所以在本质上应该使用cp02的DTS来做修改。

MDIO node:

改用gpio16来做reset phy的脚位。tlmm的gpio改为gpio16
 

mdio_pins: mdio_pinmux {

                                      ……

                mux_2 {

                        pins = "gpio16";

                        function = "gpio";

                        bias-pull-up;

                };

        };
 

mdio中使用&tlmm 再次指定phy-reset-gpio
 

       mdio: mdio@90000 {

                pinctrl-0 = <&mdio_pins>;

                pinctrl-names = "default";

                phy-reset-gpio = <&tlmm 16 0>;

                   ……
 

后面应该照着原来的设定。因为88Q2112要用Clause 45,所以每个port都要加上compatible="ethernet-phy-ieee802.3-c45"

而那个reg参数 分别对应到 QCA8081的PHYAD[4..2]。

 

PhyAddr1

PhyAddr2

 mdio: mdio@90000 {

                pinctrl-0 = <&mdio_pins>;

                pinctrl-names = "default";

                phy-reset-gpio = <&tlmm 16 0>;

                status = "ok";

                phy0: ethernet-phy@0 {

                        reg = <0x10>;

                        compatible=”ethernet-phy-ieee802.3-c45”

                };

                phy1: ethernet-phy@1 {

                        reg = <0x14>;

                        compatible=”ethernet-phy-ieee802.3-c45”

                };

        };
 

这里要注意的是 88Q2112 只有定义 PHYAD[2..0],PHYAD[4..3]要填甚么值需要确认下。当然这个值还是要参考88Q2112的电路bootconf的设定。

ess-switch 应该跟cp02一样。注意一下phyaddress的设定,以及加上ethernet-phy-ieee802.3-c45;

ess-switch@3a000000 {

                switch_cpu_bmp = <0x1>;  /* cpu port bitmap */

                switch_lan_bmp = <0x10>; /* lan port bitmap */

                switch_wan_bmp = <0x20>; /* wan port bitmap */

                switch_inner_bmp = <0xc0>; /*inner port bitmap*/

                switch_mac_mode = <0xf>; /* mac mode for uniphy instance0*/

switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/

                switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/

                qcom,port_phyinfo {

                        port@4 {

                                port_id = <4>;

                                phy_address = <0x10>;

                                port_mac_sel = "QGMAC_PORT";

                                ethernet-phy-ieee802.3-c45;

                        };

                        port@5 {

                                port_id = <5>;

                                phy_address = <0x14>;

                                port_mac_sel = "QGMAC_PORT";

                                ethernet-phy-ieee802.3-c45;

                        };

                };

        };
 

照理说现在应该可以利用MDIO读取88Q2112的PHYID。 然后就要看看ssdk中是否有support这个PHY。让Ethernet Driver可以正常的启动。

在qsdk/qca/src/qca-ssdk/include/hsl/phy/hsl_phy.h 加个phy id define

/*qca808x_start*/

#define QCA8081_PHY_V1_1        0x004DD101

+#define 88Q2112_PHY                   0x002b0983

#define INVALID_PHY_ID          0xFFFFFFFF

在qsdk/qca/src/qca-ssdk/src/hsl/phy/hsl_phy.c 里面 借用QCA8081的driver来用。这样就不用全部重写。
 

/*qca808x_start*/

                   case QCA8081_PHY_V1_1:

+                 case 88Q2112_PHY:

                             phytype = QCA808X_PHY_CHIP;

                             break;

之后循着 qca-ssdk/src/hsl/phy/qca808x.c, qca808x_phy.c 去debug。

mdio 觉得都无法正常的使用;

ssdk一开始会使用mvl88q_phy_reg_read 这个function。可是marvell的phy不支持Clause22的格式,这个呼叫就会失败。进而导致异常。所以这里要直接回应return PHY_INVALID_DATA;给ssdk,让他不要再使用这个command。

在qca808x_phy.c中有qca808x_phy_reg_read/write, 以及qca808x_phy_mmd_read/write之分,xxx_phy_mmd_read/write 走的就是Clause45的方式来存取phy上的register。

我们在使用mvl88q的时候,就都要改成使用xxx_phy_mmd_read/write的方式。在DTS中加ethernet-phy-ieee802.3-c45;这个参数,无法全面地改用Clause45的方式来存取phy。只会影响部分的api。

尤其是注册给kernel的ops function。其他模组在调用api的时候,传进来的参数并没有附带c45的flag。 现在明确的分开成两个api。可以确认,在DUT上可以透过mdio正确的access marvell 88q2112的register了。

因为无法全面使用CAUSE45的方式来存取phy,重新参考aquantia_phy.c 来实作marvell 88Q2112的driver,把最底层读写phy reg的函式,套用成 Clause45的格式。
 

static sw_error_t

marvell_phy_reg_read(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t reg_mmd,

          a_uint32_t reg_id, a_uint16_t *phy_data)

{

          sw_error_t rv;

          SSDK_INFO("+++++++++++++++++++++++++++++++++++\n");

          reg_id = MARVELL_REG_ADDRESS(reg_mmd, reg_id);

          HSL_PHY_GET(rv, dev_id, phy_id, reg_id, phy_data);

          SSDK_INFO("+---------------------------------+\n");

          return rv;

}

这样就可以正常的存取Phy了。可见88Q2112 对PHYAD[4..3]是一种Don’t care的状态。
 

实际碰到的问题:

在T1 上量测到的波型,像是digital 的讯号。很奇怪。
 

wave


客人的线路图中,C110,C113 与C157,C154 使用的数值应该是4700pF。用470pF反而把讯号给滤掉了。把电容换掉,波型就正常,auto nego就正常了。
 

schema


 

接着,就一个萝卜一个坑的把marvell_phy_api_ops_init 中所指定的call back function 给填写好就行了。

static int marvell_phy_api_ops_init(void)

{

          int ret;

          hsl_phy_ops_t *marvell_phy_api_ops = NULL;

          SSDK_INFO("\n");

          SSDK_INFO("+++++++++++++++++++++++++++++++++++\n");

          marvell_phy_api_ops = kzalloc(sizeof(hsl_phy_ops_t), GFP_KERNEL);

          if (marvell_phy_api_ops == NULL) {

                   SSDK_ERROR("marvell phy ops kzalloc failed!\n");

                   return -ENOMEM;

          }

          phy_api_ops_init(MARVELL_PHY_CHIP);

          marvell_phy_api_ops->phy_speed_get = marvell_phy_get_speed;

          marvell_phy_api_ops->phy_speed_set = marvell_phy_set_speed;

          marvell_phy_api_ops->phy_duplex_get = marvell_phy_get_duplex;

          marvell_phy_api_ops->phy_duplex_set = marvell_phy_set_duplex;

          marvell_phy_api_ops->phy_autoneg_enable_set = marvell_phy_enable_autoneg;

          marvell_phy_api_ops->phy_restart_autoneg = marvell_phy_restart_autoneg;

          marvell_phy_api_ops->phy_autoneg_status_get = marvell_phy_autoneg_status;

          marvell_phy_api_ops->phy_autoneg_adv_set = marvell_phy_set_autoneg_adv;

          marvell_phy_api_ops->phy_autoneg_adv_get = marvell_phy_get_autoneg_adv;


透过QSDK中的ssdk framework,只要follow phy driver的模板把 marvel phy 的api都实作起来。就可以轻松地将3’rd party 芯片给porting上了。
 

参考:

aquantia_phy.c

qca808x_phy.c

linux-4.4\Documentation\devicetree

88Q2110_88Q2112 Datasheet

Marvell New SMI Register Access GUI User Guide

IPQ401x/IPQ806x/IPQ807x NSS Networking Debug User Guide

SOHO Switch Software Development Kit Reference Manual

Q&A:

1. 我想换用其他厂牌的Switch IC,高通会帮忙porting吗?

Ans: 不会,请参考SOHO Switch Software Development Kit Reference Manual自行porting。

2. Porting 3’rd party 的Switch/Phy IC 碰到问题,该如何获得协助?

Ans: 高通本身有完整的产品Switch/Phy IC,基本上不支持porting第三方的IC。Porting 3rd party的switch/phy IC 要靠自己,建议使用高通产品。诠鼎的优质客户可直接联系我们PM。

3. 甚么是Clause45?

clause45-1

clause45-2

clause45-3

4. 甚么是Clause 22?

clause22



5. 挂载多的Switch, MDIO界面不够用怎么办?

Ans: MDIO界面可以支持并联多个Switch的。只要区分好Phy Address就可以。如果真没办法,可以使用I2C去模拟送出Clause22以及Clause45的指令,读写Switch内的设定。

 登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/518373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

传输层 --- TCP (下篇)

目录 1. 超时重传 1.1. 数据段丢包 1.2. 接收方发送的ACK丢包 1.3. 超时重传的超时时间如何设置 2. 流量控制 3. 滑动窗口 3.1. 初步理解滑动窗口 3.2. 滑动窗口的完善理解 3.3. 关于快重传的补充 3.4. 快重传和超时重传的区别 4. 拥塞控制 4.1. 拥塞控制的宏观认识…

2024年华为OD机试真题-推荐多样性-Java-OD统一考试(C卷)

题目描述&#xff1a; 推荐多样性需要从多个列表中选择元素&#xff0c;一次性要返回N屏数据&#xff08;窗口数量&#xff09;&#xff0c;每屏展示K个元素&#xff08;窗口大小&#xff09;&#xff0c;选择策略&#xff1a; 1. 各个列表元素需要做穿插处理&#xff0c;即先从…

新版HI3559AV100开发注意事项(三)

新版HI3559AV100开发注意事项&#xff08;三&#xff09; 十九、用的sdk是Hi3559V200_MobileCam_SDK_V1.0.1.5 播放AAC音频文件&#xff0c;adec->ao;adec的初始化里面包括了aaclc解码器的注册&#xff0c;可是在HI_MPI_ADEC_RegisterDecoder(&s32Handle, &stAac);…

一篇文章带你学会7大基本算法(2024最新保姆级教程)

&#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 算法 - 排序约定选择排序冒泡排序插入排序希尔排序归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序 快速排序1. 基本算法2. 切分3. 性能分析4. 算法改进4.1 切换到插入排序4.2 三数取中4.3 三向切分 5. 基于切…

vue 打包 插槽 inject reactive draggable 动画 foreach pinia状态管理

在Vue项目中&#xff0c;当涉及到打包、插槽&#xff08;Slots&#xff09;、inject/reactive、draggable、transition、foreach以及pinia时&#xff0c;这些都是Vue框架的不同特性和库&#xff0c;它们各自在Vue应用中有不同的用途。下面我将逐一解释这些概念&#xff0c;并说…

用 Wireshark 解码 H.264

H264&#xff0c;你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容&#xff1a; -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…

Vue使用高德地图(快速上手)

1.在高德平台注册账号 2.我的 > 管理管理中添加Key 3.安装依赖 npm i amap/amap-jsapi-loader --save 或 yarn add amap/amap-jsapi-loader --save 4.导入 AMapLoade import AMapLoader from amap/amap-jsapi-loader; 5.直接上代码&#xff0c;做好了注释&#xff08;初…

单细胞RNA测序(scRNA-seq)SRA数据下载及fastq-dumq数据拆分

单细胞RNA测序&#xff08;scRNA-seq&#xff09;入门可查看以下文章&#xff1a; 单细胞RNA测序&#xff08;scRNA-seq&#xff09;工作流程入门 单细胞RNA测序&#xff08;scRNA-seq&#xff09;细胞分离与扩增 1. NCBI查询scRNA-seq SRA数据 NCBI地址&#xff1a; https…

前视声呐目标识别定位(六)-代码解析之目标截图并传输

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

51单片机实验02- P0口流水灯实验

目录 一、实验的背景和意义 二、实验目的 三、实验步骤 四、实验仪器 五、实验任务及要求 1&#xff0c;从led4开始右移 1&#xff09;思路 ①起始灯 &#xff08;led4&#xff09; ②右移 2&#xff09;效果 3&#xff09;代码☀ 2&#xff0c;从其他小灯并向右依…

服务器设置了端口映射之后外网还是访问不了服务器

目录 排查思路参考&#xff1a; 1、确认服务是否在运行 2、确认端口映射设置是否正确 3、使用防火墙测试到服务器的连通性 4、检查服务内部的配置 5、解决办法 6、学习小分享 我们在一个完整的网络数据存储服务系统设备中都会存有业务服务器、防火墙、交换机、路由器&a…

【Laravel】09 用模型批量赋值简化代码 数据库关系

【Laravel】09 用模型批量赋值简化代码 & 数据库关系 1. 用模型批量赋值简化代码2. 数据库关系 1. 用模型批量赋值简化代码 原来存储一个值 2. 数据库关系 这里可以看到两个SQL是一样的

STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)

不同系列STM32——SPI框图 F1系列框图 F4系列框图 TI模式时序图特性 F7系列框图 H7系列框图 注意&#xff1a;F7系列以及H7系列支持Quad-SPI模式&#xff0c;可以连接单&#xff0c;双或者四条数据线的Flash存储介质。 SPI——Cube配置流程 RCC时钟源配置 SYS系统调试模式配…

Spring 详细总结

文章目录 第一章 IOC容器第一节 Spring简介1、一家公司2、Spring旗下的众多项目3、Spring Framework①Spring Framework优良特性②Spring Framework五大功能模块 第二节 IOC容器概念1、普通容器①生活中的普通容器②程序中的普通容器 2、复杂容器①生活中的复杂容器②程序中的复…

MySQL、Oracle查看字节和字符长度个数的函数

目录 0. 总结1. MySQL1.1. 造数据1.2. 查看字符/字节个数 2. Oracle2.1. 造数据2.2. 查看字符/字节个数 0. 总结 databasecharbyteMySQLchar_length()length()Oraclelength()lengthB() 1. MySQL 1.1. 造数据 sql drop table if exists demo; create table demo (id …

Cesium 批量种树

1、准备树种建模 分各种级别建模LOD1-LODN 其中meta.json长这样&#xff1a; Gltf再3Dmax中导出Obj,再通过ObjToGltf的工具转换&#xff0c;参考 https://editor.csdn.net/md/?articleId96484597 2、准备shp点数据。&#xff08;shp中的点位就是种树的位置&#xff09; 3、准…

【并发编程】线程安全

线程安全 1. 讲一下 synchronized 关键字的底层原理 1.1 基本使用 如下抢票的代码&#xff0c;如果不加锁&#xff0c;就会出现超卖或者一张票卖给多个人 synchronized&#xff0c;同步【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】 其它线程再想获…

多模态AI全解析:概念、应用与风险

大家好&#xff0c;在人工智能的快速发展浪潮中&#xff0c;多模态学习作为一项革命性技术&#xff0c;正逐渐改变着我们与机器交互的方式。 自OpenAI推出ChatGPT以来&#xff0c;人工智能已经从处理单一文本输入的单模态工具&#xff0c;迈向了能够理解和生成包括文本、图像、…

【算法】【floodfill】洪水灌溉

文章目录 1. 岛屿数量2. 岛屿最大面积3. 被围绕的区域4. 太平洋大西洋水流问题5. 扫雷游戏6. 机器人的运动范围 1. 岛屿数量 &#x1f449;&#x1f517;题目链接 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0…

查看MySQL版本的方式

文章目录 一、使用cmd输入命令行查看二、在mysql客户端服务器里查询 一、使用cmd输入命令行查看 1、打开 cmd &#xff0c;输入命令行&#xff1a; mysql --version 2、还是打开cmd&#xff0c;输入命令行&#xff1a;mysql -V (注意了&#xff0c;此时的V是个大写的V) 二、…