PolarFire® SoCシリーズ② Lチカ1_MSS編

GPIOの使い方

はじめに

1.概要

Microchip社のPolarFire® SoCは、不揮発性で低消費電力のミッドレンジSoC FPGAで、64ビットのRISC-V ISAを5コア搭載したプロセッサーと低消費電力FPGAを組み合わせたチップです。

(fig.1-1)PolarFire® SoC ブロック図

外部リンク

タイトルリンク
PolarFire SoCプロダクトページ
(Microchip)
PolarFire® SoC FPGAs | Microchip Technology
PolarFire SoC Discoveryキット
(Microchip)
PolarFire® SoC Discovery Kit | Microchip Technology
PolarFire SoC MSS テクニカルリファレンスマニュアルPolarFire SoC MSS Technical Reference Manual (microchip.com)
Microprocessor Subsystem (MSS) User’s GuidePolarFire SoC MSS Technical Reference Manual (microchip.com)
PolarFire SoCプロダクトページ
(GitHub)
PolarFire-SoC · GitHub
ベアメタルプロジェクト
(Github)
GitHub – polarfire-soc/polarfire-soc-bare-metal-examples: Bare metal example software projects for PolarFire SoC
GPIO Bare Metal Driver
(Github)
polarfire-soc-documentation/bare-metal-embedded-software/bare-metal-driver-user-guides/polarfire-soc-mss-driver-user-guides/mss-gpio/mss-gpio-driver-user-guide.md at master · polarfire-soc/polarfire-soc-documentation · GitHub
(fig.1-2)各リンク集

2.この記事の目的

この記事は私の忘備録も兼ねて、PolarFire®SoCのMSS(Microprocessor Subsystem)にてLチカが出来る事を目指しています。試行錯誤で実験を進めておりますので、記事の不備とうご容赦ください。

3.構成

前回の記事と同じく、PolarFire® SoC Discovery Kitを使用し、動作を確認していきます。
PolarFire® SoC Discovery Kit | Microchip Technology

(fig.2-1)PolarFire® SoC Discovery Kit 外観
(fig.2-2)PolarFire® SoC Discovery Kit ブロック図

下記に各BANKの接続図を示します。

(fig.2-3)BANK接続図

Lチカまでの道のり①

0.はじめに

GitHubにPolarFire SoCに関するリポジトリが公開されています。
PolarFire-SoC · GitHub

リポジトリには以下のような関連リソースがありますので、まずはLチカの前にGitHubにアップされているベアメタルExamplesを動かしてみます。

1.Gitからダウンロード

下記のGitHubからベアメタルサンプルプロジェクトをダウンロード&解凍を行います。

GitHub – polarfire-soc/polarfire-soc-bare-metal-examples: Bare metal example software projects for PolarFire SoC

2.プロジェクトを開く

①SoftConsoleアプリケーションを起動すると、最初にワークスペースの保存場所を聞かれるので、ディレクトリを指定します。

②File > Open Project from File System をクリックします。

③「Directort..」ボタンを押し、Githubからダウンロードした「mpfs-gpio-interrupt」フォルダを指定します。中間のチェックボックスにチェックを入れ、最後に「Finish」ボタンを押します。

3.プロジェクトの設定

①プロジェクトを右クリックし、「Properties」を選択

②「C/C++ Builld 」 から「Build Variables」を選択します。
Configrationが「LIM-Debug-DiscoveryKit[Active]」になっていない場合、「Manage Configuration」ボタンを押します。

③LIM-Debug-DiscoveryKitを選択し「Set Active」ボタンを押します。

④「Apply」ボタンを押します。

⑤「C/C++ Builld 」 から「Setting」を選択し、Configrationが「LIM-Debug-DiscoveryKit[Active]」になっていることを確認します。

⑥「C/C++ Builld 」 から「Tool Chain Editor」を選択し、Configrationが「LIM-Debug-DiscoveryKit[Active]」になっていることを確認します。

⑦「Apply and Close」をクリックし、ウィンドウを閉じます。

4.ソースファイルの変更

①src > application > hart1 > u54_1.cをダブルクリックで開きます。

②125行目あたりに//ここから挿入 ~ //ここまでをペーストします。

    SYSREG->GPIO_INTERRUPT_FAB_CR = 0xFFFFFFFFUL;

    PLIC_SetPriority_Threshold(0);

    for (int_num = 0u; int_num <= GPIO2_NON_DIRECT_PLIC; int_num++)
    {
        PLIC_SetPriority(GPIO0_BIT0_or_GPIO2_BIT0_PLIC_0 + int_num, 2u);
    }

    
    //ここから挿入
    uint64_t led_cnt;
    MSS_GPIO_config(GPIO1_LO, MSS_GPIO_9, MSS_GPIO_OUTPUT_MODE);
    while(1u)
    {
        led_cnt ++;
        if (led_cnt < 500000)
        {
            MSS_GPIO_set_output(GPIO1_LO, MSS_GPIO_9, 1u);
           // led_cnt = 1;
        }
        else if (led_cnt < 1000000)
        {
            MSS_GPIO_set_output(GPIO1_LO, MSS_GPIO_9, 0u);
           // led_cnt = 0;
        }
        else
        {
            led_cnt = 0;
        }

    }
    //ここまで
    
    
    
    MSS_GPIO_init(GPIO2_LO);

    for (cnt = 9u; cnt< 23u; cnt++)
    {
        MSS_GPIO_config(GPIO2_LO,
                        cnt,
                        MSS_GPIO_OUTPUT_MODE);
    }

    MSS_GPIO_config(GPIO2_LO, MSS_GPIO_26,

5.Debug

①ワークスペースの右にある、「Launch Configration」タブから、「GDB OpenOCD Debugging」をクリックし「mpfs-gpio-interrupt hw all-harts debug」をダブルクリックし、実行します。

6.結果

チップ抵抗R705の方端をオシロスコープで確認すると376msecでトグルしている事がわかります。

7.プログラミング

(以下の記事は書きかけです)

Opened ‘G:\Works\MyProgram\2024\PolarFireSoC\20_Project\03_Bare-metal_example\driver-examples\mss\mss-gpio\mpfs-gpio-interrupt\eNVM-Scratchpad-Release-DiscoveryKit\bootmode1\fpgenprogProject\proj_fp\proj_fp.pro’
The ‘open_project’ command succeeded.
Info: Programming is already enabled for device ‘target’.
The ‘enable_device’ command succeeded.
PPD file ‘G:/Works/MyProgram/2024/PolarFireSoC/20_Project/03_Bare-metal_example/driver-examples/mss/mss-gpio/mpfs-gpio-interrupt/eNVM-Scratchpad-Release-DiscoveryKit/bootmode1/fpgenprogProject/proj_fp/target.ppd’ has been loaded successfully.
DESIGN : TOP; CHECKSUM : 0000; PDB_VERSION : 1.0
The ‘set_programming_file’ command succeeded.
The ‘set_programming_action’ command succeeded.
programmer ‘E2009BI1CF’ : Scan Chain…
Programmer ‘E2009BI1CF’ : JTAG TCK / SPI SCK frequency = 1 MHz
programmer ‘E2009BI1CF’ : Check Chain…
Error: programmer ‘E2009BI1CF’ : Device 1: Found: MPFS095(T|TL|TLS|TS), Expected: MPFS250T_ES
Error: programmer ‘E2009BI1CF’ : Scan and Check Chain FAILED.
Error: Failed to run Action.
Error: The command ‘run_selected_actions’ failed.
Error: Failure when executing Tcl script. [ Line 5 ]
Error: The Execute Script command failed.

編集後記

正直なところ、まだわからないことが多く、手探りで実験を進めている状態です。ドキュメントは多く揃っているものの、その分資料やページの量が膨大で初めて扱う内容も多いため、情報の整理に苦労しています。


コメント

  1. つぼさん より:

    はじめまして。
    Microchip(Microsemi)のFPGA関連の情報が少なすぎて茫然とする中、こちらにたどり着きました。
    この記事のmssでのLチカは、ハード側の構成情報(zynqだと、最初にvivadoでブロックを組むやつ)は要らないのでしょうか。また、Debug実行するときに、SoCに事前に何かをプログラムしておく必要はないのでしょうか。

    • pico より:

      こんにちは。回答が遅くなりました。

      なかなか日本語情報が少なくて苦労しますよね。
      私もPolarFireに手を出し始めたばかりで、手探り状態です。
      今回の手順を実行すればとりあえずデバッグモードで動作したため、
      CPUだけを動かすだけであればFPGA側への書込みは不要だと思います。

タイトルとURLをコピーしました