编译OpenWrt内核驱动

news2024/12/26 0:00:29

  编译OpenWrt内核驱动可以参考OpenWrt内部其它驱动的编写例程,来修改成自己需要的驱动

一、OpenWrt源代码获取与编译

1.1、搭建环境

  下载OpenWrt的官方源码:

git clone https://github.com/openwrt/openwrt.git

1.2、安装编译依赖项

sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools \
libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \
vim wget xmlto xxd zlib1g-dev python3-setuptools

1.3、更新 feeds

  进入openwrt目录后执行以下指令


./scripts/feeds update -a
./scripts/feeds install -a


1.4、配置编译选项

  根据自己的平台来选择编译选项

make menuconfig

1.5、下载 dl 库

  进入openwrt目录后执行以下指令

make download -j8

1.6、编译

make V=s -j1

二、OpenWrt驱动源代码分析

  OpenWrt驱动存放目录为openwrt\package\kernel
在这里插入图片描述
  以gpio-button-hotplug驱动为例,进行分析。在gpio-button-hotplug文件夹下面有一个Makefile文件和src文件夹,而src文件夹下有模块源码gpio-button-hotplug.c和源码编译Makefile
在这里插入图片描述

2.1、顶层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:=3
PKG_LICENSE:=GPL-2.0

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

define Build/Compile
	$(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules
endef

$(eval $(call KernelPackage,gpio-button-hotplug))

2.1.1、第一步

  首先包含rules.mk、kernel.mk和package.mk文件。接着将驱动模块的名称定义为“gpio-button-hotplug”,并设置版本编号为“3”。
在这里插入图片描述

2.1.2、第二步

  在软件包定义中的一些变量赋值:
  SUBMENU:我们内核模块放置于“Other modules”。我们在make menuconfig时,可以在Kernel modules/other modules菜单下找到这个模块。
  TITLE:标题,驱动模块的简短描述。
  FILES:生成的驱动模块的存放位置。此处为设置为在编译目录下(就是编译过程中的临时目录build_dir)。
  AUTOLOAD:代表是否在系统启动时自动装载到内核中,后面括号内有3个参数(参数1不变,参数2为驱动模块的装载顺序(可以省略这个参数,省略后系统自动分配状态顺序),参数3代表驱动模块名称)。
  DEPENDS:如果驱动模块还需要依赖,则此变量设置为依赖文件名(此处没有依赖所以就未设置)。
在这里插入图片描述

2.1.3、第三步

  配置menuconfig时的描述信息
在这里插入图片描述

2.1.4、第四步

  编译源代码选项,在大多数情况下应该不用定义而使用默认值
在这里插入图片描述

2.1.5、第五步

  最后KernelPackage,将驱动模块的名称作为参数传递给KernelPackage
在这里插入图片描述

2.2、源码makefile

obj-m += gpio-button-hotplug.o

2.3、源码gpio-button-hotplug.c

  gpio-button-hotplug.c就是驱动的实际代码

三、编写自己的OpenWrt驱动代码

  将gpio-button-hotplug文件夹复制为mykernel_test,放置到gpio-button-hotplug相同的目录下

3.1、顶层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:=mykernel_test
PKG_RELEASE:=3
PKG_LICENSE:=GPL-2.0

include $(INCLUDE_DIR)/package.mk

define KernelPackage/mykernel_test
  SUBMENU:=Other modules
  TITLE:=Simple GPIO Button Hotplug driver
  FILES:=$(PKG_BUILD_DIR)/mykernel_test.ko
  AUTOLOAD:=$(call AutoLoad,30,mykernel_test,1)
  KCONFIG:=
endef

define KernelPackage/mykernel_test/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

define Build/Compile
	$(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules
endef

$(eval $(call KernelPackage,mykernel_test))

3.2、源码makefile

obj-m += mykernel_test.o

3.3、源码mykernel_test.c.c

#include <linux/init.h>
#include <linux/module.h>
 
static int __init mykernel_test_init(void)
{
	printk(KERN_INFO "mykernel_test enter\n");
	return 0;
}

 
static void __exit mykernel_test_exit(void)
{
	printk(KERN_INFO "mykernel_test  exit\n ");
}
module_init(mykernel_test_init);
module_exit(mykernel_test_exit);
MODULE_LICENSE("GPL v2");

四、编译自己的OpenWrt驱动代码

4.1、配置

  在OpenWrt源码顶级目录下输入下面的命令配置内核

make menuconfig

  依次按照如下顺序选择:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2、编译

  在OpenWrt源码顶级目录下输入下面的命令编译驱动模块

make package/kernel/mykernel_test/compile V=s

  编译完成之后会在下面的目录中看到我们的内核模块
在这里插入图片描述
  此ko模块和普通的linux内核的驱动模块的装载方法一样,不再赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人中的数值优化(九)——拟牛顿方法(下)、BB方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

CocosCreator3.8研究笔记(六)CocosCreator 脚本装饰器的理解

一、什么是装饰器&#xff1f; 装饰器是TypeScript脚本语言中的概念。 TypeScript的解释&#xff1a;在一些场景下&#xff0c;我们需要额外的特性来支持标注或修改类及其成员。装饰器&#xff08;Decorators&#xff09;为我们在类的声明及成员上通过元编程语法添加标注提供了…

Java23种设计模式之【单例模式】

目录 一.单例模式的起源&#xff0c;和应用场景 1.单例模式的前世今生&#xff01; 2.什么是单例模式&#xff1f; 2.1使用单例模式的注意事项 2.2如何理解单例模式&#xff1f; 2.3单例模式的优势以及不足&#xff01; 2.4使用场景 二.实现 1.实现思路 1.1创建一个 S…

华为OD机试-贪吃蛇

题目描述 【贪吃蛇】贪吃蛇是一个经典游戏&#xff0c;蛇的身体由若干方格连接而成&#xff0c;身体随蛇头移动。蛇头触碰到食物时&#xff0c;蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时&#xff0c;游戏结束。 下面让我们来完成贪吃蛇游戏的模拟&…

Ajax + Promise复习简单小结simple

axios使用 先看看老朋友 axios axios是基于Ajaxpromise封装的 看一下他的简单使用 安装&#xff1a;npm install axios --save 引入&#xff1a;import axios from axios GitHub地址 基本使用 axios({url: http://hmajax.itheima.net/api/province}).then(function (result…

接口自动化测试系列-yml管理测试用例

项目源码 目录结构及项目介绍 整体目录结构&#xff0c;目录说明参考 测试用例结构类似httprunner写法&#xff0c;可参考demo 主要核心函数 用例读取转换json import yaml import main import os def yaml_r():curpath f{main.BASE_DIR}/quality_management_logic/ops_ne…

centos7挂载nfs存储

centos7挂载nfs存储 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.安装NFS服务 #安装nfs yum -y install rpcbind nfs-utils#创建目录&#xff08;我这边是/data/upload&#xff09; mkdir -p /data/upload#写/etc/fstab文件&#xff0c;添加要挂载的nfs盘 172.16.…

Ubuntu18.04系统下通过ROS控制Kinova真实机械臂-多种实现方式

所用测试工作空间test_ws&#xff1a;包含官网最原始的功能包 一、使用Kinova官方Development center控制真实机械臂 0.在ubuntu系统安装Kinova机械臂的Development center&#xff0c;这一步自行安装&#xff0c;很简单。 1.使用USB连接机械臂和电脑 2.Development center…

【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 树上倍增、LCA⭐)

文章目录 竞赛链接Q1&#xff1a;7020. 统计对称整数的数目竞赛时代码——枚举预处理 Q2&#xff1a;8040. 生成特殊数字的最少操作&#xff08;倒序遍历、贪心&#xff09;竞赛时代码——检查0、00、25、50、75 Q3&#xff1a;2845. 统计趣味子数组的数目竞赛时代码——前缀和…

jQuery成功之路——jQuery动画效果和遍历效果概述

一、jQuery动画效果 1.1显示效果 方法 方法名称解释show([speed],[easing],[fn]])显示元素方法hide([speed],[easing],[fn]])隐藏元素方法toggle([speed],[easing],[fn])切换元素方法&#xff0c;显示的使之隐藏&#xff0c;隐藏的使之显示 参数 参数名称解释speed三种预…

CocosCreator3.8研究笔记(五)CocosCreator 脚本说明及使用(下)

在Cocos Creator中&#xff0c;脚本代码文件分为模块和插件两种方式&#xff1a; 模块一般就是项目的脚本&#xff0c;包含项目中创建的代码、引擎模块、第三方模块。 插件脚本&#xff0c;是指从 Cocos Creator 属性检查器中导入的插件&#xff0c;一般是引入第三方引入库文件…

管理类联考——数学——汇总篇——知识点突破——数据分析——排列组合

角度——&#x1f434; 角度——&#x1f469; 排列组合的基本步骤&#xff08;固定解题体系&#xff09; 先取后排&#xff1a;即先取出元素&#xff0c;后排列元素&#xff0c;切勿边取边排. 逐次进行&#xff1a;按照一定的顺序逐次进行排列组合. 实验结束&#xff1a;整个…

vscode保存格式化自动去掉分号、逗号、双引号

之前每次写完代码都是双引号还有分号&#xff0c;看着很难受&#xff0c;就像修改一下&#xff0c;让它变成单引号&#xff0c;并且不加上引号&#xff1a;如下形式&#xff0c;看着简洁清晰明了 修改方式&#xff1a;更改 settings.json 文件 快捷键“Ctrl Shift P”打开命令…

UmeTrack: Unified multi-view end-to-end hand tracking for VR 复现踩坑记录

在 github 上找到了开源代码&#xff1a;https://github.com/facebookresearch/UmeTrack/tree/main 环境配置 运行第三行&#xff0c;报错&#xff0c;缺少torch。改成先运行第四行&#xff0c;成功。 再运行第三行&#xff0c;报错&#xff0c;required to install pyproj…

uniapp 集成蓝牙打印功能(个人测试佳博打印机)

uniapp 集成蓝牙打印功能&#xff08;个人测试京博打印机&#xff09; uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能&#xff0c;个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…

空间复杂度和时间复杂度

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;时间复杂度、空间复杂度、算法☀️每日 一言&#xff1a;车到山前必有路&#xff0c;船到码头自然直&#xff01; 一、前言 时间复杂度和空间复杂度是算法和数据结构领域中两个重要的概念&#…

服务器(I/O)之多路转接

五种IO模型 1、阻塞等待&#xff1a;在内核将数据准备好之前&#xff0c;系统调用会一直等待。所有的套接字&#xff0c;默认都是阻塞方式。 2、非阻塞等待&#xff1a;如果内核没有将数据准备好&#xff0c;系统调用仍然会返回&#xff0c;并且会返回EWUOLDBLOCK或者EAGAIN错…

springboot邮件发送和接收验证码

springboot邮件篇 要在Internet上提供电子邮件功能&#xff0c;必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商&#xff1a;新浪、搜狐、163、QQ邮箱等&#xff0c;他们都有自己的邮件服务器。这些服务器类似于现实生活中的邮局&#xff0c;它主要负责接…

【C语言】辗转相除法求最大公约数(详解)

辗转相除法求最大公约数 辗转相除法&#xff08;又称欧几里德算法&#xff09;是一种用于求解两个整数的最大公约数的方法。本文将使用C语言来实现辗转相除法&#xff0c;并对其原理进行解释。 辗转相除法的原理 辗转相除法的原理非常简单。假设有两个整数a和b&#xff0c;其…

Vue+Element-ui+SpringBoot搭建后端汽车租赁管理系统

最近在做项目&#xff0c;花了一周的时间搭建了一个十分完备的汽车租赁后端管理系统。页面采用纯Vue2Element-ui搭建&#xff0c;后端采用SpringbootMybatis搭建&#xff0c;数据库采用Mysql。包括了登录验证&#xff0c;根据不同权限进入不同界面、数据增删改查、表格分页、表…