下面是超声波模块与开发板的连线方式: 2....示例代码 下面是超声波测距模块的驱动代码,将超声波模块的输出脚接在开发板支持中断的IO口上,配置为上升沿触发,当超声波输出脚检测到高电平就进去中断服务函数,在中断服务函数里调度工作队列,最终在工作函数里完成高电平的时间长度获取...下面是测量的结果: 2.1 驱动代码 #include #include #include #include..._linux_csb_init); /*驱动入口--安装驱动的时候执行*/ module_exit(tiny4412_linux_csb_cleanup); /*驱动出口--卸载驱动的时候执行*/...MODULE_LICENSE("GPL"); /*设置模块的许可证--GPL*/ 2.2 Makefile KER_DRI=/home/wbyq/work/linux-3.5/linux-3.5
insmod:加载模块 参数: -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。 -k 将模块设置为自动卸除。 -m 输出模块的载入信息。...-o 指定模块的名称,可使用模块文件的文件名。 -p 测试模块是否能正确地载入kernel。 -s 将所有信息记录在系统记录文件中。 -v 执行时显示详细的信息。...-x 不要汇出模块的外部符号。 -X 汇出模块所有的外部符号,此为预设置。...实例: insmod first_drv.ko 除了insmod外,还有modprobe 也是加载模块,不同的是它在加载某模块时,会同时加载该模块所依赖的其他模块。...参考资料:http://www.linuxso.com/command/insmod.html rmmod:卸载模块 参数: -a 删除任何现在无需的模块。
目的 买了这块并口的屏幕,是为了做一个nes模拟器的游戏机,之前用的SPI的屏幕,显示游戏画面还是比较耗时,毕竟是串行数据,所以准备试一下并行接口的屏幕,顺便理解一下并口8080的驱动方式。...并口协议 8080 时序也叫因特尔总线,一般mcu(mpu)模式的lcd上。...ST7789 引脚定义 ST7789的用法有好几种,今天只说一下16bit的并口驱动。...易出错点 16bit驱动最容易出错的地方就是坐标设置,我以为坐标是16bit的,那么我就直接写四个坐标不就行了,恰恰错了,这里需要兼容8bit的,要把每个16bit分两次写入。
本模块可直接装入各种读卡器模具。模块采用电压为3.3V,通过SPI接口简单的几条线就可以直接与用户任何CPU主板相连接通信,可以保证模块稳定可靠的工作、读卡距离远。...当前文章介绍如果在Linux系统下编写MF-RC522模块驱动,配合应用层,完成IC卡号读取,扇区读写,密码验证等等。...驱动代码示例 3.1 rc522.c 源代码 #include #include #include #include... #include #include #include #include #include #include #include #include <linux/
因为近期用到了Linux内核的相关知识,下面随笔将给出内核模块的编写记录,供大家参考。...1、运行环境 Ubuntu 版本:20.04 Linux内核版本:5.4.0-42-generic gcc版本:gcc version 9.3.0 驱动和一般应用程序的执行方式很大不同...2、内核模块模型说明 (1)驱动和一般应用程序的执行方式很大不同 一般应用由main函数开始执行,流程基本由程序自身控制 驱动程序没有main函数,由回调方式驱动运行 (2)回调方式: 先向内核注册函数... 设备控制函数,动态注册; 应用调用ioctl函数操作设备时,会触发该函数; (8)DriverMMap 设备内存映射函数,动态注册; 应用调用mmap函数时,会触发该函数; 下面给出驱动模块编写函数...> 14 15 #include 16 17 #include 18 19 #include 20 21
前言 本章介绍所有的关于模块和内核编程的关键概念,通过一个 hello world 模块来认识驱动加载的流程及相关细节。...模块初始化函数的任务是为以后调用模块的函数做准备;模块的退出函数就在模块被卸载时调用。这种编程的方法类似于事件驱动的编程,但是虽然不是所有的应用程序都是事件驱动的,每个内核模块都是。...2、内核的并发 常见引起并发原因: linux 系统中通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序。...大多数设备能够中断处理器,而中断处理程序异步运行,而且可能在驱动程序正试图处理其他任务时被调用。 linux 可以运行在多处理器上,因此可能同时有多个处理器在使用该进程。...#include 最重要的头文件中的一个,这个文件包含很多驱动使用的内核 API 的定义,包括睡眠函数和许多变量声明。
#include 1....模块参数 在驱动定义变量 static int num = 0; //当加载模块不指定num的值时则为0 module_param(变量名, 类型, 权限);类型: byte, int, uint,...KPARAM_ISBOOL : 0, \ set, get, { arg } } 多个c文件编成一个模块,可以使用xxx-objs这个Makefile中的指令来实现,如下: test-objs :=...a.o b.o //由a.c, b.c 编成test.ko, 注意不能有.o文件与目标ko文件同名 obj-m += test.o 可在/sys/module/模块名/下查看模块在系统的信息 1.
在spring框架中,我们可以看到有许多的@Enablexxx注解,如spring的Cachine模块@EnableCaching,在springboot中有自动装配模块@EnableAutoConfiguration...手写@Enable模块分两类实现,一种是“注解驱动”,另一种是“接口编程”,后者更难,也可以再细分为两种实现方式。...在手写@Enable模块的时候,也可以看看spring框架已定义好的@Enable相关注解,这样可以有助于我们理解该模块的设计思想。...(1)方式一:“注解驱动”,@Import导入xxxConfiguration类 domain Student类 @Data public class Student { private String...String[] args) { SpringApplication.run(SpringBootEnableApplication.class, args); } } 方式一注解驱动
1.无操作系统时的硬件、驱动、应用软件要满足高内聚、低耦合。 2.有操作系统时的驱动, 3.LINUX驱动与整个软硬件的关系
一.DDT简介 Data Driven Testing,数据驱动,简单来说就是测试数据的参数化 Python数据驱动模块DDT,包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据) 通常情况下...d]) 如果没有@unpack,那么[a,b]当成一个参数传入用例运行 如果有@unpack,那么[a,b]被分解开,按照用例中的两个参数传递 二、安装DDT pip install ddt 三、导入模块
新特性介绍 构建 Linux 内核驱动模块 Xmake 也许是首个提供 Linux 内核驱动开发 内置支持的第三方构建工具了。...然后直接执行 xmake 命令,一键编译,生成内核驱动模块 hello.ko。...add_requires("linux-headers 5.9.x", {configs = {driver_modules = true}}) 交叉编译 我们也支持内核驱动模块的交叉编译,比如在 Linux...x86_64 上使用交叉编译工具链来构建 Linux Arm/Arm64 的驱动模块。...构建 Arm 驱动模块 $ xmake f -p cross -a arm --sdk=/mnt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
os内存指:由linux操作系统管理的内存;mmz内存:由mmz驱动模块进行管理供媒体业务单独使用的内存,在驱动加载时可以指定该模块管理内存的大小: insmod hi_osal.ko mmz=anonymous...#ifndef MMZ_V2_SUPPORT unsigned int id; #endif char name[HIL_MMB_NAME_LEN+1]; //该mmb模块使用者名字...mmz驱动模块支持多个mmz区域,只要在加载mmz.ko时通过参数传递即可,一般情况下只有一个mmz区域。...2、mmb、mmb_info和mmb_userdev_info关系 下图展示了mmz驱动和应用申请数据结构之间的关系: ?...由于mmz大部分为媒体业务独立使用,内存在媒体硬件模块流转,应用无需访问,这时不用映射,只有当应用需要访问时才需要进行映射。
2.1 按键驱动源代码 #include #include #include #include <linux...open=tiny4412_open, .read=tiny4412_read, .write=tiny4412_write, .release=tiny4412_release }; /* Linux...卸载驱动的时候执行*/ MODULE_LICENSE("GPL"); /*设置模块的许可证--GPL*/ 2.2 makefile文件 编译驱动的makefile代码。...KER_DRI=/home/wbyq/work/linux-3.5/linux-3.5 all: make -C $(KER_DRI) M=`pwd` modules cp *.ko /home/wbyq.../work/rootfs/code -f make -C $(KER_DRI) M=`pwd` modules clean arm-linux-gcc app.c -o app cp app /home
Linux 网络设备驱动架构 驱动架构自上而下分为4层: 协议接口层 设备接口层 设备驱动功能层 网络设备与媒介层 协议接口层 协议接口层主要功能是给上层协议提供接收和发送的接口。...传递的数据被描述为套接字缓冲区,用struct sk_buff结构描述,该结构体定义位于include/linux/skbuff.h中,用于在Linux网络子系统中的各层之间传输数据,该结构在整个网络收发过程中贯穿始终...设备驱动功能层 类似于字符设备,struct net_device结构体也提供了一个操作函数集struct net_device_ops来描述对网卡的各种操作。...源码分析 笔者基于的是 S5PV210 的 DM9000 驱动,会大体上对 DM9000 的驱动源码进行分析, 分析源码位于DM9000 源码 platform 框架分析 DM9000 的驱动是基于 platform...return platform_driver_register(&dm9000_driver); } 该函数调用了 platform_driver_register 函数注册了一个平台总线驱动
四、 linux内核下USB相关的API函数与数据结构 前面介绍了USB相关一些基础概念与重要的数据结构,接下来就分析在linux内核中如何编写一个USB 驱动程序,编写与一个USB设备驱动程序的方法和其他总线驱动方式类似...(中断传输方式) 5.1 USB驱动注册框架代码 #include #include #include /*...该宏定义在下 这个宏有两个参数,第一个参数设备名,第二个参数该设备加入到模块中时对应产生的设备搜索符号,这个宏生成了一个名为__mod_pci_device_table...#include /* 本程序为USB鼠标驱动程序,要安装本驱动,需要先将内核自带的USB驱动程序卸载掉 */ //定义USB的IDTAB 24ae:2002 static...该宏定义在下 这个宏有两个参数,第一个参数设备名,第二个参数该设备加入到模块中时对应产生的设备搜索符号,这个宏生成了一个名为__mod_pci_device_table
2 Linux驱动程序需要掌握的内容 3 Linux驱动可参考的资源 4 ARM处理器体系架构 5 ARM的前世今生 ---- 0 引言 前面Linux专题中关于Linux下系统编程总结了17篇博文,主要是为了提高...Linux下的C编程应用能力,熟悉Linux编程应用环境,从此篇博文起开始Linux驱动的总结,后面计划加一些综合实践项目练习。...6)底层驱动的编写方式,并注册到系统(register_chrdev()) 7)MISC杂项设备(混杂设备):简化了驱动的编写 8)模块(module):驱动调试时以模块的形式进行驱动的加载和卸载 3...Linux驱动可参考的资源 Linux本身就是一个开源软件,开源的好处大家都知道,资料丰富,我们做Linux驱动开发,能找到技术支持和相应资源的有如下,列出的,对于新手来说,建议最佳的顺序是从1到5:...、结构体,其实Linux驱动,就是掌握了这些东西怎么用,适应到自己要写的驱动程序中。
四、指纹SPI设备驱动框架 在对硬件有了较高的基础理解后,其实代码主要就是开始对SPI的接口做的软件实现了。...由于平台厂商通常给我们做好了spicontroller以及spicore部分,接下来的总结主要是针对SPI设备驱动部分的。...代码部分均来自于linuxkernel开源代码https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/?...五、总结 个人理解现在这个科技发展的风口下,手机、IOT、车机等终端设备齐放异彩的大背景下,新终端生态的搭建、基础智能设备的整合、大健康的趋势下,Sensor的发展是一个非常关键的驱动力,基础驱动软件能力的掌握也是重中之重...,linux给了我们一个很好的平台让我们能在前辈的肩上进行各种高质量的代码学习,我们也需抓住这个机会,在做好本质工作的基础上静心努力钻研,不断前行,祝愿各位也祝愿我自己在技术的道路上越走越远。
TxModeReg 0x12 //定义发送过程的数据传输速率 #define RxModeReg 0x13 //定义接收过程中的数据传输速率 #define TxControlReg 0x14 //控制天线驱动器管教...TX1和TX2的逻辑特性 #define TxAutoReg 0x15 //控制天线驱动器的设置 #define TxSelReg 0x16 //选择天线驱动器的内部源 #define RxSelReg...0x24 //控制ModWidth的设置 #define RFU25 0x25 //保留 #define RFCfgReg 0x26 //配置接收器增益 #define GsNReg 0x27 //选择天线驱动器管脚...(TX1和TX2)的调制电导 #define CWGsCfgReg 0x28 //选择天线驱动器管脚的调制电导 #define ModGsCfgReg 0x29 //选择天线驱动器管脚的调制电导 #define...2.STM32对RC522寄存器的操作 上面说了,单片机是向RC522的寄存器操作来驱动RC522的,所以会有这几种基本操作: 读取RC522指定寄存器的值 向RC522指定寄存器中写入指定的数据 置位
驱动层和应用层 还记得实习那会儿我第一次接触嵌入式Linux项目的时候,我的导师让我去学习项目的其它模块,然后尝试着写一个串口相关的应用。...驱动模块的加载有两种方式:第一种方式是动态加载的方式,即驱动程序与内核分开编译,在内核运行的过程中加载;第二种方式是静态加载的方式,即驱动程序与内核一同编译,在内核启动过程中加载驱动。...我们前面说了驱动的装载方式之一的动态装载:把驱动程序编译成模块,再动态装载。动态装载的体现就是开发板已经启动运行了Linux内核,我们通过开发板串口终端使用命令来装载驱动。...对应到驱动程序里我们有如下两个函数: module_init(hello_init); //注册模块加载函数 module_exit(hello_exit); //注册模块卸载函数 这里加载与注册有用到...模块注册与卸载函数 */ module_init(xxx_init); module_exit(xxx_exit); /* 模块许可证(必选项) */ MODULE_LICENSE("GPL"); 按照这样的套路来开发驱动程序的
领取专属 10元无门槛券
手把手带您无忧上云