在開發自己的openwrt固件時往往會編寫自己的應用程序,那麼如何使用openwrt的框架將自己的代碼嵌套進去呢?然後隨編譯出來的固件一起下載的設備中呢,或者動態選擇的方式裝載呢?
下面兩種方式根據自己的理解一一說明,希望可以幫助的別人:
- 隨固件一起打包fw
- 通過ipk方式選擇安裝
首先新建自己的packages
下面具體說下,如何編譯一個zl380tw的軟件包。假如我們的openwrt目錄爲$<TOPDIR>
1、在$<TOPDIR> /package目錄下創建zl380tw目錄及相關的目錄
mkdir -p $<TOPDIR>/package/zl380tw/src
mkdir -p $<TOPDIR>/package/zl380tw/include
mkdir -p $<TOPDIR>/package/zl380tw/lib
cd $<TOPDIR>/package/zl380tw
ls
include lib src
2、創建編寫自己的source code
通過第一步文件目錄準備好了後,開始準備編寫自己的source code了,在此編寫的有8個c文件
ls src
tw_hal_verify.c vproc_data_types.h zl380twolf_config.h
tw_ldfwcfg.c zl380twolf_firmware.c zl380twolf_firmware.h
tw_spi_access.c zl380twolf_config.c
3、編寫自己的source code makefile
這個src目錄下的makefile實際上和wrt沒有太多關係,也就是一個正常的編譯規則脫離了wrt同樣make也可以編譯出自己的target obj
下面貼一下src/Makefile或許可以幫到別人
cat /src/Makefile
#seven
#TOOLCHAINDIR=/home/seven/work/mtk/openwrt/mt7620v1505/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin
#CC=$(TOOLCHAINDIR)/mipsel-openwrt-linux-uclibc-gcc
PROGS_SPI_ACCESS:=tw_spi_access
PROGS_TW=tw
INSTDIR=$(prefix)/usr/bin
INSTMODE=0755
INSTOWNER=root
INSTGROUP=root
OBJS2 := zl380twolf_firmware.o
OBJS1 := zl380twolf_config.o
#TW_OBJS=tw.o
OBJS = $(OBJS1) $(OBJS2)
CPPFLAGS+=-I./ -I../include
LDFLAGS+= -L../lib -lzl380tw -static
all: $(PROGS_SPI_ACCESS) $(PROGS_TW)
$(PROGS_SPI_ACCESS): $(OBJS) tw_spi_access.c
$(CC) $^ $(CPPFLAGS) $(LDFLAGS) $(LDLIBS) -o $@
$(PROGS_TW): $(OBJS) tw_hal_verify.c
$(CC) $^ $(CPPFLAGS) $(LDFLAGS) $(LDLIBS) -o $@
#$(OBJS): tw_spi_access.c twolf.o
# $(CC) $(CFLAGS) $(LDFLAGS) -o $@
$(OBJS1): zl380twolf_config.c
$(CC) -c $(CPPFLAGS) $^ -o $@
#$(CC) tw_spi_access.c zl380twolf_config.c zl380twolf_firmware.c $(CFLAGS) $(LDFLAGS) -o $(PROGS)
$(OBJS2): zl380twolf_firmware.c
$(CC) -c $(CPPFLAGS) $^ -o $@
install: $(PROGS_SPI_ACCESS) $(PROGS_TW)
$(INSTALL) -d $(INSTDIR)
$(INSTALL) -m $(INSTMODE) -o $(INSTOWNER) -g $(INSTGROUP) $(PROGS_SPI_ACCESS) $(INSTDIR)
$(INSTALL) -m $(INSTMODE) -o $(INSTOWNER) -g $(INSTGROUP) $(PROGS_TW) $(INSTDIR)
clean:
rm -f $(PROGS_SPI_ACCESS) $(PROGS_TW) *.o core
4、創建openwrt解析的Makefile
這個makefile纔是真正高手wrt讀取自己的應用程序創建編譯產出的的一個規則,它所在的位置爲用戶程序的頂層目錄即zl380tw目錄下
cd $<TOPDIR>/package/zl380tw
ls
include lib
Makefile src
同樣貼一下
cat Makefile
#seven
include $(TOPDIR)/rules.mk //像其他package一樣添加規則
#include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:= zl380tw //包的名字 可以隨便取
PKG_RELEASE:=1 //自定義
PKG_VERSION:=1.0 //自定義
include $(INCLUDE_DIR)/package.mk //讀取package規則
#PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)
define Package/zl380tw //創建菜單條目
SECTION:=utils //屬於哪個類別,在此屬於utils
CATEGORY:=Utilities
TITLE:=Microsemi r/w test //在菜單顯示標題
endef
define Package/zl380tw/description //描述信息 自定義
ZL380tw building test
endef
define Build/Prepare //創建包編譯位置
mkdir -p $(PKG_BUILD_DIR)/src
$(CP) ./src/* $(PKG_BUILD_DIR)/src/
$(CP) ./include $(PKG_BUILD_DIR)/
$(CP) ./lib $(PKG_BUILD_DIR)/
endef
define Build/Compile //編譯路徑 此處會執行src/Makefile創建目標程序
$(MAKE) -C $(PKG_BUILD_DIR)/src \
$(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"
endef
define Package/zl380tw/install //此處對目標文件產出位置做安排,如果不想打包進fw,需要移除此項,然後通過 opkg install xxx.ipk安裝
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/tw $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/tw_spi_access $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/raklink $(1)/usr/bin
endef
$(eval $(call BuildPackage,zl380tw))
通過以上幾步就可以實現自己程序添加到wrt框架中
剩下的就是執行make menuconfig選擇剛纔添加的package並且make -j4 V=99進行編譯
$make menuconfig
Utilities --->
│ │ < > yunbridge..................................... Arduino YUN bridge library │ │
│ │ <*> zl380tw............................................... Microsemi r/w test │ │
│ │ < > zsh.......................................................... The Z shell
編譯過程會在build_dir目錄下完成
編譯結果會放在 bin/[yourtarget]/package目錄下
如果打包進fw,會在usr/bin下找到可執行文件
如果採用opk方式,需要將ipk包下載到目標板中執行opkg install *.ipk