1. 程式人生 > >openwrt新增驅動

openwrt新增驅動

前言:

剛剛遇到個案子,需要把驅動弄進openwrt裡,於是去網上大肆蒐羅一番,然而,看到的都是千遍一律,而且毫無營養,

估計很多人按照這些部落格裡面做出來的,能做成功的,沒幾個人。於是,爬了坑之後,決定自己寫個筆記記錄一下,在

此,我要非常感謝“佐須之男” 佐大,看了他的視訊,才知道大概怎麼去做。

在給驅動做package的時候,跟應用package差不多,最重要的一點是,需要掌握Makefile的知識。

開始:

當模組是單個檔案且沒有依賴的時候,其實按照網上的部落格基本也能做出來,但是模組是多個檔案,而且需要依賴核心裡的

元件時,我覺得很多人會掉坑,起碼我是其中之一。

首先,我們需要了解這個Package的結構,在瞭解Package的檔案結構時,tree命令非常有用,如下:

從上圖可以看出,一個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這個有點基礎的都知道。

然後Buile之前做什麼,需要在Buile/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

即可生成模組。

最後,非常感謝佐須之男給予的指導

給佐大做做廣告: