UHD驱动分析(一):编程语言与API层次分析

796 阅读1分钟

UHD驱动分析初步

编程语言统计

  • USRP驱动使用Verilog实现,在FPGA运行;
  • 驱动接口及应用接口,大多使用C/C++暴露给OS及应用程序调用;

image.png

代码目录(一级)

├── CHANGELOG
├── CODING.md
├── CONTRIBUTING.md
├── firmware
├── fpga-src           //语法主要为Verilog,对于usrp硬件操作
├── host               //语法主要为C++,对调用者提供接口
├── images
├── LICENSE.md
├── mpm
├── README.md
├── tags
└── tools

API接口层次

The device API (Low-Level / 驱动接口)

/* 驱动级接口,面向Host系统提供抽象类,提供硬件抽象级别的方法 */
uhd::device      /host/include/uhd/device.hpp
  • 对系统提供硬件抽象(目标用户为OS,提供驱动能力)
    • 发现设备 Discover devices
    • 创建软件设备对象 Create a device object
    • 注册设备驱动 Register a device driver
test@radio38:~/Desktop/uhd-3.15.0.0$ uhd_
uhd_cal_rx_iq_balance  uhd_config_info        uhd_image_loader       uhd_rx_nogui           uhd_usrp_probe         
uhd_cal_tx_dc_offset   uhd_fft                uhd_images_downloader  uhd_siggen             
uhd_cal_tx_iq_balance  uhd_find_devices       uhd_rx_cfile           uhd_siggen_gui   
  • 系统通过命令调用device API

The C API (High-Level / 应用接口)

/* 头文件引用方式 */
#include <uhd.h>    /host/include/uhd.h
  • 对Host业务提供标准功能接口API(目标用户为应用程序,例srsRAN)
    • 大多数在C语言中可以访问到的UHD类都是通过句柄(handle)来实现的
    • 所有句柄的使用都关联_make()和_free()函数
/* 接口调用方式 */
uhd_rx_metadata_handle md;
uhd_rx_metadata_make(&md);

// Streaming here puts useful information into metadata
int64_t full_secs;
double frac_secs;
uhd_rx_metadata_time_spec(md, &full_secs, &frac_secs);

uhd_rx_metadata_free(&md);

接口调用方式指南

  1. 创建句柄
  2. 调用*_make(&句柄)函数
  3. 在程序结束前,需调用*_free(&句柄)函数释放内存,否则会引起内存泄露