驱动(RK3588S)第五课时:字符设备驱动编程

news2024/11/27 12:39:49

目录

  • 一、操作系统的框架
  • 二、设备的类型
  • 三、什么是设备
  • 四、杂项字符设备的 API
  • 五、代码实现
    • 1、底层实现(内核)
    • 2、应用层代码
    • 3、交叉编译环境
    • 4、结果展示

一、操作系统的框架

在这里插入图片描述
在这里插入图片描述

二、设备的类型

硬件设备其实是分类型的:
字符设备:所谓的字符备就是你操作这个设备的时候是通过字节一位一位的去操作的,这个开发板其实除了块设备和网络设备以为的所有设备几乎都是字符设备,比如led
beepkey lediicspiuartlcd 等他们是属于字符设备。所以你今后写驱动代码几乎写都是字符设备驱动的代码。一般使用符号c
块设备:就是你开发板上的u盘硬盘就是运行内核和存储内核—符号是b
网络设备:网络设备他是专门为网络数据的发送和接收给设计一个设备
所以咱们的开发板上的硬件几乎都是字符设备。

三、什么是设备

设备号其实就是设备的一个标识符,就好比你们当时操作系统的时候的进程的PID,PID的作用,就是为了区分不同的进程而定义的一个PID,开发板上那么多的硬件设备,内核怎么去区分每一个不同的设备呢?这里就搞另一个设备号,设备号就是给硬件一个编号,就好比每一个人的身份证号,他也是唯一的,设备号他又有两部分组成:主设备号+次设备号
主设备号:他代表一类设备。
次设备号:他代表这一类设备当中的具体哪一个设备比如咱们开发板上有两个 LED 灯,他们是属于一类设备,但是他们有属于不同的个体,所以为了区分这种情况,就是使用次设备号做区分。
Linux 下一切皆文件,不管你操作什么其实都是在操作文件,包括你硬件设备,这里驱动把硬件设备给抽象成为了一个特殊的文件,设备节点文件,位置就是/dev/。有了设备节点你就可以操作对应的硬件设备了。
设备节点上有重要的信息:
crw-rw-rw- 1 root tty 5, 0 9 月 2 09:46 tty
c:就代表设备的类型
-代表普通文件
l 代表链接文件 ---- 快捷方式
c 代表字符设备
d 代表目录文件
b 代表块设备
p 代表管道
s 代表套接字
rw-rw-rw- — 代表文件的权限

四、杂项字符设备的 API

特性:主设备固定是 10,它可以可以在/dev/给你自动生成一个设备节点名 , 这个名是有你自己确定,下面我的这个名字均为myled。
杂项字符设备依赖两个函数和两个核心结构体
注册函数和注销函数
注册函数:就是往内核里去注册申请一些设备信息,资源。
注销函数:就是把你申请的设备信息,或者是资源还给内核。
注册函数应该写到加载函数里
注销函数应该写到卸载函数里

函数功能:注册杂项字符设备
函数原型:*int misc_register(struct miscdevice misc);
函数头文件:#include <linux/miscdevice.h>
在这里插入图片描述
函数参数:misc:核心结构体
这个核心结构体里存放的就是杂项字符设备的关键的信息
结构体的原型:
在这里插入图片描述
struct miscdevice {
int minor;//次设备号 — 一般写 255 代表自动给你分配一个可以使
用的
const char *name;//设备节点的名字,这个名字就是在/dev 下载自动
生成的,一般这个名字要见名知意 led beep key lcd 等
*const struct file_operations fops;//他是操作这个设备的方法的集合
以下的成员变量不需要你填写 内核会自动的给你填写
struct list_head list;
struct device *parent;
struct device *this_device;
const struct attribute_group **groups;
const char *nodename;
umode_t mode;
};
在这里插入图片描述
owner = THIS_MODULE 他是一个固定的值,就代表当前的模块
在这里插入图片描述
这个结构体里存放的都是函数指针,本质是一个指针,只不过这个指针指向了一个函数
常用的成员变量:
llseek — 对应应用层的 lseek
open ---- 对应应用层的 open
release ---- 对应应用层的 close
read ---- 对应应用层的 read
write ---- 对应应用层的 write
mmap ----- 对应应用层的 mmap
函数返回值:成功返回 0 失败负数
*函数功能:注销你申请的杂项字符设备资源
函数原型: void misc_deregister(struct miscdevice misc)
函数头文件: #include <linux/miscdevice.h>
函数参数:misc:核心结构体
函数返回值:无

在这里插入图片描述
函数原型:
在这里插入图片描述

五、代码实现

1、底层实现(内核)

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>

int myled_open (struct inode *inode, struct file *fp)
{
printk(“myled open ok\n”);
printk(“打开成功\n”);
return 0;
}

int myled_close (struct inode *inode, struct file *fp)
{
printk(“myled close ok\n”);
printk(“关闭成功\n”);
return 0;
}

struct file_operations myfops={
.owner = THIS_MODULE,
.open=myled_open,
.release=myled_close,
};

struct miscdevice mymisc={
.minor=255,
.name=“myled”,
.fops=&myfops,

};
static int __init myled_init(void)
{
int misc = 0;
misc = misc_register(&mymisc);
if(misc < 0)
{
printk(“misc_register error\n”);
return -1;
}
printk(“杂项字符设备注册成功\n”);
return 0;
}
static void __exit myled_exit(void)
{
misc_deregister(&mymisc);
printk(“杂项字符设备注销成功\n”);
}
module_init(myled_init);
module_exit(myled_exit);
MODULE_LICENSE(“GPL”);

2、应用层代码

在这里插入图片描述

3、交叉编译环境

在这里插入图片描述

4、结果展示

经过交叉编译之后会生成led.ko和app,将其推送到开发板上,先运行led.ko再运行app即可。
app的运行会自己调用底层代码。

在这里插入图片描述

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

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

相关文章

TCP/IP 报文传输过程

目录 1. 概念理解2. 传输过程 原文回到 TCP/IP 强烈推荐下面博客&#xff0c;详细阐述了TCP/IP协议概念和传输过程 TCP协议详解 (史上最全) 1. 概念理解 2. 传输过程 以一个具体例子为例&#xff0c;如下图所示&#xff0c;由A 给 F 发送一个数据包整个过程是怎样的

Windows 安装 MySQL8

目录 前言 下载 安装 配置 连接 前言 一般数据库都是部署在 Linux 服务器上&#xff0c;在 Windows 上开发&#xff0c;通过数据库连接工具来连接数据库。在工作中&#xff0c;如果条件允许&#xff0c;会有单独的开发库给开发人员使用&#xff0c;否则开发人员就只能连接…

U盘损坏深度解析与高效数据恢复指南

一、U盘损坏现象初探 在数字化时代&#xff0c;U盘作为便捷的数据存储与传输工具&#xff0c;几乎成为了我们日常生活与工作中的必需品。然而&#xff0c;不少用户都曾遭遇过U盘损坏的困境&#xff0c;面对无法读取、文件丢失或系统提示错误等问题&#xff0c;往往感到束手无策…

【概率与统计 动态规划】 808. 分汤

本文涉及知识点 C动态规划 数学 概率与统计 LeetCode 808. 分汤 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。 提供 75ml 的 汤A 和 25ml 的 汤B 。 提供 50ml 的 汤A 和 50ml 的 汤B 。 提供 25…

Chapter 10 async函数 await关键字

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、async 函数二、await 关键字 前言 在现代 JavaScript 开发中&#xff0c;异步编程是一个重要的概念。随着 ES2017 的引入&#xff0c;async 函数和 await 关键字为处…

一文读懂Mysql连接数的基本知识

目录 前言1. 基本知识2. 常用命令 前言 原先写过一篇SQL Server的知识点&#xff0c;推荐阅读&#xff1a;Sql Server缓冲池、连接池等基本知识&#xff08;附Demo&#xff09; 其余知识点推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&…

Windows10上Nginx如何通过自签名证书方式发布Https服务(上)

背景 在Android开发中使用平板设备进行调试,Android版本是13。在调试中遇到一个这样的报错信息:“java.io.IOException: Cleartext HTTP traffic to 192.168.137.1 not permitted”,然后查了下报错原因是:应用正在尝试通过不安全的HTTP协议进行网络通信,而你的应用运行的环…

计时计费收银软件如何控制设备 佳易王电玩城PS5机计时定时提醒管理系统操作教程

一、前言 计时计费收银软件如何控制设备 佳易王电玩城PS5机计时定时提醒管理系统操作教程 【特别说明&#xff1a;下载的文件为压缩包文件&#xff0c;右键 解压到当前文件夹&#xff0c;将解压后 的文件夹复制到电脑的D盘或E盘&#xff0c;打开该文件夹&#xff0c;将程序图…

竞品分析文档——word版

今天和大家免费分享产品必备文档模板——竞品分析文档&#xff08;word&#xff09;&#xff0c;包括一下部分内容&#xff1a; 1、竞品概述——基本信息、竞品目的、发展历程、产品定位、商业模式 2、市场分析——发展背景、发展现状、流量分析 3、用户分析——用户画像、用…

如何使用Windows自带的软件进行扫描

我们在使用电脑办公的时候&#xff0c;可能会需要进行文件的扫描。有的小伙伴在扫描的过程中可能会出现一些问题&#xff0c;明明扫描仪已经安装了&#xff0c;但是又不知道Windows扫描仪程序在哪里怎么启动&#xff1b;那么今天就跟大家分享一下Windows扫描仪程序在哪里&#…

uniapp插槽用法

目录 什么是插槽? 基本概念 默认插槽 命名插槽 作用域插槽 场景一:子插槽向父组件传递一个字符串 场景二:子插槽向父组件传递对象 什么是插槽? 在 UniApp 中&#xff0c;插槽&#xff08;Slot&#xff09;是一种允许父组件向子组件特定位置插入HTML内容的方式。这种方式使得组…

安科瑞DJSF1352型电子式直流电能表 CE/UL等资质认证

产品概述 DJSF1352型电子式直流电能表采用液品显示&#xff0c;具有RS485功能可与微机进行数据交换。适合充电桩直流计量、电池、太阳能电池板等直流信号设备电量测量和电能计量使用&#xff0c;亦可用于工矿企业&#xff0c;民用建筑&#xff0c;楼宇自动化等现代供配直…

JeecgBoot积木报表AviatorScript表达式注入漏洞复现

文章目录 漏洞信息漏洞复现环境搭建poc复现DNSLog验证 漏洞信息 影响组件&#xff1a;JimuReport积木报表 影响版本&#xff1a;v1.6.0 &#xff1c; JimuReport ≤ 1.7.8 漏洞名称&#xff1a;AviatorScript表达式注入漏洞 漏洞链接&#xff1a;积木报表软件存在AviatorSc…

强化学习实践(二):Dynamic Programming(Value \ Policy Iteration)

强化学习实践&#xff08;二&#xff09;&#xff1a;Dynamic Programming&#xff08;Value \ Policy Iteration&#xff09; 伪代码Value IterationPolicy IterationTruncated Policy Iteration 代码项目地址 伪代码 具体的理解可以看理论学习篇&#xff0c;以及代码中的注释…

Shader学习笔记

1. 渲染管线概述 定义&#xff1a;渲染管线&#xff08;流水线&#xff09;就是将数据分阶段的变为屏幕图像的过程 数据就是我们在游戏场景中放置的模型、光源、摄像机等等内容的数据 阶段就是渲染管线中的三个阶段&#xff1a;应用阶段一>几何阶段一>光栅化阶段 通过这…

超详细步骤——Keil MDK-ARM 如何修改工程名字

背景&#xff1a; 注意&#xff1a;本项目是基于 STM32 单片机的裸机程序&#xff0c;使用 STM32CubeMX 工具生成的 Keil MDK-ARM 工程。 目标&#xff1a; 在 Keil MDK-ARM 开发环境中&#xff0c;将名为version0805 的工程重命名为 version0910&#xff0c;并确保所有新编译…

PHP+Thinkphp+MySQL民宿管理系统41279-计算机毕业设计项目选题推荐(免费领源码)

摘 要 伴随着国内旅游经济的迅猛发展民宿住宿行在国内也迎来了前所未有的发展机遇。传统的旅游模式已难以满足游客日益多元化的需求&#xff0c;随着人们外出度假的时间越来越长&#xff0c;导致人们在住宿的选择上更加追求舒适、个性化的住宿体验。以往大家出游度假首选都是以…

Android图片缓存工具类LruCache原理和使用介绍

LruCache & DiskLruCache原理。 常用的三级缓存主要有LruCache、DiskLruCache、网络&#xff0c;其中LruCache对应内存缓存、 DiskLruCache对应持久化缓存。Lru表示最近最少使用&#xff0c;意思是当缓存到达限制时候&#xff0c;优先淘汰近 期内最少使用的缓存&#xff0c…

传输层协议---TCP协议

以下都是自己的学习总结&#xff0c;有不足也有错误的地方&#xff0c;谨供参考。 TCP协议特点 ---面向字节流&#xff0c;有连接&#xff0c;可靠&#xff0c;全双工 面向字节流 面向字节流指的是服务器和客户端之间的数据传输&#xff0c;使用的字节流传输&#xff0c;获取…

Git 使用指南 --- 远程仓库

序言 在这篇文章中&#xff0c;我们将理解分布式版本控制系统&#xff0c;学习远程仓库与本地仓库的交互操作&#xff0c;掌握多⼈协作开发模式。 1. 理解分布式版本控制系统 前两篇中的所有内容都是针对于在本地的文件管理&#xff0c;Git 的强大之处肯定不仅仅只是体现于此。…