打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OpenWRT添加模块(三)内核模块
分类:OpenWRT 2013-12-24 21:33 4541人阅读评论(2)举报
openwrt
http://blog.csdn.net/ruiyiin/article/details/8850467
注意1:本文中代码直接拷贝可能会有问题,最好手动输入一遍
注意2:example/Makefile中的PKG_BUILD_DIR没有定义,不知道是否有影响,但是我添加了一句PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
注意3:如果需要编译多个文件,可以在src下面的Makefile增加"example-y := example2.o",就可以增加一个example2.c
关于内核模块的自动加载:
1  FILES:=$(PKG_BUILD_DIR)/fnsr-i2c$(PKG_MODULE_EXTENSION)    用于将制定的ko文件拷贝到root-fs/lib/modules目录下
2   AUTOLOAD:=$(call AutoLoad,99,fnsr-i2c) 应该是用于自动装载模块,在linux 2.6上工作正常,在linux 3.10不能生效,仍然需要手动输入insmod
可以在Makefile增加下面代码(在files下创建脚本my_module_start.sh)
define KernelPackage/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) files/my_module_start.sh $(1)/etc/init.d
endef
进入package目录,创建模块目录
cd mcp/branches/V1.1-beta1/mcp/package
mkdir example
进入example目录,创建Makefile文件和代码路径
cd example
touch Makefile
mkdir src
Makefile具体内容如下:
# Kernel module example
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=example
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define KernelPackage/example
SUBMENU:=Other modules
DEPENDS:=@TARGET_octeon
TITLE:=Support Module for example
AUTOLOAD:=$(call AutoLoad,81,example)
FILES:=$(PKG_BUILD_DIR)/example/example.$(LINUX_KMOD_SUFFIX)
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) -R ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Compile
$(MAKE) -C "$(LINUX_DIR)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
ARCH="$(LINUX_KARCH)" \
SUBDIRS="$(PKG_BUILD_DIR)/example" \
EXTRA_CFLAGS="-g $(BUILDFLAGS)" \
modules
endef
$(eval $(call KernelPackage,example))
3.进入src目录,创建代码路径和相关源文件
cd src
mkdir example
cd example
touch example.c Kconfig Makefile
example.c具体内容如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/* hello_init ---- 初始化函数,当模块装载时被调用,如果成功装载返回0 否则返回非0值 */
static int __init hello_init(void)
{
printk("I bear a charmed life.\n");
return 0;
}
/ * hello_exit ---- 退出函数,当模块卸载时被调用 */
static void __exit hello_exit(void)
{
printk("Out, out, brief candle\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhangjiefeng");
Kconfig具体内容如下:
config EXAMPLE
tristate "Just a example"
default n
help
This is a example, for debugging kernel model.
If unsure, say N.
Makefile具体内如如下:
obj-m := example.o
回到主路径 mcp/branches/V1.1-beta1/mcp/,编译选项配置保存并编译
make menuconfig
Kernel modules --->
Other modules --->
kmod-example
选项设置为M,保存退出
然后编译该模块:
make package/example/compile
5.编译出的文件可以在主路径的以下路径找到
./staging_dir/target-mips64_eglibc-2.10.1/root-octeon/lib/modules/2.6.30.9/
./build_dir/linux-octeon/example/ipkg-octeon/kmod-example/lib/modules/2.6.30.9/
./build_dir/linux-octeon/example/example/
文件名为:example.ko
注:我们使用./build_dir/linux-octeon/example/example/example.ko
二、用户态工具添加方法
1.进入package目录,创建工具目录
cd mcp/branches/V1.1-beta1/mcp/package
mkdir example1
2.进入example1目录,创建Makefile文件和代码路径
cd example1
touch Makefile
mkdir src
该Makefile具体内容如下:
#User mode tool example
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=example1
PKG_RELEASE:=1
PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/example1
SECTION:=utils
CATEGORY:=Base system
TITLE:=Build for example1 commands
endef
define Package/example1/description
This package contains an utility useful to use example1 commands.
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
target=$(firstword $(subst -, ,$(BOARD)))
MAKE_FLAGS += TARGET="$(target)"
TARGET_CFLAGS += -Dtarget_$(target)=1 -Wall
define Build/example1/compile
$(MAKE) -C "$(LINUX_DIR)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
ARCH="$(LINUX_KARCH)" \
SUBDIRS="$(PKG_BUILD_DIR)" \
EXTRA_CFLAGS="$(BUILDFLAGS)"
endef
define Package/example1/install
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/example1 $(1)/sbin/
endef
$(eval $(call BuildPackage,example1))
3.进入src目录,创建相关源文件
cd src
touch example1.c Makefile
example1.c 具体内容如下:
#include <stdio.h>
int main(void)
{
printf("Hello, world\n");
return 0;
}
Makefile文件具体内容如下:
.NOTPARALLEL:
#OCTEON_ROOT=$(PWD)/src/
CC=~/openwrt/main/staging_dir/toolchain-mips64_gcc-4.4.1_eglibc-2.10.1/usr/bin/mips64-openwrt-linux-gnu-gcc
CFLAGS=-mips64r2 -mabi=64 -march=octeon -mtune=octeon
LFLAGS=
.PHONY: all
all: example1
example1:example1.c
${CC} ${CFLAGS} ${LFLAGS} -W -g -Wall -Wno-unused-parameter -DUSE_RUNTIME_MODEL_CHECKS=1 \
-o $@ example1.c
4.回到主路径 mcp/branches/V1.1-beta1/mcp/,编译选项配置保存并编译
make menuconfig
Base system --->
example1
选项设置为M,保存退出
然后编译该模块:
make package/example1/compile
5.编译出的文件可以在主路径的以下路径找到
./staging_dir/target-mips64_eglibc-2.10.1/root-octeon/sbin/
./build_dir/linux-octeon/example1/ipkg-octeon/example1/sbin/
./build_dir/linux-octeon/example1/
文件名为:example1
注:我们使用./build_dir/linux-octeon/example1/example1
根据OpenWrt安装介绍,将内核模块和用户态工具在板子上运行,到这就简单了往下我就不贴了。
本文贴自:http://semptian.net/projects/openwrt/wiki/%E5%A2%9E%E5%8A%A0%E6%96%B0%E7%9A%84%E5%BA%94%E7%94%A8%E5%88%B0%E7%B3%BB%E7%BB%9F%E4%B8%AD
转自:http://blog.chinaunix.net/uid-9217288-id-3060464.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[z]关于android中的ramdisk.img及uImage无法包含驱动模块(*.ko)的问...
KBuild MakeFile介绍
写内核模块Makefile的技巧
通用内核模块Makefile
linux/android mk文件
Android源代码编译命令m mm mmm make分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服