- 博客(50)
- 收藏
- 关注
原创 嵌入式驱动开发详解12(LCD驱动)
LCD 是现在最常用到的显示器,手机、 电脑、各种人机交互设备等基本都用到了 LCD,最常见就是手机和电脑显示器了。通过 LCD 可以显示绚丽的图形、界面等,提高人机交互的效率。分辨率:提起 LCD 显示器,我们都会听到 720P、1080P、2K 或 4K 这样的字眼,这个就是 LCD 显 示器分辨率。
2025-01-15 15:21:25
1239
原创 嵌入式驱动开发详解11(INPUT子系统)
按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input 子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input 框 架,用户只需要负责上报输入事件,比如按键值、坐标等信息,input 核心层负责处理这些事件。input 就是输入的意思,因此 input 子系统就是管理输入的子系统,和 pinctrl、gpio 子系统 一样,都是 Linux 内核针对某一类设备而创建的框架。
2025-01-07 21:36:03
993
原创 嵌入式驱动开发详解10(MISC杂项实现)
MISC 驱动也叫做杂项驱动,也就是当我们板子上的某 些外设无法进行分类的时候就可以使用 MISC 驱动。MISC 驱动其实就是最简单的字符设备驱 动,通常嵌套在 platform 总线驱动中,所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。随着 Linux 字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC 设备驱动就用于解决此问题。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设备驱动可以简化字符设备驱动的编写。
2025-01-07 20:14:50
949
原创 嵌入式驱动开发详解9(platform驱动)
Linux 系统要考虑到驱动的可重用性,提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了我们最常打交道的 platform 设备驱动,也叫做平台设备驱动。在实际的驱动开发中,一般 I2C 主机控制器驱动已经由 半导体厂家编写好了,而设备驱动一般也由设备器件的厂家编写好了,我们只需要提供设备信 息即可,比如 I2C 设备的话提供设备连接到了哪个 I2C 接口上,I2C 的速度是多少等等。
2025-01-02 14:35:42
1241
原创 嵌入式驱动开发详解8(阻塞/非阻塞/异步通信)
首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就 可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数, 在中断服务函数中做具体的处理。同样的,Linux 应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以使用,非阻塞方式的话会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动的去查询设备的使用情况;
2025-01-02 11:19:36
901
原创 C++基本语法
目前正计划学习QT开发,但是之前一直都是做MCU开发和linux驱动开发,用的都是C语言开发的,对C++一点概念都没有,因此笔者将对自己近期C++的学习情况进行记录。
2024-12-31 14:59:48
1266
原创 嵌入式驱动开发详解7(并发、竞争、中断)
中断会引起线程的切换,并发和竞争也是对线程切换的一种灵活保护和处理,因此这里将中断和并发与竞争放在一块讲解说明。中断控制器:GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核中的 NVIC。目前 GIC 有 4 个版本:V1~V4,V1 是最老的版本,已经被废弃了。V2~V4 目前正在大 量的使用。
2024-12-28 22:00:37
1081
原创 嵌入式驱动开发详解21(网络驱动开发)
linux驱动主要是字符设备驱动、块设备驱动还有网络设备驱动、字符设备驱动在本专栏前面已经详细将解了,网络设备驱动本文会做简要讲解,主要是讲解网络设备里面的以太网,PHY芯片,usb和sdio的wifi驱动挂载注意事项等,对网络内部实现仅仅只做简要介绍。I.MX6ULL 内核集成了两个 10/100Mbit/S 的网络 MAC,符合 IEEE802.3-2002 标准,MAC 层支持双工、半双工局域网。MAC 可编程、可以作为 NIC 卡或其他一些交换器件。
2024-12-25 16:26:02
1227
原创 嵌入式驱动开发详解20(IIO驱动架构)
IIO 全称是 Industrial I/O,翻译过来就是工业 I/O,IIO 就是为 ADC 类或者 DAC 类传感器准备的,大家常用的陀螺仪、加速度 计、电压/电流测量芯片、光照传感器、压力传感器等内部都是有个 ADC,内部 ADC 将原始的 模拟数据转换为数字量,然后通过其他的通信接口,比如 IIC、SPI 等传输给 SOC。当使用的传感器本质是 ADC 或 DAC 器件的时候,可以优先考虑使用 IIO 驱动框架。
2024-12-22 15:29:22
1434
原创 嵌入式驱动开发详解19(regmap驱动架构)
在前面学习 I2C 和 SPI 驱动的时候,针对 I2C 和 SPI 设备寄存器的操作都是通过相关 的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C/SPI 等设备,引入了 Regmap 子系统。regmap:regmap 是 Linux 内核为了减少慢速 I/O 在驱动上的冗余开销,提供了一种通用的接口来操 作硬件寄存器。问题。
2024-12-18 21:15:25
964
原创 嵌入式驱动开发详解18(USB驱动开发)
该专栏主要是讲解嵌入式相关的驱动开发,但是由于部分模块的驱动框架过于复杂,其内容量不是一个人能完成的,我们驱动开发人员主要是对其进行理解即可,所以本专栏对部分驱动代码相关内容不进行讲解,包括ALSA,Codec,CAN,USB,WIFI,4G模块等,这些只讲解相关的协议等基础知识USB 全称为 Universal Serial Bus,翻译过来就是通用串行总线。由英特尔与众多电脑公司 提出来,用于规范电脑与外部设备的连接与通讯。
2024-12-17 19:25:50
1076
原创 嵌入式驱动开发详解17(CAN驱动开发)
该专栏主要是讲解嵌入式相关的驱动开发,但是由于部分模块的驱动框架过于复杂,其内容量不是一个人能完成的,我们驱动开发人员主要是对其进行理解即可,所以本专栏对部分驱动代码相关内容不进行讲解,包括ALSA,Codec,CAN,USB,WIFI,4G模块等,这些只讲解相关的协议等基础知识CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。
2024-12-16 21:09:49
1389
原创 嵌入式驱动开发详解16(音频驱动开发)
因此该专栏主要是讲解嵌入式相关的驱动开发,但是由于ALSA驱动框架过于复杂,实现音频编解码芯片的驱动不是一个人能完成的,所以没有对应具体的驱动代码相关内容,包括后面的CAN,USB,WIFI,4G模块这些都是比较复杂的,都只会讲解相关的协议等基础知识音频是我们最常用到的功能,音频也是 linux 和安卓的重点应用场合。由于音频驱动开发任务量巨大,不是一个人能全流程实现的,因此只是通过修改设备树和已写好的驱动进行修改开发,该专栏后面的USB驱动、网络驱动等都是如此,对基础感兴趣的可以参考专栏的前部分文章。
2024-12-14 10:58:37
1834
原创 嵌入式驱动开发详解6(RTC)
实时时钟是很常用的一个外设,通过实时时钟我们就可以知道年、月、日和时间等信息。因此在需要记录时间的场合就需要实时时钟,可以使用专用的实时时钟芯片来完成此功能,但 是现在大多数的 MCU 或者 MPU 内部就已经自带了实时时钟外设模块。STM32 内部有一个 RTC 外设模块,这个模块需要一个 32.768KHz 的晶振,对这个 RTC 模块进行初始化就可以得到一个实时时钟。I.MX6U 内部也有 个 RTC 模块,但是不叫作“RTC”,而是叫做“SNVS”,这一点要注意!
2024-12-12 19:36:26
920
原创 嵌入式驱动开发详解15(电容触摸屏gt9147)
随着智能手机的发展,电容触摸屏也得到了飞速的发展。相比电阻触摸屏,电容触摸屏有 很多的优势,比如支持多点触控、不需要按压,只需要轻轻触摸就有反应。
2024-12-11 21:46:54
1415
原创 嵌入式驱动开发详解14(SPI驱动架构实现)
SPI 是很常用的串行通信协议,可以通过 SPI 来连接众多的传感器,相比 I2C 接 口,SPI 接口的通信速度很快,I2C 最多 400KHz,但是 SPI 可以到达几十 MHz。本文章主要讲解SPI串行通信协议相关的基本内容和在Linux操作系统下如何进行SPI外设的开发。SPI 全称是 Serial Perripheral Interface,也就是串行外围设备接口。
2024-12-09 16:58:25
1779
原创 嵌入式驱动开发详解13(IIC驱动架构实现)
本内容主要讲解在linux系统上开发I2C设备驱动,先讲解I2C相关的基础知识,再讲解I2C设备驱动框架,最后讲解I2C设备驱动具体实现。
2024-12-09 11:52:30
1087
原创 嵌入式驱动开发详解5(ioctl的使用)
linux内核给用户提供了两类系统调用函数:一类是数据操作函数,比如read、write…。另外一类函数是非数据操作函数,比如ioctl…,用户程序可以用ioctl给底层设备发送指令。ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。==在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。==
2024-12-05 11:19:35
1283
原创 嵌入式驱动开发详解4(内核定时器)
LInux内核定时器是一种基于未来时间点的计时方式,以当前时刻来启动的时间点,以未来的某一时刻为终止点。比如,现在是10点5分,我要定时5分钟,那么定时就是10点5分+5分钟=10点10分。这个和手机闹钟很相似。比如你要定一个第二天早晨8点的闹钟,就是当前时间定时到第二天早晨8点。
2024-12-05 10:33:20
1310
原创 嵌入式驱动开发详解3(pinctrl和gpio子系统)
如果不用pinctrl和gpio子系统的话,我们开发驱动时需要先在设备树或者驱动文件中对pin进行配置成相应的功能引脚,然后如果是gpio功能的话就需要进行gpio初始化,如果是其他外设的话就需要进行其他外设的初始化,因为经常将引脚配置为gpio模式,因此linux内核针对pin的配置特意推出了pinctrl子系统,针对gpio的配置推出了gpio子系统,对于一些其他的外设模式有其他特定的子系统,这里不做讲解。
2024-11-25 15:25:35
1349
原创 嵌入式驱动开发详解2(设备挂载问题)
驱动的设备挂载和卸载是十分重要的内容,一旦操作不当可能会导致系统崩溃,接下来我将用字符设备的驱动挂载原理进行详细讲解,并把自己在学习过程中遇到的问题与解决办法进行展示。
2024-11-24 16:46:35
1434
原创 嵌入式驱动开发详解1(系统调用)
应用层程序直接用系统提供的API函数即可调用驱动层相应的函数,中间的具体过程都是由linux内核实现的,下面我们用read函数来举例子。
2024-11-19 00:09:37
815
原创 windows与windows文件共享
1、先确保两台电脑直接能够ping通,这是文件共享的前提,如果ping不通就去查找对应的原因,一般都是防火墙的原因。,配置起来比较麻烦,我就没做处理,因为第一次访问是需要用户名和密码才能访问。2、对专有网络,公用网络和所有网络进行配置,全部都选择第一个即可。如果有大佬知道简洁一点的设置用户权限的办法,欢迎留言交流。1、首先确定需要共享的文件夹,然后按照下图操作即可。1、先找到高级共享设置。
2024-11-01 19:27:08
487
原创 Makefile语法详解2-书写规范
为符合模式<pattern>的文件指定搜索目录<directories>。清除符合模式<pattern>的文件的搜索目录。3、vpath清除所有已被设置好了的文件搜索目录。<pattern>需要包含“%”字符。“%”的意思是匹配零或若干字符。
2024-10-12 11:23:28
820
原创 Makefile语法详解1-编译链接脚本初始
变量使用 := 来定义,符号两边要留一个空格,变量的引用使用 {} 或者 () ,前面加一个符合$,具体使用方法如下图所示,通过make compile命令可以生成main.o文件。下面是一个例程,第一个图是对应的文件信息,我们需要在main.cpp中调用另外两个文件里面的函数。最后一个run直接依赖前面两个过程.o文件的生成和.so动态库的生成。为了避免与文件名重名,如下所示,我们常采用伪目标的形式将clean修饰一下,目的是即使有一个同名的文件名,他也会执行makefile中的clean命令。
2024-09-17 18:53:40
1304
原创 开发板与ubuntu建立网络通信(NFS和TFTP协议搭建)
1、可能存在一直显示TTT的情况,这个是因为发送端的nfs版本太高,需要加入V2版本的nfs可参考。参考正点原子教程配置即可,注意路径不要打错了,我把home打成了hmoe找了半天错误。2、可能存在文件可以发送过来但是最后还是需要等待几个TTT的情况,此时参考。参考正点原子教程配置后会出现以下问题。
2024-09-16 22:01:38
528
原创 gcc编译器详解
gcc编译动态库方式如下,现将.c文件编译成二进制.o文件,然后用-share将.o编译成一个动态库文件,最后将mian.c和动态库文件一起编译成可执行文件,注意-l和-L后面不能留空格。gcc编译的时候对应的文件后缀解释,其中.a代表静态库,.so代表动态库。其他的都是我们所熟知的,就不做过多赘述。如上所示我们可以使用gcc工具将.c文件预处理成.i文件,其中E是将文件进行预处理,o是输出一个处理后文件,如上是将.c文件编译生成.o可重定位的目标程序文件。如上是将.c文件处理成.s汇编文件。
2024-09-16 21:19:27
470
原创 IMX6ULL之nonexistent directory
由上可知rcS文件修改没有问题但是每次开机时系统总是会提示如下log(系统刚移植好时或者每次把在/etc文件夹下的自动生成的mdev删除掉是不存在的,PS也能看到完整设备节点信息)设备节点信息也无法看到。请问可能是什么原因?
2024-09-04 09:33:58
220
原创 链表相关知识(双向链表初识)
该双向链表是由上一个帖子通用链表演变而来,其结构类型如下图所示:我们还是照常创建一个头节点,但是头节点不存放数据,只是在排序的时候用来判断是否循环了一整轮。该结构有一个明显的特点即head->pre指向的永远都是链表的最后一个节点。
2024-08-17 19:51:28
326
原创 链表相关知识(通用链表)
在链表相关知识(初学)中,写出来一个简单的链表基本操作,因此我们引入一个新的结构体node_t,使之能够形成一个新的链接形式,如下所示,在下面这个架构中,我们不管结构体是啥样的,只要是成员中包含node_t node的节点即可进行链接起来。
2024-08-16 23:43:42
779
原创 链表相关知识(初学)
链表是一种动态数据结构。当数据插入或删除时,链表的大小随之发生变化。因此,在使用链表时,程序员需要在运行时分配和释放内存空间。这是堆内存的一个优点,它允许程序员动态地分配内存空间来满足链表的动态性。在堆内存上使用链表还有一个好处,即它不会像栈内存一样随着函数的调用和结束而自动释放。这意味着,即使函数返回了,链表中的元素仍将保留在内存中,并可以在其他函数中继续使用。因此,通常情况下,程序员选择在堆内存上实现链表,这可以满足链表动态增长和释放内存的需求。
2024-08-16 22:12:42
281
原创 ucosiii栈大小的确定
汇编文件 (.s 文件):定义:在嵌入式系统中,汇编文件通常是指包含汇编语言代码的文本文件,其中的指令和数据使用特定的汇编语法表示。这些文件以 .s 作为文件扩展名。作用:汇编文件用于编写底层的系统级代码,通常包括中断服务程序、启动代码、设备驱动程序等。它们直接与硬件交互,并对系统资源进行管理。例如,一个嵌入式系统的汇编文件可能包含了与硬件设备通信的指令,如对寄存器的读写、对外设的控制等。我们会通过keil5来生成反汇编文件来查看如何估算栈的大小:
2024-08-15 20:49:37
714
原创 【Markdown教学笔记】
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + S
2024-08-01 21:06:53
741
原创 IMX6ULL裸机开发问题
在这个实验中FIC_EnableIRQ只能放在上面这句代码下面,而其他实验的可以放上面。第一个触摸点只能刚触碰和结束触碰的时候产生中断,两个及以上就没这个问题。
2024-08-01 21:00:24
231
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人