关于如何编写linux设备驱动

关于如何编写linux设备驱动

1)首先确定硬件接口使用的总线,
2)然后确定要实现的功能,是网卡、sensor还是什么?再确定对上层应用暴露的接口, 从而选择子系统,例如iio、input子系统等。由于linux只有字符设备、块设备、网络设备三种设备,其实iio、input子系统都是字符设备,只是它们帮你封装好了字符设备的file_operations和Major设备号了,另外提供统一的sysfs接口(一类sysfs接口)。你只需要按照子系统要求注册进子系统就行。子系统就像应用和你驱动之间的framework中间层,它帮你处理了很多通用的功能。另外自己再加入一些specific的sysfs接口即可。
确定了上面这些后,你就可以找到对应的例子去抄(参考)了。说白了,linux 内核设计者已经给你搭好了大的框架,你所要思考框架的东西并不多,你需要的是熟悉内核提供了什么框架子系统,如何使用。
什么样的bus,决定你调用什么总线API去访问硬件,什么样的功能决定你用什么样的子系统来暴露接口给上层应用使用。

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

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

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

另外注意:
即原则,内核只提供功能和接口,不负责策略和配置,策略和配置应该有具体应用提供。
天下代码一大抄,鼓励大家理解的方式抄好的代码例子。
对各个linux kernel子系统的api函数和重要结构体的熟悉是必须的。

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

时间: 2024-10-07 13:13:20

关于如何编写linux设备驱动的相关文章

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

编写linux设备驱动的注意事项之一 当然写驱动,你得清楚上层调用是否导致存在函数重入.什么执行context下(1. 中断.2. 软中断.3. tasklet(软中断的一种). 4. timer(基于软中断实现).5. hrtimer (软中断或硬中断环境下执行) .6. workqueue(也是kernel thread).7. kernel thread.8. 普通thread的内核态下)会访问此函数和此资源,需要什么样的"同步机制"保护. 你利用子系统(例如input子系统)的

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设备驱动第三篇:写一个简单的字符设备驱动

在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

(笔记)linux设备驱动--LED驱动

linux设备驱动--LED驱动 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋友一起学习技术,共同进步. 作者:liufei_learning(转载请注明出处) email:[email protected] IT学习交流群:160855096 转至:http://blog.csdn.net/liufei_learning/article/details/7025246 开发环