对Linux设备驱动开发初步的认识

Linux设备驱动开发入门——Hello world       近期做的工作主要有两个,一是将dvsdk_4中的video_copy项目移植到自己的板子上,在参考资料极其匮乏的情况下,本人继续发扬艰苦奋斗的作风和打不死的小强精神,终于将Omap3530中的DSP成功地跑起来了。另一个工作就是开始学习Linux设备驱动开发,为编写新设备的驱动做准备。dvsdk的内容比较庞杂,所做的工作还在整理之中,后面我会发出来。Linux设备驱动开发的资料很多 阅读详情

经过两周的摸索,终于对Linux设备驱动开发有了个初步的认识,下面对Linux设备驱动开发环境的搭建做个小结,以方便自己以后查询,同时也能给同道的初学者一点帮助。

刚接触Linux设备驱动时,初学者往往连如何编译驱动程序都不懂,更别说编译进内核或加载测试了。一般都是在网上找个最简单的 helloworld驱动程序,然后严格按照网上所说的步骤编译,结果却得到一大堆见都没见过的错误,更不要说根据错误信息来解决问题了,很多人到这里就 不知道如何往下进行了。十几天前我也卡在这里很长时间,现在知道所以然了就记下来,些许对一些同道者有帮助。

一个基本的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的内容如下:
    
    #include "linux/init.h"
    #include "linux/module.h"
    
    static int hello_init(void)
    {
        printk(KERN_ALERT "Hello World linux_driver_module\n");
        return 0;
    }
    
    static void hello_exit(void)
    {
        printk(KERN_ALERT "Goodbey linux_driver_module\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("lpj");
  3. 写Makefile文件,一个示例如下,里面各项参数根据实际情况更改:
    
    #sample driver module
    obj-m := hello.o
    KDIR = /usr/src/linux-source-2.6.24/
    
    all:
         $(MAKE) -C $(KDIR) M=$(PWD)
    
    .PHONY:clean
    clean:
         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(菜单配置文件),内容分别如下:

    #makefile
    obj-$(CONFIG_HELLODRV) += hello.o
    
    #Kconfig
    menu  USER_DEVICE_DRIVERS
    config HELLODRV
     tristate "Hello"
     ---help---
       This is a sample driver programme.
    endmenu
    

    注意,如果Kconfig文件中的"tristate"写成"bool",则该模块只能选为Y(编译进内核)或N(不选择),不能选为M(编译为模块,可动态加载)

  4. 修改上层目录( linux内核源码目录/drivers/)中的Makefile和Kconfig文件,Makefile中加入如下语句:

    #makefile
    obj-y += (目标文件夹)

    (此处有多种写法,这只是其中一种)
    Kconfig中加入如下语句:

    #Kconfig
    source "drivers/(目标文件夹)/Kconfig"
  5. 编译内核:几个基本的命令及选择界面如下:
    make menuconfig 执行到这一步后,会看到下面这个界面:

      
其中Vendor/Product...是选择处理器厂家和型号的,Kernel/Library...是配置应用程序的,按空格键或回车键可以进入选项进行配置,用上下键移动到Kernel/Library...菜单上,按空格或回车进入下面的内核配置界面:
   


在该界面有两个Customize...选项,第一个是选择自定义配置内核,第二个是选择自定义配置应用程序,按空格键可以选择这些选项,选择后按 exit键退出,选择是否保存的时候选择“yes“,如果选择了第一个Customize...,则退出后会自动进入内核配置界面,如下图:
 


该界面有很多选项,这里不细讲,我们要配置驱动模块,就用上下键移动到Device Drivers上,然后按回车或空格键进入,设备驱动配置界面如下图:
 


这里就是linux-2.X/drivers/Kconfig里的内容了,下面那个绿色的V(+)表示这一页没显示完,可以用下键继续往下浏览,找到我们自己的菜单名,然后按回车或空格进入,我的模块配置界面如下:
 


用M键使选项前的尖括号里显示M表示该模块要动态加载,也可以按y键选择直接编辑进内核,选择完后exit退出,选择yes或no的对话框通一选yes。
make romfs #第一次编译内核前一定要有该步骤
make

  1. 加载测试:将生成的zImage文件下载到开发板,开发板上的嵌入式Linux启动后可以用insmod或modprobe加载驱动模块,测试完毕后可以通过rmmod命令卸载驱动模块
[LINUX]LINUX驱动开发最简环境搭建(适用于新手) LINUX驱动开发环境搭建一、 前言二、系统环境UbuntuVMWare{可选}三、开发环境搭建1.用于简单学习(Header)2.用于复杂驱动开发(源码树)a. 基本包b. 源码获取及编译四、驱动开发简单示例【HelloWorld】1. Linux C文件2. Makefile文件3. 驱动编译、加载及卸载五、参考链接六、写在最后的话【应该没有彩蛋】彩蛋? 一、 前言 本文以流水账为记述方式,叙述了从零开始在Ubuntu系统环境下建立LINUX驱动开发环境的过程,并提供了简单的例子。目的是为了给新手或者其 阅读详情

相关推荐

Linux驱动开发(一)---环境搭建与hello world

linux驱动开发入门篇

小人物的编程 6547

【Linux开发板】1、Linux驱动开发环境配置

驱动开发前准备:安装交叉编译器及其他库文件,编译uboot使用SD烧录,配置网络tftp和nfs,设置uboot环境变量(bootcmd、bootarg、ipaddr等),编译linux内核并使用网络挂载,使用nfs挂载根文件系统。

amateur_dabai的博客 988

LED设备驱动开发实验—源码代码详解

如题,因学校课程要求写驱动开发要求。无奈Linux内核机制不清楚,很是痛苦。所以将led的源代码看了一遍,从中窥探Linux的冰山一角。 实验要求参考:嵌入式Linux移植驱动及应用开发.pdf 第16章(如下) 实验书上的环境和实验步骤写的很详细,废话不多说,上代码: led.h #include #include #include #inc

JaYiFen 2059

2. 驱动开发--驱动开发环境搭建

搭建驱动开发的环境,便于调试。文章记录了本人的项目实践和朱有鹏老师的课程知识汇总。

weixin_43379278的博客 1169

设备驱动开发-基础知识

包含linux设备驱动开发的基础知识及统信UOS设备驱动的总体架构,常用的设备驱动开发调试优化手段及在环境搭建和代码编写过程中常见问题处理等。

RZer的博客 1401

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

manongxianfeng的博客 7023

linux与arm开发:初步探索设备驱动程序开发之hellowold驱动

1在linux内核根目录下(有arch文件夹的目录),此目录下运行终端,make menuconfig 在弹出的配置界面中,进行linux操作系统的各种配置,包括cpu的架构等。 其中涉及设备驱动程序的是: kernel-2.6.13/drivers/char/Kconfig文件,配置字符型设备的配置选项 在配置界面中,Device Drivers Character devices 选择要配置...

joygo007的专栏 249

Linux驱动开发(1):内核模块、设备树、设备树插件的编译加载

内核模块全称 Loadable Kernel Module(LKM), 是一种在内核运行时,加载一组目标代码来实现某个特定功能的机制。模块是具有独立功能的程序,它可以被单独编译,但不能独立运行, 在运行时它被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不一样的。模块由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序和其他内核上层功能。模块本身不被编译入内核映像,这控制了内核的大小。模块一旦被加载,它就和内核中的其它部分完全一样。

lishing6的博客 1679

linux设备驱动程序_走进Linux设备驱动程序的第一步——点亮led

本篇文章来学习嵌入式Linux驱动程序开发中的第一步——点亮led。驱动程序开发的步骤主要分为以下几个部分:根据原理图确定相关引脚;查看芯片手册(以我的板子来说就是三星平台EXYNOS4412系列);编写驱动程序;编写用于测试的应用程序;以上的驱动程序开发过程,不仅仅只是在Linux中,在所有的嵌入式软件开发中,也基本都是遵循这套流程。特别说明:第一个步骤和第二个步骤我将直接跳过(查看原理图和芯片...

weixin_39529903的博客 276

Linux设备驱动开发实战详解

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

weixin_42591908的博客 1000

【大模型12步学习路线 · 第3步 · ③IC验证实战篇】SOTA Prompt 逐字拆解

本文拆解了4篇SOTA LLM4Verification论文的Prompt设计,重点分析了AssertLLM、RTLFixer等模型在IC验证领域的Prompt工程实践。AssertLLM通过任务分解为3个专用LLM(Spec分析、信号映射、SVA生成),结合领域RAG和定制System Prompt,将SVA准确率从GPT-4的8%提升至89%。RTLFixer采用ReAct框架实现98.5%的RTL语法错误修复率。文章总结了Prompt设计的关键技巧:任务分解、结构化输出、置信度评分、允许"不确定"标记

元直的博客 583

Linux设备驱动开发详解

Linux设备驱动开发详解Linux设备驱动开发详解Linux设备驱动开发Linux设备驱动开发详解1. linux设备驱动概述及开发环境搭建2. 驱动设计的硬件基础3. linux内核及内核编程4. linux内核模块5. linux文件系统与设备文件6. 字符设备驱动7. linux设备驱动中的并发控制8. linux设备驱动中的阻塞与非阻塞I/O9. linux设备驱动中的异步通知与异步I/O10. 中断与时钟11. 内存与I/O访问12. linux设备驱动的软件架构思想13. linux块设备驱.

tan1666的博客 2万+

YOLOv10注意力革新:小波域注意力(WDA)如何实现多尺度特征精准聚焦

本文深入解析YOLOv10中的小波域注意力(WDA)机制,探讨其如何通过频域分解与动态聚焦实现多尺度特征精准提取。WDA模块结合离散小波变换与注意力机制,显著提升小目标检测性能,在VisDrone数据集上AP提升达12.6%。文章详细介绍了两种集成方案及代码实现,为计算机视觉开发者提供实用指南。

weixin_29079671的博客 251

Linux设备驱动开发详解笔记

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

实力派,无需多言! 1558

Vivado2022.2下载安装

链接:https://pan.baidu.com/s/1lyfE2d-VmaWC-_aR8ratCQ提取码:mt09。

weixin_61081689的博客 2万+

FDTD仿真实战:从材料导入到反射率曲线分析

本文提供了一份完整的FDTD仿真实战指南,详细讲解了从自定义材料(如WO3)数据导入、结构建模、仿真区域与网格设置,到光源与监视器配置、运行仿真并提取反射率数据的全流程。重点解决了材料库缺失、网格优化、边界条件设置等常见难题,旨在帮助研究人员高效、准确地通过FDTD仿真获取材料的关键光学特性——反射率曲线。

elastic6hunter的博客 341

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

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

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

Vibe Coding 实战指南:用 3 类社区资源实现每周高效追新

介绍一种分层技术雷达校准方法,通过领域过滤器(L1技术栈锚定、L2能力映射、L3场景收敛)精准筛选AI编程相关更新,结合可验证的Shell命令与CI任务卡,将信息过载压缩为可执行、可审计的工程实践。

weixin_27251469的博客 330

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

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

九牧林的博客 1万+

第10章《VTK自定义部件Widget》

是用于交互式操作 3D 场景的组件,例如移动对象、调整尺寸、创建标注等。VTK 提供了一些内置的 Widget,如。,用户可以点击鼠标,在 3D 场景中放置一个点。负责绘制一个点,并控制其颜色、大小等。,可用于 3D 标注、对象拾取等应用!等,但在某些应用中,我们需要。这样,我们就创建了一个。

yumeiguo的博客 523

手把手教你学PCIE--固件与BIOS配置 - BIOS设置对PCIe性能的影响

本文详细分析了BIOS设置对PCIe性能的影响,并提供了优化建议。通过合理调整链路参数、功耗管理策略和高级功能配置,可以显著提升系统的性能和稳定性。本文将进一步分析BIOS设置如何影响PCIe设备的性能,并提供优化建议。BIOS(或UEFI)是系统启动时的第一个控制层,其设置直接决定了PCIe设备的工作状态和性能表现。BIOS中的功耗管理选项(如C-States、P-States)会影响PCIe链路的低功耗模式(L0s/L1)。MSI/MSI-X中断具有更高的性能和更好的可扩展性,应作为首选方案。

MHD0815的博客 994

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

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

weixin_39785524的博客 1942

国科大学习资料--现代数字信号处理I(张颢)--2020年期末考试试卷

国科大学习资料–现代数字信号处理I(张颢)–2020年期末考试试卷 国科大学习资料–现代数字信号处理I(张颢)–2020年期末考试试卷 国科大学习资料–现代数字信号处理I(张颢)–2020年期末考试试卷 =========================================================================================================================================================

无名何许人的博客 3574

Linux下PCI设备驱动开发详解(一)

PCI总线是目前应用最广泛的计算机总线标准,而且是一种兼容性最强,功能最全的计算机总线。 而linux作为一种开源的操作系统,同时也为PCI总线与各种新型设备互联成为可能。尤其被现在的异构计算GPU/FPGA、软硬结合新的方向广泛运用。

2301_81736663的博客 3940

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux设备驱动开发之LED

path:带有全路径的节点名,返回值:找到的节点,如果为 NULL 表示查找失败。

m0_53955705的博客 1454

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: c++ 卫哨
下一篇: 已越狱苹果手机升级到ios7.1.2
raidtest
博客等级 码龄25年 164粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值