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
即可生成模組。
最後,非常感謝佐須之男給予的指導
給佐大做做廣告: