8.2.5 NCI原理

最后更新于:2022-04-02 06:05:39

NCI(NFC Controller Interface)是NFC Forum于2012年制定的一个规范,其主要关注点为DH(Device Host,主机设备)如何控制并与NFCC(NFC Controller)交互。图8-23所示为NFCC、NCI和DH三者之间的关系。 :-: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/4dabf9728466a16a3bec469c0116b65b_1137x582.jpg) 图8-23 NFCC、NCI和DH三者之间的关系 在图8-23中,NFCC和DH通过物理连线相连,物理连线对应为Transport Layer(传输层)。目前,NFCC和DH在传输层这一块支持SPI、I2C、UART和USB等。在图右边的DH中,所有和NFC相关的应用程序都可被视为DH-NFCEE(EE是Execution Environment的缩写)。图左边有一个NFCEE模块,该模块也可运行着一些和NFC相关的程序或系统(以图8-21为例,它的SmartMX Secure Element就是此处所说的EE)。NFCEE模块可直接集成在NFCC中,也可作为单独的芯片模块通过物理连线与NFCC相连。NCI负责处理DH和NFCC之间的交互。NCI包含多个模块,详情见下文。图8-24所示为NCI的模块结构。 :-: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/7a6676fb41d4fc9f54a5ffa672db1401_857x682.jpg) 图8-24 NCI模块结构 - NCI Core模块负责DH和NFCC之间交互的基本功能,包括控制消息(Control Message)和数据消息(Data Message)的传递、DH初始化、重置和配置NFCC等。 - Transport Mapping用于在NFC Core和传输层之间转换数据格式,例如将NCI Core使用的控制消息和数据消息转换成对应传输层使用的数据格式。 - NCI Module包含多个功能模块,例如RF Discovery模块用于搜索周围的其他NFC Device、RF Interface用于和对端的NFC Device交互。 使用NCI的NFC Device中,DH和NCI的工作原理如图8-25所示。 :-: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/1a04456ea86b8d95a21f1c9fc219ceee_719x643.jpg) 图8-25 NCI工作原理 图8-25中: * DH通过NCI规范定义的Control Message来控制NFCC。目前规范定义的Control Message包括Commands(请求命令,包括初始化NFCC、重置NFCC、设置NFCC配置参数等)、Responses(回复)和Notifications(通知)。这些Message都封装在NCI Control Packages中。其中,Commands只能由DH发送给NFCC。 * DH通过RF Interface和对端NFC设备(图中的Remote NFC Endpoint)交互,也可通过NFCEE Interface和本设备的NFCEE交互。交互数据包括Control Message和Data Message。 NCI规范一共有140多页,是NFC Forum众多规范中比较复杂的一个。根据笔者的理解,NCI的一个很重要的作用就是统一Android中NFC HAL层的实现,即通过一套标准的方法来实现对NFCC的控制以及数据交互。不过,由于NCI规范推出的时间比较晚(该协议最终版的时间为2012年11月6日),所以占据最大市场份额的NXP公司在其Android平台的NFC HAL层中还没 有使用NCI。 >[info] 提示 8.4节将专门讨论Android平台中NFC HAL层的实现状况。从Android 4.2的代码来看,NXP公司使用了自己的一套NFC HAL层实现方式,而博通公司的NFC HAL层的实现参考了NCI规范。但实际上这两家公司NFC HAL层的代码处处透露着它们与特定芯片的紧密关系,这使不了解芯片细节的读者很难真正看懂NFC HAL层的代码。随着NFC的重要性和普及程度日益加大,开发者已经在Linux Kernel 3.8[21]中增加了一个名为NFC的子系统,它使得以后的NFC HAL层只需通过netlink消息就可和位于Kernel空间的NFC驱动交互。因目前NFC HAL层这些被不同芯片所“绑架”的代码就可从用户空间移除,而那些和芯片相关的代码就可通过NFC驱动的形式运行在Kernel之内。
';