编写linux设备驱动的注意事项之一

编写linux设备驱动的注意事项之一

当然写驱动,你得清楚上层调用是否导致存在函数重入、
什么执行context下(1. 中断、2. 软中断、3. tasklet(软中断的一种)、 4. timer(基于软中断实现)、5. hrtimer (软中断或硬中断环境下执行) 、6. workqueue(也是kernel thread)、7. kernel thread、8. 普通thread的内核态下)会访问此函数和此资源,需要什么样的“同步机制”保护。

你利用子系统(例如input子系统)的去实现驱动需要实现功能。你利用总线的api函数去访问设备硬件,例如i2c_transfer、spi_sync等
注意probe函数传入的device,是bus_type实现的,在module_init时注册了驱动到对应总线上,在.machine_init时,会通过board板级代码把此bus的设备加入到对应的总线上(无论是否需要device tree方式)。无论是谁创建的设备(bus函数或者machine_init的函数),加入bus后,match成功后,就传入到驱动的probe函数上了,所以probe函数传入的就是对应bus的device结构,例如i2c是struct i2c_client , spi总线是struct spi_device ,platform虚拟总线传入的是struct platform_device *。 具体参见我的《linux device driver model_2018_02_03(必读).pptx》

像手机的touch driver比较复杂(例如cypress或者synaptics厂家),他还自己创建了一条虚拟的bus来实现动态支持不同的子function的添加。

需要考虑一个驱动如何支持多个设备,避免全局和静态变量,而采用基于xxx_priv_dev的结构体成员变量代替,一个xxx_priv_dev 对应一个device。

关于具体的写linux驱动的方法、技巧和注意事项,欢迎观看我的《如何编写linux设备驱动》的视频:
https://edu.51cto.com/course/17132.html

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html

原文地址:https://blog.51cto.com/8906847/2367930

时间: 2024-11-07 19:41:17

编写linux设备驱动的注意事项之一的相关文章

关于如何编写linux设备驱动

关于如何编写linux设备驱动 1)首先确定硬件接口使用的总线,2)然后确定要实现的功能,是网卡.sensor还是什么?再确定对上层应用暴露的接口, 从而选择子系统,例如iio.input子系统等.由于linux只有字符设备.块设备.网络设备三种设备,其实iio.input子系统都是字符设备,只是它们帮你封装好了字符设备的file_operations和Major设备号了,另外提供统一的sysfs接口(一类sysfs接口).你只需要按照子系统要求注册进子系统就行.子系统就像应用和你驱动之间的fr

Linux设备驱动开发基础

1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮训.中断处理.DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据. 由此可见,设备驱动充当了硬件和应用软件之间的纽带,他使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作.在系统中没有操作系统的情况下,工

linux 设备驱动的重点和难点

1. 编写linux设备驱动,要求工程师具备一定的硬件基础,懂得SRAM, Flash, SDRAM, 磁盘的读写方式, UART, I2C, USB等设备的接口,轮询.中断.DMA的原理,PCI总线的工作方式以及CPU的内存管理MMU. 2. 具备好的C语言基础,可灵活运用结构体,指针,函数指针及内存动态申请和释放. 3. 有一定的linux 内核基础,至少要明白驱动与内核的接口, 4. 要求工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁.互斥.信号量.等 待队列等并

linux设备驱动辩编写基础

Linux设备驱动辩编写基础 一.linux中的驱动是以模块的形式存在的,这样就大大提高了驱动的灵活性,linux内核模块的程序结构如下: l  模块加载函数(必须):module_init() l  模块卸载函数(必须):module_exit() l  模块许可证声明(必须):MODULE_LECENSE("GPL") l  模块参数(可选):module_param(a,int,0400) l  模块到处符号(可选):EXPORT_SYMBOL_GPL(func) l  模块作者

linux设备驱动归纳总结(六):2.分享中断号【转】

linux设备驱动归纳总结(六):2.分享中断号 转自:http://blog.chinaunix.net/uid-25014876-id-90837.html xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 上一节介绍的内容是,调用接口request_irq(),使中断号与中断处理函数对应.但是,有时候会有这样的情况,如果开发板上按键的中断已经被另外的驱动程序注册中断了

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie

《Linux设备驱动开发详解(第3版)》海量更新总结

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2015.2.26 几乎完成初稿. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第1章 <Linux设备驱动概述及开发环境构建>[D]删除关于LDD6410开发板的介绍[F]更新新的Ubuntu虚拟机[N]添加关于QEMU模拟vexpress板的描述 第2章 <驱动设计的硬件基础> [N]增加关于SoC的介绍:[N]增加关于eFuse的内容:[D]删除ISA总线的内容了:[N]增加关于SP

Linux设备驱动基本框架(字符设备)

Linux设备驱动都是以内核模块的形式出现的,但模块不一定是驱动.驱动可以编译进内核,在配置内核时,如果把某个配置项设为m,那么它将会随着内核编译时被编译成一个模块,但是这样向内核添加驱动程序会使得内核变得很大,而且在增加.修改.删除驱动程序时需要再一次编译内核,这样做极为麻烦.所以一般的驱动程序都是采用模块化装载,在需要使用时候通过insmod装载进内核,不需要使用时用rmmod卸载驱动模块. 内核模块的主要相关命令: lsmod:查看当前内核装载有哪些模块 insmod:加载模块 rmmod

linux设备驱动第三篇:如何写一个简单的字符设备驱动?

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [email prot