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这个有点基础的都知道。

然后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

即可生成模块。

最后,非常感谢佐须之男给予的指导

给佐大做做广告:

http://forgotfun.org/2018/04/openwrt-training-2018.html

### OpenWrt 添加 Wi-Fi 驱动的方法 对于希望向 OpenWrt添加特定 Wi-Fi 芯片组的支持,通常涉及多个步骤来确保驱动程序能够正常工作并集成到构建环境中。以下是针对不同情况下的处理方式: #### 使用预编译的闭源驱动 当目标设备使用的是联发科(MediaTek)Wi-Fi 芯片时,可以直接利用社区成员提供的闭源驱动包。这些驱动已经被优化用于某些型号如斐讯 K2P 的路由器,并且可以通过简单的命令将其加入到 OpenWrt 构建环境当中[^3]。 ```bash cp mtk_wifi_driver -rf /path/to/openwrt/package/kernel/ ``` 需要注意的是,尽管这种方法简单快捷,但在较新版本的 OpenWrt 上可能会遇到稳定性方面的问题。因此建议密切关注相关论坛上的讨论以及测试报告以获取最新的进展信息。 #### 移植开源或第三方驱动 如果打算支持其他类型的 Wi-Fi 卡,则可能需要从头开始移植相应的 Linux 内核模块至 OpenWrt 平台。特别是那些仅能在旧版内核中工作的驱动,往往还需要借助 `backport` 工具来进行适配操作[^4]。 ```bash git clone https://github.com/backports/backports.git cd backports make defconfig-$(uname -r) make sudo make install ``` 上述过程展示了如何下载、配置并安装适用于当前系统的 `backport` 模块;之后便可以根据实际需求选取合适的上游仓库地址拉取所需的 Wi-Fi 驱动源码,并按照官方文档说明完成进一步的修改与调整直至成功编译入固件之中。 #### 自定义镜像制作流程简介 为了简化整个开发周期内的重复劳动量,还可以考虑创建一个自定义化的 OpenWrt 安装映像文件。通过这种方式可以在不影响主线分支的前提下自由增删各类组件和服务功能,从而更好地满足个性化应用场景的要求[^1]。 ```bash ./scripts/feeds update -a make menuconfig make V=s ``` 以上指令序列依次完成了更新软件库索引表、选择所需特性开关项以及启动正式打包任务的功能调用动作。其中特别强调了 `-s` 参数的作用在于开启详细的日志记录模式以便于后期排查可能出现的各种异常状况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值