【OpenWrt】使用SDK编译Linux内核驱动

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wr132/article/details/78946200

很多路由器都有USB接口,当路由器搭载OpenWrt(LEDE)系统后,理论上可以使用任何USB接口的设备,常见的设备比如各种存储设备、USB网卡等。但是如果内核中没有集成相关的驱动,并且源中也没有提供该设备的kmod,那么就需要自己寻找驱动源码并编译为驱动模块。
OpenWrt官方提供了一套编译系统,使用feed/package模式,但是如果不是专门开发OpenWrt,熟悉这一套开发环境需要很多时间和精力,如果我们只需要编译标准的Linux驱动模块,可以使用OpenWrt提供的SDK。

下载SDK

  • OpenWrt官方下载链接
  • LEDE官方下载链接

    1. 选择固件版本,如果可以,尽量选择最新的稳定版本
    2. 根据路由器的处理器架构选择相应的固件,比如MT7620为mips架构,那么需要选择ramips
    3. 在固件所在的目录,可以找到适配于当前版本的SDK,直接下载即可

确定相关路径

解压SDK后,需要使用其中的内核源码以及交叉编译器,下面的路径均以MT7620的SDK为例。

内核源码所在目录:

${SDK_ROOT}/build_dir/target-mipsel_24kc_musl-1.1.16/linux-ramips_mt7620/linux-4.4.92

交叉编译器所在的目录

${SDK_ROOT}/staging_dir/toolchain-mipsel_24kc_gcc-5.4.0_musl-1.1.16/bin

编写编译脚本

编译Linux内核模块的时候,比较重要的几个环境变量:

ARCH:处理器架构
CROSS_COMPILE:交叉编译器的路径前缀
KVER:内核版本
KSRC:内核源码路径
STAGING_DIR:OpenWrt编译器指定的目录,如果不设置会有警告

所以可以在内核驱动源码路径下编写一个build.sh的脚本,用来向make工具传递环境变量。模板如下:

#!/bin/bash
ARCH=arm
CROSS_COMPILE=/home/ryan/develop/lede/lede-sdk-17.01.4-brcm2708-bcm2709_gcc-5.4.0_musl-1.1.16_eabi.Linux-x86_64/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi/bin/arm-openwrt-linux-muslgnueabi-
KVER=4.4.92
KSRC=/home/ryan/develop/lede/lede-sdk-17.01.4-brcm2708-bcm2709_gcc-5.4.0_musl-1.1.16_eabi.Linux-x86_64/build_dir/target-arm_cortex-a7+neon-vfpv4_musl-1.1.16_eabi/linux-brcm2708_bcm2709/linux-4.4.92
STAGING_DIR=./staging_dir
make ARCH=${ARCH} \
    CROSS_COMPILE=${CROSS_COMPILE} \
    KVER=${KVER} \
    KSRC=${KSRC} \
    STAGING_DIR=${STAGING_DIR}

因为许多内核驱动源码的Makefile都提供了很多设备的配置信息,所以在编译之前,需要看一下是否提供了相关的环境变量,然后执行build.sh即可

猜你喜欢

转载自blog.csdn.net/wr132/article/details/78946200