用於 FPGA 程式設計的核心 API¶
概述¶
用於 FPGA 程式設計的核心 API 是 FPGA 管理器、橋和區域的 API 的組合。用於觸發 FPGA 程式設計的實際函式是 fpga_region_program_fpga()。
fpga_region_program_fpga() 使用 FPGA 管理器和橋提供的功能。它將
鎖定區域的互斥鎖
鎖定區域的 FPGA 管理器的互斥鎖
如果已指定一種方法來構建 FPGA 橋列表
停用橋
使用在
fpga_region->info中傳遞的資訊來程式設計 FPGA。重新啟用橋
釋放鎖
struct fpga_image_info 指定要程式設計的 FPGA 映象。它由 fpga_image_info_alloc() 分配/釋放,並使用 fpga_image_info_free() 釋放
如何使用區域程式設計 FPGA¶
當 FPGA 區域驅動程式探測時,它被賦予一個指向 FPGA 管理器驅動程式的指標,因此它知道要使用哪個管理器。該區域要麼有一個在程式設計期間要控制的橋列表,要麼有一個指向將生成該列表的函式的指標。以下是一些示例程式碼,說明下一步該怎麼做
#include <linux/fpga/fpga-mgr.h>
#include <linux/fpga/fpga-region.h>
struct fpga_image_info *info;
int ret;
/*
* First, alloc the struct with information about the FPGA image to
* program.
*/
info = fpga_image_info_alloc(dev);
if (!info)
return -ENOMEM;
/* Set flags as needed, such as: */
info->flags = FPGA_MGR_PARTIAL_RECONFIG;
/*
* Indicate where the FPGA image is. This is pseudo-code; you're
* going to use one of these three.
*/
if (image is in a scatter gather table) {
info->sgt = [your scatter gather table]
} else if (image is in a buffer) {
info->buf = [your image buffer]
info->count = [image buffer size]
} else if (image is in a firmware file) {
info->firmware_name = devm_kstrdup(dev, firmware_name,
GFP_KERNEL);
}
/* Add info to region and do the programming */
region->info = info;
ret = fpga_region_program_fpga(region);
/* Deallocate the image info if you're done with it */
region->info = NULL;
fpga_image_info_free(info);
if (ret)
return ret;
/* Now enumerate whatever hardware has appeared in the FPGA. */
用於程式設計 FPGA 的 API¶
fpga_region_program_fpga()- 程式設計 FPGAfpga_image_info()- 指定要程式設計的 FPGA 映象fpga_image_info_alloc()- 分配 FPGA 映象資訊結構fpga_image_info_free()- 釋放 FPGA 映象資訊結構
-
intfpga_region_program_fpga(structfpga_region*region)¶ 程式設計 FPGA
引數
struct fpga_region *regionFPGA 區域
描述
使用 FPGA 映象資訊 (region->info) 程式設計 FPGA。如果該區域具有 get_bridges 函式,則如果程式設計成功,將保持對橋的獨佔引用。這旨在防止重新程式設計區域,直到呼叫者認為這樣做是安全的。呼叫者需要在嘗試重新程式設計區域之前呼叫 fpga_bridges_put()。
返回
成功返回 0,或返回負錯誤程式碼。
FPGA 管理器標誌
fpga_image_info->flags 欄位中使用的標誌
FPGA_MGR_PARTIAL_RECONFIG:如果支援,則進行部分重新配置
FPGA_MGR_EXTERNAL_CONFIG:FPGA 已在 Linux 啟動之前配置
FPGA_MGR_ENCRYPTED_BITSTREAM:指示位元流已加密
FPGA_MGR_BITSTREAM_LSB_FIRST:SPI 位元流位順序為 LSB first
FPGA_MGR_COMPRESSED_BITSTREAM:FPGA 位元流已壓縮
-
structfpga_image_info¶ 特定於 FPGA 映象的資訊
定義:
struct fpga_image_info {
u32 flags;
u32 enable_timeout_us;
u32 disable_timeout_us;
u32 config_complete_timeout_us;
char *firmware_name;
struct sg_table *sgt;
const char *buf;
size_t count;
size_t header_size;
size_t data_size;
int region_id;
struct device *dev;
#ifdef CONFIG_OF;
struct device_node *overlay;
#endif;
};
成員
標誌如上定義的布林標誌
enable_timeout_us透過橋啟用流量的最大時間 (uSec)
disable_timeout_us停用透過橋的流量的最大時間 (uSec)
config_complete_timeout_usFPGA 在 write_complete 操作中切換到執行狀態的最大時間。
firmware_nameFPGA 映象韌體檔案的名稱
sgt包含 FPGA 映象的散佈/收集表
buf包含 FPGA 映象的連續緩衝區
countbuf 的大小
header_size映象標頭的大小。
data_size要傳送到裝置的資料映象大小。如果未指定,將使用整個映象。在任何一種情況下都可以跳過標頭。
region_id目標區域的 ID
dev擁有此裝置的裝置
overlay裝置樹覆蓋
-
structfpga_image_info*fpga_image_info_alloc(struct裝置*dev)¶ 分配 FPGA 映象資訊結構
-
voidfpga_image_info_free(structfpga_image_info*info)¶ 釋放 FPGA 映象資訊結構
引數
struct fpga_image_info *info要釋放的 FPGA 映象資訊結構