举个例子,如果想在路由器上跑 OpenWRT 并未包含的 RTL8188EU 驱动模块该怎么办呢?在这里给出一种快捷但是比较 dirty 的办法(否则应该自己写个 package )。
首先得有编译固件时留下的 kernel 的源码,包括编译过程中生成的一些文件。
下面假定 OpenWRT 的源码目录在 /some/path/openwrt ,内核目录以及 Staging DIR 分别为其下的 build_dir/target-mips_r2_uClibc-x.x.x.x/linux-target_generic/linux-x.x.x 和 staging_dir ,Toolchain 编译好后会存放在 Staging DIR 下的 toolchain-mips_r2_gcc-x.x-linaro_uClibc-x.x.x.x 目录里,前缀为 mips-openwrt-linux- 。目标机器指令集为 MIPS32 R2 。
那么,我们可以在内核驱动的目录下写一个脚本来帮助编译:
#!/bin/sh PREFIX="/media/study/wrt/openwrt_trunk" ARCH=mips KSRC="$PREFIX/build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.9" STAGING_DIR="$PREFIX/staging_dir" TOOLCHAIN_DIR="$STAGING_DIR/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/bin" CROSS_COMPILE="mips-openwrt-linux-" export STAGING_DIR=$STAGING_DIR export PATH=$TOOLCHAIN_DIR:$PATH make clean make ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE KSRC=$KSRC
一般情况下厂商的 Makefile 都会帮你传递 ARCH 、CROSS_COMPILE 和 KSRC 这几个变量,如 rtl8188eu 的驱动( https://github.com/lwfinger/rtl8188eu.git )。有的时候需要阅读 Makefile 并做些修改。
最后把生成的内核模块 scp 到装有对应固件的路由器上的 /lib/modules/<kernel_version>/ 下即可。使用 insmod 手动装入或者在 /etc/modules.d/ 下创建一个配置文件来完成开机自动加载。
已经根据贵博客的方法编译出OpenWrt on Raspberry的驱动,非常感谢!
Could you guide step by step, i have tp link wr725n V2 with chipset rtl8188eu.
Thanks!
Do you have the OpenWRT toolchain and the standalone rtl8188eu driver?
yes i have both. I follows this link https://github.com/lwfinger/rtl8188eu/issues/110 to compile driver for raspberry pi openwrt. Compile no error but not work.
Could you help me more clearly about your guide
Thank you very much!
Did you put the firmware in the correct place? Also can you see the card in dmesg / iwconfig?
Sorry, i find reply about link https://github.com/lwfinger/rtl8188eu/issues/110. The driver on this link do not support ARM architecture.
Could you help me more clearly you guide on this post, so that i can follow.
Thanks!
Which kernel are you using? I think the Raspbian kernel has rtl8188eu driver, maybe you can try that, but I need to verify. I have never tried to run OpenWRT on Rapsberry Pi.
rtl8188 work fine on raspbian, on openwrt it not work, i will try another time. Thank you very much your reply.
Best wishes for you!
Here outp of dmesg command:
[ 2.925283] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[ 3.045835] usb 1-1.2: New USB device found, idVendor=0bda, idProduct=8179
[ 3.054501] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3.063598] usb 1-1.2: Product: 802.11n NIC
[ 3.069518] usb 1-1.2: Manufacturer: Realtek
[ 3.075474] usb 1-1.2: SerialNumber: 00E04C0001
output of ifconfig
root@OpenWrt:~# ifconfig
br-lan Link encap:Ethernet HWaddr B8:27:EB:4C:6E:96
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::ba27:ebff:fe4c:6e96/64 Scope:Link
inet6 addr: fd19:9ba1:1f65::1/60 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3068 errors:0 dropped:0 overruns:0 frame:0
TX packets:1407 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:387462 (378.3 KiB) TX bytes:326726 (319.0 KiB)
eth0 Link encap:Ethernet HWaddr B8:27:EB:4C:6E:96
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4022 errors:0 dropped:10 overruns:0 frame:0
TX packets:1414 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:575071 (561.5 KiB) TX bytes:342432 (334.4 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:768 errors:0 dropped:0 overruns:0 frame:0
TX packets:768 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:52224 (51.0 KiB) TX bytes:52224 (51.0 KiB)
root@OpenWrt:~#
Did you insmod it at all? I do not see any output by the driver.
I use the newest trunk, the kernel is 3.18.11. Could you tell me full command insmod to load driver.
这个驱动加载上,怎么才能建立无线热点,openwrt里网络里出不来无线那个页面
这个驱动使用 wext 接口而非 cfg80211 ,所以需要 wireless-tools 。另外这个驱动需要修改版的 hostapd 才能开热点,操作起来比较麻烦。
修改版的hostapd已经下载了,按照网上说的改makefile里的cc,我改成cc=i486-openwrt-linux-gcc,生成的hostapd放到openwrt系统里不能用,不加执行权限说没权限,加了x权限又说not found。是我哪操作不对吗?具体要怎么做才能建热点?希望写一篇新博文来说明一下,谢谢。
你的路由器是 x86 的吗?一般应该是 mipsel
另外我不觉得 OpenWRT 对这类特殊的 hostapd 支持很好,估计还是开不了 AP ,因为配置文件里需要指定特殊的 driver
用的虚拟机,配置文件里指定了driver=rtl817xdrv。这是从网上看来要这样配置的。换了另一个驱动包,ifconfig里能看到wlan0了,你博文里提到的的那个驱动包使用ifconfig wlan0 up结果报Operation not permission。你提到的驱动包里也有hostapd的包。生成的hostapd与另一个驱动包文件大小不一样。但是两个都出现相同的问题加上运行权限报not found
rtl8188eu 需要一个 firmware 文件,系统里面如果没有的话,可以自己手动加进去,也可以用 OpenWRT 的包 r8188eu-firmware 。
另外你可以 strings 一下你的 hostapd ,如果第一行是 ld-linux 一类的而非 /lib/ld-uClibc.so.0 ,则说明编译环境有问题。
strings hostapd第一条是/lib/ld-linux.so.2
运行hostapd还是总说not found,运行显示/bin/ash:hostapd:not found
firmware这个文件在驱动包里有吗,还是也要自己编译出来,放在什么位置,需要什么命令加载吗,还是放进去就行
所以 hostapd 的编译环境没弄对。另外 firmware 用 OpenWRT 自己的包就行了。
我是要在x86上跑的,应该用什么环境设置
openwrt/attitude_adjustment/staging_dir/toolchain-i386_gcc-4.6-linaro_uClibc-0.9.33.2/bin/i486-openwrt-linux-uclibc-gcc
谢谢,明白怎么回事了,应该用i486-openwrt-linux-uclibc-gcc,这个gcc,而不是i486-openwrt-linux-gcc这个,因为在一个目录下,对编译又不懂所以一直不成功。再次感谢。
新的问题,运行hostapd /etc/hostapd/hostapd.conf后疯狂报错:
recvbuf2recvframe()-1548: RX Warning!, pkt_lentransfoer_len
这个错误一直出只能强行中止,可能是哪的问题?
这个没遇到过,貌似是 rtl8188eu 驱动 USB 部分的问题
build_dir/target-mips_r2_uClibc-x.x.x.x/linux-target_generic/linux-x.x.x
你的build_dir是这个
我的build_dir目录下有host、linux-x86_generic、target-i386_uClibc-0.9.33.2、toolchain-i386_gcc-4.6-linaro_uClibc-0.9.33.2四个目录,但是在target-i386_uClibc-0.9.33.2这个目录下没有linux-3.3.8,我的linux-x86_generic这个目录下有linux-3.3.8,我编译驱动build_dir用的是这个build_dir/linux-x86_generic/linux-3.3.8,是不是错了。但是在target-i386_uClibc-0.9.33.2下没有linux-3.3.8,怎么回事呢?
驱动编译没问题。x86 有点特殊的地方就是内核不用交叉编译。其他程序因为用了 uClibc 需要交叉编译。
看了一个编译8192cu的是用的build_dir/linux-x86_generic/linux-3.3.8
现在的问题是运行hostapd卡在 rtl817x_set_acl这里不动,只能中止,可以看到无线热点但连不上
这个就没辙了,不清楚问题出在哪。