开发平台AM335XD, 添加一款网络接口芯片 swith PHYs ksz8863RLL,百兆以太网模式, 接口为RMii, 原来开发版Linux内核配置的是一个千兆以太网PHY芯片 ar8031, 如果需要支持ksz8863这款芯片需要做哪些修改? Linux内核版本是3.2.0,目前修改的内容如下:
1.网络接口定义部分,在arch/arm/mach-omap2/board-am335xevm.c中,由原来的千兆网络接口定义RGMII改为RMii接口定义如下:
{"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},
2. 修改am33xx_cpsw_init()函数,网络模式改为百兆网口模式 am33xx_cpsw_init(AM33XX_CPSW_MODE_RMII, NULL, NULL); 即修改寄存器gmii_sel的值为0x45;
3.内核配置如下:

编译内核后,启动发现不能发现我们的网络芯片ksz8863, 如下:
[ 2.481844] davinci_mdio davinci_mdio.0: davinci mdio revision 1.6
[ 2.488292] davinci_mdio davinci_mdio.0: no live phy, scanning all
[ 2.511748] davinci_mdio: probe of davinci_mdio.0 failed with error -5
请问,是不是还有需要修改内核的地方,如何让内核网络的MAC驱动支持我们的这款片子,谢谢!
Jian Zhou:
关于RMII的修改,请参考:http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/45981.aspx
kesheng yuan:
回复 Jian Zhou:
针对以上的参考进行修改,GMII_SEL 设置为0xc5,引脚也配置了,但是Phy id 的设定不知道在哪里可以设置,具体在哪个函数中,请说明,谢谢!
Jian Zhou:
回复 kesheng yuan:
如果您用的是SDK06,需要修改u-boot源码下的/board/ti/am335x/Board.c中的:
static struct cpsw_slave_data cpsw_slaves[] = { { .slave_reg_ofs = 0x208, .sliver_reg_ofs = 0xd80, .phy_id = 0, }, { .slave_reg_ofs = 0x308, .sliver_reg_ofs = 0xdc0, .phy_id = 1, },};
phy_id要做对应修改
kesheng yuan:
回复 Jian Zhou:
如果只在Linux内核下修改phy_id部分可以吗? 目前Linux内核定义内容如下:
static struct cpsw_slave_data am33xx_cpsw_slaves[] = {#if defined(CONFIG_OK335XD) || defined(CONFIG_OK335XS) { .slave_reg_ofs = 0x200, .sliver_reg_ofs = 0xd80, .phy_id = "0:1", .dual_emac_reserved_vlan = CPSW_PORT_VLAN_SLAVE_0, }, { .slave_reg_ofs = 0x300, .sliver_reg_ofs = 0xdc0, .phy_id = "0:2", .dual_emac_reserved_vlan = CPSW_PORT_VLAN_SLAVE_1, },
其中.slave_reg_ofs = 0x200,而你给出的定义是.slave_reg_ofs = 0x208,我用的CPU型号是am335xd,3354的 ,不知道这里定义是否正确?
同时这个phy_id的名称是不是由mdio总线驱动id号和PHY的地址构成? 也就是0:1, 和0:2 。
其中我用的这个swith 交换芯片有两个独立的PHY口,地址分别是1和2,我是不是可以这样设置phy_id呢?
目前这样设置之后内核启动后不能识别出我的PHY芯片。
TI中文支持网
