在Linux内核中如何开启EMAC1呢,我已经在uboot中将EMAC1的管脚复用打开了。但是Linux启动后只检测到EMAC0.
Chris Meng:
你好,
请参考论坛讨论:http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/p/237498/832532.aspx。
YiLong Zhou:
回复 Chris Meng:
我已经通过CCS测试过EMAC1 loop是可以的。我的需求是Linux系统下开启双网卡(硬件已经设计了)。您提供的帖子似乎不是解决这个问题的。
Chris Meng:
回复 YiLong Zhou:
In u-boot you can change the emac address base definition (EMAC_BASE_ADDR and EMAC_WRAPPER_BASE_ADDR) in arch/arm/include/asm/arch/emac_defs.h to point to second EMAC.In kernel by default Second EMAC will be brought up by default.
YiLong Zhou:
回复 Chris Meng:
谢谢你的回复,在Uboot中,问题已经解决了。
测试如下:
文件include/configs/Hm8168.h中,如下:/* EMAC1 support */#define CONFIG_EMAC1_TI816X
arch/arm/include/asm/arch-ti81xx/cpu.h文件中增加如下定义:#ifdef CONFIG_TI816X…
#ifdef CONFIG_EMAC1_TI816X/* EMAC1 */#define MTSI_DCLK (CTRL_BASE + 0x8C8)#define MTSI_DATA0 (CTRL_BASE + 0x8CC)#define MTSI_DATA1 (CTRL_BASE + 0x8D0)#define MTSI_DATA2 (CTRL_BASE + 0x8D4)#define MTSI_DATA3 (CTRL_BASE + 0x8D8)#define MTSI_DATA4 (CTRL_BASE + 0x8DC)#define MTSI_DATA5 (CTRL_BASE + 0x8E0)#define MTSI_DATA6 (CTRL_BASE + 0x8E4)#define MTSI_DATA7 (CTRL_BASE + 0x8E8)#define MTSI_BYTSTRT (CTRL_BASE + 0x8EC)#define MTSO_DCLK (CTRL_BASE + 0x8F0)#define MTSO_DATA0 (CTRL_BASE + 0x8F4)#define MTSO_DATA1 (CTRL_BASE + 0x8F8)#define MTSO_DATA2 (CTRL_BASE + 0x8FC)#define MTSO_DATA3 (CTRL_BASE + 0x900)#define MTSO_DATA4 (CTRL_BASE + 0x904)#define MTSO_DATA5 (CTRL_BASE + 0x908)#define MTSO_DATA6 (CTRL_BASE + 0x90C)#define MTSO_DATA7 (CTRL_BASE + 0x910)#define MTSO_BYTSTRT (CTRL_BASE + 0x914)#define MCTL_SCLK (CTRL_BASE + 0x918)#define MCTL_SCTL (CTRL_BASE + 0x91C)#define MCTL_SDI (CTRL_BASE + 0x920)#define MCTL_SDO (CTRL_BASE + 0x924)#endif
#endifBoard/ti/ti8168/evm.c文件中增加如下#函数void set_muxconf_regs(void)#ifdef CONFIG_EMAC1_TI816X /* EMAC1 Padconfig */ __raw_writew(M1, MTSI_DCLK); __raw_writew(M1, MTSI_DATA0); __raw_writew(M1, MTSI_DATA1); __raw_writew(M1, MTSI_DATA2); __raw_writew(M1, MTSI_DATA3); __raw_writew(M1, MTSI_DATA4); __raw_writew(M1, MTSI_DATA5); __raw_writew(M1, MTSI_DATA6); __raw_writew(M1, MTSI_DATA7); __raw_writew(M1, MTSI_BYTSTRT); __raw_writew(M1, MTSO_DCLK); __raw_writew(M1, MTSO_DATA0); __raw_writew(M1, MTSO_DATA1); __raw_writew(M1, MTSO_DATA2); __raw_writew(M1, MTSO_DATA3); __raw_writew(M1, MTSO_DATA4); __raw_writew(M1, MTSO_DATA5); __raw_writew(M1, MTSO_DATA6); __raw_writew(M1, MTSO_DATA7); __raw_writew(M1, MTSO_BYTSTRT); __raw_writew(M1, MCTL_SCLK); __raw_writew(M1, MCTL_SCTL); __raw_writew(M1, MCTL_SDI); __raw_writew(M1, MCTL_SDO);#endif
以下代码是测试将原有EMAC0改为EMAC1#修改arch/arm/include/asm/arch-ti81xx/emac_defs.h#define EMAC_BASE_ADDR (0x4A120000) //(0x4A10000)#define EMAC_WRAPPER_BASE_ADDR (0x4A120900) //(0x4A100900)#define EMAC_WRAPPER_RAM_ADDR (0x4A122000) //(0x4A1020000)#define EMAC_MDIO_BASE_ADDR (0x4A100800)#define DAVINCI_EMAC_VERSION2#define DAVINCI_EMAC_GIG_ENABLE
#define EMAC_MDIO_BUS_FREQ (250000000UL)#define EMAC_MDIO_CLOCK_FREQ (2000000UL)
/*TODO: verify Phy address */#define EMAC_MDIO_PHY_NUM (3)//(1)#define EMAC_MDIO_PHY_MASK (1 << EMAC_MDIO_PHY_NUM)#drivers/net/davinci_emac.c文件修改如下:#1在函数static int davinci_eth_phy_detect(void)中增加一个延时。 udelay(40000);//注意,实际测试的时候,发现读取adap_mdio->ALIVE时,address 3不是马上能识别的,加一点延时,就可以了 phy_act_state = readl(&adap_mdio->ALIVE) & EMAC_MDIO_PHY_MASK; #2 在函数davinci_eth_phy_read中 将USERACCESS0改为USERACCESS1 #3在函数davinci_eth_phy_write中 将USERACCESS0改为USERACCESS1
另外一个问题,在Linux中该如何识别双网卡呢,我看到有个官方文档
http://processors.wiki.ti.com/index.php/TI81XX_PSP_ETHERNET_Switch_User_Guide#Bringing_Up_interfaces
但是 ,似乎只支持dm814X。
Huan a:
回复 YiLong Zhou:
你好,我也想在uboot中启用eth1 但是我按照你的步骤做完修改之后,启动后uboot运行网络相关的命令都出错。我的板子是 DM8168EVM rev J。因为我们希望能将EIO板子上的网卡作为首选网口,能向你请教一些吗? 谢谢 QQ:2646439369,mail:huan.gong@wildsc.com.cn
修改后的启动log:
Net: Detected MACID:50:56:63:a7:8d:a5DaVinci EMACHit any key to stop autoboot: 0
修改前的log:在上面的第一句和第二句之间还有一句 ethernet PHY:GENERIC @0X01
Net: Detected MACID:50:56:63:a7:8d:a5ethernet PHY:GENERIC @0X01DaVinci EMACHit any key to stop autoboot: 0
Louis:
回复 YiLong Zhou:
你好,
DM814X 是 3-Port Gigabit Switch (CPSW),而DM816x是两个独立的EMAC。在内核的ti816x_ethernet_init函数对两个EMAC都做了初始化。
Huan a:
回复 Louis:
那我该怎么设置才能让Uboot使用eth1来通过 搭建好的tftp 获取 内核镜像呢,现在我用eth0都可以正常工作,但是现在我们更希望能使用eth1. 在uboot的ip参数中设置IP = :::::eth1:off 这个只是linux内核起来后通过eth1口挂载rootfs吧,现在希望Uboot下使用的是eth1. 我在uboot中没找到ti816x_ethernet_init函数,这个是Linux kernel中的板级文件中的函数吧,在内核起来后,我们两个网口都是可以正常工作的。希望给予些指导,这个问题困扰我们挺久了。谢谢
Louis:
回复 Huan a:
可以看一下emac_defs.h的EMAC的寄存器定义,换成EMAC2的基地址试一下。
EMAC1
#define EMAC_BASE_ADDR (0x4A100000)#define EMAC_WRAPPER_BASE_ADDR (0x4A100900)#define EMAC_WRAPPER_RAM_ADDR (0x4A102000)
EMAC2
#define EMAC_BASE_ADDR (0x4A120000)#define EMAC_WRAPPER_BASE_ADDR (0x4A120900)#define EMAC_WRAPPER_RAM_ADDR (0x4A122000)#define EMAC_MDIO_PHY_NUM (2)
Huan a:
回复 Louis:
我按照社区会员 YiLong Zhou 的建议和方法修改了,但是启动Uboot后网络功能不能使用,一用就卡死。 只修改基地址可以吗,不需要其他配置吗
我明天试试….
YiLong Zhou:
回复 Huan a:
附件是ccs5的emac环路测试,你可以做根短接网线测试下eth0和eth1,证明硬件是可以得,再根据里面的修改来更改uboot。这个代码是从官网下载后做了一定修改,你也可以从官网下源码来做测试。
网址:http://support.spectrumdigital.com/boards/evm816x/revg/
测试方法如下:
修改 emac.h文件中的
#define EMAC0//#define EMAC1
来切换网口做测试。
祝好运。