- 博客(661)
- 资源 (4)
- 收藏
- 关注
原创 uinput
Linux的uinput机制允许用户空间程序创建虚拟输入设备,模拟键盘、鼠标等物理设备的输入行为。通过/dev/uinput接口,程序可以设置设备属性、发送输入事件并同步到内核。典型应用包括自动化测试、游戏控制、远程桌面等场景。使用时需加载uinput模块、处理权限问题,并注意同步事件通知内核。该机制通过input_event结构传递事件,最终由内核处理为真实输入,为系统级输入仿真提供了灵活的用户态解决方案。
2025-07-27 20:15:37
320
原创 input_handler和input_dev详解
摘要: Linux输入子系统采用分层架构,由input_dev(设备驱动层)、input_handler(协议驱动层)和input_handle(连接桥梁)构成。设备驱动通过input_dev注册硬件(如触摸屏、键盘),设置支持的事件类型;协议驱动通过input_handler提供用户空间接口(如/dev/input/eventX)。当两者匹配成功后,input_handle建立绑定关系,实现事件传递。核心流程为:驱动注册设备→协议处理器匹配→创建事件节点→用户程序读取输入。该设计实现了输入设备的统一抽象与
2025-07-27 09:53:05
874
原创 OTG原理讲解
摘要:USB OTG(On-The-Go)是USB 2.0的重要功能,允许设备在主机和从机间动态切换,实现设备间的直接通信。其核心机制是通过ID引脚电平判断角色:Micro-USB中接地为Host,悬空为Device;USB-C则通过CC引脚协商。电路设计需处理ID引脚连接和VBUS电源控制,MCU根据ID状态配置USB控制器模式。典型应用包括手机连接U盘、键盘等外设,极大扩展了移动设备的连接能力。
2025-07-26 20:20:02
786
原创 USB驱动(URB)
本文介绍了Linux内核中USB驱动开发的核心概念URB(USB Request Block)。URB是主机与USB设备间传输数据的抽象结构体,包含目标设备、端点信息、数据缓冲区等关键字段。文章详细解析了URB的生命周期(分配、填充、提交、回调、释放)、四种传输类型(控制、批量、中断、等时)及其应用场景,并提供了鼠标设备的中断传输示例代码。最后强调了URB使用注意事项,包括DMA缓冲区分配、错误处理和资源释放等。URB作为USB驱动与内核通信的桥梁,是构建稳定USB驱动程序的基础。
2025-07-25 10:29:18
264
原创 UDP通信是否需要使用bind,connect,send等函数
本文系统讲解了UDP通信中connect、bind、send等函数的使用场景。bind函数用于绑定本地地址,接收端通常需要调用,而发送端一般不需要;connect函数在UDP中并非必须,但能简化固定对端通信并提升安全性;send/recv需配合connect使用,sendto/recvfrom则适用于多对多通信。文章通过对比表格和代码示例说明各函数区别,建议根据通信需求选择:固定对端用connect+send/recv,灵活通信用sendto/recvfrom。最终强调UDP的"connect&q
2025-07-23 17:03:32
427
原创 C++中的虚继承
虚继承是为了解决多重继承中基类子对象被重复继承的问题,确保只有一份共享的基类子对象。概念描述虚继承为了解决菱形继承中基类重复的问题实现效果所有派生类共享一份虚基类子对象语法构造函数只有最底层派生类负责构造虚基类。
2025-07-23 14:44:33
425
原创 UDP中的单播,多播,广播(代码实现)
本文介绍了UDP三种通信方式的实现方法:单播(Unicast)通过指定目标IP和端口发送数据;广播(Broadcast)需要设置SO_BROADCAST选项向子网广播地址发送;多播(Multicast)通过多播组地址(224-239)发送,接收方需用IP_ADD_MEMBERSHIP加入组播。三种方式发送均使用sendto,接收都需bind端口,但广播和多播需要额外设置选项。
2025-07-20 16:16:00
378
原创 UDP中的单播,多播,广播
本文介绍了UDP协议的三种通信方式:单播、广播和多播。单播是一对一通信,使用单播地址,适用于点对点传输;广播是一对多通信,向子网内所有主机发送数据,适用于局域网服务发现;多播则是一对多通信,只发送给加入指定多播组的主机,可跨子网传输,适用于视频直播等场景。文章对比了三者的特点、地址类型、通信范围和网络开销,并提供了C语言代码示例。IPv6已取消广播仅保留单播和多播,多播需要网络设备支持IGMP/MLD协议。
2025-07-20 16:13:58
537
原创 FTP实现断点续传
本文介绍了一个使用C语言实现支持断点续传的FTP上传客户端方案。该方案基于标准FTP协议,不依赖第三方库,通过SIZE、REST和STOR命令实现断点续传功能。关键实现包括:采用被动(PASV)模式建立数据连接,分离控制连接与数据连接,通过SIZE获取远程文件大小确定续传偏移量,使用REST设置续传点,最后用STOR完成剩余数据上传。文中提供了完整的C代码实现,包含FTP客户端结构体、命令发送、响应解析、登录认证、文件大小查询和断点续传上传等核心功能模块,可有效应对网络中断导致的上传失败问题,提高大文件传输
2025-07-20 09:28:40
906
原创 TCP断点续传
摘要: 本文详细解析TCP断点续传原理,并通过C语言实现秒级续传功能。断点续传通过记录文件偏移位置,避免网络中断后重复传输已完成部分。文章提供完整的客户端和服务端代码,客户端发送文件名和初始偏移,服务端返回已接收长度并定位续传起点,支持多线程并发处理。此外,还提出优化方向如协议标准化、完整性校验等,帮助开发者构建更健壮的文件传输系统。核心逻辑清晰,适合技术博客或公众号分享。
2025-07-20 09:20:21
536
原创 input子系统
Linux Input子系统是内核中用于管理各类输入设备的统一框架。它采用三层架构:驱动层负责硬件交互,核心层提供注册和事件上报接口,处理层通过/dev/input节点向用户空间提供访问。主要数据结构包括input_dev(设备描述)、input_event(事件封装)和input_handler(事件处理模块)。驱动开发涉及设备分配、属性设置、注册和事件上报流程,用户空间可通过读取设备文件获取事件。系统还支持虚拟输入设备(uinput)和提供多种调试工具,广泛应用于嵌入式设备、触摸屏、游戏手柄等场景,实现
2025-07-15 10:57:12
681
原创 libusb的同步和异步
本文介绍了 libusb 库中的同步与异步 USB 传输机制。同步传输简单易用但会阻塞线程,适合简单应用;异步传输非阻塞且性能更高,但编程复杂度较大,适合高速数据传输场景。文章详细讲解了两种传输方式的操作流程、关键函数和示例代码,并对比了它们的特性差异。最后总结了常见错误排查方法和使用建议,推荐从同步传输入门,逐步过渡到异步实现,同时强调了异步模式下必须正确处理事件的重要性。
2025-07-13 16:51:45
396
原创 使用libusb读取鼠标数据
本文介绍了使用libusb库读取USB鼠标数据的方法。主要内容包括:通过libusb_init初始化USB通信,获取设备列表并查找符合HID鼠标协议的设备(bInterfaceClass=3,bInterfaceProtocol=2);找到中断传输端点后,使用libusb_open打开设备并声明接口;最后通过libusb_interrupt_transfer循环读取鼠标数据包(通常每8ms发送一次),解析其中的按键状态和位移信息。文章提供了完整的代码框架,实现不依赖内核驱动直接与USB设备通信的功能。
2025-07-13 14:42:51
348
原创 理解 USB 的配置信息与接口信息:深入 libusb 的描述符结构
本文深入解析了USB设备的配置(Configuration)与接口(Interface)概念及其在libusb库中的数据结构。USB配置代表设备的一种工作模式,包含多个接口;每个接口描述设备的一项功能,如HID或音频接口,并可具有多个备选设置。libusb提供了三个关键结构体:libusb_config_descriptor表示配置信息,libusb_interface管理接口及其备选设置,libusb_interface_descriptor描述具体接口特性。文章还展示了通过libusb获取和打印接口信息
2025-07-13 14:34:56
765
原创 HID协议
HID(人机接口设备)协议是一种标准化的通信协议,用于规范计算机与鼠标、键盘等交互设备的数据传输。该协议通过描述符系统定义设备功能,核心是Report Descriptor,它规定了数据的组织格式。HID设备使用Input、Output和Feature三种报告类型进行双向通信,采用USB中断传输确保实时性。其优势包括免驱支持、跨平台兼容性和高度可配置性,适用于从标准外设到自定义设备的开发。相比CDC和MSC协议,HID在实时交互场景中更具优势,是嵌入式设备开发的理想选择。
2025-07-12 10:48:57
403
原创 libusb库关键函数讲解
本文介绍了一个基于libusb库的USB设备通信程序,主要用于连接特定VID/PID的USB设备(如鼠标或HID设备)并读取中断数据。程序流程包括:初始化libusb、打开目标设备、解除内核驱动绑定、声明接口控制权、获取设备描述符和配置信息、创建线程进行中断数据传输。关键函数详解了libusb_init()、libusb_open_device_with_vid_pid()、libusb_interrupt_transfer()等API的参数、返回值和使用方法。最后说明了完整的释放资源流程。该程序适用于需要
2025-07-06 16:31:51
681
原创 RK3568移植libusb库
libusb是一个开源、跨平台的USB 设备访问库,允许在用户空间中直接访问 USB 设备,无需编写内核驱动。它支持等多个平台,广泛应用于嵌入式开发、设备调试、USB 通信程序开发等领域。libusb是一个简洁高效的用户态 USB 编程接口,让开发者无需编写驱动就能实现 USB 通信,是嵌入式与桌面应用中控制 USB 设备的重要工具。
2025-07-06 10:34:04
1064
原创 STM32中实现shell控制台(命令解析实现)
本文介绍了一个轻量级嵌入式Shell命令系统的实现方案。该系统通过命令表结构存储注册命令,提供命令注册、查找和执行功能。核心模块包括:初始化函数cmd_init()、命令注册cmd_register()、命令查找cmd_find()和命令执行cmd_execute()。该系统采用统一接口设计,支持参数解析和命令扩展,具有结构清晰、资源占用少的特点,适用于嵌入式设备的人机交互和调试场景。示例展示了echo命令的执行流程,验证了系统的可行性。
2025-07-05 21:17:13
453
原创 STM32中实现shell控制台(shell窗口输入实现)
本文介绍了基于STM32平台的串口Shell控制台实现方案。该Shell包含命令输入缓冲与解析、光标控制、历史记录管理等核心功能模块,通过串口中断接收字符并实时处理。系统支持ANSI转义序列实现命令行编辑、历史命令切换等功能,采用环形缓冲区存储历史命令。关键函数包括shell_input_char()处理字符输入、shell_refresh_line()刷新命令行显示、shell_handle_enter()执行命令等。该方案具有异步接收、支持RTOS/裸机环境、可扩展命令接口等特点,适用于嵌入式系统调试,
2025-07-05 21:15:26
1094
原创 ZMODEM 接收端实现源码解析:以 rz 示例为例
摘要: 本文解析了一个基于C语言的ZMODEM协议接收端实现示例(模拟rz命令),适用于串口文件传输场景。程序通过文件接口抽象串口通信,实现了ZMODEM核心功能,包括帧头解析(ZRQINIT、ZFILE等)、数据块接收、CRC校验、断点续传及异常处理。重点剖析了协议状态机流程,如初始化响应、文件创建、数据写入及错误重传机制(ZRPOS)。该实现可作为嵌入式系统(如STM32)移植参考,建议替换串口驱动和存储接口以适应裸机环境。ZMODEM的流式传输和容错特性使其在固件升级等工业场景中具有实用价值。
2025-07-05 16:14:20
961
原创 ZMODEM 协议简介
ZMODEM是一种高效可靠的串口文件传输协议,由Chuck Forsberg于1986年开发,支持批量文件传输、断点续传、流式传输和CRC校验。相比X/YMODEM,ZMODEM具有自动接收、连续发送和错误恢复等优势。其工作流程包括初始化、文件头发送、数据帧传输和结束确认,每帧包含头标志、类型、参数、数据和校验。ZMODEM广泛应用于嵌入式开发,如固件升级和文件传输,可通过lrzsz、XShell等工具实现。在STM32等嵌入式系统中移植ZMODEM需实现串口缓冲、协议解析和CRC校验等功能。
2025-07-05 15:54:16
611
原创 多线程 vs 异步
观点说明多线程 + 锁机制 是结构清晰、适合控制流程的传统方案,但易出错、扩展困难发布订阅模型 更具现代性、可扩展性强,适合模块化、大系统、高并发场景在资源有限的设备上,传统方案更安全可控;而在复杂业务和高性能平台上,异步架构更胜一筹工程的本质是权衡,选择适合场景的技术,远比盲目追求“先进架构”重要。如果你在开发过程中也面临“线程同步 vs 异步触发”的抉择,不妨根据你的项目规模、平台能力和团队经验来综合考虑。两种方式都有其生存空间,没有绝对的优劣,只有最合适的选择。
2025-07-03 10:44:07
733
原创 Linux 中发送邮件功能详解
本文介绍了在Linux系统中实现邮件发送功能的多种方法。首先讲解了邮件发送的基本原理是通过SMTP协议传输邮件。然后详细介绍了四种常用工具:mail命令简单易用,适合纯文本发送;sendmail功能强大但配置复杂;ssmtp轻量适合外部SMTP服务器;Python脚本则最为灵活。文章还提供了每种工具的具体使用示例和配置步骤,并建议根据实际需求选择合适方案。最后总结指出,掌握这些工具可以满足从简单通知到自动化程序的各种邮件发送需求。全文内容实用,操作性强,适合Linux用户学习邮件发送功能。
2025-06-29 09:33:17
575
原创 在 RT-Thread 中实现 Shell 控制台的设计与源码剖析
RT-Thread中的Finsh Shell是一个功能完备的命令行交互模块,支持脚本解析、历史命令和自动补全等功能。其核心架构包括shell线程、命令解析器和符号表注册机制。当用户输入命令时,Shell会通过串口接收字符,解析为AST并编译为虚拟机指令执行。Finsh采用动态注册方式管理命令,开发者可通过宏导出新增命令。此外,模块还提供历史记录、自动补全和用户认证等可选功能。Finsh Shell具有资源占用低、交互性强、扩展性好等特点,是嵌入式系统调试和管理的实用工具。
2025-06-28 21:06:00
759
原创 在单片机中如何实现一个shell控制台
本文系统介绍了在单片机中实现Shell控制台交互系统的原理与设计方法。Shell控制台作为串口命令行界面,包含输入系统、命令解析器、执行器和注册表四大核心模块,需重点关注输入完整性、命令扩展性、安全性和资源适配等设计要点。文章详细阐述了从字符接收到命令执行的完整交互流程,并提出了命令补全、历史记录等进阶功能方向。总体而言,嵌入式Shell的本质是将用户输入的字符串转化为可执行的函数调用,实现高效的人机交互和设备控制。
2025-06-28 21:03:25
945
原创 多网卡与网关配置关系详解:是否能共用、如何分配、如何避免冲突
场景推荐配置方式单一默认出网通道只设一个默认网关多网段连接不同网络每个网段设对应网关,设置 metric 优先级双出口线路负载或容灾使用策略路由,按来源 IP 分流嵌入式或简易设备避免多个接口使用相同网关需控制 Socket 出口接口使用 SO_BINDTODEVICE 或策略路由多个网卡技术上可以共用网关,但条件苛刻,风险大。默认网关建议只配置一条,或使用 metric 和策略路由细化控制。策略路由是多出口环境下的标准方案。
2025-06-24 21:50:58
1033
原创 网络编程中的网关
网关本质上是一个连接两个不同网络的设备,它负责在两个网络之间转发数据。最常见的例子就是家庭或公司中的路由器,它连接了内网(如 192.168.1.x)和外网(如互联网)。在 TCP/IP 网络中,我们常说的“网关”通常是指默认网关(Default Gateway),用于将数据发送到不同子网或外部网络。核心要点说明网关是跨子网通信的关键中转站是将数据发往外部网络的“跳板”默认网关必须设置正确否则数据出不去多网卡环境需设置路由优先级避免冲突和路径错误Socket 可通过接口绑定控制出口。
2025-06-24 21:50:02
867
原创 RK3568音频设备使用
框架,支持多种音频接口(I2S、SPDIF、HDMI、USB Audio),并通过设备树、驱动与外设(如 Codec)结合。的 API 进行音频播放和录音,见上面你提到的 C 示例中使用。注意:驱动是否支持该 codec,要确认内核启用了。在 RK3568 平台上,音频设备的使用通常基于。的完整指南,适合移植和开发。
2025-06-22 10:53:05
1055
原创 RK3568移植lvgl后触摸屏无响应问题解决
摘要: LVGL移植后界面显示正常但触摸无响应?本文提供系统性排查方案: 1️⃣ 硬件排查:确认/dev/input/eventX设备存在且hexdump能捕获触摸事件; 2️⃣ 驱动配置:检查LVGL代码中设备路径是否匹配实际设备(如event0或event2); 3️⃣ 软件逻辑: 验证evdev_init()是否成功打开设备; 确保lv_indev_drv_register正确注册输入设备; 主循环中定期调用lv_timer_handler()处理事件; 4️⃣ 数据校验:在evdev_read()中
2025-06-22 10:04:52
808
原创 RK3568使用LVGL(rga的作用)
摘要: 在RK3568平台上,结合LVGL轻量级GUI库和RGA(Raster Graphic Accelerator)硬件加速模块,可显著提升图形界面性能。RGA支持图像缩放、旋转、格式转换等操作,降低CPU负担,适用于高帧率UI渲染。实现时需通过librga库调用RGA接口(如c_RkRgaBlit),在LVGL的flush_cb回调中完成显存加速写入。关键步骤包括初始化RGA、配置LVGL显示驱动、编译链接librga,并确保内核驱动和内存对齐要求。此方案适用于工业屏、车载仪表等高性能场景。
2025-06-21 11:18:04
1029
原创 RK3568交叉编译lvgl源码
本文详细介绍了在RK3568开发板上使用CMake交叉编译LVGL应用程序的全过程。首先将LVGL库文件和头文件安装到系统路径,然后通过编写toolchain.cmake配置交叉编译工具链,包括设置目标平台、编译器路径和系统根目录。主CMakeLists.txt文件定义了项目结构、包含路径、库链接等关键构建参数,最终生成可在开发板运行的可执行文件。整个流程涵盖了从源码编译、库文件安装到交叉编译配置的完整环节,为嵌入式GUI开发提供了清晰的参考实现。
2025-06-21 10:58:44
1114
原创 RK3568使用buildroot编译lvgl
摘要:本文介绍了使用Buildroot自动编译LVGL图形库的方法。Buildroot作为嵌入式Linux构建系统,通过包管理机制自动完成LVGL源码的下载、编译和安装全过程。操作步骤包括进入RK3568 SDK环境、执行menuconfig配置界面搜索并选中LVGL包、保存配置后编译整个系统。该方法简化了LVGL的移植流程,无需手动处理依赖关系,编译完成后LVGL将自动集成到目标根文件系统中。文中配有详细的命令行截图说明各步骤操作。
2025-06-21 09:52:17
605
原创 完整 Bootloader 框架
本文详细介绍了嵌入式系统中Bootloader的完整框架设计。主要内容包括:1.Bootloader的核心功能模块,如应用启动、命令交互、下载功能、Flash烧写和调试维护;2.模块化设计框架,包含启动代码、驱动层、协议实现等组件;3.典型工作流程和关键模块实现,如命令行接口、命令注册机制、Flash操作等;4.应用跳转前的准备工作和安全扩展设计,如加密校验、OTA支持等。文章强调了一个成熟Bootloader在系统维护、升级和安全中的重要性,建议采用模块化、可扩展的设计方法。
2025-06-12 18:11:03
891
原创 STM32 Bootloader:使用文件头加载并启动应用程序
本文详细解析了STM32 Bootloader的设计与实现方法。系统通过自定义的image_header_t结构体记录应用程序的关键信息,包括加载地址、大小和入口点等。Bootloader启动后,首先初始化UART输出调试信息,然后从指定Flash位置读取并解析镜像头,获取应用程序参数,将程序数据拷贝到RAM,最后设置中断向量表并跳转执行。该方案支持基本的固件加载功能,并预留了校验、多应用管理和安全扩展等接口。文中还提供了核心代码实现,包括字节序转换、数据拷贝和跳转执行的汇编指令,为开发者构建定制化Boot
2025-06-12 17:39:25
1285
原创 Keil 中设置 STM32 Flash 和 RAM 地址详解
摘要: 本文详细介绍了在Keil开发环境下配置STM32(以STM32F103ZE为例)Flash和RAM地址的方法。通过Target选项卡设置IROM1(Flash起始地址0x08000000,大小512KB)和IRAM1(RAM起始地址0x20000000,大小64KB),确保与芯片规格匹配。Linker选项卡中的参数(如--ro-base和--rw-base)进一步定义代码与数据的存储位置。文章强调配置必须准确(地址不重叠、入口正确),推荐使用STM32CubeMX自动生成配置以减少错误。正确设置是保
2025-06-09 10:50:58
1482
原创 单片机bootloader(APP的自我复制)
本文解析了嵌入式系统中Bootloader将自身复制到RAM并启动的机制。该技术通过将代码从Flash复制到RAM运行,可提升执行速度、支持代码重定位,并为OTA升级预留空间。关键步骤包括:启动入口获取代码地址并调用复制函数;C语言实现数据复制;最终跳转至RAM中主函数执行。此外还介绍了手动启动指定APP的方法。这种机制适用于需要性能优化或动态代码更新的场景,前提是系统RAM空间充足。整体流程实现了从Flash到RAM的自启动迁移,为嵌入式系统提供了一种灵活的引导方案。
2025-06-09 10:41:42
583
原创 使用lighttpd和开发板进行交互
本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。
2025-06-01 14:39:02
1015
原创 RK3568交叉编译lighttpd
本文详细介绍了在ARM开发板上交叉编译和部署轻量级Web服务器lighttpd的完整流程。主要内容包括:1)下载并解压lighttpd源码;2)配置交叉编译工具链;3)编译安装到指定目录;4)将生成文件部署到开发板的对应位置;5)配置lighttpd.conf文件,详细解析了各模块功能、目录设置、日志记录等关键参数;6)最终成功运行lighttpd服务并通过浏览器访问验证。该方案实现了在嵌入式设备上搭建高效Web服务器,适用于物联网设备管理、文件共享等应用场景。
2025-06-01 10:59:13
696
原创 CGI概念讲解
CGI(通用网关接口)是Web服务器调用后端程序的接口标准,常用于嵌入式系统实现动态网页交互。其工作流程为:浏览器发起请求→Web服务器调用CGI程序→程序处理参数(通过环境变量或标准输入)→输出结果返回浏览器。嵌入式设备因资源有限,常用轻量服务器(如boa)配合C语言或Shell脚本编写的CGI实现设备配置(IP/参数设置)、状态查询(温度/电压)及硬件控制(LED开关)。CGI程序需输出HTTP头部(如"Content-type: text/html")和HTML内容,并存放于/cg
2025-06-01 07:59:20
437
原创 LVGL(Grid)
LVGL的网格布局(Grid)是一种类似CSS Grid的布局方式,适合用于创建复杂、规则的静态界面结构。使用步骤包括:1)设置容器为Grid布局;2)定义行/列模板,支持比例单位、内容自适应等;3)应用模板到容器;4)设置子控件在网格中的位置和跨行/跨列属性。Grid布局与Flex布局相比,更适合表格、键盘等规则结构,而Flex更适合流式排列的动态内容。选择依据主要取决于界面复杂度及是否需要精确的行列控制。完整示例展示了2×2网格的实现方法。
2025-05-27 18:05:28
427
Cmake 3.27版本
2023-07-16
SG90舵机使用手册pdf
2023-06-13
STM32F407智能小车学习代码
2023-06-13
基于STM32智能小车
2022-12-17
智能指针的类型方法及使用方法
2023-03-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人