前言:html
刚刚遇到个案子,须要把驱动弄进openwrt里,因而去网上大肆搜罗一番,然而,看到的都是千遍一概,并且毫无养分,bash
估计不少人按照这些博客里面作出来的,能作成功的,没几我的。因而,爬了坑以后,决定本身写个笔记记录一下,在ui
此,我要很是感谢“佐须之男” 佐大,看了他的视频,才知道大概怎么去作。命令行
在给驱动作package的时候,跟应用package差很少,最重要的一点是,须要掌握Makefile的知识。code
开始:orm
当模块是单个文件且没有依赖的时候,其实按照网上的博客基本也能作出来,可是模块是多个文件,并且须要依赖内核里的视频
组件时,我以为不少人会掉坑,起码我是其中之一。htm
首先,咱们须要了解这个Package的结构,在了解Package的文件结构时,tree命令很是有用,以下:blog
从上图能够看出,一个package能够包括一个顶层Makefile,一个src文件夹,src文件夹里包括源文件以及用于编译的Makefile图片
顶层Makefile用于生成package的。
通常咱们还须要在src里面添加一个Kconfig,用于在menuconfig上生成菜单。
如今先来看顶层Makefile的内容,最好的方法,就是复制现成的Makefile来改,这招是从佐大那里学来的。
# # 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 PKG_NAME:=gpio-button-hotplug PKG_RELEASE:=1 include $(INCLUDE_DIR)/package.mk define KernelPackage/gpio-button-hotplug SUBMENU:=Other modules TITLE:=Simple GPIO Button Hotplug driver FILES:=$(PKG_BUILD_DIR)/gpio-button-hotplug.ko AUTOLOAD:=$(call AutoLoad,30,gpio-button-hotplug,1) KCONFIG:= endef define KernelPackage/gpio-button-hotplug/description This is a replacement for the following in-kernel drivers: 1) gpio_keys (KEYBOARD_GPIO) 2) gpio_keys_polled (KEYBOARD_GPIO_POLLED) Instead of generating input events (like in-kernel drivers do) it generates uevent-s and broadcasts them. This allows disabling input subsystem which is an overkill for OpenWrt simple needs. endef EXTRA_KCONFIG:= \ CONFIG_GPIO-BUTTON-HOTPLUG=m 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,gpio-button-hotplug))
上面include字段,不须要改,这是包含外部的信息,固定格式
PKG_NAME:你的package名字
PKG_RELEASE:释放版本
而后如下是主要关注的地方
define KernelPackage/gpio-button-hotplug #gpio-button-hotpulg改为你的package名 SUBMENU:=Other modules #属于哪一个菜单,下面图片介绍 TITLE:=Simple GPIO Button Hotplug driver #标题 FILES:=$(PKG_BUILD_DIR)/gpio-button-hotplug.ko #这是你的模块ko文件 AUTOLOAD:=$(call AutoLoad,30,gpio-button-hotplug,1) #自动装载命令行 KCONFIG:= endef
下面是属于对这个package的描述,随你怎么写
define KernelPackage/gpio-button-hotplug/description ... endef
下面是固定格式,不需改动
MAKE_OPTS:= \ ARCH="$(LINUX_KARCH)" \ CROSS_COMPILE="$(TARGET_CROSS)" \ SUBDIRS="$(PKG_BUILD_DIR)"
而后这里是重点,模块通常须要包含一些路径,标志,可是上面的Makefile里是没有介绍的,并且这个也是其余博客里面没有
介绍的,他们只会抄模板里的而后拷贝,而后什么都不说
就是上面这个EXTRA_CFLAGS,若是你的驱动须要包含一些依赖,或者是定义-Dxxxxx,须要在这里加上
而后下面的都是固定格式,不需修改了。
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,gpio-button-hotplug))
大概就是介绍MAKE须要的宏,例如文件夹,ARCH和CROSS_COMPILE这个有点基础的都知道。
而后Build以前作什么,须要在Build/Prepare中添加
而后就是编译了。
顶层Makefile大概就是这样,接下来介绍src里的Makefile,通常咱们会有一个文件或者多个文件,这里跟普通的Makefile时同样的,例如咱们要生成一个gpio_button-hotpulg.ko,而这个模块生成须要a.c,b.c和c.c文件
gpio_button-hotpulg-objs := a.o b.o c.o obj-${CONFIG_GPIO-BUTTON-HOTPLUG} += gpio_button-hotpulg.o
这样,这个package就完成了9成了,而后咱们还须要添加一个Kconfig,用于在menuconfig中生成菜单项。
config GPIO-BUTTON-HOTPLUG tristate "gpio button hotpulg" help module for gpio button hotpulg.
以上是一个完整的package元素要点,按照这些补充上,最后只须要在openwrt文件夹下执行
make package/gpio_button_hotpulg/compile V=s
便可生成模块。
最后,很是感谢佐须之男给予的指导
给佐大作作广告: