Finding which Linux module is needed for your hardware


Please note that this blog has been moved.

Now it has its own domain: mynixworld.info🙂

If you want to read the latest version of this article (recommended) please click here and I open the page for you.

Your Linux distro or even the stock Linux kernel comes with all thinkable drivers for all those hardware that they supported. Most of them are preselected by default (base on hardware architecture) to cover a wide palette of hardware.

However, if you are going to compile a Linux kernel only for your system, you should select/include only those modules that have something to do with your system. By cutting down the default kernel configuration you will save time, memory and will make your system faster.

How could you find out what drivers are need it by your system?If you have already a functional system or if you can boot a Live Linux CD then all you have to do is to look into the Linux system filesystem (sysfs) and to determine which device is using what driver.

For instance, to determine what driver is my network card using, first I need to know the network interface (eq. eth0, wlan0, etc) I want to find what where does the symlink /sys/class/net/<net-if>/device/driver/module point to.

In my case if I run the command ls against the path specified earlier I get the relative path to the driver module for my network card (where <net-if>=wlan1):

user@rpi-gentoo ~ $ ls -l /sys/class/net/<net-if>/device/driver/module
/sys/class/net/wlan1/device/driver/module -> ../../../../module/ath5k

As you can see the driver needed by this device is called ath5k. To setup the kernel to include this driver all I have to do is to search a configuration parameter named CONFIG_%ATH5K% (where % means one or more characters).

You should not be surprised if you will find more than one parameter with the pattern shown above because there could hundreds devices from that vendor. For example, the following configuration parameters contain the pattern show earlier:

CONFIG_ATH5K
CONFIG_ATH5K_AHB
CONFIG_ATH5K_DEBUG
CONFIG_ATH5K_PCI

If you want to understand what means any of those drivers I suggest you to look them up on Linux Hardware Database (lhwdb.org). The query string for any kernel configuration parameter is:

http://lhwdb.org/cfg/parameter

Note: the CONFIG_ prefix in the example above is stripped, so if the kernel parameter is named CONFIG_parameter you should use only the parameter part in the lhwdb.org query (or just go to lhwdb.org and use the damn search box :o).

Ok, so you’ve found out what is the driver name for you network card, right? But there could be at least 10-20 different drivers and finally, just to determine the kernel configuration name you have to search the content of at least 1600 different kernel Makefiles. It could be done automatically, though:

#!/bin/bash
TMP=$(mktemp)
FLIST=$(mktemp)
find -type f -name Makefile|sort -u > $FLIST
for f in $(find /sys/ -type l -name driver 2>/dev/null) ; do
        test -e $f/module && basename `readlink $f/module`
done|sort -u >$TMP

for m in $(cat $TMP);do
        echo -e "\e[33;1;31m[$m]\e[0m"
        for f in $(cat $FLIST);do
                grep -io "(CONFIG_.*$m.*)" $f
        done|sort -u
done|sed -e 's/^.*(//g;s/).*$//g'

rm -f $TMP $FLIST

The output of the code above run on my system looks like this (but it could look different on your system):

[ahci]
CONFIG_EXYNOS4_DEV_AHCI
CONFIG_IMX_HAVE_PLATFORM_AHCI
CONFIG_SATA_ACARD_AHCI
CONFIG_SATA_AHCI
CONFIG_SATA_AHCI_PLATFORM
[ath5k]
CONFIG_ATH5K
CONFIG_ATH5K_AHB
CONFIG_ATH5K_DEBUG
CONFIG_ATH5K_PCI
[coretemp]
CONFIG_SENSORS_CORETEMP
[drm]
CONFIG_DRM
CONFIG_DRM_AST
CONFIG_DRM_CIRRUS_QEMU
CONFIG_DRM_EXYNOS
...
CONFIG_DRM_I915
...
[ehci_hcd]
CONFIG_USB_EHCI_HCD
CONFIG_USB_EHCI_HCD_PLATFORM
[snd_hda_intel]
CONFIG_SND_HDA_INTEL
[uhci_hcd]
CONFIG_USB_UHCI_HCD
[usbcore]
[usbhid]

I searched on lhwdb.org and I’ve determined what represents each of these drivers and I’ve decided that those written with bold are the ones I need.

To include these and only these drivers on my Linux kernel, all I have to do is to step in each class of “Device drivers” (the lhwdb.org tells you even the kernel menus where to find these configuration parameters) and to select only those parameters that match with those shown by the output of the script above.

Final note: The method shown above it’s just the tip of the iceberg since it covers the process of finding the core drivers for the system. In order to determine each tiny driver used by each tiny device you might have, I would recommend reading the “Linux kernel in a Nutshell” by Greg Kroah-Hartman, which presents more techniques regarding this topic.

About Eugen Mihailescu

Always looking to learn more about *nix world, about the fundamental concepts of arithmetic, algebra and geometry. I am also passionate about programming, database and systems administration.
This entry was posted in kernel, linux and tagged , , . Bookmark the permalink.

One Response to Finding which Linux module is needed for your hardware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s