![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux3.4.2驱动开发
文章平均质量分 90
Leon_George
一只始终飞翔在嵌入式Linux ARM开发中的黑鸟,对bootloader、跟文件系统和Linux内核裁剪,以及对Linux底层应用和驱动开发也有些许心得。有志同道合的同学请关注我哦。
展开
-
超长文解析Linux块设备驱动编写方法
块设备的初始化过程要比字符设备复杂,它既需要像字符设备一样在加载内核时完成一定的工作,还需要在内核 编译时增加一些内容。块设备驱动程序初始化时,由驱动程序的 init()完成。 块设备的初始化过程:初始化并注册 gendisk 结构struct gendisk (定义于 ) 在内核中代表一个单独的磁盘驱动器。事实上, 内核还使用 gendisk 来表示分区,所以物理上的一块磁盘,可以在内核中由多个逻辑上的磁盘(gendisk)来表示。每个 gendisk 中包含了本物理实体的全原创 2023-03-03 23:59:19 · 3059 阅读 · 2 评论 -
关于字符设备驱动的通用概念和写法
用户应用程序调用设备的一些功能是在设备驱动程序中定义的,也就是设备驱动程序的入口点,它是一个在内核中定义的 结构,不会出现在用户空间的程序中,但它定义了常见文件 I/O 函数的入口,如下所示:系统调用函数通过内核,最终调用对应的 struct file_operations 结构的接口函数(例如,open()文件操作是通过调用对应文件的 file_operations 结构的 open 函数接口而被实现)。当然,每个设备的驱动程序不一定要实现其中所有的函 数操作,若不需要定义实现时,则只需将其设为原创 2023-02-18 23:04:42 · 631 阅读 · 0 评论 -
嵌入式 Linux 驱动开发你想知道的都在这
关于嵌入式 Linux 驱动开发的方方面面,包括学习路径、学习方法,工作经验、书籍推荐等等。只要是你想问的,这里都有。转载 2023-02-09 22:24:34 · 1873 阅读 · 0 评论 -
Linux设备模型剖析系列文章之七(kobj、kset)
【摘要】本文是Linux设备模型系列文章的最后一篇,补充讲解了kobj和kset的一些内容,主要阐述kobj/kset作为统一设备模型的基础,到底提供了哪些功能,在具体应用过程中,如device、bus甚至platform_device等是如何使用kobj/kset的。原创 2022-10-29 15:27:16 · 417 阅读 · 0 评论 -
Linux设备模型系列文章之六(设备资源管理)
【摘要】本文是Linux设备模型剖析系列文章之六,主要讲述了如何避免在内核驱动编程中解决繁琐的资源管理难题。相信每一个写过Linux driver的工程师,都在probe函数中遇到过上面的困惑:要顺序申请多种资源(IRQ、clock、memory、regions、ioremap、dma、等等),只要任意一种资源申请失败,就要回滚释放之前申请的所有资源。而设备资源管理帮我们解决了这个问题,本文就是围绕它来展开。原创 2022-10-29 15:24:12 · 297 阅读 · 0 评论 -
Linux设备模型剖析系列之五(class)
【摘要】本文是Linux设备模型剖析系列文章之五,讲述了class相关的概念及其在驱动编程中的应用。在设备模型中,Bus、device、device driver等等,都比较好理解,因为它们对应了实实在在的东西,所有的逻辑都是围绕着这些实体展开的。而本文所要描述的class就有些不同了,因为它是虚拟出来的,只是为了抽象设备的共性。原创 2022-10-29 15:16:23 · 489 阅读 · 1 评论 -
Linux设备模型剖析系列之四(BUS)
【摘要】本文是Linux设备模型剖析系列文章之四,主要讲述了BUS总线在Linux设备模型中的地位,BUS是一类特殊的设备,它是连接处理器和其它设备之间的通道(channel)。为了方便设备模型的实现,内核规定,系统中的每个设备都要连接在一个Bus上,这个Bus可以是一个内部Bus、虚拟Bus或者platform Bus。内核通过struct bus_type结构抽象Bus。下文会围绕该结构,描述Linux内核中Bus的功能,以及相关的实现逻辑。最后,会简单的介绍一些标准的Bus(如platform)。原创 2022-10-29 15:10:35 · 676 阅读 · 0 评论 -
Linux设备模型剖析系列之三(device和device driver)
【摘要】device和device driver是Linux驱动开发的基本概念。Linux kernel的思路很简单:驱动开发,就是要为指定的设备(device)开发指定的软件(device_driver),所以kernel就为设备和驱动定义了两个数据结构,分别是device和device_driver。下文将会围绕这两个数据结构,介绍Linux设备模型的核心逻辑,包括:设备及设备驱动在kernel中的抽象、使用和维护;设备及设备驱动的注册、加载、初始化原理;设备模型在实际驱动开发过程中的使用方法。原创 2022-10-29 15:01:53 · 505 阅读 · 0 评论 -
Linux设备模型剖析系列之二(uevent、sysfs)
【摘要】本文为Linux设备模型剖析系列文章之二,主要内容为对kobject中的uevent进行了讲解,包括其在内核中的位置(地位)和内部逻辑;而后还讲述了sysfs和kobjet之间的关系、attrbute的概念等问题。原创 2022-10-29 14:55:50 · 1264 阅读 · 0 评论 -
Linux设备模型剖析系列一(基本概念、kobject、kset、kobj_type)
【摘要】本文是linux设备模型剖析系列文章之一,主要内容包括了Linux内核中设备模型的核心思想,讲述了Bus, class, device和device_driver等的概念,特别是对kobject、kset、kobj_type作为Linux设备模型的基本单元,同时也是设备模型中最难理解的一部分,进行了源码级的较为清楚的分析。原创 2022-10-29 14:42:25 · 946 阅读 · 0 评论 -
uart驱动框架及编程方法
【摘要】本文讲述了UART串口的驱动框架,其与tty架构的联系及相互关系,描述了常见的数据结构及一般串口驱动编程的一般步骤和方法,最后引用LDD3文章中的一个串口实例讲述了串口驱动源码全貌原创 2022-10-28 23:39:18 · 2150 阅读 · 0 评论 -
超详细Uart驱动框架及编程方法
UART(Universal Asynchronous Receiver/Transmitter),中文全称为通用异步收发传输器,是一种异步收发传输器,它将要传输的数据通过并行到串行转换后再进行传输。该总线双向通信,可以实现全双工传输和接收。在嵌入式设备中,UART 用于主机与辅助设备通信。原创 2022-10-24 00:48:37 · 4746 阅读 · 0 评论 -
GDB的断点调试
前言之前在GDB的极致运用一文中,我们讲到了GDB启动调试的多种方式,分别应用于多种场景。今天我们来介绍一下断点设置的多种方式。1.为何要设置断点在介绍之前,我们首先需要了解,为什么需要设置断点。我们在指定位置设置断点之后,程序运行到该位置将会“暂停”,这个时候我们就可以对程序进行更多的操作,比如查看变量内容,堆栈情况等等,以帮助我们调试程序。2.查看已设置的...原创 2019-02-28 20:34:37 · 2898 阅读 · 0 评论 -
PCI设备驱动(一)
首先要明确两个概念:Linux内核 PCI设备驱动和设备本身驱动两部分。工作中所谓的编写设备驱动,其实就是编写设备本身驱动。因为Linux 内核的PCI驱动是内核自带的。当然,并不是说内核帮咱们写好了Linux PCI驱动我们什么就不用做了,至少你要明白内核大致都干了些什么,这样你才能明白你该干什么,如何完成设备本身的驱动。我们下面就来研究下Linux PCI驱动到底都干了些什么...原创 2019-01-03 22:14:36 · 3803 阅读 · 0 评论 -
一文彻底讲清Linux tty子系统架构及编程实例
本文详细解读了linux系统下的tty子系统的深层次原理和架构,并参考了LDD3中的代码实例讲述了无硬件下实现一个简单的tty设备驱动模块的编写。对了解tty子系统及下部串口驱动模块的学习有较好的参考价值。原创 2022-10-23 00:16:11 · 4273 阅读 · 0 评论 -
一文讲透Linux网络设备驱动框架及编写步骤
本文阐述了网络架构模型,特别是Linux系统中网络子设备框架4层结构,反别阐述了各层的作用。重点讲解了sk_buff及net_device数据结构及其常用操作接口,最后以实际代码讲述了特定网卡的驱动编写步骤、流程和移植方法。原创 2022-10-18 13:02:08 · 4017 阅读 · 3 评论 -
一文彻底搞清Linux中块设备驱动的深层次原理和编写方法
本文主要讲述了在Linux环境下的块设备驱动的常见数据结构和内核接口,并以一个实际例子讲述了块设备驱动的编写方法。文章参考LDD3。原创 2022-10-12 18:11:08 · 1961 阅读 · 0 评论 -
linux内存重映射的概念及对内核虚拟地址的重映射方法分析
【摘要】本文分析了Linux设备的内存映射的相关概念和理论,使用例子对mmap及nopage的驱动编写方法进行了解释,最后对3种不同的内核虚拟空间分配方法下,mmap驱动编写方法进行了细致的分析和调试。原创 2022-10-10 21:46:41 · 1212 阅读 · 0 评论 -
细说嵌入式驱动程序设计
摘要:嵌入式系统驱动程序的开发有别于WIndows或Linux。后者除了必须了解新设备的硬件特性,把控制硬件的程序尽快完成之外,还需要设法让驱动程序符合Windows或Linux的规定(大且复杂的架构)。但在嵌入式系统中,往往是先设计驱动程序再有系统,所以只需要致力于驱动各个外围设备,而且嵌入式产品一般没有后期新增硬件的需求,所以不要求驱动程序编写的有扩展性,只需要逻辑清晰,简单明了就可以。本文详细描述了嵌入式驱动程序设计的主要原则和方法,对编写嵌入式驱动程序具有较好的借鉴和参考意义。原创 2020-11-29 19:16:59 · 5960 阅读 · 0 评论 -
驱动工程师必备技能
今天偶然看到一篇大佬写的文章,感觉对从事驱动开发的同学很有参考意义,故稍作精简后引文到此,供大家围观。作为驱动工程师,主要的工作就是移植各种驱动,接触各种硬件。接触最多的就是dts、中断、gpio、sysfs、proc fs。一个基本合格的驱动工程师,要时刻想着如何利用你平时看的代码,如何体现在工作的调试中,如何利用sysfs、proc fs及内核提供的接口为我们降低调试难度,快速解决问题。注:部分代码分析举例基于linux-4.15。转载 2022-09-25 23:27:16 · 1129 阅读 · 0 评论 -
LCD液晶屏驱动详解
开发环境:开发板:JZ2440V3CPU:samsunS3C2440内核:Linux3.4.2编译工具:arm-linux-gcc 4.3.2LCD:4.3存液晶屏AT043TN24参考文献:LCD驱动程序详细讲解(一)_weixin_33935505的博客-CSDN博客LCD驱动详解 - Lilto - 博客园 (cnblogs.com)主题:s3c2440移植l...原创 2021-08-02 21:49:44 · 14928 阅读 · 0 评论 -
一文入门USB设备的驱动编写方法
摘要:本文介绍了USB设备驱动相关的基本知识结构,和编写驱动的基本步骤和流程。最后通过编写一个USB鼠标的驱动实力,讲述了简单字符型USB输入设备驱动的具体编写步骤,并给予了测试方法。文末附有完整程序代码和Makefile。原创 2022-09-19 23:05:04 · 6132 阅读 · 0 评论 -
详解linux内核链表list_head及其接口应用
摘要:本文介绍了内核代码中经常使用的list_head链表的原理,及其它的各种接口函数(宏函数)的使用方法和技巧,对理解Linux内核数据结构和代码有较好参考意义。原创 2022-09-14 23:23:33 · 683 阅读 · 3 评论 -
编写具有良好移植性Linux C代码的若干技巧
摘要:本文主要讲述了linux内核开发过程中,需要注意的有关提高代码可移植性的若干技巧,同样对编写Linux应用程序也有较好的参考意义。干货满满,请君一阅。原创 2022-09-14 15:09:28 · 392 阅读 · 0 评论 -
如何把自己写的驱动编进内核
本文详细介绍了如何将自己编写的驱动代码放入内核整体框架下.原创 2022-09-07 20:02:16 · 1362 阅读 · 0 评论 -
如何把自己写的驱动编进内核
本文详细介绍了如何将自己编写的驱动代码放入内核整体框架下原创 2022-09-06 23:59:28 · 408 阅读 · 0 评论 -
一文搞懂Linux系统内核升级及下载当前内核源代码
介绍linux发行版(Ubuntu、Fedro、Redhat)下获取或升级内核源码的方法和技巧。原创 2022-09-06 15:56:11 · 2163 阅读 · 0 评论 -
一种用于Linux内核驱动开发的Vim环境配置
本文介绍一种用于linux内核驱动开发或linux内核源码阅读的vim环境配置。用到的几款插件包括:cags、cscope和taglist。其中,ctags主要用于查找函数的定义;taglist基于ctags和vim的一款插件,主要用于实现右侧的文件目录导航;cscope主要用于对函数的定义、调用关系等进行查找。原创 2022-09-06 11:47:02 · 817 阅读 · 0 评论 -
详解linux内核链表list_head
Linux内核中的链表通常都组织成双向循环链表,不同于一般意义上的链表,这里的链表节点只含有链表指针(next和prev),没有链表的数据。Linux内核中使用的链表源代码位于` include/linux/list.h`中,下面详细叙述。转载 2022-08-21 22:45:04 · 995 阅读 · 0 评论 -
远程登陆Win10自带子系统Ubuntu-22.04
网上已经有很多关于远程登陆linux服务器的文章了,但很少找到关于远程登陆Windows自带的Linux子系统(WSL)——Ubuntu-22.04LTS的文章。原创 2022-06-25 19:40:00 · 2600 阅读 · 0 评论 -
linux驱动开发基础知识
摘要:主要介绍了在进行linux驱动开发前,需要了解和掌握的一些基本知识。MobaXterm窗口设置为了解决在命令行中输入较长命令时,MobaXterm终端不能自动换行而导致命令首尾字符覆盖的问题,需要将MobaXterm终端大小设置成与linux终端一致,其步骤为:Linux终端窗口大小设置查询终端窗口的行列数:stty size设置终端窗口列数:stty cols num设置终端窗口行数:stty rows numMobaXterm终端大小设置右击会话窗口,选择edit ses原创 2022-04-23 22:36:37 · 2679 阅读 · 0 评论 -
第四讲 Linux内核KFIFO的使用
在驱动编程中,经常会遇到异步数据处理的情况,比如采用中断或定时器处理数据输入输出等情况。此时数据的采集与处理往往不同步,于是驱动编程中数据采集方需要将采集的数据暂时放到一个缓冲区中,使用方在需要处理数据时从缓冲区中将数据读出驱动编程中常采用队列这种数据结构来实现整个过程,我们可以选择自己编写一个队列,也可以利用内核中现有队列kfifo来实现。4.2、使用过程定义KFIFO变量;为KFIFO开辟空间;把数据写入KFIFO;从KFIFO读出数据;原创 2022-04-08 22:48:55 · 2135 阅读 · 0 评论 -
第五讲 Linux内核-中断机制(下)
内核中的延迟执行机制中断底半部软中断taskletworkqueuetimer定时器在第五讲 Linux内核-中断机制(上)中已经讲述了前4种内核的延时机制,今天讲一讲内核定时器及其应用方法。3、内核定时器3.1、初始化定时器位于``/include/linux/time.h`struct timer_list{ ... unsigned long expires; //定时时间 struct tvec_base *base; void(*function)(unsigned原创 2022-04-07 19:08:47 · 498 阅读 · 0 评论 -
第五讲 Linux内核-中断机制(上)
本文分析了linux中断机制中的常用接口,回答了什么是中断的顶半部和底半部,以及中断底半部实现的3种方法——软中断、tasklet和工作队列,每个方法均给出了代码实例,便于大家学习理解。3、内核中断所在头文件:<linux/interrupt.h>3.1、中断APIenum irqreturn{ IRQ_NONE = (0<<0), //未处理 IRQ_HANDLED = (1<<0), //已处理 IRQ_WAKE_THREAD = (1.原创 2022-04-06 22:56:38 · 1086 阅读 · 0 评论 -
Makefile语法及通用模板
简介:本文主要讲解了在开发常规项目时,用于自动化部署生成目标文件的Makefile。对其包含的主要语法进行了讲解,最后给出了一个项目通用的Makefile模板,以帮助大家理解。1. Makefile 三要素目标依赖命令目标:依赖(文件、其它目标)<tab>命令1<tab>命令2<tab>命令3target1:target2 target3 echo "target1" target2: echo "target2" target3.原创 2022-04-05 23:37:54 · 1957 阅读 · 2 评论 -
第九讲 Linux I2C子系统及mma8653重力传感器驱动编写
本文主要讲述了Linux系统下的IIC子系统驱动框架及其原理,对编写IIC接口设备驱动具有较好的参考意义。原创 2022-04-04 21:34:16 · 1650 阅读 · 0 评论 -
第八讲 Linux I2C总线及mma8653驱动编写实例
I2C总线1.1 I2C总线电气连接通信总线的方式:同步/异步全双工/半双工/单工串行/并行I2C总线:是同步、半双工、串行的总线,可以用来连接存储器(EEPROM、FLASH)、A/D、D/A转换器、LCD驱动器、传感器等等。它支持多主多从的模式(一般情况使用的是一主多从)。电气结构:1.2、I2C时序起始信号:时钟线高电平期间,数据线产生负跳变停止信号:时钟线高电平期间,数据线产生正跳变写数据时机:时钟周期的低电平期间;读数据时间:时钟周期原创 2022-04-03 22:41:16 · 547 阅读 · 0 评论 -
第七讲 Linux字符设备驱动2
一、复习1.1、字符设备驱动编写alloc_chrdev_region/register_chrdev_regioncdev_alloccdev_initcdev_addclass_createdevice_create注意:错误处理,goto语句卸载的时候:释放申请的资源,并删除注册的结构体1.2、设备文件创建mknod通过udev/mdev创建设备文件(根据uevent文件中的设备文件信息创建)一个驱动对应驱动多个同类型设备:cdev_demo0、cdev_demo1、c原创 2022-04-02 21:46:53 · 602 阅读 · 0 评论 -
第六讲 Linux字符设备驱动1
六、字符设备驱动6.1、基本概念Linux操作系统思想:一切皆文件对设备的操作,也是将设备抽象成设备文件,应用层通过文件IO对设备文件进行操作,其最终结果,是在操作设备。Linux操作系统,将设备分成三大类:字符设备: 除了网络设备和块设备,剩下的全部是字符设备特点:I/O传输过程中以字符为单位进行传输。用户对字符设备发出读/写请求时,实际的硬件读/写操作一般紧接着发生(同步发生、无缓存机制)块设备:存储设备特点:数据传输以块(内存缓冲)为单位传输;用户对块设备读/写原创 2022-04-01 22:51:15 · 3801 阅读 · 0 评论 -
Linux内核编译
1. 内核编译的基本流程<获取源代码>, 如有需要则进行修改;<配置>;<编译>;[根据发布版生成相应的源码包];<安装内核映像和模块>。<>为必需的步骤,[ ]为可选的步骤。若不使用发布版的源码包管理系统, 则不需要进行步骤4。 想要使用源码包管理系统来安装时, 可以使用各发布版的源码包创建系统。 在这种情况下步骤 3 和步骤 4 的操作是合并进行的。2. 准备工作2.1 工具的安装Fedora发行版源原创 2022-03-27 00:48:53 · 1670 阅读 · 0 评论