Linux设备驱动开发

linux设备驱动开发详解 书名:《Linux设备驱动开发详解》第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora arm-linux-gcc版本:version 4.4.1 开发板:mini2440-256M 版权信息:版权归作者M.Bing和博客园共同所有,可以随意转载,但请保留此条信息! 备注:由于作者水平有限,文章难免出错,欢迎大家指正,共同学习。 一、字符设备简介   在Linux2.6内核中,使用cdev结构描述一个字符设备,cdev结构如下所示 复制代码 struct cde 阅读详情

一个基本的Linux设备驱动开发环境


由宿主机和目标机组成,宿主机就是用来做驱动开发工作的主机,目标机就是用来运行和测试设备驱动的主机,在宿主机上需要有开发工具(gcc,gdb,make等)和linux源码(版本要对应目标机上的linux内核),而目标机上只要运行linux即可。由于步骤有所不同,下面分为普通Linux设备驱动开发和嵌入式Linux设别驱动开发两种情况来讲述环境的搭建和驱动程序的编译:

(一)普通Linux设备驱动开发

普通Linux主要是区分于嵌入式Linux(一般指uClinux),在这种开发中宿主机和目标机可以是一台主机,即在本机上开发编译然后在本机上加载运行(Linux设备驱动也可以直接编译进内核,但为了开发工作方便,一般采用动态加载的方式),当然也可以是两台主机,如果是两台主机的话,要保证宿主机上的linux源码的版本号与目标机中的linux内核版本一致。普通Linux设备驱动开发的步骤如下:

1. 在宿主机上安装开发工具和下载linux源码(要求版本号和目标机上的linux内核版本一致)。开发工具主要有gcc、gdb、make等,这些工具在redhat或fc中默认就安装了,在debian或Ubuntu中可以通过下面这个命令安装:
apt-get install build-essential
linux源码可以通过以下几种途径获得:
* 直接去www.kernel.org下载
* 通过包管理工具下载源码,在debian和Ubuntu中可以通过下面这个命令下载,
apt-get install linux-source-(版本号) ,下载后的文件在/usr/src目录中,解压到该目录即可

将源码解压到/usr/src/目录后,进入linux-source-(版本号)目录中执行下面几个命令:
make oldconfig
make prepare
make scripts
2. 编写Linux驱动程序,以一个最简单的hello.c为例,hello.c的内容如下:
1. #include "linux/init.h"
2. #include "linux/module.h"
3.
4. static int hello_init(void)
5. {
6. printk(KERN_ALERT "Hello World linux_driver_module/n");
7. return 0;
8. }
9.
10. static void hello_exit(void)
11. {
12. printk(KERN_ALERT "Goodbey linux_driver_module/n");
13. }
14.
15. module_init(hello_init);
16. module_exit(hello_exit);
17. MODULE_LICENSE("GPL");
18. MODULE_AUTHOR("lpj");
3. 写Makefile文件,一个示例如下,里面各项参数根据实际情况更改:
1. #sample driver module
2. obj-m := hello.o
3. KDIR = /usr/src/linux-source-2.6.24/
4.
5. all:
6. $(MAKE) -C $(KDIR) M=$(PWD)
7.
8. .PHONY:clean
9. clean:
10. rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions
4. 编译,在hello.c和Makefile所在目录下执行 make 即可,编译后在当前目录生成hello.ko文件
5. 加载并测试:加载使用insmod或modprobe命令来实现,如在当前路径执行如下代码:
insmod hello.ko 或 modprobe hello
注意,如果在虚拟终端加载内核的话,将看不到内核打印信息,因为内核打印信息不会输出到虚拟终端,而是输出到/proc/kmsg文件中,所以可以通过以下方式查看内核信息:
* cat /proc/kmsg 会一直打印,需要Ctrl-C手动终止
* dmesg 或 dmesg | tail -N ,N为一数字,表示显示最后N行
6. 卸载:使用rmmod命令卸载驱动模块,如 rmmod hello

(二)嵌入式Linux设备驱动开发

这种开发中一般目标机为带有嵌入式处理器的开发板,而宿主机为PC,开发环境需要在宿主机上搭建,嵌入式Linux设备驱动开发的步骤如下:

1. 在宿主机上下载嵌入式Linux的源码,并安装嵌入式Linux开发工具(针对于不同的嵌入式处理器,工具也有所不同,如对应于Arm的arm-gcc系列,针对nios2处理器的nios2-cc系列)
2. 编写Linux设备驱动驱动程序,还以上面给出的hello.c为例,将该文件复制到(linux 源码目录)/drivers/(目标文件夹)/中
3. 在(目标文件夹)中创建Makefile和Kconfig(菜单配置文件),内容分别如下:
1. #makefile
2. obj-$(CONFIG_HELLODRV) += hello.o
1. #Kconfig
2. menu USER_DEVICE_DRIVERS
3. config HELLODRV
4. tristate "Hello"
5. ---help---
6. This is a sample driver programme.
7. endmenu

注意,如果Kconfig文件中的"tristate"写成"bool",则该模块只能选为Y(编译进内核)或N(不选择),不能选为M(编译为模块,可动态加载)
4. 修改上层目录( linux内核源码目录/drivers/)中的Makefile和Kconfig文件,Makefile中加入如下语句:
1. #makefile
2. obj-y += (目标文件夹)

(此处有多种写法,这只是其中一种)
Kconfig中加入如下语句:
1. #Kconfig
2. source "drivers/(目标文件夹)/Kconfig"
5. 编译内核:几个基本的命令及选择界面如下:
make menuconfig 执行到这一步后,会看到下面这个界面:
menuconfig
其中Vendor/Product...是选择处理器厂家和型号的,Kernel/Library...是配置应用程序的,按空格键或回车键可以进入选项进行配置,用上下键移动到Kernel/Library...菜单上,按空格或回车进入下面的内核配置界面:
kernel_library
在该界面有两个Customize...选项,第一个是选择自定义配置内核,第二个是选择自定义配置应用程序,按空格键可以选择这些选项,选择后按 exit键退出,选择是否保存的时候选择“yes“,如果选择了第一个Customize...,则退出后会自动进入内核配置界面,如下图:
kernel_comfig
该界面有很多选项,这里不细讲,我们要配置驱动模块,就用上下键移动到Device Drivers上,然后按回车或空格键进入,设备驱动配置界面如下图:
device_drives_config
这里就是linux-2.X/drivers/Kconfig里的内容了,下面那个绿色的V(+)表示这一页没显示完,可以用下键继续往下浏览,找到我们自己的菜单名,然后按回车或空格进入,我的模块配置界面如下:
mydrivers
用M键使选项前的尖括号里显示M表示该模块要动态加载,也可以按y键选择直接编辑进内核,选择完后exit退出,选择yes或no的对话框通一选yes。
make romfs #第一次编译内核前一定要有该步骤
make
6. 加载测试:将生成的zImage文件下载到开发板,开发板上的嵌入式Linux启动后可以用insmod或modprobe加载驱动模块,测试完毕后可以通过rmmod命令卸载驱动模块


=======================


1. 学会写简单的makefile

2. 编一应用程序,可以用makefile跑起来

3. 学会写驱动的makefile

4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出。

5. 写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现。 在ioctl里完成从用户空间向内核空间传递结构体的实现。

6. 写一block驱动, 加上read,write,ioctl,poll等各种函数实现。

7. 简单学习下内存管理, 这个是最难的,明白各种memory alloc的函数实现细节。这是Linux开发的基本功。

8. 学习锁机制的应用,这个不是最难的但是最容易犯错的,涉及到很多同步和并发的问题。

9. 看内核中实际应用的驱动代码。 你会发现最基本的你已经知道了, 大的框架都是一样的, 无非是read, write, ioctl等函数的实现, 但里面包含了很多很多细小的实现细节是之前不知道的。 这时候就要考虑到很多别的问题而不仅仅是基本功能的实现。

推荐您看2.6.20中integrated的一个驱动 kvm, 记得是在driver/lguest下,很好玩的,就是Linux下的虚拟机驱动, 代码不长,但功能强大。有能力的可以自己写一操作系统按照要求做成磁盘镜像加载到虚拟机中,然后客户机可以有自己的4G虚拟地址空间。

10. 看完驱动欢迎您进入Linux kernel学习中来。

最简单的方法,跟着ldd(Linux devive driver)做一遍。

宋宝华《Linux设备驱动开发详解》 宋宝华《Linux设备驱动开发详解》 虚拟机以及源码。 阅读详情

相关推荐

Linux设备驱动开发实战详解

简介:《Linux设备驱动开发详解》是一本全面讲解Linux设备驱动开发的专业书籍。书中不仅提供理论框架,还包含大量实践案例,覆盖硬件基础、文件系统、内存与I/O访问、字符设备、块设备、特定设备驱动(如音频、LCD、USB)以及设备驱动调试等关键领域。旨在帮助读者理解Linux内核与设备的交互机制,掌握从硬件到高级驱动开发的各项技术要点。

weixin_42591908的博客 1000

最全Linux驱动开发全流程详细解析(持续更新)

Linux驱动开发详细解析

拉依达不拉跨的博客 11万+

Linux 设备驱动开发(PDF格式含源码)

Linux 设备驱动开发英文版(PDF格式含源码)

Linux驱动开发基础

一、内核态和用户态 内核态与用户态是操作系统的两种运行级别,cpu提供Ring0-Ring3三种级别的运行模式。Ring0级别最高,Ring3最低。 CPU是在两种不同的模式下运行的:Kernel Mode(内核态),在内核模式下(执行内核空间的代码),具有ring0保护级别,代码具有对硬件的所有控制权限。可以执行所有CPU指令,可以访问任意地址的内存。内核模式是为操作系统最底层,最可信的函数服务的。在内核模式下的任何异常都是灾难性的,将会导致整台机器停机。 User Mode(用户态),在用户模式下

风间琉璃的博客 2万+

Linux Driver Development

Linux 驱动开发,驱动入门书籍

三维(点云)语义分割概述以及方法总结

语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到...

renhaofan的博客 3万+

【Linux 驱动篇(一)】字符设备驱动开发

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。

K3169的博客 5665

磁传感器技术解析:从霍尔效应到车规级应用,纳芯微的本土第一之路

磁传感器是现代工业与汽车电子中的关键感知元件,其技术演进经历了从分立器件到高集成度SoC的跨越。霍尔效应与磁阻效应构成两大物理基础,其中硅基霍尔方案凭借高性价比与成熟供应链,在车规级应用中占据主流。高精度电流检测、角度与位置感知、磁开关等场景,对传感器的温漂抑制、共模瞬态抗扰与批量一致性提出严苛要求。车规级可靠性体系与系统级集成能力,成为衡量供应商的核心标尺。随着新能源主驱、光伏逆变、工业伺服等应用爆发,具备完整信号链与隔离技术积累的厂商正逐步构建护城河。本文以纳芯微为样本,剖析其从隔离技术延伸至磁传感器平

weixin_34387468的博客 365

Linux 驱动开发详解:从入门到实践

本文系统介绍了Linux内核驱动开发的核心流程。首先概述了驱动作为内核与硬件桥梁的作用,区分了字符设备、块设备等主要类型。详细讲解了开发环境搭建和Hello World模块编写步骤,重点剖析了字符设备驱动的实现过程,包括file_operations结构、设备注册机制和用户空间交互方法。进阶部分涉及IOCTL接口、数据安全传输和同步互斥等关键技术,并提供调试技巧与安全实践建议。全文通过代码实例展示驱动开发全流程,为深入学习Linux内核和硬件交互奠定基础。

Jay_515的博客 4682

新手避坑指南:HT7036计量芯片SPI读取电压的完整流程(从复位到校准)

本文详细介绍了HT7036计量芯片的SPI读取电压完整流程,从硬件准备到校准设置,重点解析了复位引脚处理、SPI通信配置、芯片初始化及数据处理等关键步骤。针对常见问题如晶振焊接、SPI时序错误等提供实用解决方案,帮助开发者高效完成电压测量与校准。

weixin_30070339的博客 326

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 506

Linux设备驱动开发详解

设备驱动提供了硬件和应用软件之间的纽带应用软件时只需 调用系统软件的应用编程接口(API) 就可让硬件去完成要求的工作。

实力派,无需多言! 2302

Axure RP9汉化+授权全攻略:从下载到激活一步到位(附最新授权码)

本文提供Axure RP9从下载安装到界面汉化的完整指南,帮助设计师和产品经理快速上手这款原型设计工具。详细讲解了如何安全获取软件、执行汉化操作、理解核心界面布局,并介绍了创建交互原型和生成HTML文件的基础步骤,助力用户高效开展设计工作。

cuda7parallel的博客 1135

Linux设备驱动开发详解笔记

设备驱动提供了硬件和应用软件之间的纽带应用软件时只需 调用系统软件的应用编程接口(API) 就可让硬件去完成要求的工作。

实力派,无需多言! 1558

C++中为什么要引入引用变量?

C++引用机制的设计哲学在于平衡性能与安全性。它解决了指针的三个痛点:语法噪音、空指针风险和语义模糊,同时保持了指针的效率优势。引用必须绑定有效对象且不可重绑定的特性增强了安全性,其值语义语法更直观。尤其在运算符重载和const引用场景中,引用展现了不可替代的优势。本质上,引用是编译器优化的指针实现,体现了C++"零开销抽象"的核心思想——既保持底层性能,又提供高级抽象。这种设计允许开发者根据场景灵活选择指针或引用,反映了C++多范式共存的语言智慧。

教学 & 技术专栏 174

基于Python+OpenCV中文及符号检测

一、项目背景与意义在图像处理、文档识别、自动翻译等场景中,中文及符号的准确检测是一个重要且复杂的任务。传统的字符检测方法往往对英文等拉丁字母系的识别效果较好,但对中文及特殊符号的识别准确率较低。本项目旨在利用Python编程语言结合OpenCV库,开发一个能够高效、准确地检测图像中中文及符号的系统,为相关领域的研究和应用提供技术支撑。二、技术实现图像预处理:利用OpenCV的图像处理功能,对输入的图像进行灰度化、二值化、滤波去噪等预处理操作,以提高中文及符号检测的准确性[1]。

2301_79809972的博客 1119

linux设备驱动开发详解_Linux设备驱动概述

本篇文章将介绍Linux设备驱动开发的基本知识,带你快速拨开Linux驱动这团迷雾。文章分为如下3个小节进行讲解:1、设备驱动的概念和作用;2、在无操作系统和有操作系统的情况下设备驱动的设计开发;3、Linux设备驱动的重点、难点和学习方法。文章最后会给出一个简单的LED驱动在无操作系统和Linux操作系统下的实现示例。好,Let's go1、设备驱动的概念和作用大家都知道在Linux开发中是一个...

weixin_39785524的博客 1942

eNSP常见故障处理

eNSP无法启动设备一直停在#井号的问题的解决方案?

lvshiliang123的博客 2万+

【Linux】设备驱动开发:如何在Linux上开发和调试设备驱动

设备驱动程序是连接硬件与操作系统的软件桥梁。开发和调试设备驱动程序是Linux内核开发中的重要环节。本文将详细介绍如何在Linux上开发和调试设备驱动程序,帮助读者理解和掌握这一过程。

科技改变人类,技术成就未来 1504

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux设备驱动开发环境的搭建

<br />经过两周的摸索,终于对Linux设备驱动开发有了个初步的认识,下面对Linux设备驱动开发环境的搭建做个小结,以方便自己以后查询,同时也能给同道的初学者一点帮助。<br />刚接触Linux设备驱动时,初学者往往连如何编译驱动程序都不懂,更别说编译进内核或加载测试了。一般都是在网上找个最简单的 helloworld驱动程序,然后严格按照网上所说的步骤编译,结果却得到一大堆见都没见过的错误,更不要说根据错误信息来解决问题了,很多人到这里就 不知道如何往下进行了。十几天前我也卡在这里很长时间,现在知

转角遇到嵌入式 1546

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

探索Linux设备驱动开发的宝藏:《Linux设备驱动开发详解》资源仓库推荐

探索Linux设备驱动开发的宝藏:《Linux设备驱动开发详解》资源仓库推荐 【下载地址】宋宝华Linux设备驱动开发详解资源下载 宋宝华《Linux设备驱动开发详解》资源下载本仓库提供宋宝华所著《Linux设备驱动开发详解》一书的资源文件下载 ...

gitblog_06503的博客 459

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

探索Linux设备驱动开发的宝典:《Linux设备驱动开发详解》第二版

探索Linux设备驱动开发的宝典:《Linux设备驱动开发详解》第二版 【下载地址】Linux设备驱动开发详解_宋宝华著高清带目录第二版分享 Linux设备驱动开发详解_宋宝华著(高清带目录第二版) 项目地址: https://g...

gitblog_06643的博客 940

Linux下i2c设备驱动开发

在 Linux 内核中 I2C 的体系结构分为 3 个部分: I2C 核心: I2C 核心提供了 I2C 总线驱动和设备驱动的注册、 注销方法。 I2C 总线驱动: I2C 总线驱动是对 I2C 硬件体系结构中适配器端的实现, 适配器可由CPU 控制, 甚至可以直接集成在 CPU 内部。I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 I2C 设备驱动: I2C 设备驱动是对 I2C 硬件体系结构中设备端的实现, 设备一般挂接在受

weixin_64581379的博客 1922

探索Linux设备驱动开发的权威指南

探索Linux设备驱动开发的权威指南 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在Linux操作系统中,设备驱动程序是连接硬件与操作系统内核的关键桥梁。为了帮助开发者深入理解和掌握这一领域,我们特别推出了LINUX设备驱动程序第3版完整版.pdf的资源下载。这本书是Linux设备驱动开发领域的经典之作,由业内专家撰写,内容详实且权威,是每一位Linux开发者不可或...

gitblog_06674的博客 319

【Linux】Linux设备驱动开发详解:基于最新的Linux 4.0内核

1 Linux设备驱动概述及开发环境构建 1.1 设备驱动的作用 驱使硬件设备行动 1.2 无操作系统时的设备驱动 典型架构:一个无限循环中夹杂着对设备中断的检测或者对设备的轮询 1.3 有操作系统时的设备驱动 并发 、内存管理 1.4 Linux 设备驱动 1.4.1 设备的分类及特点 ● 字符设备。 ● 块设备。 ● 网络...

九牧林的博客 1万+
上一篇: 基于现场总线的嵌入式远程监控系统设计
下一篇: Linux人才需求与Windows持平 职位“粥多僧少”
Linux先生
博客等级 码龄20年 97粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值