Linux NFC 子系统剖析

1.总览

linux源码中NFC在net/nfc下,文件结构如下图:

hci:Host Controller Interface

主要是针对NFC的主机-控制器接口协议

 nci:NFC Controller Interface

主要是NFC的控制器接口协议,用于NFCC(NFC Controller)和DH(Device Host)之间

core.c:

NFC子系统的核心,NFC整个协议栈从这里加载到内核中

af_nfc.c:Address Family

注册NFC协议族

digital_core.c、digital_dep.c、digital_technology.c:

NFC数字协议(NFC Digital Protocol)的协议栈实现

llcp_core.c、llcp_sock.c、llcp_commands.c:

NFC的逻辑链路控制协议(Logical Link Control Protocol)实现

netlink.c:

NFC的Generic netlink相关实现

rawsock.c:

NFC的raw sock相关实现

它们分别在NFC系统中实现了哪些功能?请看下图:

NFC驱动开发:

最底层一共三种方式:

1.直接通过NFC核心驱动框架开发

2.通过HCI接口驱动框架开发

3.通过NCI接口驱动框架开发

这三种方式最终还是通过核心驱动框架与应用层通信,通信的方式有generic netlink、rawsock。如果是llcp,那还会通过rawsock_llcp与应用层交互。

其中generic netlink主要是交互一些命令与事件,比如应用层向驱动层发送开始寻卡命令,寻找到卡后,驱动层会发送寻找到目标的事件。而rawsock主要是数据交互,比如向卡内写数据、读取卡内数据等。

NFC的应用开发:

1.通过dbus获取NFC相关事件

2.通过AF_NFC Sockets与内核交互数据

3.通过Neard AL与驱动层交互(本质还是generic netlink)

其实由驱动也可以看出来,Neard作为应用层的一个守护进程并不是必须的。

2.代码分析

nfc_init

nfc协议栈的起点是 nfc_init 函数,它被subsys_initcall调用后加载。

这个函数包含了nfc协议栈的所有初始化:

nfc类的注册不再赘述,注册成功后会有/sys/class/nfc目录。

nfc_genl_init

nfc_genl_init用来注册nfc的netlink接口:

这中间最重要的是变量 nfc_genl_family ,它包含了使用netlink实现的功能。它包含了两个最重要的元素:

其中name是用来匹配此协议簇,当我们在应用层与之匹配时,需要指明name是nfc,这样就能匹配成功。其次就是匹配成功后该协议簇所支持的一系列操作:

这些操作对应了我们驱动需要实现的功能。在内核有关nfc subsystem的说明文档中有提到:

也就是start_poll 、stop_poll 、activate_target 、deactivate_target 、data_exchange 这些操作是nfc子系统必须实现的,它们的含义:

start_poll :启动设备开始轮询目标

stop_poll :停止轮询操作

activate_target :选择和初始化其中一个发现的目标

deactivate_target :取消选择和恢复初始化目标

data_exchange :发送数据和接收应答

而这些我们需要实现的操作都被 nfc_genl_ops 中不同指令所对应的操作调用。比如start_poll:

上图中的info会由应用层指定,主要就是确定是哪个发起者开始轮询,毕竟系统中可能存在多个发起者。真正的启动轮询函数如下:

上图中的ops是重点,我们编写的驱动中实现的start_poll在这里被调用。对ops的赋值在函数 nfc_allocate_device 中,从函数名也可以看出是用来申请nfc device的,我们的驱动中需要使用此函数申请nfc_dev设备,申请的时候必须传入ops操作合集:

根据上述描述我们已经了解了用户层是如何通过generic netlink的CMD来操作不同设备寻卡、激活卡的,那寻找到卡后怎么通知到应用层?该调用哪些API呢?

很简单在include/uapi/linux/nfc.h中有枚举类型 nfc_commands ,里面包含了所有genl的CMD和事件,我们在net/nfc/netlink.c中搜索 NFC_EVENT_ 前缀的宏定义即可找到对应的函数,比如添加了一个device:

可以看到这个函数主要功能就是广播一条内容为 NFC_EVENT_DEVICE_ADDED 的事件,这个函数只在 nfc_register_device 函数中被调用,所以申请完nfc device后,我们还要调用这个函数注册设备。

所以我们只需要关注我们需要发送哪些事件,即可知道需要调用哪几个函数:

Tips--这里解释一些缩写: 

TM:Target mode

LLC:Logic Link Control,逻辑链路控制,用于P2P模式

SE:Secure Element,安全单元,通常用于CE模式

rawsock_init

该函数用于注册新协议注册。

不用关心如何注册,我们只需要关注下面的变量:

这中间最重要的是 rawsock_ops 和 rawsock_raw_ops 操作函数合集。

当应用层使用下面的操作创建sock时:

socket(AF_NFC, SOCK_SEQPACKET, NFC_SOCKPROTO_RAW)

对应的各个操作函数就是 rawsock_ops了。然后通信的时候先connect,再send/recv。在connect的时候,根据传入的addr中的设备ID和目标ID,确定通过哪个发起者和哪张卡通信。

其中发送函数先把需要发送的数据放在队列里,然后使用tx工作队列:

在创建rawsock的时候,指定了tx_work的执行函数:

传输的关键就在于nfc_data_exchange 函数:

上述 im_transceive 函数也是注册nfc_dev的时候传入的操作函数。 

特定名词

NFC(Near Filed Communication) 近场通信

R/W MOD 读写模式

CE MOD(Card Emulation Mod) 卡仿真模式

P2P MOD 点对点模式

PCD(VCD) 近(疏)耦合设备

PICC(VICC) 近(疏)IC卡

LLCP 逻辑链路控制协议

RF 射频

RFID 设备识别

NDEP NFC数据交换协议

NFCIP NFC接口和协议

NDEF NFC数据交换格式

DEP 数据交换协议

SNEP 简单NDEF交换协议

CHP(Connection Handover Protocol) 连接切换协议

WUPA 唤醒A类卡

ATQ 对请求的应答

ATQA 对A型卡请求的应答

ATQB 对B型卡请求的应答

ATR 对重新启动的请求的应答

ATS 对选择请求的应答

ATQ-ID 对ID号请求的应答

CRC 环检验码

RATS 对选择应答请求

PPS 协议和参数的选择

REQA 对A型卡的请求

REQB 对B型卡的请求

REQ-ID 请求ID号

RESEL 重新选择的请求

文章推荐:

LINUX NFC SUBSYSTM | SVEN

http://t.csdnimg.cn/zN4a2

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EAP-TLS实验之H3C MSR2600-10-X1配置相关

H3C MSR2600充当802.1x流程中的NAS(Network Access System)角色,一般负责实际待验证的设备与认证服务器之间沟通的桥梁(当然也可以配置成认证服务器角色)工作。在挑选购买支持802.1x的路由器或交换机时需要跟厂家明确是…

【python基础学习08课_函数的嵌套、内置函数等】

一、函数 1、函数的注释 1)如何写注释 """ 函数的注释 -- 说明这个函数的作用,以及参数的诠释"""三个引号之间可以注释例如:这是一段注释"""这是一段注释""" 2)如…

SVN教程-SVN的基本使用

SVN(Apache Subversion)是一款强大的集中式版本控制系统,它在软件开发项目中扮演着至关重要的角色,用于有效地跟踪、记录和管理代码的演变过程。与分布式系统相比,SVN 的集中式架构使得团队能够更加协同地进行开发&…

计算机网络之应用层

域名由点和标号(label)组成, 点分割的即是标号每个标号不超过63个字符,总计不超过255个字符, 并且不区分大小写顶级域名TLD(Top Level Domain)分为三类, 国家顶级域名nTLD, 通用顶级域名gTLD, 基础结构域名ID(Infrastructure Domain). 基础结构域名只有一个即 arpa. 用于反向域…

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…

Docker部署前后端服务示例

使用Docker部署js前端 1.创建Dockerfile 在项目跟目录下创建Dockerfile文件: # 使用nginx作为基础镜像 FROM nginx:1.19.1# 指定工作空间 WORKDIR /data/web# 将 yarn build 打包后的build文件夹添加到工作空间 ADD build build# 将项目必要文件添加到工作空间&a…

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈,IPD流程是一种高度结构化的产品开发流程,它集成了业界很多优秀的产品开发方法论,像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点,对全流程的IPD进行合适的裁剪…

【Python】FastAPI 项目创建 与 Docker 部署

文章目录 前言&需求描述1. 本地FastAPI1.1 Python 环境准备1.2 本地 Pycharm 创建FastAPI项目 2. Python FastAPI 部署2.1 服务器配置Python环境2.2.1 下载与配置Git、Pyenv等工具2.2.2 下载与配置Python 2.2 FastAPI 打包成镜像2.2.1 项目准备所需环境文件2.2.2 编写Docke…

【MATLAB】ICEEMDAN_ MFE_SVM_LSTM 神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 ICEEMDAN是指“改进的完全扩展经验模态分解与自适应噪声”(Improved Complete Ensemble Empirical Mode Decomposition with Adaptive Noise),它是CEEM…

行为树入门:BehaviorTree.CPP Groot2练习(叶子节点)(2)

以《行为树BehaviorTree学习记录1_基本概念》练习。 1 SequenceNode顺序控制节点 代码下载 git clone https://gitee.com/Luweizhiyuan2020/ros2_bt.git例程 1.1 sequence 顺序执行 下载版本SequenceNode1。 1.2 ReactiveSequence 异步执行 注意: ①only a…

金三银四面试必问:Redis真的是单线程吗?

文章目录 01 Redis中的多线程1)redis-server:2)jemalloc_bg_thd3)bio_xxx: 02 I/O多线程03 Redis中的多进程04 结论▼延伸阅读 由面试题“Redis是否为单线程”引发的思考 作者:李乐 来源:IT阅读…

工业锅炉物联网:HiWoo Cloud为工业能源转型注入新动力

随着全球工业化的快速发展,工业锅炉作为工业生产的“心脏”,其能源效率和运行安全性越来越受到关注。然而,传统的工业锅炉管理往往依赖于人工监控和定期维护,这种方式不仅效率低下,而且难以确保设备的持续高效运行。在…

WebServer -- 日志系统(下)

目录 🌼整体思路 🎂基础API fputs 可变参数宏 __VA_ARGS__ fflush 🚩流程图与日志类定义 流程图 日志类定义 🌼功能实现 生成日志文件 && 判断写入方式 日志分级与分文件 🌼整体思路 日志系统分两部…

Figma 最新版下载:无需激活码,轻松安装!

从事设计工作,怎么能没有设计工具呢?我相信许多设计师也必须使用Figma这样的软件,真的可以让我们的设计工作更有效率,但我相信你也发现Figma属于外国软件,自然语言也是英语,直到现在没有中文版本&#xff0…

【Kubernetes】安装K3S

目录 前言一、原理单体架构高可用架构 二、初始化1.配置yum源2.关掉防火墙3.关掉selinux4. 修改内核参数5.关掉swap交换分区 三、安装master节点1. 安装container2.启动master服务 四、安装node节点五、卸载六、总结 前言 各位小伙伴们,大家好,小涛又来…

自定义神经网络四之编写自定义神经网络

文章目录 前言神经网络组件代码整体的项目结构Tensor张量Layers层NeuralNet神经网络Loss损失函数Optim优化器data数据处理train训练 神经网络解决实际问题实际问题训练和推理代码 总结 前言 自定义神经网络一之Tensor和神经网络 自定义神经网络二之模型训练推理 自定义神经网络…

关于电脑一天24小时多少度电电脑的一天用电量计算

随着这几年物价的上涨,一些地区的电价越来越高,而我们经常需要使用电脑,那么一台电脑一天24小时用多少度电呢? 如何计算电脑一天的用电量? 让我们跟随小编来了解更多吧。 1、功耗、主机箱功耗 现在的计算机中&#xf…

(Linux学习一):Mac安装vmWare11.5,centOS 7安装步骤教程

一。下载vmware 官网地址:下载地址 由于我的电脑系统是Mac 10.15.6版本系统,我下载的是VMware Fusion 11.5版本,13是最新版本不支持安装需要系统在11以上。 百度网盘下载地址: VMware Fusion 11 VMware Fusion 12 VMware Fusion 13 下载需要…

插值、逼近、拟合、光顺

插值 插值(Interpolation)是数学和计算科学中的一个重要概念,它指的是通过已知的一系列数据点,构造一个函数或曲线,并据此估计未知数据点的值。这个过程通常发生在已知数据点之间,用于预测或估算在这些已知…

Android Duplicate class 排除重复类

一、起因: 在迭代开发的时候,发现2个ijk很多类重复。但又2个库实现的功能是不一样,目前不能合并。但又想保留2个功能。需要排除其中一个库。 二、报错如何下图: 三、解决方法: 3.1 在terminal 也就是命令行处输入 …