“第十二课--MicroWRT 驱动开发”的版本间的差异
(→openWRT中驱动介绍) |
(→openWRT中驱动介绍) |
||
第96行: | 第96行: | ||
#include <linux/module.h> | #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"); | |
− | |||
这样一个简单的驱动就完成了,下面就可以编译了。 | 这样一个简单的驱动就完成了,下面就可以编译了。 | ||
第120行: | 第119行: | ||
为了方便玩家在编写Makefile和C文件的时候出错,现在测试文件上传上来,玩家可以直接下现在使用。 | 为了方便玩家在编写Makefile和C文件的时候出错,现在测试文件上传上来,玩家可以直接下现在使用。 | ||
− | |||
|} | |} |
2014年11月24日 (一) 05:47的版本
本节教程主要介绍如何在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 是显示的顺序。 根据这个配置,在配置界面上面的显示为下图所示: 第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文件的时候出错,现在测试文件上传上来,玩家可以直接下现在使用。 |