ubuntu-1804
IPQ8076A,SDK11.2
AQR114c
nor+nand
1.下载114c的FW,去Marvell官网下载 or xxxx.
2.高通有aquantia的驱动框架程序,添加114c的支持就好了
需要修改如下几个地方:
1.xxx_init函数中添加114c的switch-case判断
2.xxxx.dts中添加aquantia相关node信息
3.xxxx.h文件中添加114c这个chip相关的宏定义
4.xml中添加114c的FW(可以自定义二进制文件,此处只给出官方update_common_info.py生成的方法),且复制FW到指定位置
步骤1:修改init函数添加114c的支持
"uboot/drivers/net/ipq807x/ipq807x_edma.c"
ipq807x_edma_init(){
switch(phy_chip_id){
case AQUANTIA_PHY_114C: // 新增114c的case,
ipq_board_fw_download(phy_addr); //并且调用该函数自动加载FW
}
}
步骤2:修改dts相关节点
"arch/arm/dts/ipq807x-hk14.dts"
// 根据个人情况选择dts
# M : ess-switch{}中(确认)修改如下几条信息
switch_mac_mode = <0x2>; // 确定mode支持114c的5G ,这里是USXGMII,最高支持10G。
//(具体参考Ess Switch Mac Modes定义,uboot与linux宏定义值不同)
aquantia_port = <5>; // 这里的5指的是如下port_phyinfo{}第5个port为aquantia_port
port_phyinfo{
port@5 { //prot5
phy_address = <0>; // 修改这里的phy_addresss与实际相符且与其他port无冲突
phy_type = <3>; // 补充:我这里使用了switch_mac_mode2,所以这里设为3,默认为1。
}
}
步骤4:修改库文件中宏定义
"uboot/drivers/net/ipq_common/ipq_phy.h"
#define AQUANTIA_PHY_114C 0x31c31c22 // 这个值是mdio读出来然后计算而得,建议直接读一下mdio填进去就好
#define AQU_PHY_ADDR 0x0 // 修改AQU_PHY_ADDR,与dts中保持一致,如这里实际phy_id为0,dts中配置为0,这里就修改为0
步骤4:xml中添加FW路径及文件(使用官方工具生成img)
"common/build/ipq_x64"
// 我用64bit系统,所以放在这里
“/common/build/ipq”
// 32bit 请放这里
“apss_proc/out/meta-tools/ipq807x/flash_partition/norplusnand-partition.xml”
// 我是nor+nand , 根据实际选择不同xml。 这里不是原始文件,原始文件我一般不修改,这里的路径仅供参考。
cp xxxxx/AQR114C_FW.mbn common/build/ipq_x64/
cp xxxxx/AQR114C_FW.mbn common/build/ipq/
vi apss_proc/out/meta-tools/ipq807x/flash_partition/norplusnand-partition.xml
// 修改`0:ETHPHYFW` 这个分区(默认名字是这个),参考如下:
138 <name length="16" type="string">0:ETHPHYFW</name>
....
146 <img_name type="string">AQR114C_FW.mbn</img_name>
// 这里原始是空的 添加了文件名,名字自定义,与上述cp的文件名相同就好了。
1.从board_eth_init()
开始分析
board/qca/arm/ipq807x/ipq807x.c
board_eth_init()
->ipq807x_edma_init():
2.分析ipq807x_edma_init():
函数
"uboot/drivers/net/ipq807x/ipq807x_edma.c"
2.1)
获取"/ess-switch"node下"8033_port"这个节点是否存在
获取"/ess-switch"node下"aquantia_port"
这个节点是否存在
获取"/ess-switch"node下"switch_mac_mode"
这个节点是否存在,不存在则return
获取"/ess-switch"node下"/ess-switch/port_phyinfo"
这个节点是否存在,不存在则return
默认初始化6个port
,for读取这6个port的dts,并执行对应的init程序。
2.2)
读取phy_id,判断是否超过最大PHY_MAX,然后把dts中"/ess-switch/port_phyinfo"下的"phy_address"赋值给phy_addr变量
判断当前phy_addr是否和dts中"aquantia_port"相同
,相同则把AQU_PHY_ADDR宏重新赋值给phy_addr
(这个宏需要根据实际phy_addr定义,假定为0,则需要修改宏,下文给出.h文件的修改方法)
2.3)
通过mdio读取chip_id
,如果是aquantia_port||id=4,再读取不同偏移的addr,并重新赋值phy_chip_id,
2.4)
判断phy_chip_id:进入不同chip的init程序,此处没有114c的case,添加114c的case
(case AQUANTIA_PHY_114C:),引用113c相同的init函数即可。
ipq_board_fw_download(); //加载FW
,下完分析
ipq_qca_aquantia_phy_init(); // init
->return to board_eth_init()
3.分析下fw加载的过程,即上文:ipq_board_fw_download();
函数
"drivers/net/ipq6018/ipq6018_aquantia_phy.c"
注意这个结构体名字已经写死了,
"0:ETHPHYFW"
,这就是加载FW的分区名,不建议修改,需要多出同步修改。
判断启动flash类型,分类生成不同runcmd命令,如这里的spi nor boot,定义了runcmd为"sf probe && " "sf read 0x%p 0x%llx 0x%llx && "
通过run_command()函数
,将flash中FW数据读到内存中,
最后校验
内存中FW读取是否ok
->return
to ipq807x_edma_init();
"common/build/ipq_x64"
// 我用64bit系统,所以放在这里
“/common/build/ipq”
// 32bit 请放这里
“apss_proc/out/meta-tools/ipq807x/flash_partition/norplusnand-partition.xml”
// 我是nor+nand , 根据实际选择不同xml。 这里不是原始文件,原始文件我一般不修改,这里的路径仅供参考
qsdk/qca/src/linux-4.4/arch/arm64/boot/dts/qcom/xxxx.dts
368 phy4: ethernet-phy@4 {
369 compatible ="ethernet-phy-ieee802.3-c45";
370 reg = <8>;
371 };
372 phy5: ethernet-phy@5 {
373 compatible ="ethernet-phy-ieee802.3-c45";
374 reg = <0>;
375 };
switch_mac_mode = 0xff //mac UXSGMII
406 port@4 {
407 port_id = <5>;
408 phy_address = <8>;
409 ethernet-phy-ieee802.3-c45;
410 };
411 port@5 {
412 port_id = <6>;
413 phy_address = <0>;
414 ethernet-phy-ieee802.3-c45;
415 };
drivers/net/phy/aquantia.c
+#define PHY_ID_AQR114C 0x31c31c22
18 +{
19 + .phy_id = PHY_ID_AQR114C,
20 + .phy_id_mask = 0xfffffff0,
21 + .name = "Aquantia AQR114C",
22 + .features = PHY_AQUANTIA_FEATURES,
23 + .flags = PHY_HAS_INTERRUPT,
24 + .probe = aquantia_phy_probe,
25 + .soft_reset = aquantia_soft_reset,
26 + .config_init = aquantia_config_init,
27 + .aneg_done = aquantia_aneg_done,
28 + .config_aneg = aquantia_config_aneg,
29 + .config_intr = aquantia_config_intr,
30 + .ack_interrupt = aquantia_ack_interrupt,
31 + .read_status = aquantia_read_status,
32 + .suspend = aquantia_suspend,
33 + .resume = aquantia_resume,
34 + .update_link = aquantia_update_link,
35 + .driver = { .owner = THIS_MODULE,},
36 +},
37 };
41 { PHY_ID_AQR112, 0xfffffff0 },
42 { PHY_ID_AQR113C, 0xfffffff0 },
43 { PHY_ID_AQR112C, 0xfffffff0 },
44 + { PHY_ID_AQR114C, 0xfffffff0 },
45 { }
qsdk/qca/src/qca-ssdk/include/hsl/phy/hsl_phy.h 添加芯片id
+#define AQUANTIA_PHY_114C 0x31c31c22
src/hsl/phy/hsl_phy.c switch中添加114c相关case
237 case AQUANTIA_PHY_113C_A1:
238 case AQUANTIA_PHY_112C:
239 + case AQUANTIA_PHY_114C:
240 phytype = AQUANTIA_PHY_CHIP;
241 break;
242 case QCA8030_PHY:
aq-fw-download /ssssss/114c.cld miireg 8
aq-fw-download /ssssss/114c.cld miireg 0
# 8 和 0 为PHY_ADDR
# 再重新自协商一下(参考)
ssdk_sh debug phy set 8 0x4004c441 0x8
ssdk_sh debug phy set 8 0x40070000 0x3200
ssdk_sh debug phy set 0 0x4004c441 0x8
ssdk_sh debug phy set 0 0x40070000 0x3200