openwrt之字符设备驱动开发示例

OpenWrt开发(4)-- 添加内核驱动模块 -- 读写寄存器 本文以建立一个能够读写寄存器数值的内核驱动模块来介绍如何给OpenWr添加内核驱动模块。 阅读详情

第四章 字符设备驱动及应用程序模板测试

字符设备驱动软件包测试

1. 将模板 mydrv 放到 openwrt 源码特定目录 openwrt/package/kernel/下

mydrv模板结构

2. 配置对该驱动的编译支持
  $ cd openwrt
  $ make menuconfig
  # 选择 Kernel modules -> Other modules -> kmod-mydrv
  # 按 y 选中
  # 保存退出
3. 字符设备驱动软件包 Makefile 介绍
  include $(TOPDIR)/rules.mk
  include $(INCLUDE_DIR)/kernel.mk
  include $(INCLUDE_DIR)/package.mk #以上三个用来关联OpenWrt

  PKG_NAME:=mydrv #字符设备驱动模块名称
  PKG_RELEASE:=1 #版本号

  define KernelPackage/mydrv #内核模块
    SUBMENU:=Other modules #进行归类
    TITLE:=mydrv #标题
    FILES:=$(PKG_BUILD_DIR)/mydrv.ko #模块文件
    KCONFIG:=
  endef

  define KernelPackage/mydrv/description
    This is a mydrv drivers #描述
  endef

  MAKE_OPTS:= \ #编译前指定工具和内核arch等
    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,mydrv))

src 目录下的 Makefile :obj-m += mydrv.o告诉内核添加的模块目标文件名称为 mydrv.o

4. 编译驱动包
  $ cd openwrt
  $ make package/kernel/mydrv/compile V=99 #如果make有问题,试试root用户

编译得到的固件在目录 openwrt/bin/ramips/packages/base/ 下,名称为kmod-mydrv_3.18.29-1_ramips_24kec.ipk

5. 加载驱动模块到内核及其卸载
  # 将模块拷贝到 widora
  $ opkg install kmod-mydrv_3.14.25-1_ramips_24kec.ipk
  # 安装完成后在目录 `/lib/modules/3.18.29/`下可以找到驱动
  $ insmod mydrv.ko #加载
  $ rmmod mydrv.ko #卸载

加载测试

6. 驱动开机自动加载
  $ cd /etc/modules.d
  $ vi 61-mydrv #61表示不使用外接usb类的自启动程序,分隔符‘-’后面接驱动模块名称!
  # 在创建的该文件中写入: mydrv 即驱动的名称。
  # 最后,必须保证 mydrv.ko 驱动模块文件放在`/lib/modules/3.14.25/`中
  $ reboot
  $ lsmod #令查询当前已经加载的驱动模块

应用程序软件包测试

1. 将模板 mydrv_app 应用程序软件包放在 OpenWrt 的一个特定的目录 openwrt/package/
2. 配置 OpenWrt 支持软件包的编译
  $ cd openwrt
  $ make menuconfig
  # 选择 Utilities -> mydrv_app -> y 选中
3. 应用程序软件包源码介绍
  #include <stdio.h>
  #include <string.h>
  #include <fcntl.h>
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <sys/ioctl.h>

  int main(int argc , char** argv)
  {
    int fd;
    int num = 1;
    //打开驱动模块
    fd = open("dev/mydrv" , O_RDWR|O_NONBLOCK);
    if(fd < 0)
    {
        printf("can't open /dev/mydrv\n");
        return -1;
    }
    //函数测试
    write(fd,&num,1);
    read(fd,&num,1);
    ioctl(fd,1,1);
    close(fd);
    return 0;
  }
4. 编译应用程序软件包
  $ cd openwrt
  $ make package/mydrv_app/compile V=99
  $ make package/mydrv_app/install V=99
  $ make package/index V=99
  # 编译后的固件存放在目录 `openwrt/bin/ramips/packages/base`下,名称为`mydrv_app_1_ramips_24kec.ipk`
5. 应用程序的安装和使用
  # 将程序拷贝到 widora
  $ opkg install mydrv_app_l_ramips_24kec.ipk
  $ mydrv_app #运行程序

安装测试

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

相关推荐

OpenWrt字符设备驱动开发:从cdev框架到GPIO实战

字符设备驱动是Linux内核中用于管理以字节流形式访问的硬件(如串口、GPIO设备)的基础机制。其核心原理是通过file_operations结构体定义open、read、write等系统调用的处理函数,实现用户空间与内核空间的安全数据交互(如使用copy_to_user)。这一技术价值在于为应用程序提供了统一的硬件抽象接口,是嵌入式系统(如路由器、物联网网关)中控制按键、传感器等外设的关键。在OpenWrt这一嵌入式Linux发行版中,开发字符设备驱动需遵循其特定的构建系统与环境,并常涉及GPIO子系统与

weixin_30698297的博客 515

OpenWRT(五)驱动开发

一、OpenWRT中的驱动 Openwrt源码中,所有扩展的软件包到在package目录下,自己添加的应用放在该目录下。 所有扩展的内核驱动package/kernel目录下,自己添加的驱动放在该目录下。 二、添加驱动步骤 在package/kernel目录下添加一个helloworld文件夹 在helloworld添加一个Makefile文件。具体Makefile怎么写,我们先看两个ke

嵌入式软件开发交流 2万+

openwrt入门经典案例

一:下载编译 编译出来的镜像位于 bin 目录下面 其中 openwrt-ramips-rt305x-mpr-a2-squashfs-sysupgrade.bin 这个就是我们要的镜像。烧写到板子上面即可启动。这样最简单的 OpenWrt 就可以启动了。 二:设置开发板的IP地址 开发板中设置IP地址 在开发板上面,通过修改/etc/config 目录下的 network 配置文件,可以达到目的,首先输入一些命令 # cd / # vi etc/config/network 在源码.

internetv的博客 1941

openwrt开发--驱动程序IPK包开发(GPIO控制)

openwrt下的驱动开发范例,并且配合用户侧程序,实现了对GPIO的操作。

小人物的编程 1893

openwrt (一):特殊的WiFi驱动移植方法

openwrt移植不同方案的WiFi驱动源码到backport上具体的操作方法

带着耳朵取流浪的博客 2949

《OpenWrt开发笔记》第16章 驱动开发之字符设备驱动程序框架

16.1 字符设备驱动程序框架简介我们在学习 C 语言的时候,知道每个应用程序的入口函数,即第一个被执行的函数是 main函数,那么,我们自己的驱动程序,哪个函数是入口函数呢? 在写驱动程序的时候,如果函数的名字可以任意取,常常为 xxxx_init(),当实现好这个 xxxx_init()函数以后,内核其实并不知道这个就是我们驱动的入口函数,因此我们要想办法告诉内核,我们的入口函数是哪个?我们通

不问归期的博客 2356

OpenWrt字符设备驱动开发:从内核原理到实战实现

在嵌入式Linux系统开发中,设备驱动是连接硬件与操作系统的核心桥梁。其基本原理在于,驱动程序作为内核的一部分,运行在特权模式,能够直接管理和访问硬件资源,而用户空间程序则通过内核提供的统一接口(如文件操作)进行间接调用。这种架构确保了系统的安全性和稳定性,其技术价值在于为多样化的硬件提供了标准化的访问方式。在路由器、物联网终端等嵌入式应用场景中,开发者常需为特定外设(如GPIO、I2C传感器)编写驱动以实现定制功能。本文聚焦于OpenWrt平台,深入解析字符设备驱动的开发框架,涵盖主次设备号、file_o

weixin_30352191的博客 243

《OpenWrt开发笔记》第17章 驱动开发之字符设备驱动程序

17.1 配置编译驱动程序首先将 f403tech_drv (参见文末下载链接)文件夹传到 OpenWrt 源码的openwrt/trunk/package/kernel 目录下。然后进入 OpenWrt 源码的顶层目录,执行 makemenuconfig。 注意:至于f403tech_drv的内容,建议初学者按照步骤做就是了,不必追问细节,初学者应该知道openwrt驱动开发流程,代码的具体实现

不问归期的博客 2209

OpenWRT(七)字符设备驱动开发

一、字符设备驱动 我们之前学习过驱动程序的开发,接下来我们接着深入学习字符设备驱动程序的开发。字符设备驱动是比较简单的一种驱动。主要在于实现init、exit、open、read、write等函数。 二、字符设备驱动实例 1、在package/kernel/文件夹下新建一个chardrv文件夹 2、在chardrv文件夹下新建一个Makefile文件,内容如下: # # C

嵌入式软件开发交流 2万+

《OpenWrt开发笔记》第15章 驱动开发之字符设备驱动程序之概念介绍

15.1应用程序、库、内核、驱动程序的关系从上到下,一个软件系统可以分为:应用程序、库、操作系统(内核)、驱动程序。开发人员可以专注于自己熟悉的部分,对于相邻层,只需要了解它的接口,无需关注它的实现细节。 以点亮一个 LED 为例,这 4 层软件的协作关系如下,如图 1 所示 图1 1). 应用程序使用库提供的 open 函数打开代表 LED 的设备文件。 2). 库根据 open 函

不问归期的博客 2190

《OpenWrt开发笔记》第18章 驱动开发之字符设备应用程序

18.1 编写应用程序在前面的章节中, 我们成功的写出了我们自己的驱动程序, 并且向应用程序提供了 open、read、write 三个接口,那么接下来我们就来编写应用程序,调用这些接口。#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> int main(int argc, char

不问归期的博客 1427

openwrt之字符设备驱动开发

第二章 字符设备驱动开发及相关概念 应用程序、库、内核、驱动程序的关系 以驱动LED为例: 应用程序使用库提供的 open 函数打开代表 LED 的设备文件。 库根据 open 函数传入的参数执行SWI指令,该指令会引起 CPU 异常,进入内核。 内核的异常处理函数根据这些参数找到相应的驱动程序,返回一个文件句柄给库, 进而返回给应用程序 应用程序得到文件句柄后,使用库提供的 ...

北京-大白的博客 597

OpenWRT字符设备驱动开发实战指南

在Linux系统中,设备驱动是连接硬件与用户空间程序的核心桥梁。字符设备作为三大基础设备类型之一(另两类为块设备与网络设备),其特点是按字节流方式进行访问,不经过文件系统缓存机制,适用于如串口、GPIO、键盘、传感器等直接读写场景。字符设备驱动程序通常以模块形式存在于内核中,通过结构体绑定操作函数,如openreadwrite等,实现与用户空间的交互。其注册流程涉及设备号申请、cdev结构初始化与注册,以及设备类与设备节点的创建。

weixin_42402664的博客 708

OpenWrt字符设备驱动开发:从核心框架到实战调试

字符设备驱动是Linux内核中三大设备驱动类型之一,它以字节流形式进行数据读写,是连接硬件与用户空间的关键桥梁。其核心原理基于“一切皆文件”的哲学,通过file_operations结构体定义设备能力,利用cdev结构体管理设备实例,并使用主次设备号进行系统标识。掌握字符设备驱动框架对于嵌入式开发至关重要,它使开发者能够为各类传感器、执行器或虚拟设备创建标准接口。在OpenWrt这一嵌入式Linux发行版中,驱动开发面临特定的编译、加载和调试挑战。本文通过一个完整的内存设备驱动示例,详细解析了从模块初始化、

weixin_33739541的博客 506

OpenWRT平台LED驱动开发实战详解

想做个“按键双击快闪”的效果?完全可以自己注册一个trigger!注册成功后,立刻就能用:从此你的LED就有了“新技能”!回顾整个过程,你会发现:设备树负责描述“有什么”负责“谁来管”leds-class提供“怎么控”gpiolib屏蔽“在哪连”sysfs暴露“让用户怎么玩”每一层都在做一件事:隐藏复杂性,暴露简洁接口。这种高度模块化、可扩展的设计思想,正是Linux能在如此多平台上稳定运行的根本原因。下次当你随手。

weixin_42592399的博客 888

从数据校准到论文呈现:fsQCA与NCA方法融合的完整实证研究指南

本文详细介绍了fsQCA(模糊集定性比较分析)与NCA(必要条件分析)方法融合的完整实证研究流程,从数据校准到论文呈现。通过软件操作技巧、R语言NCA包高效使用及论文写作规范,帮助研究者避免常见误区,提升研究质量与可靠性。特别适合需要进行组态分析的研究生和学者参考。

weixin_29215391的博客 416

8.openwrt char字符设备驱动原型

1.文件结构和在源码中的位置 字符设备的驱动一般位于 package/kernel 目录下面,文件结构如下: test@test-Inspiron-3670:~/work/openwrt1505_mt7628/package/kernel$ tree mydrv/ mydrv/ ├── Makefile └── src ├── Makefile └── mydrv.c 2.文件介...

liupeng08304的专栏 325

简化神经元模型6 -- Hindmarsh-Rose Model

简化神经元模型 6 Hindmarsh-Rose Model

weixin_73557167的博客 1427

OpenWrt字符设备驱动开发:从file_operations到硬件交互实战

在Linux内核驱动开发中,字符设备驱动是最基础且广泛应用的硬件交互方式,它通过file_operations结构体定义了一套标准的文件操作接口,使硬件能够以文件形式被访问。其核心原理在于将用户空间的系统调用(如read、write、ioctl)翻译为特定的硬件操作指令,通过设备号管理和cdev注册机制,在内核中建立设备与驱动的关联。这种设计模式的技术价值在于提供了统一、安全的硬件抽象层,使得开发者无需关心底层系统调用细节,只需专注于实现硬件控制逻辑。在嵌入式系统和物联网领域,字符设备驱动广泛应用于传感器数

weixin_30546189的博客 441

全局特征描述子 CVFH (Clustered Viewpoint Feature Histogram) 原理

特性VFHCVFH处理对象整个物体点云物体点云被分割后的稳定表面块(簇)对遮挡的鲁棒性弱。遮挡会破坏全局形状,导致描述子失效。极强。只依赖于稳定存在的部分。描述子维度263 维308 维 (263 + 45 SC)输出数量一个物体产生1 个描述子一个物体可能产生多个签名计算复杂度相对较低较高(需先聚类)主要应用场景完整、分割良好的物体存在遮挡、背景杂波的不完整物体。

weixin_37079656的博客 619

CenterPoint 工程复现

CenterPoint 工程复现,本文中使用版本:BEVerse工程下的mmdet3d (`MMDet3d v0.17.3`)版本,MMDetection3D中其他版本的使用`大同小异`。

Darchan的博客 5663

openwrt之字符设备GPIO驱动

第五章 GPIO驱动 GPIO操作的几种方式 1. 在文件系统中使用寄存器REG工具直接操作 # reg Usage : reg r addr Usage : reg w addr value # 读 # reg r 0x10000000 # 写 # reg w 0x10000064 0x552 # reg w 0x10000064 0x550 ...

北京-大白的博客 2957

光谱数据预处理综合

除了化学信息,光谱还包含其他不相关或不需要的信息,如电噪声,基质背景,杂散光,散射效应等。在用化学计量学方法建立校准模型时,利用预处理方法消除光谱数据中的无关信息和噪声是非常必要的。

qq_44204759的博客 5191
上一篇: openwrt之字符设备驱动框架
下一篇: openwrt之字符设备GPIO驱动
北京-大白
博客等级 码龄10年 83粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值