背景
在HXX板中,DM8168使用了和EVM板一样的配置,即两个EMAC模块分别连接到两个PHY上,用同一个MDIO模块管理。这两个PHY配置为不同地址。在TFTP方式烧写内核和文件系统过程中,U-Boot默认使用且只支持EMAC0实现网口通信。
然而在新研FXX板中,DM8168改变了网口连接方式,其EMAC0未引出板外,EMAC1通过PHY引出RJ45接口。因此在烧写内核和文件系统过程中只能使用EMAC1,这就需要修改U-Boot源码使其支持EMAC1。
U-Boot网口驱动分析
U-Boot的启动过程不赘述,其中与EMAC相关的几个函数的调用关系为
start_armboot()
–>eth_initialize()
–>board_eth_init()
–>davinci_emac_initialize()
–>davinci_eth_mdio_enable()
&davinci_eth_phy_detect()
&davinci_eth_phy_read()
&davinci_eth_phy_write()
,此外还有一些如miiphy_init()
、eth_register()
、miiphy_register()
等与硬件无关的代码。
初始化过程将网络设备注册到U-Boot系统中,但并不真正使用它。在调用U-Boot网络命令时,才会调用网口的关闭、打开、接收、发送等函数。在DM8168上对应davinci_eth_open()
、davinci_eth_close()
、davinci_eth_send_packet()
和davinci_eth_rcv_packet()
函数。
了解了这个脉络,就可以进一步分析代码了。先看第一个真正的硬件操作:
============ drivers/net/davince_emac.c 115 129 ==================
static void davinci_eth_mdio_enable(void)
{
u_int32_t clkdiv;
clkdiv = (EMAC_MDIO_BUS_FREQ / EMAC_MDIO_CLOCK_FREQ) - 1;
writel((clkdiv & 0xff) |
MDIO_CONTROL_ENABLE |
MDIO_CONTROL_FAULT |
MDIO_CONTROL_FAULT_ENABLE,