![](https://img-blog.csdnimg.cn/20200417085810564.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux驱动开发学习笔记
学习如何给芯片写Linux驱动,可以更好的理解linux系统是怎么在一个芯片上工作的。
耐心的小黑
七月份就上班了,比较忙!
展开
-
linux驱动开发学习笔记二十五:SPI驱动框架介绍
一、SPI 驱动框架简介和I2C一样,SPI 也是很常用的串行通信协议,SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口。1、 SPI 主机驱动SPI 主机驱动就是 SOC 的 SPI 控制器驱动,类似 I2C 驱动里面的适配器驱动。Linux 内核使用 spi_master 表示 SPI 主机驱动,spi_master 是个结构体,定义在 include/linux/spi/spi.h 文件中,内容如下(有缩减):315 stru原创 2020-05-13 13:23:23 · 2349 阅读 · 0 评论 -
linux驱动开发学习笔记二十四:I2C驱动框架介绍
I2C 是很常用的一个串行通信接口,用于连接各种外设、传感器等器件,Linux 下的 I2C 驱动是有框架的,我们需要按照指定的框架去编写 I2C 设备驱动。为了符合 Linux 的驱动分离与分层的思想,Linux内核将 I2C 驱动分为两部分:①I2C 总线驱动,I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。②I2C 设备驱动,I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。一、I2C 总线驱动首先来看一下 I2C 总线,在platform中总线是虚原创 2020-05-12 17:54:36 · 2275 阅读 · 0 评论 -
linux驱动开发学习笔记二十三:input子系统
一、简介按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input 框架,用户只需要负责上报输入事件,比如按键值、坐标等信息,input 核心层负责处理这些事件。input 就是输入的意思,因此 input 子系统就是管理输入的子系统,和 pinctrl 和 gpio 子系统一样,都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等等这些都原创 2020-05-11 22:52:57 · 1785 阅读 · 0 评论 -
linux驱动开发学习笔记二十二:MISC驱动
一、简介misc 的意思是混合、杂项的,因此 MISC 驱动也叫做杂项驱动,也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。MISC 驱动其实就是最简单的字符设备驱动,通常嵌套在 platform 总线驱动中,实现复杂的驱动,所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。随着 Linux字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC 设备驱动就用于解决此问题。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创原创 2020-05-10 14:23:51 · 2067 阅读 · 0 评论 -
linux驱动开发学习笔记二十一:异步通知
一、异步通知简介我们首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理。比如我们在裸机篇里面编写的 GPIO 按键中断实验,我们通过按键去开关蜂鸣器,采用中断以后处理器就不需要时刻的去查看按键有没有被按下,因为按键按下以后会自动触发中断。同样的,Linux 应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以原创 2020-05-09 22:26:19 · 1944 阅读 · 0 评论 -
linux驱动开发学习笔记二十:linux内核中断
一、简介不管是裸机实验还是 Linux 下的驱动实验,中断都是频繁使用的功能,在裸机中使用中断我们需要做一大堆的工作,比如配置寄存器,使能 IRQ 等等。Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。在 Linux 内核中使用一个...原创 2020-05-07 15:18:13 · 1848 阅读 · 0 评论 -
linux驱动开发学习笔记十九:认识一下ioctl函数
一、ioctl介绍ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制。如果不用ioctl的话,也可以实现对设备I/O通道的控制,但那是蛮拧了。例如,我们可以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过,如果有的话,那么后面就跟着控制命令。但是如果这样做的话,会导致代码分工不明,程序结构混乱,程序员自己也会头昏...原创 2020-05-07 01:18:44 · 2544 阅读 · 0 评论 -
linux驱动开发学习笔记十八:认识一下内核定时器
一、内核时间管理系统节拍率Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍率...原创 2020-05-06 23:29:01 · 2136 阅读 · 0 评论 -
linux驱动开发学习笔记十七:并发与竞争
一、并发与竞争并发与竞争简介Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。现在的 Linux 系统并发产生的原因很复杂,总结一下有下面几个主要原因:①、多线程并发访问,Linux 是多任务(线程)的系统,所以多线程访问是最基本的原因。②、抢占式并...原创 2020-05-05 23:44:43 · 1828 阅读 · 0 评论 -
linux驱动开发学习笔记十六:gpio相关OF函数和子系统API函数
一、gpio相关OF函数我们在设备节点中会定义了一个名为“gpios”的属性,当然不一定是“gpios”,你可以自定义。gpios 属性描述了 test 这个设备所使用的 GPIO。在驱动程序中需要读取 gpios 属性内容,Linux 内核提供了几个与 GPIO 有关的 OF 函数,常用的几个 OF 函数如下所示:of_gpio_named_count 函数of_gpio_named_...原创 2020-05-03 20:06:24 · 4794 阅读 · 0 评论 -
linux驱动开发学习笔记十五:gpio子系统介绍
一、gpio子系统简介我们之前已经说过了 pinctrl 子系统,pinctrl 子系统重点是设置 PIN(有的 SOC 叫做 PAD)的复用和电气属性,如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话,那么接下来就要用到 gpio 子系统了。gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO为输入输出,读取 GPIO 的值等。...原创 2020-05-03 17:52:34 · 2473 阅读 · 0 评论 -
linux驱动开发学习笔记十四:pinctrl子系统介绍
一、前言之前已经介绍过关于设备树的一些基本概念,相信对设备数已经有了一些了解。我们知道在驱动开发过程中设备树是非常重要的,但是在使用pinctrl和gpio子系统之前,其实我们写驱动的方式,就拿点亮一个led来说,还是和裸机开发非常类似。因为我们仍然相当于直接操作的寄存器,和不使用设备树相比无疑只是将寄存器的地址写到了节点属性里,然后我们去读取而已。其实对于大多数的 32 位 SOC 而言,引...原创 2020-05-03 16:01:07 · 2824 阅读 · 1 评论 -
linux驱动开发学习笔记十三:设备树常用OF操作函数
设备树描述了设备的详细信息,这些信息包括数字类型的、字符串类型的、数组类型的,我们在编写驱动的时候需要获取到这些信息。比如设备树使用 reg 属性描述了某个外设的寄存器地址为 0X02005482,长度为 0X400,我们在编写驱动的时候需要获取到reg属性的0X02005482和 0X400这两个值,然后初始化外...原创 2020-05-02 11:45:15 · 4302 阅读 · 0 评论 -
linux驱动开发学习笔记十二:设备树中节点的命名格式和常见属性
一、节点的命名格式1 / { 2 aliases { 3 can0 = &flexcan1; 4 };5 6 cpus { 7 #address-cells = <1>;8 #size-cells = <0>;9 10 cpu0: cpu@0 {11 ...原创 2020-05-01 15:19:07 · 5160 阅读 · 3 评论 -
linux驱动开发学习笔记十一:初识设备树
一、什么是设备树?在Linux3.x之前的内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录中。每年新出的 ARM 架构芯片少说都有数十、数百款,每一款芯片又会有很多款基于该芯片的板子,这些板子上的设备又不相同,每一块板子都要有自己的板级信息文件,所以Linux 内核下板级信息文件将会成指数级增长!关键是...原创 2020-05-01 11:58:58 · 2567 阅读 · 0 评论 -
linux驱动开发学习笔记十:字符设备驱动改进版
在这里首先要说一下,之所以称作新写法,是针对我之前的一篇文章—如何开始编写你的第一个字符设备驱动?来说的。今天要说的新的写法,和之前比,主要变化在于:分配和释放设备号的方式字符设备注册的方式不再需要手动创建设备节点好了,下面就来一个一个的说。一、分配和释放设备号之前我们使用 register_chrdev函数注册字符设备的时候只需要给定一个主设备号即可,但是这样会带来两个问题:...原创 2020-04-29 22:14:39 · 1855 阅读 · 0 评论 -
linux驱动开发学习笔记九:menuconfig过程详解
当我们执行make menuconfig时,系统到底帮我们做了什么?这里面一共涉及到了以下几个文件,下面我们逐个的讲解:Linux内核根目录下的scripts文件夹arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件Linux内核根目录下的makefile文件、各层目录下的makefile文件Linux内核根目录下的的.config文件、arch/$A...转载 2020-04-27 14:23:02 · 2110 阅读 · 0 评论 -
linux驱动开发学习笔记八:配置内核必不可少的工具--menuconfig
一、常见的几种配置工具介绍在配置内核的时候会有很多配置方法:make menuconfigmake xxx_defconfig直接修改.config注意: 其中menuconfig是一个图形化配置工具,在后面我们会着重介绍;xxx_defconfig是在arch/arm/configs文件夹下的一些默认配置文件;.config是编译的时候系统默认读取的配置文件,如果直接修改.conf...原创 2020-04-27 12:38:27 · 3194 阅读 · 0 评论 -
linux驱动开发学习笔记七:将驱动程序编译成.ko文件或者直接编译进内核
一、前言 也学了10天左右的linux驱动开发了,一般学习新知识的时候,我都喜欢首先理清思路,然后才去关注更加细节的东西,这次也不例外。 正如我前面写的几篇博客,主要内容包括linux内核和linux发行版的概念与区别;linux系...原创 2020-04-26 14:41:50 · 5096 阅读 · 1 评论 -
linux驱动开发学习笔记六:如何编写应用程序去验证我们的字符设备驱动程序?
一、首先是编写应用程序APP首先需要说明的是,编写测试 APP 就是编写 Linux 应用,需要用到 C 库里面和文件操作有关的一些函数,比如open、read、write和 close这四个函数。我们可以使用man命令来使用编程手册,也即它可以查询很多函数应该如何使用。包括应该包含哪些头文件,函数原型,参数以及返回值等等。这是非常好用的一个命令,具体的使用方法我们以后再说,你也可以去网上搜一...原创 2020-04-22 00:34:26 · 2676 阅读 · 0 评论 -
linux驱动开发学习笔记五:如何开始编写你的第一个字符设备驱动?
一、驱动模块的加载和卸载Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块,这样我们修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linu...原创 2020-04-21 23:46:53 · 2623 阅读 · 1 评论 -
linux驱动开发学习笔记四:设备驱动的作用?裸机设备驱动和linux系统中的设备驱动有什么区别?
一、什么是设备驱动及其作用? 任何一个计算机系统的运行都是系统中软硬件协作的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则只是一堆废铁。 硬件是底层基础,是所有软件得以运行的平台,代码最终会落实为硬件上的组合逻辑与时序逻辑;软件则实现了具体应用,它按照各种不同的业务需求而设计,满足了用户的需求。硬件较固定,软件...原创 2020-04-21 12:28:07 · 2289 阅读 · 0 评论 -
linux基础学习笔记八:Makefile基础学习
文章传送门:https://www.cnblogs.com/tp-16b/p/8955462.html自己阅读之后,发现这篇文章写的非常不错,虽然没有把所有的关于make和Makefile的知识点都列出来,但是对于小白理解它们还是非常有帮助的,至少我看过之后对于make如何执行以及Makefile如何编写都有了不错的理解。这篇文章的主要包括以下几个内容:Makefile是什么?程序...原创 2020-04-19 22:55:32 · 1575 阅读 · 0 评论 -
linux基础学习笔记七:linux系统目录以及linux内核源码目录分析
一、Linux系统目录分析登录系统后,在当前命令窗口下输入命令: ls / 你会得到如下的信息:树状目录结构:以下对这些目录进行简单的解释:/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev :dev是Device(设备)的缩写, 该目录下存放的...原创 2020-04-19 19:52:08 · 1912 阅读 · 0 评论 -
linux驱动开发学习笔记一:关于linux内核的一些基本概念
一、什么是linux内核?Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。...原创 2020-04-18 11:00:54 · 1899 阅读 · 0 评论