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

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

3天内不再提示

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

星星科技指导员 来源:ADI 作者:Mahesh Phalke 2023-06-16 10:30 次阅读

快速发展的技术需要软件支持(固件驱动程序和代码示例)来简化设计导入过程。本文介绍如何利用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驱动程序不需要修改就能跨多个平台复用。

wKgZomSLyxaAfiCOAAAf4nHOWPY188.png

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

使用no-OS驱动程序

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

wKgaomSLyTmAZnV3AACUyH2c3kQ915.jpg

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

wKgZomSLyTuARgrmAACbciVtjbQ847.jpg

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

精密转换器的no-OS驱动程序代码通常包含在两个以C编程语言编写的源文件中:adxxxx.cadxxxx.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_channeloversampling)是存在于同一头文件中的枚举,其包含这两个字段的所有可能值的数字常量,用户可以选择。

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

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

wKgaomSLyT6AAD1xAAFRHTLLxv0191.jpg

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

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

器件初始化结构。

设备驱动程序结构。

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

wKgZomSLyT-ACaqVAAC9ZMdtUqU541.jpg

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

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

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

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

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

wKgaomSLyUGAIbKLAAAytmDBKlc031.jpg

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

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

wKgZomSLyUKAAde6AAAqNFZZzhw072.jpg

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

wKgZomSLyyuAUWisAAB3ZchxdTc197.png

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

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

wKgaomSLyUWAY0sdAADc_gZC_JE208.jpg

图6.访问寄存器内容

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

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

平台驱动程序

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

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

wKgZomSLyUeACKB0AACmJSOXM9E152.jpg

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

使用平台驱动程序

平台驱动程序代码通常包含在以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和读/写数据。

wKgaomSLyUiAUVi0AAEYNjMc3nw954.jpg

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

wKgZomSLyUqAJzo-AACiP2Sb4Hs062.jpg

图9.SPI API或函数注意:增加的spi_init()和spi_write_and_read()代码是节略代码,为清楚起见而省略了细节。

wKgaomSLyUyAWhXcAAD-g4WS5Lg567.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编写)。

wKgZomSLyU6AZjDCAADhNeLjJ3U633.jpg

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

wKgaomSLyU-AJlnmAADFpsFGb8k891.jpg

图12.平台驱动程序差异

审核编辑:郭婷

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

    关注

    48

    文章

    7437

    浏览量

    150825
  • 转换器
    +关注

    关注

    27

    文章

    8600

    浏览量

    146677
  • 操作系统
    +关注

    关注

    37

    文章

    6672

    浏览量

    123127
收藏 人收藏

    评论

    相关推荐

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

    快速发展的技术需要软件支持(固件驱动程序和代码示例)来简化设计导入过程。本文介绍如何利用no-OS(无操作系统)驱动程序平台驱动程序来构建
    的头像 发表于 04-11 15:55 4332次阅读
    <b class='flag-5'>了解</b>和使用<b class='flag-5'>no-OS</b>及<b class='flag-5'>平台</b><b class='flag-5'>驱动程序</b>

    用WinDriver开发适合多平台的设备驱动程序

    WinDriver 是一套功能强大的驱动程序开发包。利用WinDriver 向导,可以生成针对自己设备的驱动程序框架,再使用VC 等编译器进行应用程序开发;适合多种平台,发布简单、方便
    发表于 04-16 10:06 21次下载

    用WinDriver开发适合多平台的设备驱动程序

    WinDriver 是一套功能强大的驱动程序开发包。利用WinDriver 向导,可以生成针对自己设备的驱动程序框架,再使用VC 等编译器进行应用程序开发;适合多种平台,发布简单、方便
    发表于 05-15 14:14 15次下载

    基于Windows NT平台的USB设备驱动程序开发

    介绍了 National Semiconductor 公司的USBN9603 /USBN9604 模块在Microsoft Windows NT 平台上PC 端USB设备驱动程序的开发过程以及该驱动程序的结构,并就与此相关的US
    发表于 09-10 16:29 43次下载

    HC6800的USB驱动程序

    HC6800的USB驱动程序HC6800的USB驱动程序HC6800的USB驱动程序HC6800的USB驱动程序HC6800的USB驱动程序
    发表于 12-28 15:28 0次下载

    Windows CE驱动程序开发

    驱动开发的几种基本模式,给出了如何使用单片驱动程序设计方法,提供了提供了平台特有设备驱动程序开发实例以及如何将驱动程序加人
    发表于 04-18 10:13 0次下载

    深入了解USB驱动之总线驱动程序

    总线驱动是不用改的,内核都帮我们做好了,为了了解整个USB驱动的体系,我们来分析一下总线驱动程序
    的头像 发表于 01-26 11:30 8762次阅读
    深入<b class='flag-5'>了解</b>USB<b class='flag-5'>驱动</b>之总线<b class='flag-5'>驱动程序</b>

    CDM20600驱动程序,USB驱动程序和并口驱动应用程序(免费下载)

    本文档的主要内容是CDM20600驱动程序,USB驱动程序和并口驱动应用程序(免费下载)详细资料概述
    发表于 06-06 10:00 57次下载
    CDM20600<b class='flag-5'>驱动程序</b>,USB<b class='flag-5'>驱动程序</b>和并口<b class='flag-5'>驱动</b>应用<b class='flag-5'>程序</b>(免费下载)

    Linux设备驱动程序平台驱动程序和字符驱动程序介绍

    了解Linux设备驱动程序的基础知识,重点介绍平台驱动程序和字符驱动程序。 提出了简单的平台
    的头像 发表于 11-27 06:32 4251次阅读

    如何为Linux编写用户空间设备驱动程序

    了解如何为Linux编写用户空间设备驱动程序。 用户空间驱动程序为某些设备提供内核空间驱动程序的替代方案
    的头像 发表于 11-22 07:04 3701次阅读

    Github: AD400x no-OS Drivers

    Github: AD400x no-OS Drivers
    发表于 01-28 02:16 9次下载
    Github: AD400x <b class='flag-5'>no-OS</b> Drivers

    No-OS Drivers

    No-OS Drivers
    发表于 02-20 13:02 0次下载
    <b class='flag-5'>No-OS</b> Drivers

    驱动程序开发步骤

    驱动程序开发步骤 编写一个驱动程序的大致流程如下: 1)查看原理图,数据手册,了解设备的操作方法; 2)在内核中找到相近的驱动程序,作为模板来开发,有时要从零开始; 3)实现
    发表于 12-29 14:51 6586次阅读

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

    ADI公司提供基于no-OS驱动程序的嵌入式固件示例来支持精密变换器。no-OS驱动程序负责器件配置、转换器数据采集、执行校准等,而基于no-OS
    的头像 发表于 04-12 14:29 1719次阅读
    <b class='flag-5'>no-OS</b>及<b class='flag-5'>平台</b><b class='flag-5'>驱动程序</b>的<b class='flag-5'>了解</b>和使用

    了解和使用无操作系统和平台驱动程序

    快速发展的技术需要软件支持(固件驱动程序和示例代码)来简化过程中的设计。本文介绍如何使用no-OS(无操作系统)驱动程序平台驱动程序,通过
    的头像 发表于 12-15 14:28 1153次阅读
    <b class='flag-5'>了解</b>和使用无操作系统和<b class='flag-5'>平台</b><b class='flag-5'>驱动程序</b>