【QCA】寄存器操作函数

Atheros有线驱动中有一个比较迷惑人的地方:寄存器的操作函数非常多,比如ar7240_reg_wr(), ar7240_reg_wr_nf(), ag7240_reg_wr(), ag7240_mii_write(), s26_wr_phy().....不知如此多的操作函数是由于这套驱动是由多个人完成,每个人均桀骜不驯,不肯使用别人的一点东西,还是出于商业机密的 原因,或者Atheros的芯片方案确实根骨奇特,不同类的寄存器需要不同的函数来操作,才能做到最好的性能。且罢,让我们来给其进行稍微归类,以便在编 写测试代码时能脑子清晰,速度快,用地准。欢迎各种插楼补充~

注:这里仅以write类函数作为代表。

1.直接操作虚拟地址类

ar7240_reg_wr(addr, value)
ar7240_reg_wr_nf(addr, value)
sysRegWrite(addr, value)

这一类函数的特点主要是直接操作虚拟地址,比如初始化GPIO,Flash,Uart,以及以太网大部分寄存器,都是可以使用这类函数进行操作。它的操作也比较简单,直接将DataSheet里面的address填入即可操作。
在Datasheet中,可以用此类函数的寄存器有一个比较明显的特点:即是address必须是如(0x1a000000)这样的32位地址。

2.通过mac来操作的函数类

ag7240_reg_wr(mac, reg, value)

这类函数采用一个base+offset模式来进行操作。具体为在有线驱动初始化时,会选择将GE0或GE1的首地址作为base,在操作时,将 需要操作的mac填入其中。由于ar9331芯片中包含两个GMAC设备,为了在操作寄存器时不会因为GMAC0或GMAC1的因素而导致错误,这类操作 函数应运而生。
正因为这类函数需要填入mac,导致其使用范围比较有限,仅限于DataSheet中的Ethernet Register。

3.mii操作寄存器

athrs26_reg_write(s26_address, s26_write_data)
ag7240_mii_write(unit, phy_addr, reg, data)
phy_reg_write(unit, phy_addr, reg, data)

关于mii的解释,具体说来就是网络设备底层设备间协商时使用的一种协议。具体包括速率协商,流控等(请达人补充)。而我们这几个函数 中,athrs26_reg_write是针对DataSheet中ethernet switch register的,其中涉及switch的各个port的功能设置,比如是否打开流控,是否增加VLAN tag,是否打开MAC地址自学习功能,并可以给各个port划分一下vlan等。ag7240_mii_write函数主要是被 athrs26_reg_write调用,完成芯片的设置。

4.phy类操作寄存器

s26_wr_phy(phy_addr, reg_addr, data)

在switch的最下面,是和物理的RJ45口相连接的PHY,对于phy口,前面提及的速率协商(10、100Mbps,全、半双工等),以及如网口连接状态判断等,均是调用此函数进行操作

猜你喜欢

转载自blog.csdn.net/vickytong1018/article/details/74625726