小仇学长
感谢关注,一起进步。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CMake 详解:跨平台构建系统的入门与进阶
CMake 是一个开源的跨平台构建工具,它能够通过简单的描述文件来生成标准化的构建系统。它的主要目标是简化构建过程,特别是在多平台和多编译器的环境下。CMake 可以自动处理编译器设置、依赖关系、目标生成等任务,避免了手动配置Makefile的复杂性,因为在复杂工程文件中,Makefile的依赖关系难以确定,手动编写复杂性很高。CMake 的优势之一是支持多种操作系统平台,包括 Windows、Linux 和 macOS,这使得它成为了跨平台开发中不可或缺的工具。原创 2025-03-24 20:40:27 · 879 阅读 · 0 评论 -
Linux内核编程(二十一)USB驱动开发-键盘驱动
USB 驱动开发主要分为两种:主机侧的驱动程序和设备侧的驱动程序。主机侧驱动程序用于控制插入到主机中的 USB 设备,而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与设备功能紧密相关,因此常常被称为 USB gadget 驱动程序。USB gadget 驱动程序的作用是定义如何通过 USB 协议栈与主机端进行通信,确保设备能够正确响应主机的请求。在 USB 系统中,主机侧和设备侧有各自不同的控制器。原创 2025-01-20 17:17:30 · 1698 阅读 · 0 评论 -
Linux应用编程(五)USB应用开发-libusb库
USB接口(UniversalSerialBus)是一种通用串行总线,广泛使用的接口标准,主要用于连接计算机与外围设备(如键盘、鼠标、打印机、存储设备等)之间的数据传输和电力供应。它旨在简化计算机与外部设备之间的连接方式,同时提供更高的传输速度和更好的兼容性。这些接口虽然在当时各自具有一定的专用性和高效性,但也存在很多问题,随着技术的发展,通用性更强的接口逐渐成为主流,USB(UniversalSerialBus)便是这一发展潮流的代表。USB的诞生标志着计算机外围设备连接方式的革命性转变。原创 2025-01-18 09:44:18 · 2176 阅读 · 0 评论 -
Linux内核编程(二十)RTC子系统一驱动rx8010
RTC,即实时时钟(Real-Time Clock),是一种用于保持精确时间的电子时钟模块。它能够提供当前的秒、分、时、日、月和年信息,并且通常具有独立的电池供电功能。这意味着即使设备断电,RTC模块也可以继续记录时间,确保系统在重新启动时获得正确的时间数据。RTC模块广泛应用于电子时钟、计算机、移动设备、家用电器等场景。例如,在计算机系统中,RTC能够保证系统时间在断电状态下不会丢失;在电子门禁和安防系统中,RTC可实现基于时间的事件控制和记录。这种可靠性使得RTC在生活和工业中均成为不可或缺的组件。原创 2024-11-11 11:24:37 · 1410 阅读 · 0 评论 -
Linux内核编程(十九)SPI子系统一驱动MCP2515(SPI转CAN模块)
mcp2515读寄存器的值,我们查看其手册发现,要想读寄存器的值需要先写入0x03命令,然后发送要读取寄存器的地址,再进行读取值。本框图中spi核心层和spi适配器驱动层不需要我们去关心,如果未来要去原厂工作的话,可以深入了解其工作原理和内容,这里我们不做过多介绍。通常,SPI 设备的片选和时钟频率都需要在设备树中进行配置,以便正确地初始化 SPI 设备。失败时:返回负的错误代码,通常为 -EINVAL(无效参数)或 -EIO(输入/输出错误)等。成功时:返回接收的字节数(通常是 len)。原创 2024-11-05 16:19:10 · 1792 阅读 · 0 评论 -
Linux内核编程(十八)ADC应用与驱动(IIO子系统)
例如rk3588开发板的adc电压测量范围为0~1.8v(参考电压或量程),为10位精度。那么根据公式可得,ADC的分辨率=1.8 / 2^10,再用这个分辨率×这个数值(1003)就得到了测量电压。这里不做基础知识的讲解。SARADC为逐次逼近型的ADC转换器,后续会多次看到这个。具体ADC知识点请查看。原创 2024-11-03 16:33:56 · 1077 阅读 · 0 评论 -
Linux必学知识点:单独编译、烧写构建某个镜像,打包Linux系统镜像
使用相同的Uboot和Kernel,加上不同的文件系统,构成不同的系统。原创 2024-09-26 11:50:42 · 1954 阅读 · 0 评论 -
Linux必学知识点:文件系统的构建
文件系统是用于组织、存储和管理计算机文件的结构和方法。它定义了文件如何在存储设备上布局,以及如何访问和操作这些文件。常见的文件系统类型包括NTFS、FAT32、ext4等,每种文件系统都有其特点和用途。原创 2024-09-24 11:58:02 · 1801 阅读 · 0 评论 -
Linux内核编程(十七)PWM子系统
对于PWM的基础知识点,请查看。原创 2024-09-19 11:23:54 · 1955 阅读 · 0 评论 -
Linux内核编程(十六)CAN总线驱动
CAN (Controller Area Network) 是博世公司于 1986 年开发的一种串行通信协议,主要应用于汽车领域。CAN 协议的诞生是为了减少汽车中线束的数量,使得汽车中的电子控制单元(ECU)能够互相通信。ECU 是汽车中的最小控制模块,通过 CAN 总线,各个 ECU 模块可以在同一个局域网内实现高效的数据传输和通信。CAN 总线就像是汽车电子的“局域网”,让不同模块之间能够无缝协作。原创 2024-09-16 10:42:26 · 3399 阅读 · 0 评论 -
Linux内核编程(十五)网络设备驱动
6 类线是一种用于千兆以太网(1000Mbps)的传输介质,采用了 250MHz的带宽,具有更高的传输速度和更低的信号衰减率。与之前的线缆相比,6类线在内部结构、材质和外部保护等方面都有所改进,以确保更高的传输质量和稳定性。超5类线是5类线的增强版,主要用于千兆以太网(1000Mbps),同时向下兼容百兆以太网。3 类线是早期的以太网电缆标准之一,主要用于传输 10Mbps的传统以太网。虽然它比3类线有所提升,但在实际应用中,由于性价比不高,4类线并未得到广泛应用,很快就被更先进的5类线所取代。原创 2024-09-05 17:03:33 · 2088 阅读 · 0 评论 -
Linux内核编程(十四)IIC总线驱动FT5X06触摸屏
答:首先我们确定使用哪个I2C控制器,每个控制器都在设备树通用文件中对应一个节点(内核以有)。假设我们使用i2c控制器1。这部分相当于平台总线的设备层代码,即用于描述硬件。当然可以使用设备树来替代。那么我们在使用设备树描述时该怎么写呢?对于IIC的基础知识,这里不做过多的介绍,详细情况查看下面的两篇文章。这里是一个简单示例,为了演示如何匹配。i2c_client设备树节点。原创 2024-08-30 16:02:02 · 839 阅读 · 0 评论 -
Linux内核编程(补)字符设备驱动编写(字符设备框架)
我们在编写字符设备时,使用杂项设备框架会比使用字符设备框架编写更为简便。但是由于使用杂项设备框架会使得注册的设备变为杂项设备,虽然功能都一样,但是分类会不同。如果分类严格,则我们需要使用字符设备驱动框架来编写,这样注册的设备就被分到了字符设备列表中。如果你正在开发的设备需要明确地归类到字符设备中(例如在 /sys/class/char 中),或者你需要对设备号进行特殊的管理,那么使用字符设备框架是更合适的选择。优化:因为我们用到了设备号以及字符设备结构体等变量,我们可以将这些变量进行封装,方便操作管理。原创 2024-08-23 10:59:10 · 856 阅读 · 0 评论 -
Linux内核实践(一)驱动DS18B20传感器的完整流程解析(涵盖字符设备、单总线、设备树等)
在 Linux 中,“单总线”(One-Wire Bus)指的是一种串行通信总线标准,通常被用于与具有低数据速率需求的设备进行通信。DS18B20 使用 One-Wire(单总线)通信协议,直接输出数字温度数据,而无需模数转换(ADC),这简化了与微控制器的接口设计。(4)数据读取: 主控设备读取 DS18B20 的温度数据,数据以 9 至 12 位的格式提供,主控设备可以根据需要处理这些数据。(1)总线复位: 主控设备发送一个复位信号,复位所有连接在总线上的 DS18B20 设备。原创 2024-08-21 17:35:26 · 1317 阅读 · 0 评论 -
Linux内核编程(十三)Input输入子系统
Input 子系统是 Linux 内核中专门为输入设备设计的一个子系统,它提供了一个通用的框架来管理各种输入设备,如键盘、鼠标、触摸屏、游戏手柄等。这个子系统的主要目的是简化和规范化输入设备驱动的开发,同时提高驱动的通用性和兼容性。(1)输入设备:如键盘、鼠标、触摸屏、游戏手柄等,它们是用户与计算机进行交互的主要方式。(2)输入设备驱动的复杂性:传统上,为每种输入设备编写驱动都需要创建文件、进行硬件初始化、实现文件操作函数集和处理中断等。每种设备的驱动可能都有许多重复性的工作。原创 2024-08-18 17:55:41 · 2320 阅读 · 0 评论 -
Linux内核编程(十二)热插拔
热插拔事件会导致用户空间中的处理程序(如udev,mdev)被调用,这些处理程序会通过加载驱动程序,创建设备节点等来响应热插拔事件。因为netlink 是基于socket通信机制,在用户空间使用socket接口,如socket、bind、sendmsg、recvmsg、close 就可以使用 netlink,上手容易。③用户空间的 udev 守护进程会打开一个 Netlink 套接字并持续监听,通过监听内核发送的 uevent 来执行相应的热插拔操作,如创建设备节点、设置权限、运行脚本等。原创 2024-08-08 17:38:41 · 2032 阅读 · 0 评论 -
Linux内核编程(十一)设备模型
如果此时将硬件断开。当我们卸载一个kobj时,该kobj里的引用计数器就会自动进行-1操作,这是因为kobj的创建和卸载函数是对引用计数器操作函数的进一步封装,实质还是对计数器的操作。kobject是一个面向对象的管理机制,是构成设备上述设备模型的核心结构,在内核中注册一个kobject,对应就是在sysfs文件系统中创建一个目录和目录里的一个文件夹。Linux引入了设备驱动模型分层的概念, 将我们编写的驱动代码分成了两块:设备与驱动。:该文件夹下的所有目录是连接到总线的全部设备,从设备级联角度进行展示。原创 2024-08-06 17:51:23 · 1266 阅读 · 0 评论 -
Linux内核编程(十)中断
CPU在正常运行期间,由外部或者内部引起的事件,让CPU停下当前正在运行的程序,转而去执行触发他的中断所对应的程序,处理完中断对应的程序以后在回来继续执行。这个就是中断。举例:同学A现在正在厨房做饭,突然电话响了,然后A关火去接电话。接完电话在回去开火继续做饭。这个过程就是一个中断的一个过程。原创 2024-08-01 15:51:21 · 2010 阅读 · 0 评论 -
Linux内核编程(九)Linux内核定时器
Linux内核中有一个宏HZ,这个宏用来表示一秒钟对应的节拍的数量。利用Linux内核中的这个宏,我们就可以把时间转换成节拍数。比如,定时一秒钟换成节拍数就是expires=jiffies+1*HZ,其中宏定义jiffies为系统当前时间对应的节拍数。宏HZ的值我们是可以设置的,也就是说一秒钟对应多少个节拍数我们是可以设置的。打开make menuconfig图形化配置界面进行设置,具体设置路径查看其它博客。原创 2024-07-28 19:17:50 · 1954 阅读 · 0 评论 -
Linux内核编程(补充)高级字符设备-IO模型
IO的英文全称是input和output,翻译过来就是输入和输出。在冯.诺依曼结构中,将计算机分成分为5个部分:运算器、控制器、存储器、输入设备、输出设备。其中输入设备指的是向计算机输入数据或者信息,如鼠标,键盘都是输入设备。输出设备指的是用于接收计算机输出信息的设备,如电脑显示器。比如我们在键盘上敲击一个按键,然后这个按键的数据会传递给计算机。计算机经过运算以后,把数据显示在显示器上。在操作系统中,等待队列(Wait Queue)是一个用于管理进程等待某些事件(如IO操作完成、资源可用等)的数据结构。原创 2024-07-27 11:29:45 · 1172 阅读 · 0 评论 -
Linux内核编程(八) 添加自定义目录驱动菜单 (Kconfig文件使用)
一个Linux内核源码,其中包含了很多驱动程序,对应不同的功能。我们在编译内核时。如果将所有的驱动程序都编译进镜像文件中时,该镜像文件会占的内存很大。然而在公司企业中通常会使内核镜像占用内存空间尽可能的小,如裁剪掉不常用的功能,保留使用的功能即可。这时就需要菜单文件来进行选择裁剪。这就是这个菜单的功能。在linux中我们常用来进行图形化的方式来选择功能裁剪。完成裁剪后会生成.config文件来保存选择的配置信息。原创 2024-07-16 16:51:17 · 1164 阅读 · 0 评论 -
Linux内核编程(七)设备树DT(device tree)
设备树(Device Tree,简称 DT)是描述硬件配置信息的一种数据结构,常用于嵌入式系统,尤其是在 ARM 架构的系统中。设备树描述了系统的硬件布局,使得操作系统可以在不依赖具体硬件信息的情况下进行硬件初始化和驱动加载。原创 2024-06-20 20:59:48 · 2233 阅读 · 0 评论 -
Linux内核编程(六)平台总线platform驱动模型
平台总线模型也叫plantform总线模型。平台总线是Linux系统虚拟出来的总线。设备层传输的平台数据是什么类型,就用什么类型来接收该函数的返回值。//const struct device *dev:设备层结构体中的device。原创 2024-06-19 17:27:12 · 1587 阅读 · 0 评论 -
Linux内核编程(五)ioctl驱动编写
ioctl主要用于实现对硬件设备控制类操作,实现 write 和 read 不太好实现的功能。ioctl是一个强大的工具,可以用于实现复杂的设备控制和状态查询。尽管它的使用有时被认为不太优雅,因为它打破了标准的读写接口模型,但在许多情况下,它提供了一种有效的方法来与设备驱动程序进行高级交互。开发者在使用 ioctl 时需要小心设计和实现命令码,以确保与设备的交互是清晰且安全的。原创 2024-06-16 16:54:05 · 1474 阅读 · 0 评论 -
Linux内核编程(二)字符设备驱动编写(杂项设备框架)
杂项设备通常不属于特定的主要设备类别(如块设备、字符设备等),但它们提供了一种灵活的方式来支持各种特殊硬件或虚拟设备。除了网络设备外,字符设备和块设备都是通过文件系统的系统调用接口 open()、close()、write()、read()等函数既可以访问,应用程序可以通过打开设备文件来访问该设备。●字符设备特点:是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。设备号用于标识使用同一个设备驱动程序的不同的硬件设备,比如有两个串口,就可以用从设备号来区分他们。原创 2024-06-13 10:30:52 · 1022 阅读 · 0 评论 -
Linux内核编程(一)内核驱动及模块编程基础
嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性,用户只需要拿到相关驱动模块,再安装到用户的内核中,即可灵活地使用你的设备。原创 2024-06-11 15:47:46 · 2226 阅读 · 0 评论 -
Linux应用编程(四)IIC(获取BMP180温度/气压数据)
在 Linux ARM 平台上使用 I2C 时,不需要手动编写 I2C 时序是因为 Linux 内核和硬件抽象层已经处理了这些复杂的细节,提供了高层次的接口供开发者使用。无论是哪个IIC从机设备,我们只需要实现即可。然后根据不同设备的手册来向寄存器写或者读数据,从而实现某些特定的功能。原创 2024-06-08 17:53:47 · 1414 阅读 · 0 评论 -
Linux应用编程(三)UART串口
首先,我们就先来使用命令行基本调试一下我们的串口,来确保串口的可用性。在开始实验前,请一定要检查测试好所需硬件是否使用正常,不然调试过程中出现的问题,会让你很烦恼。函数的作用是获取指定文件描述符(fd)所关联的终端设备的当前属性,并将这些属性存储到指定的 termios 结构体(termios_p)中。这里我将不再展示参数的宏定义,因为太多了,很多也用不到,有需要的自己去查看其他博客来学习。波特率,常用 B2400,B4800,B9600,B115200,B460800。(4)设置终端设备参数,激活配置。原创 2024-06-06 16:59:52 · 3686 阅读 · 1 评论 -
Linux应用编程(二)GPIO子系统
以GPIO物理引脚号为12的引脚举例。我们将蜂鸣器的I/O口连接到该引脚上。(蜂鸣器低电平触发)控制GPIO口来控制蜂鸣器的响灭。我们先要通过查询开发板手册,来获取引脚口信息。那么我们就可以通过代码的方式来操作GPIO。这些文件用于控制和查看 GPIO 引脚的状态和配置。注意使用方法二之前要把方法一中的gpio注销掉,不然设置不成功。(2)使用export导出GPIO,相当于初始化。(4)配置GPIO为输出模式,电平为0。配置完成后,我们发现蜂鸣器响了。来导出对应的GPIO口。(2)设置GPIO的电平值。原创 2024-06-04 17:18:36 · 2612 阅读 · 0 评论 -
Linux应用编程(一)安装交叉编译器,使用命令远程传输文件。
举个例子:我们将Linux_x86上的文件拷贝到Linux_arm上,使用软件的话就只能先将文件从Linux_x86传输到windows下,然后再从windows将文件传输到Linux_arm上。但是使用命令行的话,我们可以直接将文件从Linux_x86上传输到Linux_arm上。交叉编译器是一种能够在一种操作系统或架构上生成另一种操作系统或架构可执行程序的编译器。它通常用于在一种平台上开发软件,但在另一种平台上运行。我们是无法在X86系统上运行ARM架构下的可执行文件的。使用sftp连接远程主机。原创 2024-06-04 09:27:25 · 703 阅读 · 0 评论 -
Linux项目编程必备武器!
等下载命令下载的软件都是从源服务器上获取的,有些软件包在某个服务器上存在,而另一个服务器不存在。所以我们可以添加多个服务器。中科大的源,同时支持 X86 和arm 的 Linux系统。首先我们要搞清楚什么时候需要手动修改,例如有些板子没有图形界面的,例如嵌入式 arm 上的 ubuntu,armbian 等等,有些是没有图形界面的,这个时候就需要手动修改了。原创 2024-06-02 22:29:01 · 178 阅读 · 0 评论 -
Linux系统编程(七)网络编程TCP、UDP
Socket(套接字)是在网络编程中用于实现不同主机间通信的一种机制,它允许应用程序通过网络发送和接收数据。Socket的工作原理基于客户端-服务器模型,其中一个程序充当客户端,另一个充当服务器。通常,服务器在一个主机上运行并侦听特定的端口,客户端则连接到服务器的IP地址和端口号。原创 2024-06-01 16:31:57 · 2028 阅读 · 0 评论 -
Linux系统编程(六)线程同步、互斥机制
在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数。mutex 是一种简单的加锁的方法来控制对共享资源的存取。这个互斥锁只有两种状态(上锁和解锁)。问题:为什么需要对共享资源加锁?答:因为多个线程共用进程的资源,要访问的是公共区间时(全局变量),当一个线程访问的时候,需要加上锁以防止另外的线程对它进行访问,以实现资源的独占。在一个时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程才能够对共享资源进行操作。原创 2024-05-31 10:53:37 · 1228 阅读 · 0 评论 -
Linux系统编程(五)多线程创建与退出
由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放。这个函数是一个线程阻塞函数,调用这函数的线程将一直等待直到被等待的线程结束为止,当函数返回时,被等待线程的资源被回收。:在使用线程函数时,不能随意使用 exit 退出函数进行出错处理,由于 exit 的作用是使调用进程终止,往往一个进程包括了多个线程,所以在线程中通常使用 pthread_exit 函数来代替进程中的退出函数 exit。一般线程的退出和线程的等待是一起使用的。原创 2024-05-29 22:06:24 · 1666 阅读 · 0 评论 -
Linux系统编程(四)进程间通信(IPC)
管道好比一条水管,有两个端口,一端进水,另一端出水。管道是 Linux 进程间通信的一种方式,如管道命令,意思是从ls -l中搜索含有anaconda3的文件内容。我们软件的管道文件也有两个端口,分别是读端和写端。进水可看成数据从写端被写入,出水可看数据从读端被读出。原创 2024-05-26 14:37:06 · 1431 阅读 · 0 评论 -
Linux系统编程(一)文件操作
在进程一开始运行,就自动打开了三个对应设备的文件,它们是标准输入、输出、错误流,分别用全局文件指针 stdin、stdout、stderr 表示,它们都是 FILE *类型。所以当我们打开我们自己的第一个文件时,会发现该文件的描述符号为3(系统自动打开的标准流文件描述符分别为0、1、2),在同一个进程中又打开一个文件时,文件描述符以此类推。close 函数是很重要的,因为操作系统有时候会限制同时打开的文件数量,如果不再使用的文件描述符不及时关闭,可能会导致资源泄露或者资源耗尽的问题。原创 2024-05-17 23:35:15 · 402 阅读 · 0 评论 -
Linux的shell脚本以及except脚本详解
Shell脚本就是命令解析器,包含一系列命令序列的文本文件。当运行这个脚本文本时,文件中包含的命令序列将得到执行。如果我们有一系列经常使用的 Linux 命令,我们可以把它们存储在一个文件中。Shell 可以读取这个文件并执行其中的命令。这样的文件被称为脚本文件。例如:run.sh。原创 2024-05-02 15:52:57 · 2955 阅读 · 0 评论 -
VMware中Linux和window共享文件夹
Linux和window共享目录原创 2023-07-05 09:36:20 · 241 阅读 · 0 评论 -
Linux 的静态库和动态库
在使用创建静态库前,为了使得工程目录更加清晰,我们创建三个文件夹lib(存放.h文件)、src(存放.c文件)、debug(存放.o文件)在编译程序的链接阶段,会将汇编生成的目标文件.o与引用到的库(包括静态库)的二进制文件一起链接打包到最终的可执行文件中。使用ar工具,并添加命令 rcs,将debug文件夹里的所有的.o文件进行封装为静态库。:表示静态库所在的路径,此处为当前路径。将编写好的库文件存放到不同的文件夹里。(2)编译源码时链接静态库。:表示要连接的静态库名称。(3)创建封装静态库。原创 2024-04-30 15:03:03 · 1318 阅读 · 0 评论 -
Linux环境下的编译和调试
在实际使用中,如果一条一条代码去执行编译过程会非常繁琐,这里我们只需要使用一行代码就可以完成上述所有流程。(4)链接: 将所有的目标文件(二进制文件)进行链接,得到一个可执行二进制文件。对于.cc、.cpp 格式的 C++文件,应该采用 g++进行编译。(3)汇编: as 将汇编文件编译成目标文件(二进制机器码文件)。对于.c 格式的 C 文件,可以采用 gcc 或 g++编译。,对预处理后的文件编译为汇编文件。,将汇编文件转为了二进制机器码。(2)编译: 将预处理后的源文件编译成汇编文件。原创 2024-04-30 11:05:34 · 723 阅读 · 0 评论