0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

no-OS及平台驱动程序的了解和使用

微云疏影 来源:ADI 作者:ADI 2022-04-12 14:29 次阅读

快速发展的技术需要软件支持(固件驱动程序和代码示例)来简化设计导入过程。本文介绍如何利用no-OS(无操作系统)驱动程序和平台驱动程序来构建ADI公司精密模数转换器数模转换器的应用固件,这些器件在速度、功耗、尺寸和分辨率方面提供高水平的性能。

ADI公司提供基于no-OS驱动程序的嵌入式固件示例来支持精密变换器。no-OS驱动程序负责器件配置、转换器数据采集、执行校准等,而基于no-OS驱动程序的固件示例则便于将数据传输到主机进行显示、存储和进一步处理。

no-OS和平台驱动程序简介

顾名思义,no-OS驱动程序设计用于通用(或无特定)操作系统。该名称还意味着这些驱动程序可以用在没有任何OS支持的裸机(BareMetal)系统上。no-OS驱动程序旨在为给定精密转换器的数字接口访问提供高级API。no-OS驱动程序使用器件的这些API接口访问、配置、读取、写入数据,而无需知道寄存器地址(存储器映射)及其内容。

no-OS驱动程序利用平台驱动程序层来支持跨多个硬件/软件平台复用相同的no-OS驱动程序,使固件高度可移植。平台驱动程序层的使用将no-OS驱动程序隔绝开来,后者无需知道平台特定接口(如SPI、I2C、GPIO等)的低级细节,因此no-OS驱动程序不需要修改就能跨多个平台复用。

poYBAGJVHGWAKAETAABC-YEmmMs388.jpg

图1.精密转换器固件协议栈

使用no-OS驱动程序

图2显示了no-OS驱动程序的典型代码结构。

pYYBAGJVHGWAKKmoAABOxRt7JJA320.jpg

图2.no-OS驱动程序代码结构

poYBAGJVHGWAb1iuAABNRtCvkX8998.jpg

图3.器件配置枚举、结构和API

精密转换器的no-OS驱动程序代码通常包含在两个以C编程语言编写的源文件中:adxxxx.c和adxxxx.h,其中xxxx代表器件名称(例如AD7606、AD7124等)。器件头文件(adxxxx.h)包含器件特定结构、枚举、寄存器地址和位掩码的公共编程接口,将此文件包含到所需的源文件中便可使用这些公开访问接口。器件源文件(adxxxx.c)包含接口的实现,用于初始化和移除器件、读/写器件寄存器、从器件读取数据、获取/设置器件特定参数等。

典型的no-OS驱动程序围绕一组常见功能来构建:

►器件特定寄存器地址、位掩码宏、器件配置枚举、读/写器件特定参数(如过采样、增益、基准电压等)的结构的声明。

►通过no-OS驱动程序的器件初始化/移除函数以及器件特定的初始化和驱动程序结构与描述符初始化物理器件/解除器件初始化。

►使用器件寄存器读/写函数访问器件存储器映射或寄存器详细信息,例如adxxxx_read_register()或adxxxx_write_register()。

no-OS驱动程序代码使用

使用器件特定地址、位掩码、参数配置枚举和结构:

如前所述,adxxxx.h头文件包含所有器件特定枚举和结构的声明,这些枚举和结构被传递到器件特定的函数或API以配置或访问器件参数。具体情况如图3所示。

图3中显示的adxxxx_config结构允许用户选择多路复用器通道并为其设置过采样率。此结构的成员(afe_mux_channel和oversampling)是存在于同一头文件中的枚举,其包含这两个字段的所有可能值的数字常量,用户可以选择。

adxxxx.c文件中定义的adxxxx_set_adc_config()函数通过配置结构获取用户传递的配置/参数,并进一步调用adxxxx_spi_reg_write()函数,通过数字接口(在上例中是SPI)将数据写入ADXXXX_REG_CONFIG器件寄存器。

使用no-OS驱动程序结构和初始化函数初始化器件:

pYYBAGJVHGWAZx2tAABL2bYDErw095.jpg

图4.器件初始化和驱动程序结构的声明

除了器件配置枚举和结构之外,no-OS驱动程序还提供以下两个结构:

►器件初始化结构。

►设备驱动程序结构。

器件初始化结构允许用户在用户应用程序代码中定义器件特定的参数和配置。初始化结构包含其他器件特定的参数结构和枚举的成员。图5显示了器件初始化结构的定义。

器件驱动程序结构通过器件初始化函数adxxxx_init()加载器件初始化参数。器件驱动程序结构是在运行时(动态)从堆空间中分配内存。器件驱动程序结构和器件初始化结构中声明的参数几乎完全相同。器件驱动程序结构是器件初始化结构的运行时版本。

以下步骤说明典型的器件初始化函数和初始化流程:

►第1步:在应用程序中创建器件初始化结构的定义(或实例)(例如struct adxxxx_init_params),以初始化用户特定的器件参数和平台相关的驱动程序参数。参数在编译期间定义。

注意:初始化结构中定义的参数因器件而异。

poYBAGJVHGWAcvjwAAAQnW7dm7I922.jpg

►第2步:在应用程序代码中创建器件驱动程序结构的指针实例(变量)。

用户应用程序需要创建器件驱动程序结构的单个指针实例。将此实例传递给所有no-OS驱动程序API/函数以访问器件特定参数。应用程序代码中定义的此指针实例指向堆中动态分配的内存,这是通过no-OS驱动程序中定义的器件初始化函数(如adxxxx_init())完成的。

pYYBAGJVHGWAWlyaAAASbpghT_4661.jpg

►第3步:调用器件初始化函数以初始化器件和其他平台特定的外设。

pYYBAGJVHGWAJUOJAAAsT4pHePE463.jpg

no-OS驱动程序中定义的adxxxx_init()函数用adxxx_init_param结构传递的用户特定参数初始化器件。器件驱动程序结构的指针实例和器件初始化结构的实例作为两个参数传递给此初始化函数。用户应用程序代码可以多次调用adxxxx_init()函数,只要调用初始化函数之后再调用器件移除函数来平衡。

通过器件寄存器读/写函数访问存储器映射(寄存器内容)如图6所示

用户可以通过no-OS驱动程序器件特定的adxxx_read/write()函数访问器件寄存器内容(例如产品ID、暂存区值、OSR等)。

大多数情况下,用户不会直接使用寄存器访问函数。器件特定的函数通过这些寄存器访问函数(如adxxxx_spi_reg_read/write())来调用。如果可能,建议使用器件配置和状态API来访问器件存储器映射,而不要使用直接寄存器访问函数,因为这样能确保器件驱动程序结构与器件中的配置保持同步。

平台驱动程序

平台驱动程序是包装平台特定API的硬件抽象层(HAL)之一。它们由no-OS器件驱动程序或用户应用程序代码调用,使后者可以独立于底层硬件和软件平台。平台驱动程序包装了平台特定的低级硬件功能,例如SPI/I2C初始化和读/写、GPIO初始化和读/写、UART初始化和接收/发送、用户特定的延迟、中断等。

poYBAGJVHGWAHsrcAABAc03-L9Q171.jpg

图5.用户应用程序中的器件初始化结构定义

pYYBAGJVHGWANg5NAAA3XhKTKaU502.jpg

图6.访问寄存器内容

SPI平台驱动程序模块的典型文件结构如图7所示。

使用平台驱动程序

平台驱动程序代码通常包含在以C/C++编程语言编写的三个源文件中。

1) spi.h:这是一个与平台无关的文件,包含SPI功能所需的器件结构和枚举。此头文件中定义的C编程接口没有平台依赖性。

初始化和器件结构中声明的所有参数对任何平台上的SPI接口都是通用的。

器件初始化结构中使用的void *extra参数允许用户传递额外的参数,这些参数可以是所用平台特定的。

SPI驱动程序结构和SPI初始化结构中声明的参数几乎完全相同。SPI驱动程序结构是SPI初始化结构的运行时版本。

2) spi.cpp/.c:此文件包含spi.h文件中声明的函数的实现,这些函数用于初始化特定平台的SPI外设以及读/写数据。广义的“平台”是指硬件微控制器(目标器件)和软件(如RTOS或Mbed-OS)的组合。此文件依赖于平台,移植到其他平台时需要修改。

图9详细说明了Mbed平台的SPI接口,并显示了如何使用这些接口和器件初始化/驱动程序结构来初始化SPI和读/写数据。

poYBAGJVHGWAfkn2AAA5o9vQyC0051.jpg

图7.SPI平台驱动程序代码结构

pYYBAGJVHGaAbiGeAAA9ZVL9Tz0942.jpg

图8.SPI初始化和驱动程序结构

poYBAGJVHGaAMdOkAABH4mQQqJw347.jpg

图9.SPI API或函数注意:增加的spi_init()和spi_write_and_read()代码是节略代码,

为清楚起见而省略了细节。

pYYBAGJVHGaAbYy_AAA6OndrnWk685.jpg

图10.SPI额外的初始化和驱动程序结构

3) spi_extra.h:此文件包含其他器件结构或枚举,其特定于给定平台。它允许用户应用程序代码提供通用spi.h文件中未涉及的配置。例如,SPI引脚可能随平台而异,因此可以作为这些平台特定的额外结构的一部分添加。

移植平台驱动程序

平台驱动程序可以从一个平台(微控制器)移植到另一个平台;若要移植,通常需要创建平台特定的.cpp/.c和_extra.h文件。平台驱动程序驻留在微控制器单元供应商提供的器件特定硬件抽象层(HAL)之上的一层。因此,为将平台驱动程序从一个平台移植到另一个平台,与调用供应商提供的HAL中存在的函数或API相关的平台驱动程序代码需要做一些细微改动。

图12区分了基于Mbed的SPI平台驱动程序和ADuCM410 SPI平台驱动程序。

ADI no-OS存储库和平台驱动程序的GitHub源代码链接可在ADI公司Wiki和GitHub页面上找到。

为no-OS驱动程序做贡献

ADI no-OS驱动程序已开源并托管在GitHub上。驱动程序不仅支持精密转换器,也支持许多其他ADI产品,如加速度计、收发器光电器件等。任何熟悉源代码的人都可以为这些驱动程序做贡献,方式是提交变更和创建拉取请求来审核这些变更。

有许多示例项目可以在Linux和/或Windows环境中运行。许多示例项目是用硬件描述性语言(HDL)开发的,以便在Xilinx®、Intel®等公司开发的FPGA以及由不同供应商开发的目标处理器上运行。

如需无操作系统的系统的no-OS软件驱动程序(用C编写),请访问ADI公司no-OS GitHub存储库。

ADI公司Wiki页面提供了使用Mbed和ADuCMxxx平台为精密转换器开发的示例。

poYBAGJVHGaAHA3BAABvio1saXQ195.jpg

图11.Mbed平台特定的SPI初始化实现

pYYBAGJVHGaATCyfAABeE33tMj8987.jpg

图12.平台驱动程序差异

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    8621

    浏览量

    146828
  • 数据采集
    +关注

    关注

    38

    文章

    5898

    浏览量

    113503
  • 驱动程序
    +关注

    关注

    19

    文章

    823

    浏览量

    47948
收藏 人收藏

    评论

    相关推荐

    pcie设备驱动程序安装步骤

    PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,用于计算机内部硬件组件之间的连接。安装PCIe设备驱动程序是确保硬件
    的头像 发表于 11-13 10:32 179次阅读

    arduino 6轴同步电机驱动程序

    arduino 6轴同步电机驱动程序。含加加减速。
    发表于 11-09 14:09 0次下载

    TSC2003 WinCE 5.0驱动程序

    电子发烧友网站提供《TSC2003 WinCE 5.0驱动程序.pdf》资料免费下载
    发表于 10-23 10:33 0次下载
    TSC2003 WinCE 5.0<b class='flag-5'>驱动程序</b>

    硬盘电机怎么驱动程序?它有什么典型特征?

    硬盘电机的驱动程序是硬盘中一个非常重要的组成部分,它负责控制硬盘电机的启动、停止、转速调节等操作。硬盘电机驱动程序的设计和实现涉及到电机控制理论、电子技术、计算机编程等多个领域的知识。 一、硬盘电机
    的头像 发表于 10-22 11:10 192次阅读

    LSP 2.10 DaVinci Linux驱动程序

    电子发烧友网站提供《LSP 2.10 DaVinci Linux驱动程序.pdf》资料免费下载
    发表于 10-09 09:30 0次下载
    LSP 2.10 DaVinci Linux<b class='flag-5'>驱动程序</b>

    Linux设备驱动程序分类有哪些

    Linux设备驱动程序是操作系统与硬件设备之间的桥梁,负责实现硬件设备与操作系统之间的通信和控制。Linux设备驱动程序的分类繁多,可以根据不同的标准进行分类。 按硬件类型分类 Linux设备
    的头像 发表于 08-30 15:11 424次阅读

    linux驱动程序如何加载进内核

    ,需要了解Linux内核的基本概念和API。以下是一些关键概念: 1.1 内核模块:Linux内核模块是一种动态加载和卸载的代码,可以在不重新启动系统的情况下加载和卸载。驱动程序通常以内核模块的形式实现。 1.2 设备模型:Linux内核使用设备模型来管理设
    的头像 发表于 08-30 15:02 369次阅读

    linux驱动程序主要有哪些功能

    Linux驱动程序是操作系统与硬件设备之间进行通信的桥梁,负责实现硬件设备与操作系统之间的数据交换和控制。Linux驱动程序的主要功能包括以下几个方面: 设备识别与初始化 Linux驱动程序需要
    的头像 发表于 08-30 14:47 281次阅读

    linux驱动程序的编译方法是什么

    Linux驱动程序的编译方法主要包括两种: 与内核一起编译 和 编译成独立的内核模块 。以下是对这两种方法的介绍: 一、与内核一起编译 与内核一起编译意味着将驱动程序的源代码直接集成到Linux内核
    的头像 发表于 08-30 14:46 406次阅读

    linux驱动程序运行在什么空间

    Linux 驱动程序是操作系统的一部分,负责管理硬件设备与操作系统之间的交互。驱动程序运行在内核空间(Kernel Space),这是操作系统的核心部分,与用户空间(User Space)相对。内核
    的头像 发表于 08-30 14:37 298次阅读

    虹科技术 Linux环境再升级:PLIN驱动程序正式发布

    Linux驱动程序领域再添新成员,PLIN驱动程序现已正式发布。
    的头像 发表于 06-28 13:34 332次阅读
    虹科技术 Linux环境再升级:PLIN<b class='flag-5'>驱动程序</b>正式发布

    怎么编写Framebuffer驱动程序

    Framebuffer 驱动程序框架 分为上下两层: fbmem.c:承上启下 实现、注册 file_operations 结构体 把 APP 的调用向下转发到具体的硬件驱动程序
    的头像 发表于 03-22 09:13 513次阅读
    怎么编写Framebuffer<b class='flag-5'>驱动程序</b>

    ch341a驱动程序无法使用

    随着计算机技术的不断发展,各种外部设备的驱动程序成为了保证硬件正常工作的重要一环。然而,有时我们可能会遇到ch341a驱动程序无法使用的问题。本文将详细解释该问题的原因,并提供详实、细致的解决方法
    的头像 发表于 12-26 14:17 3763次阅读

    XL2515驱动程序

    IO模拟XL2515驱动程序
    发表于 12-11 14:39 25次下载

    linux驱动程序的主要流程和功能

    驱动程序是用于控制和管理硬件设备的软件模块,它主要负责与设备进行交互,通过操作设备的寄存器和接口,实现对硬件的控制和访问。在Linux系统中,驱动程序是实现与硬件设备交互的一个关键部分。本文将详细
    的头像 发表于 12-08 14:56 2218次阅读