openwrt教程(OpenWRT驱动开发)


一、OpenWRT中的驱动

Openwrt源码中,所有扩展的软件包到在package目录下,自己添加的应用放在该目录下。

所有扩展的内核驱动package/kernel目录下,自己添加的驱动放在该目录下。

openwrt教程(OpenWRT驱动开发)

二、添加驱动步骤

  • 在package/kernel目录下添加一个helloworld文件夹
  • 在helloworld添加一个Makefile文件。具体Makefile怎么写,我们先看两个kernel中自带的驱动的Makefile文件。
  • I2C驱动

    ## Copyright (C) 2008 OpenWrt.org## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#   I2C驱动#包含上两级目录配置include $(TOPDIR)/rules.mk          # TOPDIR : /openwrtinclude $(INCLUDE_DIR)/kernel.mk    # INCLUDE_DIR: /openwrt/includePKG_NAME:=i2c-gpio-custom           #驱动名字PKG_RELEASE:=2                      #Makefile的版本号include $(INCLUDE_DIR)/package.mk   #包含上一级目录配置# make menuconfig时在配置界面上显示的方式define KernelPackage/i2c-gpio-custom SUBMENU:=I2C support                 #显示的子选项 TITLE:=Custom GPIO-based I2C device  #显示的内容 DEPENDS:=@GPIO_SUPPORT +kmod-i2c-core +kmod-i2c-gpio  #依赖于其他模块 FILES:=$(PKG_BUILD_DIR)/i2c-gpio-custom.ko    #生成的目标文件 KCONFIG:=endefdefine KernelPackage/i2c-gpio-custom/descriptionKernel module for register a custom i2c-gpio platform device. #帮助时显示的内容endefEXTRA_KCONFIG:=    CONFIG_I2C_GPIO_CUSTOM=m    #编译成模块# 无需更改EXTRA_CFLAGS:=    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG))))    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) # 无需更改MAKE_OPTS:=    ARCH="$(LINUX_KARCH)"            #CPU架构    CROSS_COMPILE="$(TARGET_CROSS)"  #交叉编译工具   SUBDIRS="$(PKG_BUILD_DIR)"    EXTRA_CFLAGS="$(EXTRA_CFLAGS)"    $(EXTRA_KCONFIG)#编译前的准备define Build/Prepare   mkdir -p $(PKG_BUILD_DIR)   $(CP) ./src/* $(PKG_BUILD_DIR)/  #PKG_BUILD_DIR:编译时的目录,对应于驱动就是 build_dir/target-**/linux-**/endef#编译define Build/Compile   $(MAKE) -C "$(LINUX_DIR)"        $(MAKE_OPTS)        modulesendef#完成前面定义后,必须使用 eval 函数实现各种定义, KernelPackage代表是内核驱动模块,Package表示应用程序$(eval $(call KernelPackage,i2c-gpio-custom))

    RTC驱动

    ## Copyright (C) 2006-2009 OpenWrt.org## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#   RTC驱动include $(TOPDIR)/rules.mkinclude $(INCLUDE_DIR)/kernel.mkPKG_NAME:=rtc-rv5c386aPKG_RELEASE:=1include $(INCLUDE_DIR)/package.mkdefine KernelPackage/rtc-rv5c386a SUBMENU:=Other modules DEPENDS:=@TARGET_brcm47xx TITLE:=Driver for RTC RV5C386A (used in WL-700gE and WL-HDD) AUTOLOAD:=$(call AutoLoad,70,rtc) FILES:=$(PKG_BUILD_DIR)/rtc.koendefdefine Build/Prepare   mkdir -p $(PKG_BUILD_DIR)   $(CP) ./src/* $(PKG_BUILD_DIR)/endef#有时候CROSS_COMPILE、ARCH、SUBDIRS、EXTRA_CFLAGS会被独立成一个变量,然后再去引用define Build/Compile   $(MAKE) -C "$(LINUX_DIR)"        CROSS_COMPILE="$(TARGET_CROSS)"        ARCH="$(LINUX_KARCH)"        SUBDIRS="$(PKG_BUILD_DIR)"        EXTRA_CFLAGS="$(BUILDFLAGS)"        modulesendef$(eval $(call KernelPackage,rtc-rv5c386a))

    根据上面的注释和解释,并对比两份Makefile,我们发现写的基本结构都是相似的,所以我们可以根据上面的模板来自行写一份。

    以I2C为模板:

    ## Copyright (C) 2008 OpenWrt.org## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#include $(TOPDIR)/rules.mkinclude $(INCLUDE_DIR)/kernel.mkPKG_NAME:=helloworldPKG_RELEASE:=2include $(INCLUDE_DIR)/package.mkdefine KernelPackage/helloworld SUBMENU:=Other modules TITLE:=HelloWorld FILES:=$(PKG_BUILD_DIR)/helloworld.ko KCONFIG:=endefdefine KernelPackage/helloworld/descriptionKernel module for register helloworld.endefEXTRA_KCONFIG:=    CONFIG_HELLOWORLD=mEXTRA_CFLAGS:=    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG))))    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) MAKE_OPTS:=    ARCH="$(LINUX_KARCH)"    CROSS_COMPILE="$(TARGET_CROSS)"    SUBDIRS="$(PKG_BUILD_DIR)"    EXTRA_CFLAGS="$(EXTRA_CFLAGS)"    $(EXTRA_KCONFIG)define Build/Prepare   mkdir -p $(PKG_BUILD_DIR)   $(CP) ./src/* $(PKG_BUILD_DIR)/endefdefine Build/Compile   $(MAKE) -C "$(LINUX_DIR)"        $(MAKE_OPTS)        modulesendef$(eval $(call KernelPackage,helloworld))

    基本上就是I2C改成helloworld就OK了!

    3、在helloworld文件夹下再新建一个src文件夹,在src下新建一个Kconfig文件。文件内容:

    ## Copyright (C) 2008 OpenWrt.org## This is free software, licensed under the GNU General Public License v2.# See /LICENSE for more information.#include $(TOPDIR)/rules.mkinclude $(INCLUDE_DIR)/kernel.mkPKG_NAME:=helloworldPKG_RELEASE:=2include $(INCLUDE_DIR)/package.mkdefine KernelPackage/helloworld SUBMENU:=Other modules TITLE:=HelloWorld FILES:=$(PKG_BUILD_DIR)/helloworld.ko KCONFIG:=endefdefine KernelPackage/helloworld/descriptionKernel module for register helloworld.endefEXTRA_KCONFIG:=    CONFIG_HELLOWORLD=mEXTRA_CFLAGS:=    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG))))    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) MAKE_OPTS:=    ARCH="$(LINUX_KARCH)"    CROSS_COMPILE="$(TARGET_CROSS)"    SUBDIRS="$(PKG_BUILD_DIR)"    EXTRA_CFLAGS="$(EXTRA_CFLAGS)"    $(EXTRA_KCONFIG)define Build/Prepare   mkdir -p $(PKG_BUILD_DIR)   $(CP) ./src/* $(PKG_BUILD_DIR)/endefdefine Build/Compile   $(MAKE) -C "$(LINUX_DIR)"        $(MAKE_OPTS)        modulesendef$(eval $(call KernelPackage,helloworld))

    再新建一个Makefile文件,内容为:

    obj-${CONFIG_HELLOWORLD}   += helloworld.o

    最后新建一个helloworld.c的驱动文件,内容为:

    #include <linux/module.h>#include <linux/kernel.h>//insmod会执行该函数static int __init helloworld_init(void){   printk("helloworld driver init !n");   return 0;}//rmmod会执行该函数static int __exit helloworld_exit(void){   printk("helloworld driver exit !n");   return 0;}//声明出入口函数module_init(helloworld_init);module_exit(helloworld_exit);MODULE_AUTHOR("YANG");MODULE_LICENSE("GPL");

    4、接下来就是编译了先make menuconfig将驱动配置一下。

    无线路由器-网关-dtu无线路由器-网关-dtu

    无线路由器-网关-dtu无线路由器-网关-dtu

    无线路由器-网关-dtu无线路由器-网关-dtu

    保存后执行makepackage/kernel/helloworld/compile V=99

    5、编译出来的驱动模块在openwrt/bin/ramips/packages/kernel/kmod-helloworld_4.4.7-2_ramips_24kec.ipk

    以上教程由“WiFi之家网”整理收藏!

    原创文章,作者:路由器教程,如若转载,请注明出处:https://www.224m.com/217687.html

    (0)
    路由器教程路由器教程
    赶紧把这几个模组加入下载行列(赶紧把这几个模组加入下载行列中)
    上一篇 2023年2月6日 08:54
    无法正常安装驱动程序(无法正常安装驱动程序怎么办)
    下一篇 2023年2月6日 09:06

    相关推荐

    • 电脑任务管理器强制结束一些进程失败解决方法(图)

      原标题:"电脑任务管理器强制结束一些进程失败怎么办"相关电脑问题教程分享。 - 来源:WiFi之家网。最近,很多用户反馈表示电脑任务管理器强制结束一些进程失败导致电脑遇到死机。这主要是因为运行的程序太多

      2021年7月14日
      6.0K
    • 宽带突然不能用了是什么原因(图文)

      【导读】宽带突然不能用了是什么原因,下面就是WiFi之家网整理的网络知识百科,来看看吧!大家好,我是191路由器网小编,上述问题将由我为大家讲解。宽带无法上网,首先请确认宽带是否因欠费暂停,建议进行充值

      2021年8月25日
      18.8K
    • 怎么设置路由器不拨号上网(路由器宽带拨号上网怎么设置)

      怎么设置路由器不拨号上网? 如果你使用的是路由器宽带拨号上网,但想要不拨号直接上网,可以按照以下步骤进行设置: 步骤一:确定网络连接方式 首先,需要确定你的网络连接方式。一般来说,…

      网络 2025年12月14日
      1.8K
    • 无线路由器帐号怎么设置(无线路由器密码怎么设置)

      无线路由器是现代人生活中必不可少的一种设备,能够帮助我们实现无线网络连接,让我们的生活更加便利。在使用无线路由器的过程中,设置帐号和密码是非常重要的,可以保护我们的网络安全。下面就…

      网络 2025年3月13日
      1.9K
    • wifi密码忘了怎么办?wifi密码怎么查看

      小编发现给大家装好宽带后,有部分用户容易忘记自己家里的无线网密码。可能宽带刚装好还有印象,但过个一年半载的确很容易忘记!今天,小编就如何找回自己的无线网密码做下整理,方便大家在忘记密码的情况下轻松找

      2020年6月12日
      66.9K
    • 怎么查看自己的wifi名字及密码?

      问:怎么查看自己的wifi名字和密码?答:wifi名称和密码,是在路由器的设置界面中进行配置和存储的,要查看wifi名称和密码,需要登录到路由器的设置界面,然后打开 无线设置 或者 Wi-Fi设置,就可以看到wifi名字和密码,详细操作步骤如下:1、在浏览器中输入路由器的登录地址,打开路由器的登录页

      2021年4月24日
      161.5K
    • 磊科路由器登陆设置(磊科路由器设置教程)

      磊科路由器登陆设置(磊科路由器设置教程) 磊科路由器是一款常用的家用路由器,本文将为您介绍如何进行磊科路由器的登陆设置。 第一步:连接路由器 首先,将路由器的电源插头插入电源插座,…

      网络 2024年9月16日
      3.8K
    • windows进入系统安全模式时蓝屏怎么办?

      不管是普通进入系统还是进入系统安全模式都蓝屏。有时用着电脑正用着忽然蓝屏。内存原因引起的蓝屏,实在太多了,就一细说啥原因了,如果是台式电脑就直接拆开机箱,把内存拔掉,把内存金手指部分擦擦再重新插回去,最好同时把内存擦槽也擦一下。机箱都拆开了,检查一下是否灰尘过多,灰尘过多的话也清理一下。一般来说由

      2021年9月21日
      3.3K
    • 普联策略路由器怎么设置(普联技术路由器怎么设置)

      普联技术路由器怎么设置 普联技术是一款常用的路由器品牌,配置路由器可以让我们更好地使用网络,所以设置路由器对于上网用户来说非常重要。 第一步:进入路由器管理页面 打开浏览器,在地址…

      网络 2025年12月9日
      1.1K
    • 杨浦区千兆路由器设置方法(腾达千兆路由器设置方法)

      杨浦区千兆路由器设置方法(腾达千兆路由器设置方法) 如果你是杨浦区的用户,安装了腾达千兆路由器,那么你需要进行一些简单的设置才能享受到更流畅的网络体验。 1. 连接路由器 首先,将…

      网络 2024年12月10日
      2.1K