家里无线设备多,唯一的一台出口路由器是小米路由器3 Pro负载逐渐上升,这玩意刚到手用着一直没啥问题,很久不重启都没事,但是随着设备多了,就开始时不时卡死,连管理界面都打不开,只能重启。硬路由一般用的都是MIPS之类的架构,带机能力有限,网上看到真正的带机神器其实是软路由,就是用一台x86的机器装上路由相关的软件虚拟成路由器用。一直心心念念了很久想搞一台,但一直没入坑,终于前段时间终于忍不住入了台J1900的四口软路由:
话说回来其实这种机器本来叫做工控主机,主要用在工业控制现场完成一些任务处理的,装上路由系统用在家里,就变成软路由了,我选的这款用的是Intel J1900四核处理器,性能相当可以的,有4个Intel I211千兆网口,加上2个USB,1个HDMI,1个VGA,看上去可玩性相当高,而且预留了天线接口,不过买之前卖家就提醒了,这货由于四个千兆网卡占用了cpu所有的pci-e通道,所以如果要装无线网卡虚拟AP的话,只能用USB定义的无线,一开始这番话我并没有太放在心上,然而路由到手之后,没想到这就成了折腾的开始。
好了,到手第一件事——拆开看一眼,这里顺便补充一下我买的配置:2G内存+32G SSD,其实到这里根据我的经验来说,如果不打算装windows或者想跑虚拟化系统的话,系统盘不用太大,像我只用openwrt系统的,一般会选择squashfs文件系统,因为可以恢复出厂设置,然而squashfs是不可写入的,所以系统盘那么大没必要,而且也没法用来存我们自己数据,主机里还留了一个SATA借口,更倾向于选择再挂一个更大的2.5寸硬盘来做NAS共享用,机器拆开如图:
可以看到红圈的地方是除了msata接口之外多出来mini pcie接口,于是我就想着加一个mini pcie无线网卡然后把天线连出来发射AP。然而我想当然的就认为只要找一个openwrt下有驱动的mini pcie无线网卡插上去就能在luci界面里用了,另外由于机箱外壳上只留了2个天线柱的接口,所以找个双天线的网卡最合适,最后挑了一下,选择了QCA9882,5G单频nac,2x2MIMO,最高速率867M的无线网卡,选定之后很快下单了:
不过,这并没有什么卵用,等无线网卡到了以后,风风火火的马上装上,开机,然而,不识别。。lspci命令里根本没有无线网卡设备。。一开始我一度以为是无线网卡坏了,问了卖软路由的老板才知道,之前说的pci-e通道被都被千兆网卡占用了不是随便说说的,指的就是,这个剩下的mini-pcie接口上面,就没有pcie的信号线了,是个usb only的接口,可以转换出usb接口用,但是pcie无线网卡不识别的。也就是说可以支持RT3070这种虽然是mini pcie接口但是走的是mini pcie座子上的usb总线的网卡才能用:
再或者,用华为的3G/4G无线模块也是可以的,走的也是USB总线,并且主板上接口旁边也预留好SIM卡座了,猜测这个mini pcie在原设计中就是留给3G/4G模块用的,天线也是给3G/4G天线留的。
否则的话,要么用转接板把usb接口转出来用,想要接pcie总线的无线网卡是不可能的。
难道只能用USB无线网卡了?但是RT3070这货只支持2.4G啊,而且速度只有150M,对于追求完美的我来说,我想要个5G ac的卡啊。并且,我真的不想在机箱上USB接口上再接东西,只想用内置的网卡。然而,我找遍了走USB总线的mini pcie无线网卡,只发现一款符合要求,那就是RT5572:
这货只有LiteON WN6500RH这款网卡是pci-e接口的,如上图,然而。。找遍了TB,没货。。。没货。。。这不还是坑爹嘛。。
无奈之下,后来我又找到了一款RTL8812BU的无线模块,双天线,USB接口,1200M双频支持ac,但是是模块,需要自己焊接4根USB线,不过也没别的办法了,只能把mini pcie转出usb接口来,然后直接焊线接上无线模块来用,话不多说,果断下单。
到手之后,果断焊上,焊上的效果如图:
完成,开机。。然而,不识别。。。我以为又是usb不支持,然而我把转换出来的usb接口直接接U盘,又是没问题的,这是为什么呢?后来折腾了半天,原来是因为pci-e接口的3.3V供电电压太低了,只有3.1V,由于我买的模块是3.3V供电的,我不敢直接接5V,于是直接焊在pci-e的3.3V电源处,然而没想到这货这么辣鸡,3.1V就不工作了,于是果断直接接USB的5V,正常识别,而且模块好像也没事啊。。这不还是坑爹么。。早说啊。。
然后下一步,驱动。。由于8812BU并不是openwrt原生就带驱动的,只能找第三方驱动。接着就开始了艰难的编译驱动之路,找了n版驱动,有的直接编译不过,有的编译完了直接kernel panic,大部分驱动,都只支持4.4以前的内核版本。一开始我用的是RTL8812AU的驱动,然而完全不工作,8812BU的USB id是0bda:b812,网上查了一下,这个desc应该用RTL8822BU的驱动,晕,还是坑爹。
最终,找到了这个驱动,可以在高版本4.14以后的内核里工作https://github.com/y0urself/rtl8822bu,不负所望,这次编译通过。。然后加载,很不幸。。kernel panic….
也就是说驱动还有点问题,根据提示,找到出错的函数,然后分析panic原因,一通瞎patch,最终,终于可以成功加载8822bu的驱动了。可是,这驱动并不能在luci界面里控制,只能用iw程序来控制,或者自己写控制脚本。这也太不方便了,还是坑爹了。
也许到这里,大家认为我最后还是打算放弃了,然而并不是的,还是打算再挣扎下。
还有一个终极方案没尝试过,那就是,不是说Intel I211网卡把pci-e通道都占满了吗,多出来的mini-pcie座子上没有pcie的信号线,那如果我拆掉一个Intel I211芯片,然后把原本接在Intel I211芯片上的pci-e线直接飞线到mini pcie座子上呢?
不多说了,试试吧,首先,我们找一下Intel I211芯片的datasheet,看一下引脚图:
首先两个红圈里的就是和PCIe信号有关的引脚了,其中PE_Rp,PE_Rn和PE_Tp,PE_Tn是两对pcie的差分信号,PECLKp和PECLKn是pcie的时钟,理论上来讲,只需要把这6根线飞线到mini pci-e的座子上对应地方就可以。接下来我们看一下Mini pcie插座的定义:
Top side
Bottom side
1
2
3.3V
3
Reserved****
4
GND
5
Reserved****
6
1.5V
7
CLKREQ#
8
VCC**
9
GND
10
I/O**
11
REFCLK-
12
CLK**
13
REFCLK+
14
RST**
15
N/C or GND
16
VPP**
Mechanical key
17
Reserved
18
GND
19
Reserved
20
Reserved***
21
GND
22
PERST#
23
PERn0
24
+3.3Vaux
25
PERp0
26
GND
27
GND
28
+1.5V
29
GND
30
SMB_CLK
31
PETn0
32
SMB_DATA
33
PETp0
34
GND
35
GND
36
USB_D-
37
Reserved*
38
USB_D+
39
Reserved*
40
GND
41
Reserved*
42
LED_WWAN#
43
Reserved*
44
LED_WLAN#
45
Reserved*
46
LED_WPAN#
47
Reserved*
48
+1.5V
49
Reserved*
50
GND
51
Reserved*
52
+3.3V
*Reserved for future second PCI Express Lane (if needed). Pin 51 has changed to be W_DISABLE2#
**Reserved for future Subscriber Identity Module (SIM) interface (if needed)
***Reserved for future wireless disable signal (if needed)
****Reserved for future wireless coexistence control interface (if needed)
可以看到上面标红的位置就是我们需要飞线焊接的位置了,话不多说,直接开干吧:
如上图,看不清楚的话可以直接下载原图,其中PERp PERn PETp PETn这4根线在可以焊在I211芯片边上的4个电容左侧,但是PECLKp和PECLKn这两根线没办法只能焊在芯片的焊盘上了,比较考验技术。另外注意一点,我右侧座子上标记的信号名和实际座子的定义是反过来的,因为PCIe的接法里面,发送端的PETp要接接收端的PERp,PETn接PERn,接收端的PETp要接发送端的PERp,接收端的PETn接发送端的PERn,也就是说发送和接收的信号要反接。CLK不需要,直接对应信号接上即可。完成之后,用点热熔胶固定,防止脱落:
然后,开机,见证奇迹的时刻到了:
竟然正常识别了!!!
接下来,重新编译openwrt固件,把firmware-qca988x的固件选上,kernel modules里选上ath10k刷进去,奇迹出现了,接口里面终于出现了无线:
好了,最后把外壳装好,按上天线,完美~~
总结:这次折腾总算是完美了,但是代价是LAN1这个网口就不能用了,不过对我来说这倒不是太大问题,牺牲一个有线网口换来一个内置的无线网卡对我来说还算值得,不过这次折腾也说明了一个问题,那就是确实软路由确实不适合用来直接发射AP,如果想要无线的话,最方便的方法还是去搞个硬路由接在LAN口上使用吧。本文纯属个人兴趣探索,供各位朋友参考!