《路由器开发-OpenWrt系统开发》第17章 驱动开发之字符设备驱动程序

开发环境:
主机:Ubuntu14.04
开发板:MT7628
Openwrt:Openwrt15.05

17.1 配置编译驱动程序

首先将 MT7628_drv 文件夹传到 OpenWrt 源码的package/kernel 目录下。然后进入 OpenWrt 源码的顶层目录,执行 make menuconfig。

注意:至于MT7628_drv的内容,建议初学者按照步骤做就是了,不必追问细节,初学者应该知道openwrt驱动开发流程,代码的具体实现笔者在后文也会讲到,跟着笔者一步一步做就是了。
$ make menuconfig
在弹出的菜单界面里,配置选项。

Kernel modules  --->  
    Other modules  --->
        <* > kmod-MT7628_drv

然后我们就能看到我们的驱动程序的选项了 kmod-MT7628_drv,将它配置成M,也可编译进入内核。然后再执行编译命令。

make V=99

编译完成以后,就能在源码/bin/ramips/packages/base目录下看到我们的内核模块驱动程序的软件包。

==kmod-MT7628_drv_3.18.29-1_ramips_24kec.ipk==

17.2字符设备驱动软件包 Makefile 介绍

首先进入到MT7628_drv 文件夹,里面有两个文件。
内容如下。

#
# Copyright (C) 2008-2019 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:= MT7628_drv
PKG_RELEASE:=1

include $(INCLUDE_DIR)/package.mk

define KernelPackage/MT7628_drv
  SUBMENU:=Other modules
  # DEPENDS:=@!LINUX_3_3
  TITLE:=Motor driver
  FILES:=$(PKG_BUILD_DIR)/MT7628_drv.ko
  # AUTOLOAD:=$(call AutoLoad,30,MT7628_drv,1)
  KCONFIG:=
endef

define KernelPackage/MT7628_drv/description
 This is a MT7628_drv drivers
 endef

MAKE_OPTS:= \
    ARCH="$(LINUX_KARCH)" \
    CROSS_COMPILE="$(TARGET_CROSS)" \
    SUBDIRS="$(PKG_BUILD_DIR)"

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Build/Compile
    $(MAKE) -C "$(LINUX_DIR)" \
        $(MAKE_OPTS) \
        modules
endef
$(eval $(call KernelPackage,MT7628_drv))

至于该 Makefile 文件中每行是什么意思,请查阅上一章,这里不再赘述。进入到 src 文件夹中,我们看一下 Makefile 的内容,非常简单:
obj-m +=MT7628_drv.o

告诉内核添加的模块目标文件名称为MT7628_drv.o,至于MT7628_drv.c 这一个驱动模板,在上一章介绍过了,这里就不加以阐述了。

17.3 动态的加载和卸载内核驱动模块软件包

通过前面的努力,我们终于得到了我们自己的内核驱动模块软件包了。接下来就来使用它。首先将 kmod-MT7628_drv_3.18.29-1_ramips_24kec.ipk软件包传到开发板上面。然后使用 opkg install 命令来安装软件包。

opkg install kmod-MT7628_drv_3.18.29-1_ramips_24kec.ipk

使用 opkg list 命令来查看已经安装了哪些软件包。这里是否执行该命令都无所谓。接下来进入我们的/lib/modules/3.18.109 目录,就能看到我们的驱动程序模块了。

cd lib/modules/3.18.29/

接下来就通过 insmod 命令来装载驱动模块。
insmod MT7628_drv.ko

当我们一执行该命令,串口终端上面就会打印出。如果我们想卸载驱动模块,则使用 rmmod 命令。

rmmod MT7628_drv

当执行完这条命令后,就成功的卸载了该驱动程序。我们也能看到打印信息。

17.4驱动开机自动加载

虽然我们通过 opkg insall 得到了.ko 为后缀的驱动模块,但是每次要使用都得进行insmod,比较麻烦,我们可以让系统开机后自动的加载该驱动模块。

首先进入到特定的目录:
$cd /etc/modules.d

然后创建一个文件并且写入一些信息:
vi 61-MT7628_drv

说明:61 表示不使用外接 usb 类的自启动程序,分隔符‘ -’后面接驱动模块名称!在创建的该文件中写入MT7628_drv 即驱动的名称。最后,必须保证MT7628_drv.ko 文件即我们的驱动模块文件放在: /lib/modules/3.18.29/

好的,重新启动系统即可:reboot

可以通过命令查询当前已经加载的驱动模块:lsmod

接收更多精彩文章及资源推送,请订阅我的微信公众号:

0PPMFS.jpg

Related posts

Leave a Comment