RTEMS-libbsd 生成驱动设备firmware

最近在为rtems-libbsd添加无线网卡驱动,需要添加网卡的固件文件,本人所用的网卡芯片是rtl8188eu,接下来讲讲如何在rtems-libbsd中生成固件文件。


首先固件文件生成是采用make-build system(吐槽一下,目前rtems-libbsd包含waf的python脚本编译和一部分的make脚本编译,实在不忍直视,不过rtems也说了会在将来全部采用waf作为唯一的编译方式,甚至连rtems的core code都是采用python脚本)。


在源码的根目录下有Makefile.todo文件,修改此文件即可得到固件文件,Makefile.todo 源码 如下:


LOCAL_INC = rtemsbsd/include/rtems/bsd/local

LOCAL_SRC = rtemsbsd/local

FREEBSD_SRC = freebsd-org

TOOLS = freebsd-org/sys/tools

GENERATED =
GENERATED += $(LOCAL_INC)/usb_if.h
GENERATED += $(LOCAL_SRC)/usb_if.c
GENERATED += $(LOCAL_INC)/bus_if.h
GENERATED += $(LOCAL_SRC)/bus_if.c
GENERATED += $(LOCAL_INC)/device_if.h
GENERATED += $(LOCAL_SRC)/device_if.c
GENERATED += $(LOCAL_INC)/usbdevs_data.h
GENERATED += $(LOCAL_INC)/usbdevs.h
GENERATED += $(LOCAL_INC)/ifdi_if.h
GENERATED += $(LOCAL_SRC)/ifdi_if.c
GENERATED += $(LOCAL_INC)/miibus_if.h
GENERATED += $(LOCAL_SRC)/miibus_if.c
GENERATED += $(LOCAL_INC)/miidevs.h
GENERATED += $(LOCAL_INC)/ofw_if.h
GENERATED += $(LOCAL_SRC)/ofw_if.c
GENERATED += $(LOCAL_INC)/ofw_bus_if.h
GENERATED += $(LOCAL_SRC)/ofw_bus_if.c
GENERATED += $(LOCAL_INC)/pci_if.h
GENERATED += $(LOCAL_SRC)/pci_if.c
GENERATED += $(LOCAL_INC)/pcib_if.h
GENERATED += $(LOCAL_SRC)/pcib_if.c
GENERATED += $(LOCAL_INC)/mmcbr_if.h
GENERATED += $(LOCAL_SRC)/mmcbr_if.c
GENERATED += $(LOCAL_INC)/mmcbus_if.h
GENERATED += $(LOCAL_SRC)/mmcbus_if.c
GENERATED += $(LOCAL_SRC)/rtwn-rtl8192cfwT.c
GENERATED += $(LOCAL_SRC)/runfw.c
GENERATED += rtemsbsd/include/machine/rtems-bsd-regdomain.h
GENERATED += rtemsbsd/rtems/rtems-bsd-regdomain.c

all: $(GENERATED)

$(LOCAL_INC)/usbdevs.h: $(FREEBSD_SRC)/sys/dev/usb/usbdevs
	awk -f $(TOOLS)/usbdevs2h.awk $< -h
	mv usbdevs.h $@

$(LOCAL_INC)/usbdevs_data.h: $(FREEBSD_SRC)/sys/dev/usb/usbdevs
	awk -f $(TOOLS)/usbdevs2h.awk $< -d
	mv usbdevs_data.h $@

$(LOCAL_INC)/usb_if.h: $(FREEBSD_SRC)/sys/dev/usb/usb_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv usb_if.h $@

$(LOCAL_SRC)/usb_if.c: $(FREEBSD_SRC)/sys/dev/usb/usb_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv usb_if.c $@

$(LOCAL_INC)/bus_if.h: $(FREEBSD_SRC)/sys/kern/bus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv bus_if.h $@

$(LOCAL_SRC)/bus_if.c: $(FREEBSD_SRC)/sys/kern/bus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv bus_if.c $@

$(LOCAL_INC)/device_if.h: $(FREEBSD_SRC)/sys/kern/device_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv device_if.h $@

$(LOCAL_SRC)/device_if.c: $(FREEBSD_SRC)/sys/kern/device_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv device_if.c $@

$(LOCAL_INC)/ifdi_if.h: $(FREEBSD_SRC)/sys/net/ifdi_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv ifdi_if.h $@

$(LOCAL_SRC)/ifdi_if.c: $(FREEBSD_SRC)/sys/net/ifdi_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv ifdi_if.c $@

$(LOCAL_INC)/miidevs.h: $(FREEBSD_SRC)/sys/dev/mii/miidevs
	awk -f $(TOOLS)/miidevs2h.awk $<
	mv miidevs.h $@

$(LOCAL_INC)/miibus_if.h: $(FREEBSD_SRC)/sys/dev/mii/miibus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv miibus_if.h $@

$(LOCAL_SRC)/miibus_if.c: $(FREEBSD_SRC)/sys/dev/mii/miibus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv miibus_if.c $@

$(LOCAL_INC)/pci_if.h: $(FREEBSD_SRC)/sys/dev/pci/pci_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv pci_if.h $@

$(LOCAL_SRC)/pci_if.c: $(FREEBSD_SRC)/sys/dev/pci/pci_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv pci_if.c $@

$(LOCAL_INC)/pcib_if.h: $(FREEBSD_SRC)/sys/dev/pci/pcib_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv pcib_if.h $@

$(LOCAL_SRC)/pcib_if.c: $(FREEBSD_SRC)/sys/dev/pci/pcib_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv pcib_if.c $@

$(LOCAL_INC)/mmcbus_if.h: $(FREEBSD_SRC)/sys/dev/mmc/mmcbus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv mmcbus_if.h $@

$(LOCAL_SRC)/mmcbus_if.c: $(FREEBSD_SRC)/sys/dev/mmc/mmcbus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv mmcbus_if.c $@

$(LOCAL_INC)/mmcbr_if.h: $(FREEBSD_SRC)/sys/dev/mmc/mmcbr_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv mmcbr_if.h $@

$(LOCAL_SRC)/mmcbr_if.c: $(FREEBSD_SRC)/sys/dev/mmc/mmcbr_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv mmcbr_if.c $@

$(LOCAL_INC)/ofw_if.h: $(FREEBSD_SRC)/sys/dev/ofw/ofw_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv ofw_if.h $@

$(LOCAL_SRC)/ofw_if.c: $(FREEBSD_SRC)/sys/dev/ofw/ofw_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv ofw_if.c $@

$(LOCAL_INC)/ofw_bus_if.h: $(FREEBSD_SRC)/sys/dev/ofw/ofw_bus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv ofw_bus_if.h $@

$(LOCAL_SRC)/ofw_bus_if.c: $(FREEBSD_SRC)/sys/dev/ofw/ofw_bus_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv ofw_bus_if.c $@

$(LOCAL_INC)/if_dwc_if.h: $(FREEBSD_SRC)/sys/dev/dwc/if_dwc_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv if_dwc_if.h $@

$(LOCAL_SRC)/if_dwc_if.c: $(FREEBSD_SRC)/sys/dev/dwc/if_dwc_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv if_dwc_if.c $@

$(LOCAL_INC)/gpio_if.h: $(FREEBSD_SRC)/sys/dev/gpio/gpio_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -h
	mv gpio_if.h $@

$(LOCAL_SRC)/gpio_if.c: $(FREEBSD_SRC)/sys/dev/gpio/gpio_if.m
	awk -f $(TOOLS)/makeobjops.awk $< -c
	mv gpio_if.c $@

$(LOCAL_SRC)/rtwn-rtl8192cfwT.c: $(FREEBSD_SRC)/sys/contrib/dev/rtwn/rtwn-rtl8192cfwT.fw.uu
	uudecode -o /dev/stdout $< | python firmware-gen.py \
	    -l "$(FREEBSD_SRC)/sys/contrib/dev/rtwn/LICENSE" \
	    rtwn-rtl8192cfwT - $@

$(LOCAL_SRC)/runfw.c: $(FREEBSD_SRC)/sys/contrib/dev/run/rt2870.fw.uu
	uudecode -o /dev/stdout $< | python firmware-gen.py \
	    -l "$(FREEBSD_SRC)/sys/contrib/dev/run/LICENSE" \
	    runfw - $@

freebsd/usr.bin/netstat/nl_symbols.c: $(FREEBSD_SRC)/usr.bin/netstat/nlist_symbols
	awk '\
	    BEGIN { \
		print "#include <sys/param.h>"; \
		print "#include <nlist.h>"; \
		print "const struct nlist nl[] = {"; \
	    } \
	    !/^\#/ { printf("\t{ .n_name = \"%s\" },\n", $$2); } \
	    END { print "\t{ .n_name = NULL },\n};" } \
	    ' < $< > $@ || rm -f $@

freebsd/usr.bin/netstat/nl_defs.h: $(FREEBSD_SRC)/usr.bin/netstat/nlist_symbols
	awk '\
	    BEGIN { \
		print "#include <nlist.h>"; \
		print "extern const struct nlist nl[];"; \
		i = 0; \
	    } \
	    !/^\#/ { printf("\#define\tN%s\t%s\n", toupper($$2), i++); }' \
	    < $< > $@ || rm -f $@

rtemsbsd/include/machine/rtems-bsd-regdomain.h: $(FREEBSD_SRC)/etc/regdomain.xml
	rtems-bin2c -H $< $@

rtemsbsd/rtems/rtems-bsd-regdomain.c: $(FREEBSD_SRC)/etc/regdomain.xml
	rtems-bin2c -C $< $@

clean:
	rm $(GENERATED)

首先声明添加:

GENERATED += $(LOCAL_SRC)/rtwn-rtl8192cfwT.c


这里对应的是rtl8192cu的固件,接着为这些目标制定方法:

$(LOCAL_SRC)/rtwn-rtl8192cfwT.c: $(FREEBSD_SRC)/sys/contrib/dev/rtwn/rtwn-rtl8192cfwT.fw.uu
	uudecode -o /dev/stdout $< | python firmware-gen.py \
	    -l "$(FREEBSD_SRC)/sys/contrib/dev/rtwn/LICENSE" \
	    rtwn-rtl8192cfwT - $@

可以看出,方法中需要FreeBSD源码的支持,在rtems-libbsd中,文件夹FreeBSD-org包含的就是FreeBSD的master主分支源码。


固件文件所需的源文件如下所示:




利用git clone 将rtems-libbsd源码clone到本地,但是默认freeBSD-org文件夹是空的。因此需要以下命令来将freeBSD clone到文件夹下:

git submodule update



分析完固件文件的生成后,添加rtl8188eu固件生成代码,在Makefile.todo 中添加:

GENERATED += $(LOCAL_SRC)/rtwn-rtl8188eufw.c

$(LOCAL_SRC)/rtwn-rtl8188eufw.c: $(FREEBSD_SRC)/sys/contrib/dev/rtwn/rtwn-rtl8188eufw.fw.uu
	uudecode -o /dev/stdout $< | python firmware-gen.py \
	    -l "$(FREEBSD_SRC)/sys/contrib/dev/rtwn/LICENSE" \
	    rtwn-rtl8188eufw - $@


然后编译:


make -f Makefile.todo


编译成功会在rtemsbsd/local文件夹下生成对应的固件c文件,然后在libbsd.py脚本中,添加该文件,运行命令:


./freebsd-to-rtems.py
即可在libbsd_waf.py中更新此文件,最后利用waf编译即可。如此,固件文件已经生成,那么如何应用呢?


在nexus-devices.h中添加如下模块则表示加载固件模块:

SYSINIT_REFERENCE(rtwn_rtl8188eufw);




转载于:https://www.cnblogs.com/sichenzhao/p/9320266.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值