用於 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

int fpga_region_program_fpga(struct fpga_region *region)

程式設計 FPGA

引數

struct fpga_region *region

FPGA 區域

描述

使用 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 位元流已壓縮

struct fpga_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_us

FPGA 在 write_complete 操作中切換到執行狀態的最大時間。

firmware_name

FPGA 映象韌體檔案的名稱

sgt

包含 FPGA 映象的散佈/收集表

buf

包含 FPGA 映象的連續緩衝區

count

buf 的大小

header_size

映象標頭的大小。

data_size

要傳送到裝置的資料映象大小。如果未指定,將使用整個映象。在任何一種情況下都可以跳過標頭。

region_id

目標區域的 ID

dev

擁有此裝置的裝置

overlay

裝置樹覆蓋

struct fpga_image_info *fpga_image_info_alloc(struct 裝置 *dev)

分配 FPGA 映象資訊結構

引數

struct device *dev

擁有裝置

返回

struct fpga_image_info 或 NULL

void fpga_image_info_free(struct fpga_image_info *info)

釋放 FPGA 映象資訊結構

引數

struct fpga_image_info *info

要釋放的 FPGA 映象資訊結構