uboot 和内核里 phy 的初始化,以及内核里的双网络配置及 phy 的初始化。
本文以盈鹏飞嵌入式的com-335x(基于am335x)核心板及网络芯片lan8720 为例,说明修改步骤。 lan8720 是 rmii 接口的 10/100m 以太网 phy 芯片,其与 com-335x 的硬件连接和设计请参考《com-335x 底板设计手册》。以下内容为具体步骤说明。
com-335x核心板:()
一、u-boot里面如何修改phy
1.引脚初始化
打开 board/eac/com335x/mux.c 文件,增加以下内容:
static struct module_pin_mux rmii1_pin_mux[] = {
{offset(mii1_crs), mode(1) | rxactive},/* rmii1_crs */
{offset(mii1_rxerr), mode(1) | rxactive}, /* rmii1_rxerr */
{offset(mii1_txen), mode(1)},
{offset(mii1_txd1), mode(1)},
{offset(mii1_txd0), mode(1)},/* rmii1_txen */
/* rmii1_txd1 */
/* rmii1_txd0 */
{offset(mii1_rxd1), mode(1) | rxactive},
{offset(mii1_rxd0), mode(1) | rxactive},/* rmii1_rxd1 */
/* rmii1_rxd0 */
{offset(mdio_data), mode(0) | rxactive | pullup_en}, /* mdio_data */
{offset(mdio_clk), mode(0) | pullup_en},/* mdio_clk */
{offset(rmii1_refclk), mode(0) | rxactive}, /* rmii1_refclk */
{-1},
};
在 enable_board_pin_mux(void)函数中,做以下修改:
void enable_board_pin_mux(void)
{
......
// configure_module_pin_mux(rgmii1_pin_mux);
configure_module_pin_mux(rmii1_pin_mux);
......
}
2.驱动初始化
打开 board/eac/com335x/board.c,在 cpsw_slaves[]结构体中,修改 phy_addr(由 lan8720 的硬件连接决
定,本文以 0 为例):
static struct cpsw_slave_data cpsw_slaves[] = {
{
.slave_reg_ofs = 0x208,
.sliver_reg_ofs = 0xd80,
.phy_addr = 0x00,
},
......
};
在 board_eth_init(bd_t *bis)函数中,修改 cpsw 的通信模式为 rmii:
int board_eth_init(bd_t *bis)
{
.......
writel((rmii_mode_enable | rmii_chipckl_enable), &cdev->miisel);
........
}
注: rmii_chipckl_enable 为 rmii_refclk 输入使能,即 rmii_refclk 信号由 phy 芯片提供而不是由
cpu 提供,该参数由硬件设计决定。在底板设计指导手册中,使用的是 lan8720 输出的 rmii_refclk 信号,
因此需要添加改参数,否则会导致 rmii_refclk 信号出现问题;如果硬件设计为由 cpu 提供的话,则无需
添加该参数。
另外,要确保 include/configs/com335x.h 文件中有如下宏定义;
#define config_phy_smsc
该定义为 phy 芯片驱动配置,文件中默认有定义,无需修改。至此, uboot 修改完毕,重新编译即可。
二、kernel里如何修改phy(单网络,rmii1接口)
1.内核配置
device drivers --->
network device support --->
ethernet driver support --->
texas instruments (ti) devices
-*- ti davinci mdio support
-*- ti davinci cpdma support
ti cpsw switch support
[] ti cpsw switch as dual emac
-*-phy device support and infrastructure --->
drivers for smsc phys
2.引脚初始化
打开板级初始化文件 arch/arm/mach-omap2/board-com335x.c,增加以下内容:
/* module pin mux for rmii1 */
static struct pinmux_config rmii1_pin_mux[] = {
{mii1_crs.rmii1_crs_dv, omap_mux_mode1 | am33xx_pin_input_pulldown},
{mii1_rxerr.mii1_rxerr, omap_mux_mode1 | am33xx_pin_input_pulldown},
{mii1_txen.mii1_txen, omap_mux_mode1 | am33xx_pin_output},
{mii1_txd1.mii1_txd1, omap_mux_mode1 | am33xx_pin_output},
{mii1_txd0.mii1_txd0, omap_mux_mode1 | am33xx_pin_output},
{mii1_rxd1.mii1_rxd1, omap_mux_mode1 | am33xx_pin_input_pulldown},
{mii1_rxd0.mii1_rxd0, omap_mux_mode1 | am33xx_pin_input_pulldown},
{rmii1_refclk.rmii1_refclk, omap_mux_mode0 | am33xx_pin_input_pulldown},
{mdio_data.mdio_data, omap_mux_mode0 | am33xx_pin_input_pullup},
{mdio_clk.mdio_clk, omap_mux_mode0 | am33xx_pin_output_pullup},
{null, 0},
};
注意:引脚不要被其它功能复用!
3.驱动初始化
在 board-com335x.c 文件的 com335x_eth_init(void)函数中,做以下修改:
static void com335x_eth_init(void)
{
setup_pin_mux(rmii1_pin_mux);
am33xx_cpsw_init(am33xx_cpsw_mode_rmii, 0:00, null);
// int ret = phy_register_fixup_for_uid(com335x_evm_phy_id, com335x_phy_mask,
am33xx_tx_clk_dly_phy_fixup);
}
注: am33xx_cpsw_init(am33xx_cpsw_mode_rmii, 0:00, null)里的第一个参数为指定 rmii 模
式,第二个参数为 rmii1 接口上的 phy_addr,第三个参数为 rmii2 接口上的 phy_addr。修改完成后,保存文
件。
在上一节提到,我们的设计中, rmii_refclk 信号由 phy 芯片提供,因此需要使能 rmii1_refclk 为输入,
打开 arch/arm/mach-omap2/devices.c 文件,在 am33xx_cpsw_init 函数中,增加以下内容:
int am33xx_cpsw_init(enum am33xx_cpsw_mac_mode mode, unsigned char *phy_id0,
unsigned char *phy_id1)
{
......
#define rmii1_io_clk_en 1 <
network device support --->
ethernet driver support --->
texas instruments (ti) devices
-*- ti davinci mdio support
-*- ti davinci cpdma support
ti cpsw switch support
ti cpsw switch as dual emac
-*-phy device support and infrastructure --->
drivers for smsc phys
2.引脚初始化
打开板级初始化文件 arch/arm/mach-omap2/board-com335x.c,增加以下内容:
/* module pin mux for rmii1 */
static struct pinmux_config rmii1_pin_mux[] = {
{mii1_crs.rmii1_crs_dv, omap_mux_mode1 | am33xx_pin_input_pulldown},
{mii1_rxerr.mii1_rxerr, omap_mux_mode1 | am33xx_pin_input_pulldown},
{mii1_txen.mii1_txen, omap_mux_mode1 | am33xx_pin_output},
{mii1_txd1.mii1_txd1, omap_mux_mode1 | am33xx_pin_output},
{mii1_txd0.mii1_txd0, omap_mux_mode1 | am33xx_pin_output},
{mii1_rxd1.mii1_rxd1, omap_mux_mode1 | am33xx_pin_input_pulldown},
{mii1_rxd0.mii1_rxd0, omap_mux_mode1 | am33xx_pin_input_pulldown},
{rmii1_refclk.rmii1_refclk, omap_mux_mode0 | am33xx_pin_input_pulldown},
{mdio_data.mdio_data, omap_mux_mode0 | am33xx_pin_input_pullup},
{mdio_clk.mdio_clk, omap_mux_mode0 | am33xx_pin_output_pullup},
{null, 0},
};
/* module pin mux for rmii2 */
static struct pinmux_config rmii2_pin_mux[] = {
{gpmc_csn3.rmii2_crs_dv, omap_mux_mode2 | am33xx_pin_input_pulldown},
//{gpmc_wpn.rmii2_rxerr, omap_mux_mode3 | am33xx_pin_input_pulldown},
{gpmc_a0.rmii2_txen, omap_mux_mode3 | am33xx_pin_output},
{gpmc_a4.rmii2_txd1, omap_mux_mode3 | am33xx_pin_output},
{gpmc_a5.rmii2_txd0, omap_mux_mode3 | am33xx_pin_output},
{gpmc_a10.rmii2_rxd1, omap_mux_mode3 | am33xx_pin_input_pulldown},
{gpmc_a11.rmii2_rxd0, omap_mux_mode3 | am33xx_pin_input_pulldown},
{mii1_col.rmii2_refclk, omap_mux_mode1 | am33xx_pin_input_pulldown},
{mdio_data.mdio_data, omap_mux_mode0 | am33xx_pin_input_pullup},
{mdio_clk.mdio_clk, omap_mux_mode0 | am33xx_pin_output_pullup},
{null, 0},
};
注意:引脚不要被其它功能复用!另外,根据底板设计手册,在 rmii2 接口中,由于 rmii2_rxerr 脚已
经被 gpmc 使用,因此 rmii2_rxerr 未与 lan8720 连接,经测试,未发现此情况下对网络有影响。
3.驱动初始化
在 board-com335x.c 文件的 com335x_eth_init(void)函数中,做以下修改:
static void com335x_eth_init(void)
{
setup_pin_mux(rmii1_pin_mux);
setup_pin_mux(rmii2_pin_mux);
am33xx_cpsw_init(am33xx_cpsw_mode_rmii, 0:00, 0:01);
// int ret = phy_register_fixup_for_uid(com335x_evm_phy_id, com335x_phy_mask,
am33xx_tx_clk_dly_phy_fixup);
}
注:详细说明请参考上一节。修改完成后,保存文件。
使能 rmii1_refclk、 rmii2_refclk 为输入(参考上一节),打开 arch/arm/mach-omap2/devices.c 文件,在
am33xx_cpsw_init 函数中,增加以下内容:
int am33xx_cpsw_init(enum am33xx_cpsw_mac_mode mode, unsigned char *phy_id0,
unsigned char *phy_id1)
{
......
#define rmii1_io_clk_en 1 << 6
#define rmii2_io_clk_en 1 << 7
gmii_sel |= (rmii1_io_clk_en);
writel(gmii_sel, am33xx_ctrl_regaddr(am33xx_control_gmii_sel_offset));
......
}
修改完成后,保存退出。重新编译系统即可。
4.双网络使用说明
将上述步骤编译的内核烧录到 com335x,系统启动后,在终端输入 ifconfig -a 命令可以查看到 eth0
和 eth1 两个设备。如需同时使用 eth0 和 eth1,必须注意两者不能在同一网段!
数码录音笔显示屏类型
定制段码液晶屏在开模前需要确认哪些参数
关于英特尔的新设备的性能分析和介绍
过压保护压缩机控制电路原理图
新手必看!FPGA的系统性学习
uboot和内核里phy的初始化_内核里的双网络配置及phy的初始化
博文 | Biu~笔记:高通蓝牙ADK(36)--第三类mic
华为5G折叠屏手机在巴黎旗舰店售卖 分析机构预计2020年华为智能手机出货量下降20%
PC打印机端口控制数据记录器
中国5G用户数已接近2亿,占全球比重达85%
伺服设备工作原理
3D打印呼吸机原型设计七天可完成
癌症终结者Bionaut Labs微型机器人将在2023年问世
华虹半导体Q3财报:销售收入5.685亿美元,同比下降9.7%
三相内控电能表
安普德WF61模块—5GHz WiFi应用于视频物联网设备
一文带你了解以FPGA为控制核心的程控滤波器设计
PCB检测的几种常见方法
使用网络实例比较FPGA RTL与HLS C/C++的区别
低成本低功耗蓝牙芯片MS1656—智能窗帘应用解决方案