第17章 驱动开发之字符设备驱动程序
17.1 配置编译驱动程序
首先将 f403tech_drv (参见文末下载链接)文件夹传到 OpenWrt 源码的openwrt/trunk/package/kernel 目录下。然后进入 OpenWrt 源码的顶层目录,执行 makemenuconfig。
注意:至于f403tech_drv的内容,建议初学者按照步骤做就是了,不必追问细节,初学者应该知道openwrt驱动开发流程,代码的具体实现笔者在后文也会讲到,跟着笔者一步一步做就是了。
# cd /work/openwrt/trunk/ # make menuconfig
在弹出的菜单界面里,首先进入 Kernel modules 选项。
紧接着进入 Other modules 选项。
然后我们就能看到我们的驱动程序的选项了 kmod-f403tech_drv,将它配置成 y,即*
最后,退出保存。然后再执行编译命令。
# make V=99
编译完成以后,就能在 openwrt/trunk/bin/ramips/packages 目录下看到我们的内核模块驱动程序的软件包。
17.2字符设备驱动软件包 Makefile 介绍
首先进入到f403tech_drv 文件夹,里面有两个文件。
内容如下。
# #Copyright (C) 2008-2012 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 include $(INCLUDE_DIR)/package.mk//以上三个用来关联 OpenWrt PKG_NAME:=f403tech_drv//字符设备驱动模块名称 PKG_RELEASE:=1//版本号 define KernelPackage/f403tech_drv//内核模块 SUBMENU:=Other modules//进行归类 # DEPENDS:[email protected]!LINUX_3_3 TITLE:=Motor driver//标题 FILES:=$(PKG_BUILD_DIR)/f403tech_drv.ko//模块文件 # AUTOLOAD:=$(call AutoLoad,30,f403tech_drv,1) KCONFIG:= endef define KernelPackage/f403tech_drv/description This is a f403tech_drv drivers//描述 endef MAKE_OPTS:= \//编译前指定工具和内核 arch 等 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,f403tech_drv))
至于该 Makefile 文件中每行是什么意思,请查阅上一章,这里不再赘述
进入到 src 文件夹中:
我们看一下 Makefile 的内容,非常简单:
obj-m += f403tech_drv.o 告诉内核添加的模块目标文件名称为
f403tech_drv.o
至于f403tech_drv.c 这一个驱动模板,在上一章介绍过了,这里就不加以阐述了。
17.3 动态的加载和卸载内核驱动模块软件包
通过前面的努力,我们终于得到了我们自己的内核驱动模块软件包了。接下来就来使用它。首先将 kmod-f403tech_drv_3.10.36-1_ramips_24kec.ipk 软件包传到开发板上面。
然后使用 opkg install 命令来安装软件包。
# opkg install kmod-f403tech_drv_3.10.36-1_ramips_24kec.ipk
使用 opkg list 命令来查看已经安装了哪些软件包。这里是否执行该命令都无所谓。
接下来进入我们的/lib/modules/3.10.36 目录,就能看到我们的驱动程序模块了。
# cd lib/modules/3.10.36/
接下来就通过 insmod 命令来装载驱动模块。
# insmod f403tech_drv.ko
当我们一执行该命令,串口终端上面就会打印出。
这行打印信息,正是我们在驱动程序的入口函数中添加的调试信息。
如果我们想卸载驱动模块,则使用 rmmod 命令。
# rmmod f403tech_drv
当执行完这条命令后,就成功的卸载了该驱动程序。我们也能看到如下打印。
这条打印,是在我们的驱动的出口函数中添加的调试信息
17.4驱动开机自动加载
虽然我们通过 opkg insall 得到了.ko 为后缀的驱动模块,但是每次要使用都得进行insmod,比较麻烦,我们可以让系统开机后自动的加载该驱动模块。
首先进入到特定的目录:
cd /etc/modules.d
然后创建一个文件并且写入一些信息:
vi 61-f403tech_drv 说明:61 表示不使用外接 usb 类的自启动程序,分隔符‘ -’后面接驱动模块名称!
在创建的该文件中写入: f403tech_drv 即驱动的名称。
最后,必须保证f403tech_drv.ko 文件即我们的驱动模块文件放在: /lib/modules/3.10.36/
好的,重新启动系统即可:reboot
可以通过命令查询当前已经加载的驱动模块:lsmod