Linux驱动编程(分层分离编程思想)

2023-10-27

1、面向对象
⚫ 字符设备驱动程序抽象出一个 file_operations 结构体;
⚫ 我们写的程序针对硬件部分抽象出 led_operations 结构体。

2、分层
上层实现硬件无关的操作,比如注册字符设备驱动:leddrv.c
下层实现硬件相关的操作,比如 board_A.c 实现单板 A 的 LED 操作
在这里插入图片描述
3、分离
在 board_A.c 中,实现了一个 led_operations,为 LED 引脚实现了初始化函数、控制函数:

static struct led_operations board_demo_led_opr = {
	.num = 1,
	.init = board_demo_led_init,
	.ctl = board_demo_led_ctl,
};

使用时,我们只需要在 board_A_led.c 中指定使用哪一个引脚即可。程序结构如下:
在这里插入图片描述
4、代码
程序仍分为上下结构:上层 leddrv.c 向内核注册 file_operations 结构体;下层 chip_demo_gpio.c 提供 led_operations 结构体来操作硬件。
下层的代码分为 2 个:chip_demo_gpio.c 实现通用的 GPIO 操作,board_A_led.c 指定使用哪个 GPIO,即“资源”。

led_resource.h 中定义了 led_resource 结构体,用来描述 GPIO:

/* GPIO3_0 */
/* bit[31:16] = group */
/* bit[15:0] = which pin */
#define GROUP(x) (x>>16)
#define PIN(x) (x&0xFFFF)
#define GROUP_PIN(g,p) ((g<<16) | (p))

struct led_resource 
{
	int pin;
};
struct led_resource *get_led_resouce(void);

board_A_led.c 指定使用哪个 GPIO,它实现一个 led_resource 结构体,并提供访问函数:

#include "led_resource.h"

static struct led_resource board_A_led = {
	.pin = GROUP_PIN(3,1),
};

struct led_resource *get_led_resouce(void)
{
	return &board_A_led;
}

chip_demo_gpio.c 中,首先获得 board_A_led.c 实现的 led_resource结构体,然后再进行其他操作,请看下面第 7 行:

static struct led_resource *led_rsc;
static int board_demo_led_init (int which) /* 初始化 LED, which-哪个 LED */
{
	//printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which);
	if (!led_rsc)
	{
		led_rsc = get_led_resouce();
	}

	....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux驱动编程(分层分离编程思想) 的相关文章

  • 使用 systemctl 获取 systemd 进程的正常运行时间或停机时间?

    喜欢使用systemctl is active
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include

随机推荐

  • SpringBoot简介

    SpringBoot 第一部分 SpringBoot应用 相关概念 约定优于配置 约定优于配置 Convention over Configuration 又称按约定编程 是一种软件设计规范 本质上是对系统 类库或框架中一些东西假定一个大众
  • 微信小程序:以7天为周期,连续签到7天功能效果

    此功能以1 2 3 4 5 6 7这样为一周期 连续签到的功能 通过计算是否为整除7天计算 每7天后切换数目 从而改变周期表 本案例只是提供案例的基本操作 进一步涉及 每日用户集的监听 日历表 签到统计 连续签到 签到中断 后端数据处理 等
  • intellij idea 双击选中一个变量而不是单词

    在keymap 里搜索 select Word at caret 然后双击并在弹出选项里选add mouse shortcut 然后选double click 再在下面click pad 区域点一下 就可以和eclipse一样双击选中完整的
  • 查看权限linux文件权限

    查看权限 rw rw r 一共有10位数 其中 最前面那个 代表的是类型 中间那三个 rw 代表的是所有者 user 然后那三个 rw 代表的是组群 group 最后那三个 r 代表的是其他人 other 然后我再解释一下后面那9位数 r
  • 全国大学生软件测试大赛 Web性能测试--实例(一)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 Web性能测试 实例 一 咪咕音乐测试 一 测试范围 二 测试要求 step1 a 操作流程 i 进入到咪咕音乐页面 点击 歌手 ii 对歌手进行筛选操作 点击红框内的任意按
  • 学习笔记:基于Transformer的时间序列预测模型

    1 一些准备的说明 为了便于读者理解 笔者将采取一个盾构机掘进参数预测的实际项目进行Transformer模型的说明 此外 该贴更多用于本人的学习记录 适合于对Transformer模型已经有一定了解的读者 此此次外 不定期更新中 一些参考
  • mybatisPlus分页查询的配置类

    SpringBoot中分页查询的配置类 Configuration public class MybatisPlusConfig Bean public MybatisPlusInterceptor mybatisPlusIntercept
  • 计算机视觉服务系统

    tornado教程HTTP教程 Eureka教程Eureka1Eureka2
  • Colossal-AI的安装

    最近在学习stable diffusion model 但是这个模型成本比较高 作为低端学习者 借助colossal ai加速训练 即能满足显卡要求又能节约时间 Colossal AI 是一个集成的大规模深度学习系统 具有高效的并行化技术
  • 二叉树变成搜索二叉树

    给你一个普通的二叉树 把它变成搜索二叉树 要求不改变这个树的结构 例如 给你如下二叉树 10 2 7 8 4 结果是 8 4 10 2 7 思路 1 中序遍历该二叉树 把结果存在临时数组 arr 中 2 对 arr 进行排序 3 把 arr
  • C++(11):true_type, false_type

    true type和false type是integral constant实例化的别名 C 11 integral constant 风静如云的博客 CSDN博客 template
  • matlab机械手ikine函数,matlab机器人工具箱10.1(有函数说明)

    实例简介 机器人工具箱10 1版 有例子可以学习 希望对大家有所帮助 实例截图 核心代码 robot工具箱 V10 1有例子 robot工具箱10 1及例子 matlab robot V10 1工具箱 pdf rvctools common
  • OpenXml操作Word的一些操作总结.无word组件生成word.

    OpenXml相对于用MS提供的COM组件来生成WORD 有如下优势 1 相对于MS 的COM组件 因为版本带来的不兼容问题 及各种会生成WORD半途会崩溃的问题 2 对比填满一张30多页的WORD来说 包含图 表等 用COM组件来生成会占
  • 【笔记】AOE网与关键路径

    AOE网 关键路径 求关键路径的算法实现 AOE网是以边表示活动的有向无环网 在AOE网中 具有最大路径长度的路径称为关键路径 关键路径表示完成工程的最短工期 1 AOE网 AOE网是一个带权的有向无环图 其中用顶点表示事件 弧表示活动 权
  • PCL生成线段点云

    生成三角形 生成平行四边形 生成凸包 pcl 生成线段点云 pcl官方有生成球体 圆柱体 圆锥体的相关函数 似乎没有生成线段的函数 正好有需要 所以自己写了两个 分别是根据数量和步长生成 原理 原理很简单 已知两个三维点p1 p2 求出方向
  • vue中使用高德地图marker标记点的setLabel,在不同层级下控制显示隐藏

    vue中使用高德地图marker标记点的setLabel 在不同层级下控制显示隐藏 设置点标注的文本标签 marker setLabel offset new AMap Pixel 1 0 设置文本标注偏移量 content div nam
  • 全局获取Context的技巧(再也不要为获取Context而感到烦恼)

    前言 Android提供了一个Application类 每当应用程序启动的时候 系统就会自动将这个类进行初始化 而我们可以定制一个自己的Application类 以便管理程序内的一些全局状态信息 比如说全局Context 定制自己的Appl
  • SaaS与本地部署 路在何方?

    了解云计算的一定都听过四个 高大上 的概念 On Premises 本地部署 IaaS 基础设施及服务 PaaS 平台即服务 和SaaS 软件即服务 这几个术语并不好理解 ServiceHot 旗下现产品有 ServiceHot ITSOM
  • Issues with peer dependencies found

    peer dependencies 默认存在的依赖 通常在开发组件和插件的时候用到 表示这些依赖不用下载 项目的仓库里有 例子 package json peer dependencies react 问题背景 今天安装一些依赖 报了这个错
  • Linux驱动编程(分层分离编程思想)

    1 面向对象 字符设备驱动程序抽象出一个 file operations 结构体 我们写的程序针对硬件部分抽象出 led operations 结构体 2 分层 上层实现硬件无关的操作 比如注册字符设备驱动 leddrv c 下层实现硬件相