UHD驱动分析初步
编程语言统计
- USRP驱动使用Verilog实现,在FPGA运行;
- 驱动接口及应用接口,大多使用C/C++暴露给OS及应用程序调用;
代码目录(一级)
├── 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);
接口调用方式指南
- 创建句柄
- 调用*_make(&句柄)函数
- 在程序结束前,需调用*_free(&句柄)函数释放内存,否则会引起内存泄露