首页 > 代码库 > 如何在编译内核时添加缺少的固件(以intel wireless 5100 AGN的 iwlwifi 为例)

如何在编译内核时添加缺少的固件(以intel wireless 5100 AGN的 iwlwifi 为例)

不知大家在笔记本使用 Linux 时编译内核后无线wifi 能不能用,我的本本是“联想 Y450”一款足够老的本本,配的无线网卡是:

 $ lspci | grep Wireless
06:00.0 Network controller: Intel Corporation PRO/Wireless 5100 AGN [Shiloh] Network Connection

目前使用的系统为 Linux Mint 17 Qiana(Cinnamon桌面版的,毕竟cinnamon是基于Gnome3 的,与Mate 桌面相比还是更喜欢Cinnamon 。Mint 用户定制比较多,还是比较好玩的Linux 发型版)

之前在使用Debian 时我记得好像是编译使用了一个比较新的内核后就支持了无线,但是不知道现在为什么不能解决,于是只能老老实实安装上系统提示的缺失固件。方法可行,希望对你有用。


1. 无线必备的内核选项

在编译内核时我们肯定需要选择上与 WIFI 相关的内核选项:
long@Jarvis ~ $ lsmod | grep wifi
iwlwifi               147953  1 iwldvm
cfg80211              409394  3 iwlwifi,mac80211,iwldvm


很轻松的就能选上这些:

首先选择对应的 WIFI 网卡模块(iwlwifi)及其 DVM 固件支持(iwldvm)

-> Device Drivers
  -> Network device support
    -> Wireless LAN
      -> Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)
        -> Intel Wireless WiFi DVM Firmware support    (iwldvm)


再选择上网络的无线协议802.11 API(CFG80211):

-> Networking support
  -> Wireless
    -> cfg80211 - wireless configuration API (CFG80211)


以及通用的IEEE的802.11 网络协议栈(mac80211)

-> Networking support
  -> Wireless
    -> Generic IEEE 802.11 Networking Stack (mac80211)


2. 错误情况及其处理办法

理论上,这几项编译上之后此内核应该就支持了 无线功能,但是开机后无线无法使用,在内核报告中,我们可以清晰的看到:

$ dmesg | grep wifi

[    4.577225] iwlwifi 0000:06:00.0: request for firmware file ‘iwlwifi-5000-5.ucode‘ failed.
[    4.577313] iwlwifi 0000:06:00.0: Direct firmware load failed with error -2
[    4.577318] iwlwifi 0000:06:00.0: Falling back to user helper
[    4.592958] iwlwifi 0000:06:00.0: request for firmware file ‘iwlwifi-5000-4.ucode‘ failed.
[    4.593079] iwlwifi 0000:06:00.0: Direct firmware load failed with error -2
[    4.593084] iwlwifi 0000:06:00.0: Falling back to user helper
......
[    4.594753] iwlwifi 0000:06:00.0: request for firmware file ‘iwlwifi-5000-1.ucode‘ failed.


[    4.594782] iwlwifi 0000:06:00.0: no suitable firmware found!
红色标出来的部分我们可以看到在系统启动时查询加载固件出问题了,找不到‘iwlwifi-5000-5.ucode‘固件,转而内核查找“‘iwlwifi-5000-4.ucode‘”,"‘iwlwifi-5000-3.ucode‘","‘iwlwifi-5000-2.ucode‘","‘iwlwifi-5000-1.ucode‘",都加载失败后内核放弃治疗,打印了个没有合适固件,然后就不管无线网卡了。


所以我们需要在内核中添加无线网卡的固件支持,在网上寻找良方,找到解决办法:

1. 首先下载网卡对应的固件文件,而且之前的内核日志也告诉我们该下载哪个:内核想查找‘iwlwifi-5000-5.ucode‘,再找不到的情况下才转而查找其他的,所以我们下载‘iwlwifi-5000-5.ucode‘足矣。

注: 我使用 git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git 克隆了所有内核目前可能需要的固件的仓库,以备后患,而且很轻松就可以在里面找到我需要的‘iwlwifi-5000-5.ucode‘固件。

2. 使用 $ sudo cp iwlwifi-5000-5.ucode /lib/firmware/将固件拷贝到“/lib/firmware/” 目录下

3. 编译内核时,按照我下面的修改:

-> Device Drivers
  -> Generic Driver Options  --->
     -*- Userspace firmware loading support                 
     [*]   Include in-kernel firmware blobs in kernel binary
     (iwlwifi-5000-5.ucode) External firmware blobs to build into the kernel binary     # 指定需要加载的固件
     (/lib/firmware) Firmware blobs root directory      # 指定固件所在的(根)目录,与上面选项搭配指定具体固件


其他内核选项照旧,编译后内核就支持无线功能咯,还是很方便的。此方法对于其他内核需要的固件应该也是有效的。


=====================

此外,在安装Debian 时,缺失这样的固件系统会检测并且通知用于是否插入有固件的可移动盘,在那个时候直接添加上固件应该也是有效的,虽然我还未尝试大笑


本文资源以及方法参考: http://wireless.kernel.org/en/users/Drivers/iwlwifi/?n=downloads