- 博客(30)
- 资源 (9)
- 收藏
- 关注
原创 Linux内核时钟芯片DS3232驱动源码分析
0x000x010x020x020x030x040x050x050x060x070x0B0x0E0x800x040x020x010x0F0x800x040x020x010x110x140xFF236{ }这是设备树匹配表,定义了驱动支持的设备类型。字段指定了设备树中设备节点的compatible属性值,用于匹配硬件设备。宏将该匹配表导出到内核,以便设备树核心能够找到并匹配相应的设备。完整的功能实现:支持时间读写、闹钟设置、温度读取等所有DS3232芯片功能。
2025-12-30 17:02:23
566
原创 Linux内核DS1307驱动源码分析
mcp794xx, // MCP794xx系列// ... 其他型号// DS1307寄存器地址0x000x010x020x030x040x050x060x070x08// NVRAM起始地址// 寄存器位定义0x80// 时钟停止位0x40// 12小时制标志0x20// PM标志0x80// 控制寄存器输出位0x10// 方波使能0x02// 频率选择位10x01。
2025-12-30 10:51:52
649
原创 Linux驱动proc接口示例源码分析
define PROC_NAME "proc_example" // proc文件名// 模块参数,可通过insmod时指定PROC_NAME:定义了将在/proc目录下创建的文件名proc_value:模块参数,默认值为42:宏用于将变量声明为模块参数,格式为name:参数名type:参数类型perm:参数在/sys/module下的权限:为模块参数添加描述信息proc文件系统:提供了用户空间与内核空间的通信接口序列文件(seq_file):内核提供的简化文件内容生成的机制。
2025-12-30 10:50:24
574
原创 Linux驱动input子系统示例源码分析
/ 设备结构体// sysfs对象// 设备类// 设备:自定义设备结构体,包含 input_dev 指针和 sysfs 对象simk_class和:用于在 sysfs 中创建设备节点// sysfs属性结构体.attr = {.mode = 0666, // 可读可写},.show = NULL, // 读取函数(暂不实现).store = inputkey_store, // 写入函数// 声明sysfs属性组NULL,
2025-12-26 15:23:04
681
原创 Linux驱动tasklet示例源码分析
256// 全局变量// 互斥锁用于保护共享资源// Tasklet 相关变量// Tasklet 执行计数和CLASS_NAME:定义设备名称和类名称BUF_SIZE:定义缓冲区大小:存储字符设备的主设备号:设备类指针:字符设备结构体message[]和:用于存储从用户空间接收的数据:互斥锁,保护共享资源访问:Tasklet结构体实例:原子变量,记录Tasklet执行次数:记录上次Tasklet执行的时间戳。
2025-12-25 09:29:27
676
原创 Linux驱动工作队列示例源码分析
本示例驱动展示了Linux内核中工作队列的基本使用方法,是学习异步处理机制的良好起点。通过字符设备接口接收用户数据,并在独立的工作队列中异步处理,可以有效避免在设备驱动的关键路径上执行耗时操作。工作队列是Linux内核中处理延迟执行任务的重要机制,特别适用于需要执行I/O操作、复杂计算或其他可能阻塞的任务的场景。正确使用工作队列可以显著提高系统的响应性和稳定性。
2025-12-24 11:33:46
693
原创 Linux驱动内核线程示例源码分析
include <linux/slab.h> /* 用于kzalloc/kfree */这些头文件提供了内核模块开发所需的基本API,包括内核线程管理、进程调度、错误处理、延迟函数和互斥锁等功能。模块信息声明定义了模块的许可、作者、描述和版本信息。明确的退出机制:始终实现检查,并响应停止请求状态管理:在休眠前正确设置线程状态,在退出前恢复为资源保护:使用适当的同步机制保护共享资源错误处理:对所有可能的错误情况进行处理,避免在错误状态下继续运行可配置性:使用模块参数使线程行为可配置。
2025-12-23 14:30:15
877
原创 Linux驱动定时器示例源码分析
int count;timer_data结构:定时器结构体int count:计数器,用于跟踪定时器触发次数:定时器名称,用于日志区分my_data:全局指针,指向动态分配的timer_data实例定义模块的初始化和退出函数20hr_timer:高精度定时器结构体实例interval:定时器间隔时间,类型为ktime_t(纳秒级精度)count:计数器,用于跟踪定时器触发次数MAX_COUNT:最大触发次数宏定义传统定时器。
2025-12-23 11:15:27
483
原创 嵌入式Linux软件中断概述
c// SMP热插拔线程定义.store = &ksoftirqd, // 每CPU线程指针.thread_should_run = ksoftirqd_should_run, // 运行条件.thread_fn = run_ksoftirqd, // 线程函数.thread_comm = “ksoftirqd/%u”, // 线程名称.setup = ksoftirqd_setup, // 设置函数.cleanup = ksoftirqd_cleanup, // 清理函数。
2025-12-22 16:38:00
701
原创 Linux系统74HC595驱动程序解析(基于设备树配置的多设备)
8位串行输入8位并行输出三态输出缓冲级联能力强移位时钟频率可达25MHz主要引脚功能DS (SER):串行数据输入SHCP (SRCLK):移位寄存器时钟STCP (RCLK):存储寄存器时钟OE:输出使能(低电平有效)MR:主复位(低电平有效)Q0-Q7:并行数据输出Q7’:串行数据输出(用于级联)enum{GPIO_NUM_OE = 0, // 输出使能GPIO_NUM_DS, // 串行数据输入GPIO_NUM_SHCP, // 移位寄存器时钟。
2025-12-22 12:41:21
1312
原创 Linux系统PCF8575驱动程序解析
分层设计: 将设备框架与软件模拟I2C驱动分离,提高代码可维护性和可移植性设备树支持: 通过设备树动态配置GPIO引脚,增强驱动灵活性多种接口: 提供字符设备文件和sysfs属性文件两种用户空间接口并发安全: 使用互斥锁保护设备访问,确保并发安全软件模拟I2C实现: 不依赖硬件I2C控制器,可在任何GPIO上实现I2C通信该驱动程序可广泛应用于需要扩展GPIO接口的嵌入式Linux系统,如工业控制、智能家居、物联网设备等场景,通过PCF8575可轻松扩展16个额外的I/O引脚。
2025-12-19 14:49:21
782
原创 Linux系统设备树示例(同一个驱动支持多个设备)
在Linux设备树中,当同一驱动程序需要支持多个相同或类似设备时,可以通过定义多个设备节点来实现。
2025-12-18 10:12:48
403
原创 Linux系统 74HC595 驱动程序解析
分层设计: 将设备框架与硬件控制分离,提高代码可维护性和可移植性设备树支持: 通过设备树动态配置GPIO引脚,增强驱动灵活性多种接口: 提供字符设备文件和sysfs属性文件两种用户空间接口并发安全: 使用互斥锁保护设备访问,确保并发安全可扩展性: 支持级联多个74HC595芯片,扩展更多输出引脚该驱动程序可广泛应用于需要扩展GPIO输出的嵌入式Linux系统,如LED矩阵控制、数码管显示、继电器控制等场景。
2025-12-18 10:08:52
953
原创 Motorola SD/MMC驱动源码分析
今天重新看了一下Motorola的SD/MMC驱动源码,并结合以前的分析记录,做一个总结。以E680为例,按照初始化的过程进行分析。模块初始化函数module_init(e680_mmc_init);在函数e680_mmc_init里初始化定时器,定时器的function函数为e680_detect_handler,当卡插入或取出时调用该函数。init_timer(&e680_detection
2008-07-21 12:43:00
1137
原创 移植Motorola开源的SD/MMC驱动程序
移植Motorola开源的SD/MMC驱动程序首先感谢Motorola的开源精神,它告诉其他嵌入式linux的开发人员:你们不是一个人在战斗,不是一个人!好了,言归正传,下面将介绍我的移植过程。内核版本为linux-2.4.21,CPU是PXA255。下载motorola开源的SM/MM驱动程序源码https://opensource.motorola.com/sf/frs/do/listRe
2008-06-05 10:13:00
2002
转载 U-Boot的移植之(四)调试篇:下载U-Boot到目标板进行调试
U-Boot Practically Porting Guide Author: Aaron Wong aaronwong@engineer.com U-Boot的移植之(四)调试篇:下载U-Boot到目标板进行调试 编译完成之后,得到的几个重要文件是: (1) u-boot.bin: 116K,原始二进制文件,用于下载到启动
2008-05-29 10:34:00
681
转载 U-Boot的移植之(三)实战篇:移植U-Boot到XSBASE270开发板
U-Boot Practically Porting GuideAuthor: Aaron Wong aaronwong@engineer.com U-Boot的移植之(三)实战篇:移植U-Boot到XSBASE270开发板1. 在U-Boot中添加XSBASE270目标板的定义具体方法可参考第一节,本篇给出部分细节和要点,假定$U-BOOT为源码根目录。
2008-05-29 10:12:00
755
转载 U-Boot的移植之(二)进阶篇:从源代码看系统启动过程
U-Boot Practically Porting GuideAuthor: Aaron Wong aaronwong@engineer.comU-Boot的移植之(二)进阶篇:从源代码看系统启动过程为什么要分析源代码?分析优秀的源代码本身就是一个学习的过程,也是进行深入研究的必经之路。不过在此我们的主要目的并非要研究U-boot或Bootloader技术本身,而仅仅是为了成功的
2008-05-29 10:09:00
629
转载 U-Boot的移植之(一)基础篇:添加新的目标板定义
U-Boot Practically Porting GuideAuthor: Aaron Wong aaronwong@engineer.comU-Boot的移植之(一)基础篇:添加新的目标板定义本文使用最新的U-Boot-1.3.0-rc2。U-Boot本身支持很多开发板,在其源代码中,每个板子都对应一个board/目录下的文件夹(笔者注:这并不确切,因为有的文件夹是供应商
2008-05-29 09:54:00
636
转载 Linux设备驱动程序学习(3-补)-Linux中的循环缓冲区
Linux设备驱动程序学习(3-补)-Linux中的循环缓冲区 参考资料:《Linux内核中的循环缓冲区》作者:西邮 王聪 严重感谢文章作者! 但是(可能是源码版本问题)有些结论并不正确: “而kfifo_init只会接受一个已分配好空间的fifo->buffer,不能和kfifo_free搭配,用kfifo_init分配的kfifo只能用kfree释放。” 阅读源码可以得出这
2008-05-29 09:00:00
574
转载 Linux设备驱动程序学习(3)-并发和竞态
Linux设备驱动程序学习(3)-并发和竞态今天进入《Linux设备驱动程序(第3版)》第五章并发和竞态的学习。 对并发的管理是操作系统编程中核心的问题之一。 并发产生竞态,竞态导致共享数据的非法访问。因为竞态是一种极端低可能性的事件,因此程序员往往会忽视竞态。但是在计算机世界中,百万分之一的事件可能没几秒就会发生,而其结果是灾难性的。 一、并发及其管理竞态通常是作为
2008-05-29 08:58:00
449
转载 Linux设备驱动程序学习(2)-调试技术
Linux设备驱动程序学习(2)-调试技术今天进入《Linux设备驱动程序(第3版)》第四章调试技术的学习。 一、内核中的调试支持在前面已经建议过:学习编写驱动程序要构建安装自己的内核(标准主线内核)。最重要的原因之一是:内核开发者已经建立了多项用于调试的功能。但是由于这些功能会造成额外的输出,并导致能下降,因此发行版厂商通常会禁止发行版内核中的调试功能。为了实现内核调试,我在内核配
2008-05-29 08:56:00
622
1
转载 Linux设备驱动程序学习(1)-字符设备驱动程序
Linux设备驱动程序学习(1)-字符设备驱动程序今天进入《Linux设备驱动程序(第3版)》第三章字符设备驱动程序的学习。这一章主要通过介绍字符设备scull(Simple Character Utility for Loading Localities,区域装载的简单字符工具)的驱动程序编写,来学习Linux设备驱动的基本知识。scull可以为真正的设备驱动程序提供样板。 一、主设备
2008-05-29 08:19:00
501
原创 linux bootp和tftp设置
Linux bootp和tftp设置PC端linux系统为Redhat 9。安装bootp下载bootp-2.4.3-7.i386.rpmrpm -ivh bootp-2.4.3-7.i386.rpm添加配置文件 /etc/bootp service bootps { disable =no socket_type =dg
2008-05-28 14:15:00
1355
原创 crosstool制作arm-linux交叉编译工具链
crosstool制作arm-linux交叉编译工具链今天使用crosstool制作了arm-linux交叉编译工具链,并且成功编译和运行u-boot-1.3.0。通过http://www.kegel.com/crosstool/了解crosstool。要制作的交叉编译工具链版本为3.3.2。具体步骤如下:下载crosstool-0.43.tar.gzmkdir /home/wxm/
2008-05-26 16:50:00
899
原创 嵌入式Ramdisk
嵌入式Ramdisk首先在内核配置中选择对Ramdisk的支持,一般会在Block devices的选项中。其次在启动参数中设置root=/dev/ram0。然后修改arm/arm/arch-pxa/myboard.c(不同的板子不同)通过函数setup_ramdisk (1, 0, 0, 8192); setup_initrd (__phys_to_virt(0xa1000000)
2008-05-19 15:37:00
847
转载 嵌入式Linux内核移植相关代码分析
嵌入式Linux内核移植相关代码分析转载于:http://blog.mcuol.com/User/webenson/Article/1816_1.htm本文通过整理之前研发的一个项目 (ARM7TDMI + uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考。整理过程中也同时参考了众多网友的帖子,在此谢过。由于整理过程匆忙,难免错 误及讲解的不够清楚之处,请各位网友
2008-05-19 10:00:00
1246
转载 Linux设备驱动程序学习(0)-Hello, world!模块
Linux设备驱动程序学习(0)-Hello, world!模块 一个学习Linux设备驱动程序都会碰到的第一个例程: #include linux/init.h>#include linux/module.h> MODULE_LICENSE("Dual BSD/GPL");sta
2008-05-14 11:18:00
616
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅