第十一课--MicroWRT 驱动开发

来自Microduino Wikipedia
Shengkai81@gmail.com讨论 | 贡献2015年1月27日 (二) 04:53的版本 (Created page with "{| style="width: 800px;" |- | 本节教程主要介绍如何在MicroWRT上做驱动开发。 ==openWRT中驱动介绍== 在Openwrt 整套系统中,扩张的所有软件...")
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

本节教程主要介绍如何在MicroWRT上做驱动开发。


openWRT中驱动介绍

在Openwrt 整套系统中,扩张的所有软件包在package 目录下面,自己添加的应用也可以在这里目录里面增加。 而openwrt 所扩展的内核驱动在package 里面的kernel 目录下面。自己也可以在这里增加驱动,这里我们就增加一个驱动。 首先在这个目录下面增加一个example 文件夹,我们写的驱动就在这个文件夹下面。 首先在这个目录下面增加一个Makefile 文件,这个文件规定了驱动在openwrt 下面的规则。 Makefile 内容为下面的内容:

1 #
2 # Copyright (C) 2008-2010 OpenWrt.org
3 #
4 # This is free software, licensed under the GNU General Public License v2.
5 # See /LICENSE for more information.
6 #
7 include $(TOPDIR)/rules.mk
8 include $(INCLUDE_DIR)/kernel.mk
9 PKG_NAME:=example
10 PKG_RELEASE:=1
11 include $(INCLUDE_DIR)/package.mk
12 define KernelPackage/example
SUBMENU:=Other modules
TITLE:=Example driver
FILES:=$(PKG_BUILD_DIR)/example/example.ko
AUTOLOAD:=$(call AutoLoad,30,example,1)
KCONFIG:=
13 endef
14 define KernelPackage/example/description
Kernel module to generate button hotplug events
15 endef
16 EXTRA_KCONFIG:= \
CONFIG_EXAMPLE=m
17 EXTRA_CFLAGS:= \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
18 MAKE_OPTS:= \
ARCH="$(LINUX_KARCH)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
SUBDIRS="$(PKG_BUILD_DIR)/example" \
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
$(EXTRA_KCONFIG)
19 define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
20 endef
21 define Build/Compile
$(MAKE) -C "$(LINUX_DIR)" \
$(MAKE_OPTS) \
modules
22 endef
23 $(eval $(call KernelPackage,example))

这里主要介绍一下这个文件: 前6 行是注释,这里不用管。 第7 行和第8 行包括上两级目录配置。 第9 行为驱动的名字。第10 行为版本号。第11 行为包括上一级目录配置。 第12-13 行之间的内容为在make menuconfig 的时候在配置界面上面显示的方式。 SUBMENU 是显示的子选项 TITLE 是显示的内容 FILES 是生成的目标。 AUTOLOAD 是显示的顺序。 根据这个配置,在配置界面上面的显示为下图所示:

文件:Qudong.jpg
Module Configuration

第14-15 行的内容为帮助中显示的内容。 第19-20 行的内容为编译前的准备工作。 第21-22 行的内容为编译的选项。

这样一个makefile 就写好了。这里面用到了几个环境变量这里描述一下。 PKG_BUILD_DIR:编译时的目录,对应于驱动就是build_dir/target-**/linux-**/ ARCH:编译目标架构 CROSS_COMPILE:交叉编译器

在目录下面创建一个src 目录,在src 目录下面创建example 目录,这里放驱动的源文件。 这里首先创建一个helloworld 驱动。 增加一个kconfig 文件

 #config EXAMPLE
    tristate “This is a example”
    default n
    help
       This is a example, for debugging kernel model.

If unsure, say N.

增加一个Makefile 文件

obj-m := example.o

增加一个example.c 文件

 #include <linux/module.h>
 #include<linux/kernel.h>
 static int __init helloworld_init(void)
 {
    printk("helloworld driver init\n");
    return 0;
 }	
 static void __exit helloworld_exit(void)
 {
    printk("helloworld driver exit\n");
  }
 module_init(helloworld_init);
 module_exit(helloworld_exit);
 MODULE_AUTHOR("Yan Wu");
 MODULE_LICENSE("GPL");

这样一个简单的驱动就完成了,下面就可以编译了。 执行make package/kernel/example/compile V=99 就会编译出驱动。 在目录build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620a/example/example/example.ko, 找到example.ko文件,然后上传到板子上,用命令“insmod example.ko” 就加载上了模块。这样一个简单的驱动就完成了。

本节介绍的只是一个简单的驱动开发例子,但是他包含了驱动开发的基本框架,复杂的驱动开发都是对上面各个步骤的一个扩充。

为了方便玩家在编写Makefile和C文件的时候出错,现在测试文件上传上来,玩家可以直接下现在使用。

测试例程

Example file 文件:Example.zip