编写linux驱动程序步骤

一、建立Linux驱动框架(装载、卸载Linux驱动)

    Linux内核在使用驱动时首先要装载驱动,在装载过程中进行一些初始化动作(建立设备文件、分配内存等),在驱动程序中需提供相应函数来处理驱动初始化工作,该函数须使用module_init宏指定;Linux系统在退出是需卸载Linux驱动,卸载过程中进行一些退出工作(删除设备文件、释放内存等),在驱动程序中需提供相应函数来处理退出工作,该函数须使用module_exit宏指定。Linux驱动程序一般都要这两个宏指定这两个函数,所以包含这两个宏以及其所指定的两个函数的C程序可看作是Linux驱动的框架。

二、注册和注销设备文件

    任何Linux驱动都需要有一个设备文件来与应用程序进行交互。建立设备文件的工作一般在上一步module_init宏指定的函数中完成的,可以使用misc_register函数创建设备文件;删除设备文件的工作一般在上一步module_exit宏指定的函数中完成的,可以使用misc_deregister函数删除设备文件。

三、指定驱动相关信息

    驱动程序是自描述的,驱动程序的信息需要在驱动源代码中指定。通过MODULE_AUTHOR(作者姓名)、MODULE_LICENSE(使用的开源协议)、MODULE_ALIAS(别名)、MODULE_DESCRIPTION(驱动描述)等宏来指定与驱动相关的信息,这些宏一般写在驱动源码文件的结尾。可通过modinfo命令获取这些信息。

四、指定回调函数

    Linux驱动包含了很多动作,也称为事件,如“读”“写”事件,触发相应事件时Linux系统会自动调用对于驱动程序的相应回调函数。一个驱动程序不一定要指定所以的回调函数。回调函数通过相关机制进行注册。如与设备文件相关的回调函数使用misc_register函数注册。

五、编写业务逻辑

    没什么可说的,总不能注册一些空的回调函数,什么也不做吧。

六、编写Makefile文件

    Linux内核源码的编译规则是通过Makefile文件定义的,每个Linux驱动程序必须要有一个Makefile文件。

七、编译Linux驱动程序

    Linux驱动程序可直接编译进内核(使用obj-y编译),也可以作为模块单独编译(使用obj-m编译)。

八、安装和卸载Linux驱动

    如果将驱动编译进内核,只要Linux使用该内核,驱动程序就会自动装载。如果Linux驱动程序以模块单独存在,需要使用insmod或modprobe命令装载Linux驱动模块,使用rmmod命令卸载该模块。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一种M2M业务的架构及实现M2M业务的方法

http://www.cnblogs.com/coryxie/p/3849764.html 技术领域 [0001] 本发明涉及通信技术领域,尤其涉及一种M2M业务的架构及实现M2M业务的方法。 背景技术 [0002] 随着通信技术的飞速发展以及通信技术与互联网技术的进一步融合,移动业务以及移动互联网技术普…

第二章 mybatis使用注解实现in查询(mysql)

mybatis实现in查询&#xff0c;两种方法&#xff1a; xml形式&#xff08;推荐&#xff09;注解方式&#xff08;个人喜欢注解&#xff0c;但是in场景可能不太适合注解&#xff09;代码&#xff1a; 1 Select("<script>" 2 "SELECT ID…

python面试代码题_python面试基础篇80题

1.为什么学习python?3.Python和Java、PHP、C、C#、C等其他语言的对比&#xff1f; C语言由于其底层操作特性和历史的积累&#xff0c;在嵌入式领域是当之无愧的王者。 PHP跨平台&#xff0c;性能优越&#xff0c;跟linux/unix结合比跟windows结合性能强45%,开发成本低,php5已经…

主设备号与次设备号以及申请

一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统&#xff0c;有两个LED指示灯&#xff0c;LED灯需要独立的打开或者关闭。那么&#xf…

javascript 变量作用域

为什么80%的码农都做不了架构师&#xff1f;>>> javascript中的变量的作用域不同于java/c的变量规则。 1、在java/c中&#xff0c;如果有一个全局变量与一个局部变量重名&#xff0c;那么在局部变量的作用域中&#xff0c;局部变量会覆盖掉全局变量的值。当离开局部…

七月算法--12月机器学习在线班-第五次课笔记—回归

七月算法--12月机器学习在线班-第五次课笔记—回归 七月算法&#xff08;julyedu.com&#xff09;12月机器学习在线班学习笔记 http://www.julyedu.com 转载于:https://www.cnblogs.com/sweet-dew/p/5491271.html

集合添加元素python_Python基础:列表、字典、元组、集合、添加和删除元素,增删...

列表&#xff08;有序&#xff09; 添加 list.append(元素)&#xff1a;在列表末尾添加新的元素 list.extend(seq)&#xff1a;在列表末尾一次性追加另一个序列中的多个值 –seq可以是列表、元组、字典&#xff0c;若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾。 l…

file_operations结构体分析 (设备文件的操作)

linux设备驱动中file_operations结构体分析 struct module *owner第一个 file_operations 成员根本不是一个操作; 它是一个指向拥有这个结构的模块的指针. 这个成员用来在它的操作还在被使用时阻止模块被卸载. 几乎所有时间中, 它被简单初始化为 THIS_MODULE, 一个在 <Linux…

公司网络搭建及×××到公司配置

一、公司路由器及子网配置公司192.168.1.0/24子网用于服务器集群&#xff0c;192.168.0.0/24子网用于办公子网&#xff0c;两个子网物理上不在一块。公司开业时&#xff0c;申请了电信40Mbps专线光纤&#xff0c;5个IP地址&#xff0c;网关&#xff1a;*.168.112.9 255.255.25…

js——全选框 checkbox

一直会碰见input 全选框的问题&#xff0c;先整理一种情况&#xff1a; 1. <input id"selectAll" type"checkbox" />全选 2. <input typecheckbox idid1 namecb value1 />value1 <input typecheckbox idid2 namecb value2 />value2 &…

手机编写python程序_Python实现自动上京东抢手机

本文实例为大家分享了Python自动上京东抢手机的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 上次抢荣耀V9&#xff0c;被京东给恶心到了&#xff0c;所以就写了个简单的Python来自动抢V9。虽然用的是比较蠢的方法&#xff0c;但觉得还是有可以学习的地方。所以在这…

struct cdev结构体和cdev_init和cdev_add函数

在Linux内核2.6版本以前&#xff0c;注册一个字符设备的的经典方法是使用register_chrdev&#xff0c;相应的从设备中注销字符设备的方法是unregister_chrdev&#xff0c;而在2.6版本以后&#xff0c;字符设备函数的注册与注销使用的是如下一套方法&#xff1a; #include<li…

蓝鸥零基础学习HTML5第五讲 CSS的基础样式

蓝鸥零基础学习HTML5第五讲 CSS的基础样式1.border<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>div {width:0px;height:0px;/*background: url("img/1.jpg…

class_create()函数

内核中定义了struct class结构体&#xff0c;一个struct class 结构体类型变量对应一个类&#xff0c;内核同时提供了class_create()函数&#xff0c;可以用它来创建一个类&#xff0c;这个类存放于sysfs下面&#xff0c;一旦创建了这个类&#xff0c;再调用device_create()函数…

C# 使用Conditional特性而不是#if条件编译

概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果&#xff0c;其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好&#xff0c;因为它们容易被滥用&#xff0c;其代码页进而难以理解或调试。C#设计中考虑到这个问题&#xff0c;并提供了…

python安装opencv出现错误_Python3安装OpenCV出错,如何解决?

$ sudo pip install opencv-python $ sudo pip install opencv-contrib-python 参考下&#xff1a;python作业毕设&#xff1a;安装人工智能图像处理工具OpenCV​zhuanlan.zhihu.compython版本安装 适合所有平台&#xff1a; $ sudo pip install opencv-python $ sudo pip inst…

PHP中面向对象的图片处理类

我们对图片的处理主要是添加水印和等比缩放&#xff0c;在PHP中&#xff0c;封装一个类来实现两个功能。源代码如下&#xff1a;<?php/***图片处理*/ class Image {//路径private $path ./upload/;//随机文件名private $isRandName;//初始化成员方法public function __con…

ioread32函数有关知识

x86体系和ARM体系的寻址方式是有差别的&#xff1a; 在x86下&#xff0c;为了能够满足CPU高速地运行&#xff0c;内存与CPU之间通过北桥相连并通过地址方式访问&#xff0c;而外设通过南桥与CPU相连并通过端口访问。 在ARM下也实现了类似的操作&#xff0c;通过两条不同的总线…

几何分布的期望和方差公式推导_超几何分布的数学期望与方差推导

考虑 个外表相同的物品&#xff0c;其中有 个同类物品与另一类的 个物品&#xff1b;抽取 个物品&#xff0c;每个物品的抽取等概率随机。上述便是一个超几何分布&#xff08;Hypergeometric Distribution&#xff09;的基本模型。抽取 个 类物品的概率 在研究超几何分布的数学…

FPGA开发全攻略—— 调试

原文链接&#xff1a; FPGA开发全攻略连载之十三&#xff1a;FPGA实战开发技巧&#xff08;12&#xff09; 5.6 大规模设计的调试经验 在大规模设计的调试应该按照和设计理念相反的顺序&#xff0c;从底层测试&#xff0c;主要依靠ChipScope Pro 工具。下面主要介绍ChipScope P…