【北京迅为】iTOP-4412全能版使用手册-第四十二章 驱动注册

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。


第四十二章 驱动注册

前面的实验介绍过注册驱动的流程,注册的时候需要和设备匹配,简单介绍了将驱动注册到平台设备的结构体“platform_driver_register”,并没有介绍怎么使用使用。本章就个大家详细介绍如何使用这个结构体来注册驱动。

本节配套视频

“视频 07_驱动注册”

源码

“probe_linux_module”

42.1 platform_driver_register和platform_driver_unregister函数

platform_driver_register 函数和 platform_driver_unregister 函数用于注册和卸载驱动。

如下图所示,在 Linux 源码目录下,使用命令“vim include/linux/platform_device.h”。

 

如上图所示。

注册驱动的函数:

extern int platform_driver_register(struct platform_driver *)

卸载驱动的函数:

extern void platform_driver_unregister(struct platform_driver *)

具体这两个函数是怎么实现的,大家其实不用去关心,都是前人做好的,只要掌握如何调用即可。

这两个函数都会调用一个 platform_driver 类型的结构体。

42.2 platform_driver 结构体

前一小节介绍到注册和卸载驱动的函数需要调用 platform_driver 类型结构体。这个结构体非常重要,大家一定要掌握它的使用方法。

如下图所示,这个结构体也是定义在“include/linux/platform_device.h”头文件中。

 

这个结构体需要好好分析,这个结构体提非常非常的重要,几乎所有的驱动都会用到。

该结构中包含了一组操作函数和一个 struct device_driver 的对像。在驱动中首先要做的就是定义 platform_driver 中的函数,并创建这个结构的一个对象实例, 然后在 init()函数中调用 platform_driver_register()向系统注册驱动。

函数 int (*probe)(struct platform_device *);

主要是进行设备的探测和初始化。例如想调用一个 GPIO,那么首先需要探测这个 GPIO 是否被占用了,如果被占用了那么初始化失败,驱动注册也就失败了;如果没有被占用,那么就申明要占用它。

该函数中一般还会添加生成设备节点的函数,如果初始化成功,那么就会需要添加设备节点。设备节点的知识在下一节介绍。

函数 int (*remove)(struct platform_device *);

移除驱动,该函数中一般用于去掉设备节点或者释放软硬件资源。

接着的三个函数:

void (*shutdown)(struct platform_device *);

int (*suspend)(struct platform_device *, pm_message_t state);

int (*resume)(struct platform_device *);

从字面上就很好理解了,关闭驱动,悬挂(休眠)驱动以及恢复的时候该驱动要做什么。接着的结构体 struct device_driver driver;

主要包含两个参数,一个是 name 参数,驱动名称(需要和设备驱动结构体中的 name 参数一样);一个是 owner,一般是 THIS_MODULE。

下面给接着给大家介绍一个小知识点,以 platform_driver 结构体中的参数 probe 为例,这个参数指向 platform_driver_probe 函数,如下图所示。

 

在视频中没有介绍这个参数 platform_driver 是从哪里传来的。

大家打开平台文件,看一下注册设备的代码,如下图所示,是 HELLO_CTL 的结构体。

 

上图红色的结构体和 platform_driver_probe 函数的第一个参数类型一样,如果你注册一个 HELLO_CTL 驱动,那么你的初始化函数 platform_driver_probe 就会调用这个结构体。

虽然这个结构体在这里很简单,但是在后面专门的移植课程中,你会发现移植中有部分工作是解决这个结构体中的问题,另一部分工作是调试 bug。在具体使用的时候再详细介绍相关知识,这里只要知道注册驱动的时候会调用平台文件中对应结构体即可。

42.3 实验操作

在前面“实验 2mini_linux_module”的基础上添加注册驱动的代码。

如下图所示,是“mini_linux_module.c”的代码。

 

先将这个文件名改为 probe_linux_module.c。

然后在 probe_linux_module.c 文件中开始修改和添加带代码。

如下图所示,首先需要添加头文件“#include <linux/platform_device.h>”,然后定义一个宏变量 DRIVER_NAME,定义为“hello_ctl”,需要和前面注册的 hello 设备的名称相同。

 

然后在模块入口和出口调用函数 platform_driver_register 和platform_driver_unregister,如下图所示,先将参数名定义为“&hello_driver”。另外注册驱动的时候,会返回数值,将其打印出来判断是否注册成功。 

 

如下图所示,定义结构体“hello_driver”。

driver 中的 name 参数就是驱动名称,这里将前面定义的宏变量 DRIVER_NAME 赋给它;另外一个参数 owner 一般默认为 THIS_MODULE。

 

然后定义函数 hello_probe、hello_remove、hello_shutdown、hello_suspend、hello_resume。 

 

如上图所示,这里在 hello_probe 函数中添加打印信息“printk(KERN_EMERG "\tinitialized\n");”

如果设备和驱动匹配成功就会进入函数 hello_probe 打印“initialized”。

接着需要修改一下 Makefile 文件,将”mini_linux_module.o ”改为“probe_linux_module.o”,注释部分用户可以自己修改,如下图所示。

 

在Ubuntu 中的目录“/home/topeet”中新建目录“probe_linux_module”,拷贝驱动文件“probe_linux_module.c”和编译文件“Makefile”到新建中,如下图所示。 

 

进入“probe_linux_module”目录,使用命令“make”编译“probe_linux_module.c”,如下图所示,生成模块文件“probe_linux_module.ko”。 

 

启动开发板,拷贝“probe_linux_module.ko”到 U 盘,将 U 盘插入开发板,加载驱动文件“probe_linux_module.ko”,如下图所示,可以看到打印出了“initialized”,表明进入了 probe 函数。 

 

使用命令“rmmod probe_linux_module”卸载驱动,可以看到打印“HELLO WORLD exit!”,表明卸载成功。 

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

交易系统:线上交易系统流程详解

大家好&#xff0c;我是汤师爷~ 今天聊聊线上交易系统流程详解。 线上交易系统为新零售连锁商家提供一站式线上交易解决方案。其核心目标是&#xff0c;通过数字化手段扩大商家的服务范围&#xff0c;突破传统门店的地理限制。系统支持电商、O2O等多种业务形态&#xff0c;为…

Postman接口测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 pre-request script 介绍 在过往的工作中&#xff0c;遇到很多测试小伙伴使用 postman 的时候都是直接通过 api 文档的描述请求&#xff0c;检查返回的数据是否正…

【单链表】(更新中...)

一、 题单 206.反转链表203.移除链表元素 876.链表的中间结点BM8 链表中倒数最后k个结点21.合并两个有序链表 二、题目简介及思路 206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路简单&#xff0c;但是除了要两个指针进…

深入理解 SQL 注入:原理、攻击流程与防御措施

深入理解 SQL 注入&#xff1a;原理、攻击流程与防御措施 在当今数字化的时代&#xff0c;数据安全已成为每个企业和开发者必须面对的重要课题。SQL 注入&#xff08;SQL Injection&#xff09;作为一种常见的网络攻击方式&#xff0c;给无数企业带来了巨大的损失。本文将深入…

市场上显卡型号需求分析

两个平台统计&#xff1a;&#xff08;关键词统计&#xff0c;仅做参考&#xff09; GPU型号&#xff5c;平台 github(提交量/万) huggingface&#xff08;模型量/个&#xff09; H100 6.6 210 A100 17.2 483 V100 14.4 484 4090 27.3 31 3090 11.1 92 在git…

C# WPF抽奖程序

C# WPF抽奖程序 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.…

Master EDI 项目需求分析

Master Electronics 通过其全球分销网络&#xff0c;支持多种采购需求&#xff0c;确保能够为客户提供可靠的元件供应链解决方案&#xff0c;同时为快速高效的与全球伙伴建立合作&#xff0c;Master 选择通过EDI来实现与交易伙伴间的数据传输。 EDI为交易伙伴之间建立了一个安…

基于单片机的输液速度监控系统设计

本设计是以STM32F103C8T6单片机为控制核心&#xff0c;用户可通过按键模块来设置液体高度与点滴速度的阈值&#xff0c;采用液位传感器实时监测瓶内液体位置&#xff0c;若液位低于所设阈值&#xff0c;蜂鸣器进行声音报警提醒患者或医生。采用步进电机通过控制输液管直径大小从…

河工oj新生周赛第八周2024

A.小七的作业 小柒的作业 - 问题 - 软件学院OJ 代码 #include<bits/stdc.h> using namespace std;int main() {string s;cin >> s;int l, r;cin >> l >> r;string str s.substr(l,r-l1);cout << str;return 0; } B.小七的签到题 小柒的签到…

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

低功耗蓝牙模块在高尔夫测距仪上的应用

在绿意盎然的高尔夫球场上&#xff0c;每一次挥杆都承载着球员对精准与完美的追求。随着科技的飞速发展&#xff0c;高尔夫运动也迎来了智能化的革新。一款集成了先进蓝牙模组的高尔夫测距仪&#xff0c;它不仅重新定义了高尔夫运动的测距精度&#xff0c;更以无线互联的便捷性…

如何在 cPanel 中创建子域名:分步指南

cPanel 是一个用于管理网站的工具&#xff0c;操作界面简单直观&#xff0c;常用于管理网站的各种功能&#xff0c;包括创建子域名。很多知名的网络服务提供商&#xff0c;如 Hostease&#xff0c;都提供了 cPanel 管理工具。 本文将详细介绍如何在 cPanel 中创建子域名&#x…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…

Linux安装BellSoft JDK 17 LTS

原来使用的OpenJdk&#xff0c;看到SpringBoot官网推荐&#xff08;如下图&#xff09;贝尔实验室的JDK&#xff0c;打算换一下 官方下载链接 JKD下载 可以看到Win、Mac、Linux都提供了&#xff0c;并且还有x86架构和arm架构的 在Linux中我们可以使用 uname -a 查看当前操作系…

C++(九)

前言&#xff1a; 本文主要讲述运算符的优先顺序。 一&#xff0c;运算符的优先级。 请看以下表达式&#xff1a; a32*5 运算结果为&#xff1a;13. 可以看到&#xff0c;在此代码中&#xff0c;先运行了2*5的结果&#xff0c;在此基础上在进行3操作&#xff0c;因此结果…

学生公寓智能限电系统的功能和作用

学生公寓智能限电系统‌是一种用于管理和限制学生公寓用电的设备和技术&#xff0c;旨在确保用电安全、防止火灾事故&#xff0c;并促进节能减排。以下是关于学生公寓智能限电系统的详细介绍&#xff1a; 1、功能和作用 智能限电系统通过以下功能来管理和限制用电&#xff1a…

嵌入式入门Day25

数据结构Day 6,IO Day1 查找算法顺序查找折半查找&#xff08;二分查找&#xff09;哈希查找 IO概念标准IO创建递归索引&#xff08;用于查询结构体定义&#xff09; 文件IO标准IO缓冲区指针相关函数 查找算法 顺序查找 关键字&#xff1a;分为主关键字和次关键字主关键字&am…

内网代理转发工具

概念区分 端口转发 端口转发就是将一个端口&#xff0c;这个端口可以本机的端口也可以是本机可以访问到的任意主机的端口&#xff0c;转发到任意一台可以访问到的IP上&#xff0c;通常这个IP是公网IP。 适用端口转发的网络环境有以下几种&#xff1a; 服务器处于内网&#x…

MNIST_FC

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

掌握时间,从`datetime`开始

文章目录 掌握时间&#xff0c;从datetime开始第一部分&#xff1a;背景介绍第二部分&#xff1a;datetime库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…