Linux字符设备驱动开发(二)

Linux 字符设备驱动开发基础(二)—— 编写简单 PWM 设备驱动 编写驱动的第一步仍是看原理图:        可以看到,该蜂鸣器由 GPD0_0 来控制 ,查手册可知该I/O口由Time0 来控制,找到相应的寄存器: a -- I/O口寄存器及地址       GPD0CON  0x114000a0 b -- Time0 寄存器及地址       基地址为:TIMER_BASE 0x139D0000        这些物理寄存器地址都是相邻 阅读详情

一、前言

前面说到,Linux的设备驱动程序的大致流程。目前驱动模块的加载与卸载、驱动程序的注册与注销这几个部分,已经在前面介绍了。剩下就是设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理等这几个部分了。在此部分介绍之前不得不介绍设备驱动开发的重要函数。

二、设备驱动的操作函数集合

对于字符设备的操作函数集合
include/linux/fs.h文件中struct file_operations {
   
   …}

对于块设备的操作函数集合:
include/linux/blkdev.h文件中struct block_device_operations {
   
   …}

对于网络设备的操作函数:
include/linux/netdevice.h文件中struct net_device_ops{
   
   …}

本文以字符设备驱动开发为例。在Linux内核4.x下,编写驱动程序实际上是实现对设备文件对应操作函数的编写,而这些操作函数是结构体file_operations中函数指针所指函数的具体实现。file_operations在Linux系统下的include/linux/fs.h 中可以找到定义,该结构体的每个域都对应着驱动内核模块用来处理某个被请求的事件的函数的地址。(ps:这其实也就是函数指针的功能)

1.file_operations结构体

1 	struct file_operations {
   
   
2 		struct module *owner;     /*拥有该结构的模块的指针,一般为THIS_MODULES*/
3 		loff_t (*llseek) (struct file *, loff_t, int);     /* 用来修改文件当前的读写位置 */
4 		ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);    /*从设备中同步读取数据*/
5 		ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);  /*向设备发送数据*/
6 		ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
7 		ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
8 		int (*iterate) (struct file *, struct dir_context *);    
9 		unsigned int (*poll) (struct file *, struct poll_table_struct *);     /*轮询函数,判断目前是否可以进行非阻塞的读写或写入*/
10		long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);    /*执行设备I/O控制命令*/
11		long (*compat_ioctl) (struct file *, unsigned int, unsigned long);    /*在64位系统上,32位的ioctl调用将使用此函数指针代替*/
12		int (*mmap) (struct file *, struct vm_area_struct *);        /*用来请求将设备内存映射到进程的地址空间*/
13		int (*mremap)(struct file *, struct vm_area_struct *);  
14		int (*open) (struct inode *, struct file *);
15		int (*flush) (struct file *, fl_owner_t id);   /*进程关闭它的设备文件描述符的拷贝时调用*/
16		int (*release) (struct inode *, struct file *);  /*清理未结束的输入输出操作,释放资源,用户自定义排他标志的复位等*/
17		int (*fsync) (struct file *, loff_t, loff_t, int datasync);   /*刷新待处理的数据,允许进程把所有的脏缓冲区刷新到磁盘*/
18		int (*aio_fsync) (struct kiocb *, int datasync);   /*调用fsync把文件所指定的文件的所有缓冲区写到磁盘中*/
19		int (*fasync) (int, struct file *, int);  /*系统支持异步通知的设备驱动*/
20		int (*lock) (struct file *, int, struct file_lock *);  /*用来实现文件加锁*/
21		ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);   /*由内核调用来发送数据, 一次一页, 到对应的文件*/
22		unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
23		int (*check_flags)(int);             /*允许模块检查传递给 fnctl(F_SETFL...) 调用的标志*/
24		int (*flock) (struct file *, int, struct file_lock *);
25		ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int
嵌入式Linux驱动开发(二)——字符设备驱动之控制LED 关于驱动程序框架,请参考: 嵌入式Linux驱动开发(一)——字符设备驱动框架入门 同时,在这篇文章里面留下了两个问题,现在先来解决其中的第一个问题,就是如何用驱动程序来操作需要操作的硬件。 关于开发板点亮LED的问题,在这里简单介绍一下,也可以参考之前我写的文章: 嵌入式Linux开发——裸板程序点亮开发板上的LED灯 首先为了操作硬件,看接线原理图是必不可少的一步,这几个LED的原理图相对来说 阅读详情

相关推荐

【Matlab 六自由度机器人】基于改进型D-H参数的运动学建模与蒙特卡洛工作空间分析

本文详细介绍了如何使用改进型D-H参数法为六自由度机器人建立运动学模型,并利用Matlab Robotics Toolbox实现正运动学计算与可视化。通过蒙特卡洛法对机器人工作空间进行分析,生成三维点云图以直观展示其可达范围,为机器人选型与任务规划提供关键依据。

weixin_29040367的博客 440

python监听海康威视报警服务器

因为我使用海康威视摄像头是自带热成像的所以事件报警会上报两张图片,一张是RGB图像、另一张是热成像图像,因此使用。拿到的就是第一张RGB图像。可以点击测试,会显示。

qq_57018478的博客 1166

Ubuntu docker镜像中下载安装 DPABI(DPARSF)

在Ubuntu服务器的docker镜像中用MATLAB运行DPABI(以及使用DPARSF的功能)。

Pandako's Blog 1723

【新能源汽车DCDC变换器测试优化全攻略:解决电能质量/发热/过充等核心痛点】

高压直流转12V低压的DCDC变换器是新能源汽车电源系统的核心枢纽,承担着为整车低压附件、控制器及12V蓄电池供电/补电的关键作用。在新能源汽车乘用车、商用车等不同车型实际运营中,因PDU内DC/AC等模块干扰、DCDC自身设计缺陷、整车匹配性不佳及测试验证不充分,频发12V输出电能质量差导致后端元器件烧毁、变换器发热严重、蓄电池过充/欠充、智能补电功能失效等问题,还伴随低压侧电压瞬跌/浪涌、电磁干扰超标、振动后接触不良、高温下效率骤降等行业高频故障,直接影响整车可靠性和运营安全性。本文基于国标。

优快云-新能源汽车研发测试专业博主 1269

DSP的CLA调试技巧

本文介绍了基于TMS320F28377D的CLA(Control Law Accelerator)开发实战教程,涵盖基础配置、编程、调试与优化全流程。主要内容包括:CLA核心特性及其作为实时控制协处理器的优势;开发环境搭建与工程配置要点;CLA任务调度、数据交换及编程约束;调试技巧如断点设置和性能分析方法;进阶应用案例(批量除法运算)及优化策略;以及推荐的学习资源和硬件平台。教程强调数据一致性和任务同步问题,为快速上手CLA开发提供实用指导。

1045

简要介绍 | 两阶段点云目标检测:理论与实践

目标检测是计算机视觉中的一个重要任务,其目的是识别和定位图像中的物体。对于二维图像,这已经有许多有效的方法。然而,对于三维数据(如由LiDAR生成的点云数据),目标检测则更为复杂。

NLOS的博客 1307

Python 爬虫实战:深入闲鱼平台,抓取二手好物价格波动数据

本文介绍了如何利用Python爬虫抓取闲鱼(Xianyu)二手交易平台的商品价格数据并分析其波动趋势。通过requests和BeautifulSoup库实现网页数据抓取与解析,使用pandas进行数据清洗和存储,最后借助matplotlib可视化价格波动情况。文章详细展示了从网页结构分析、数据采集到波动率计算和趋势可视化的完整流程,并建议通过定时任务实现持续数据更新。该项目能为二手市场交易者提供价格参考,帮助优化买卖决策。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3377

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

Systemcall名屋 2983

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: GCC详解的-Wl选项说明与测试
下一篇: Linux下修改可执行程序或者库的动态链接库的路径
Yimning
博客等级 码龄8年 1万+粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值