Linux驱动程序的分类

  • 字符设备驱动、块设备驱动和网络设备驱动。

Linux驱动程序运行方式

  • 把驱动程序编译进内核里面,这样内核启动后就会自动运行驱动程序了;
  • 把驱动程序编译成以.ko为后缀的模块文件,然后在Linux启动后,我们自己手动安装驱动程序。

驱动程序

#include <linux/module.h>	//包含初始化加载模块的头文件
#include <linux/init.h> //包含宏定义的头文件 static int hello_init(void)
{
printk("hello_init\n");
return 0;
} static void hello_exit(void)
{
printk("hello_exit\n");
} module_init(hello_init); //驱动入口
module_exit(hello_exit); //驱动出口 MODULE_LICENSE("GPL"); //许可声明
MODULE_AUTHOR("CMF"); //作者
MODULE_VERSION("V1.0"); //版本

Makefile

ARCH            ?= arm64
CROSS_COMPILE ?= /home/cmf/debian/LubanCat_SDK/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- export ARCH
export CROSS_COMPILE
# -m表示编译成模块
obj-m += hello.o
KDIR:=/home/cmf/debian/LubanCat_SDK/kernel
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules #make modules 使用来编译成内核模块的
echo $(PWD) clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order

编译

这里我们使用把驱动程序编译成以.ko为后缀的模块文件的方式,首先要保证kernel已经被成功编译过的。再修改Makefile,其中CROSS_COMPILE,KDIR使用自己的目录。编译成功后会生成hello.ko文件。

把ko文件拷贝到开发板

scp hello.ko cat@192.168.31.110:	(省略远程目录默认为主机的家目录即: ~)

安装驱动模块

# 打印驱动模块信息
cat@lubancat:~$ modinfo hello.ko
filename: /home/cat/hello.ko
version: V1.0
author: CMF
license: GPL
srcversion: AABA8E17AB5E10CE104D4C1
depends:
name: hello
vermagic: 4.19.232 SMP mod_unload aarch64’
# 安装驱动模块
cat@lubancat:~$ sudo insmod hello.ko
[ 4616.557876] hello_init
# 查看已安装的驱动模块
cat@lubancat:~$ lsmod
Module Size Used by
hello 16384 0
iwlmvm 368640 0
iwlwifi 270336 1 iwlmvm
r8125 143360 0
cat@lubancat:~$ cat /proc/modules
hello 16384 0 - Live 0x0000000000000000 (O)
iwlmvm 368640 0 - Live 0x0000000000000000
iwlwifi 270336 1 iwlmvm, Live 0x0000000000000000
r8125 143360 0 - Live 0x0000000000000000
# 卸载驱动模块
cat@lubancat:~$ sudo rmmod hello
[ 4634.443350] hello_exit

第一个hello驱动的更多相关文章

  1. 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

    一.   引子 首先感谢博客园:第一篇文章.第一个开源项目,算是旗开得胜.可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^. 园友给了我很多支持,并提出了很好的改进意见.现加入屏幕分辨率自 ...

  2. 用Visual Studio 2015 编译张帆的第一个WDM驱动,并且成功安装到Windows 10里面!!!

    开发工具:Visual Studio 2015 企业版 目 标 机:Windows 10 X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...

  3. linux一个例子驱动

    我们介绍的驱动称为 short (Simple Hardware Operations and Raw Tests). 所有它做 的是读和写几个 8-位 端口, 从你在加载时选择的开始. 缺省地, 它 ...

  4. Linux 内核注册一个 USB 驱动

    所有 USB 驱动必须创建的主要结构是 struct usb_driver. 这个结构必须被 USB 驱动填 充并且包含多个函数回调和变量, 来向 USB 核心代码描述 USB 驱动: struct ...

  5. 第一个Linux驱动-流水灯【转】

    转自:http://www.xuebuyuan.com/1856562.html 水平有限,描述不当之处请指出,转载请注明出处http://blog.csdn.net/vanbreaker/artic ...

  6. 用Visual Studio 2015 编写第一个UMDF驱动遇到的问题!!

    前提:Visual Studio 2015已经成功安装了驱动环境,WDK都已经完全正常安装了,在Visual Studio 2015的菜单可以看到"Driver"菜单项了.这说明已 ...

  7. 一个linux 驱动升级的小问题记录

    重复踩了两次坑,所以简单记录下. 内核 3.10. 在修改了驱动的gro实现之后,进行驱动版本的升级,make && make install 之后,发现tg3的驱动,没有生效. 相同 ...

  8. 一个MySQL-JDBC驱动bug引起的血案……

    问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是直接写入MySQL ...

  9. linux 注册一个 PCI 驱动

    为了被正确注册到内核, 所有的 PCI 驱动必须创建的主结构是 struct pci_driver 结构. 这个结构包含许多函数回调和变量, 来描述 PCI 驱动给 PCI 核心. 这里是这个结构的一 ...

  10. 一个通用驱动Makefile-V2-支持编译多目录

    目录 前言 1. 特点 2. 分析 2.1 简要原理 2.2 具体分析 3. 源码 前言 该 Makefile 已经通过基于内核 Linux5.4 版本验证通过. 因为编写这通用驱动 Makefile ...

随机推荐

  1. 实操开源版全栈测试工具RunnerGo安装(四)Windows安装

    以windows 10系统为例 视频教程:https://www.bilibili.com/video/BV14H4y1C71u/?spm_id_from=333.999.0.0 1.设置手动进入系统 ...

  2. 链表--insert

    分别是使用了二级指针和一级指针的两种方法,最后会按插入的顺序依次打印1,2,3,4 主要区别在于,使用二级指针,可以在main函数里直接用一个空的Node指针,而一级指针是在main函数里面先添加了一 ...

  3. 关于RabbitMQ消费者预取消息数量参数的合理设置

    根据RabbitMQ官方文档描述,可以通过"预取数量"来限制未被确认的消息个数,本质上这也是一种对消费者进行流控的方法. 详见:https://www.rabbitmq.com/c ...

  4. go-ini解析ini文件

    文档 https://github.com/go-ini/ini https://ini.unknwon.io/docs/intro/getting_started go get -u gopkg.i ...

  5. 【Azure Logic App】消费型逻辑应用在消费Service Bus时遇见消息并发速度慢,消息积压

    问题描述 消费型逻辑应用(Consumption Logic App)使用触发器模式消费 Azure Service Bus的消息,当Service Bus中存在大量消息等待消费时,Logic App ...

  6. 浅入 ABP 系列(7):对象映射

    目录 基础 DTO和实体 麻烦的映射 AutoMapper 集成 IObjectMapper/ObjectMapper 对象拓展 写博客的过程中,发现很多基础理论太薄弱,因此很多专业词汇可能会解释错误 ...

  7. rt_snprintf()是什么

    在c++中snprintf()函数的解释 1,函数原型: int snprintf(char* dest_str,size_t size,const char* format,...); 2,功能 将 ...

  8. AntSK:打造你的本地AI知识库——离线运行详细教程

    亲爱的读者朋友们,今天我要给大家介绍一个强大的开源工具--AntSK.这个工具能让您在没有Internet连接时依然能使用人工智能知识库对话和查询,想象一下,即使在无网络的环境中,您也能与AI进行愉快 ...

  9. Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)

    @ 目录 题面 链接 题意 题解 代码 总结 题面 链接 C. Kefa and Park 题意 求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现,当 ...

  10. CompletableFuture Demo

    CompletableFuture Demo 题目:有一个数据库client,从数据库中取数据A和数据B,然后求和.请使用并发的知识,尽快的完成操作. /** * {@code @author:} k ...