当前位置: 首页 > news >正文

记录:如何编写linux驱动,用module的方式

记录:如何编写Linux驱动,用module的方式

  • 记录:如何编写Linux驱动,用module的方式
    • 参考

记录:如何编写Linux驱动,用module的方式

编写一个 Linux 的驱动,用 module 方式开发,一般来说,编写一个 Linux 的驱动,需要遵循以下步骤:

  • 确定设备的类型和功能,以及它在系统中的位置和编号。设备的类型可以分为字符设备、块设备、网络设备等,它们有不同的操作方法和数据传输方式。设备的位置和编号可以通过设备树、总线、设备号等方式来表示,它们用于标识设备的唯一性和归属性。
  • 编写设备驱动的源代码文件,通常是一个 .c 文件,包含了设备的初始化、操作、中断处理等函数。设备驱动的源代码文件需要包含一些必要的头文件,如 linux/module.h 、 linux/init.h 、 linux/fs.h 等,以及一些设备相关的头文件,如 linux/i2c.h 、 linux/spi.h 等。设备驱动的源代码文件还需要定义一些必要的数据结构,如 file_operations 、 cdev 、 platform_device 、 platform_driver 等,以及一些必要的宏,如 MODULE_LICENSE 、 module_init 、 module_exit 等。
  • 编写设备驱动的 Makefile 文件,用于指定设备驱动的编译选项和依赖关系。Makefile 文件通常位于设备驱动源代码文件所在的目录下,或者其上级目录下。Makefile 文件需要指定设备驱动的模块名称、源文件名称、对象文件名称等变量,并使用内核提供的编译规则,如 obj-m 、 ccflags-y 、 ldflags-y 等。
  • 编写设备驱动的 Kconfig 文件,用于定义设备驱动的配置选项和描述信息。Kconfig 文件通常位于设备驱动源代码文件所在的目录下,或者其上级目录下。Kconfig 文件需要指定设备驱动的配置符号、类型、提示、默认值、依赖条件等属性,并使用内核提供的配置语法,如 config 、 tristate 、 bool 、 help 等。
  • 在 Linux 内核源码树中运行 make menuconfig 命令,进入内核配置菜单界面。在菜单界面中,找到设备驱动所属的分类,并选择是否编译该设备驱动。如果选择编译为模块,则会生成一个 .ko 文件;如果选择编译为内核一部分,则会链接到内核镜像中。
  • 在 Linux 内核源码树中运行 make 命令,编译内核和设备驱动。如果编译成功,则会生成一个 vmlinuz 文件和一个或多个 .ko 文件。vmlinuz 文件是压缩后的内核镜像文件,.ko 文件是设备驱动模块文件。
  • 将编译好的内核镜像文件和设备驱动模块文件拷贝到目标系统中,并更新引导加载器的配置文件。引导加载器的配置文件通常位于 /boot 目录下,例如 grub.cfg 或 lilo.conf 等。引导加载器的配置文件需要指定内核镜像文件的位置和参数。
  • 重启目标系统,并选择新编译的内核启动。如果一切正常,则系统会加载新内核和设备驱动,并识别出相应的设备。可以通过 dmesg 命令查看内核和设备驱动的输出信息,也可以通过 lsmod 命令查看已加载的模块信息。

以下是一个简单的字符设备驱动的代码例子,假设我们要实现一个名为 hello 的字符设备驱动,它只能打印出“Hello world!”这句话:

// hello.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/uaccess.h>#define HELLO_MAJOR 200 // 主设备号
#define HELLO_MINOR 0 // 次设备号
#define HELLO_DEVICE "hello" // 设备名称
#define HELLO_CLASS "hello_class" // 设备类名称
http://www.lryc.cn/news/218884.html

相关文章:

  • 3款免费又好用的 Docker 可视化管理工具
  • C语言--判断一个年份是否是闰年(详解)
  • Python---排序算法
  • gitlab Blocking and unblocking users
  • Swift 和 Python 两种语言中带关联信息错误(异常)类型的比较
  • 北京联通iptv组播配置
  • C++ STL 迭代器失效
  • 麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包
  • 专业媒体播放软件Movist Pro中文
  • 数据结构-邻接表广度优先搜索(C语言版)
  • Py之auto-gptq:auto-gptq的简介、安装、使用方法之详细攻略
  • 【Linux】Linux+Nginx部署项目(负载均衡动静分离)
  • C++笔记之vector的成员函数swap()和data()
  • Linux centos环境 安装谷歌浏览器
  • go-gin-vue3-elementPlus带参手动上传文件
  • 艺术的维度:洞察AI诈骗,优雅防范之艺术
  • JavaScript的作用域和作用域链
  • 电脑文件批量重命名攻略:高效操作技巧助您轻松完成任务
  • 四、三种基本程序结构
  • 深入理解元素的高度、行高、行盒和vertical-align
  • 什么叫储能能量管理单元EMU?储能能量管理单元EMU功能?储能EMU是什么?储能能量管理系统如何实现一次调频AGC-AVC功能?
  • 机器学习之决策树
  • 聊聊logback的UNDEFINED_PROPERTY
  • 记一次pdjs时安装glob出现,npm ERR! code ETARGET和npm ERR! code ELIFECYCLE
  • Zabbix如何监控腾讯云NAT网关
  • SpringBoot案例(数据层、业务层、表现层)
  • 交叉编译程序:以 freetype 为例
  • spring-cloud-starter-dubbo不设置心跳间隔导致生产者重启no Provider问题记录
  • 【数据结构】败者树的建树与比较过程
  • GlobalMapper---dem生成均匀分布的网格,或者均匀分布的点高程点