为 OpenWRT 编译额外的内核模块

举个例子,如果想在路由器上跑 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 都会帮你传递 ARCHCROSS_COMPILEKSRC 这几个变量,如 rtl8188eu 的驱动( https://github.com/lwfinger/rtl8188eu.git )。有的时候需要阅读 Makefile 并做些修改。

最后把生成的内核模块 scp 到装有对应固件的路由器上的 /lib/modules/<kernel_version>/ 下即可。使用 insmod 手动装入或者在 /etc/modules.d/ 下创建一个配置文件来完成开机自动加载。

《为 OpenWRT 编译额外的内核模块》上的29个想法

          1. 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.

          2. 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!

        1. 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:~#

          1. I use the newest trunk, the kernel is 3.18.11. Could you tell me full command insmod to load driver.

    1. 这个驱动使用 wext 接口而非 cfg80211 ,所以需要 wireless-tools 。另外这个驱动需要修改版的 hostapd 才能开热点,操作起来比较麻烦。

      1. 修改版的hostapd已经下载了,按照网上说的改makefile里的cc,我改成cc=i486-openwrt-linux-gcc,生成的hostapd放到openwrt系统里不能用,不加执行权限说没权限,加了x权限又说not found。是我哪操作不对吗?具体要怎么做才能建热点?希望写一篇新博文来说明一下,谢谢。

          1. 用的虚拟机,配置文件里指定了driver=rtl817xdrv。这是从网上看来要这样配置的。换了另一个驱动包,ifconfig里能看到wlan0了,你博文里提到的的那个驱动包使用ifconfig wlan0 up结果报Operation not permission。你提到的驱动包里也有hostapd的包。生成的hostapd与另一个驱动包文件大小不一样。但是两个都出现相同的问题加上运行权限报not found

          2. rtl8188eu 需要一个 firmware 文件,系统里面如果没有的话,可以自己手动加进去,也可以用 OpenWRT 的包 r8188eu-firmware 。
            另外你可以 strings 一下你的 hostapd ,如果第一行是 ld-linux 一类的而非 /lib/ld-uClibc.so.0 ,则说明编译环境有问题。

  1. strings hostapd第一条是/lib/ld-linux.so.2
    运行hostapd还是总说not found,运行显示/bin/ash:hostapd:not found

    firmware这个文件在驱动包里有吗,还是也要自己编译出来,放在什么位置,需要什么命令加载吗,还是放进去就行

  2. 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这个,因为在一个目录下,对编译又不懂所以一直不成功。再次感谢。

  3. 新的问题,运行hostapd /etc/hostapd/hostapd.conf后疯狂报错:
    recvbuf2recvframe()-1548: RX Warning!, pkt_lentransfoer_len

    这个错误一直出只能强行中止,可能是哪的问题?

  4. 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,怎么回事呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据