以前の記事では、SE05x(セキュアエレメント)向けライブラリである「Plug and Trust Middleware」のRaspberry Pi上でのセットアップ方法を紹介しました。
本記事執筆時点のPlug and Trust Middleware 04.07.01は、標準ではi.MX 93のFRDM開発ボード(FRDM-IMX93)に対応の旨記載はありませんが、セットアップして動作させることができたため、その方法を紹介いたします。
セットアップ完了後はOpenSSL経由でSE05xを使用する方法やEclipse Mosquitto clientを使用したAzure IoT Hubへの接続も同様に動作させることができます。
(作業時間: 30分)
SE05xおよびPlug and Trust Middlewareについて
「Plug and Trust Middleware」のRaspberry Pi上でのセットアップ方法の記事の「はじめに」を参照ください。
本記事執筆に使用したハードウェア及びソフトウェアとそのバージョン
ハードウェア:
注:FRDM-IMX93の電源について
スタートガイドのページなどでは何も書かれていませんが、クイックスタートガイドにはPower SupplyとしてUSB Type-C PD 45Wの電源を別途用意するよう記載があります。実際の消費電力は動作条件に依存し、私は気づかずに5V2AのUSB電源を使用して一通りSE05xを使用した動作の確認を行い問題なく動作しているように見えますが、USB PD 45W以上の電源をご使用ください。
FRDM-IMX93のユーザーマニュアルの2.2 Power supplyにはVBUS_INは12~20Vと記載されており、5V 8A max.(40W)出力のDCDC電源に入力されています。これにはFRDM-IMX93からUSBデバイスへ供給される電流も含みます。
ソフトウェア:
Plug and Trust middlewareパッケージのダウンロード
まずはこちらからPlug and Trust middlewareパッケージ(SE05x-PLUG-TRUST-MW)をダウンロードしてください。
*ダウンロードにはMyNXPアカウントの登録が必要です。無償で簡単に登録できます。

*解凍後、simw-top/doc/index.htmlからドキュメントを参照できます(以降、"ドキュメント"の表記は、こちらのhtmlファイルを指します)。
ハードウェアの準備
以下画像のようにFRDM-IMX93のP12とOM-SE050ARD-Eをジャンパ線で接続します。
OM-SE050ARD-E側はシルクにも表示があるためそちらも参照ください。
FRDM-IMX93側のP12の接続は以下表も参照ください。
DPD用のピンは接続しないため、Raspberry Piを接続した際と同様にOM-SE050ARD-E上の以下二つのジャンパ設定を変更します。ジャンパ設定の詳細はRaspberry Piの記事を参照ください。
J13 : 1-2
J14 : 1-2

SDカードへのデモイメージの書き込み(Optional)
FRDM-IMX93出荷時にeMMCに書き込まれているイメージでも同じ手順でビルドが可能なはずですが、今回の記事の手順確認はnxp.com上で公開されているデモイメージをSDカードに書き込んで使用しました。
以下ページにビルド済みイメージをSDカードに書き込む手順が紹介されています。
Getting Started with FRDM-IMX93 | NXP Semiconductors
個人的にはややUSBコネクタの接続周りがわかりにくかったので作業の概要を以下に示します。
- デモイメージを FRDM-IMX93 のページからダウンロードして展開
- SDカードをFRDM-IMX93に挿入
- FRDM-IMX93のブートスイッチ設定をSerial Downloader(USB)に変更(下図参照)
- FRDM-IMX93のP2(USB1_CとあるUSBコネクタ)をPCに接続
- FRDM-IMX93スタートガイド2.3の記述に従いuuuをダウンロード、デモイメージ内のimx-image-full-imx93frdm.rootfs.wic.zstのあるディレクトリに移動してuuuのコマンドを実行開始
- FRDM-IMX93のP1(POWERとあるUSBコネクタ)をUSB PD電源に接続。uuuによるイメージダウンロードが開始されるため、完了まで待つ
- FRDM-IMX93のP1(POWER)を取り外す
- FRDM-IMX93のブートスイッチ設定をSDに変更(下図参照)
ブートスイッチSW1はデフォルトではBOOT_MODE[3:0]=0010となっておりeMMC bootとなっています。

BOOT_MODE[3:0]=0001でSerial Downloader(USB)

BOOT_MODE[3:0]=0011でSDカードからのboot

Middlewareのセットアップとサンプルアプリケーションの実行
ダウンロードしたPlug and Trust middlewareパッケージをFRDM-IMX93にコピーして展開します。
展開先のディレクトリに移動して以下コマンドを実行します
cd simw-top
python scripts/create_cmake_projects.py
その後以下コマンドを実行してソースを開きます。
vi hostlib/hostLib/platform/linux/i2c_a7.c
default_axSmDevice_nameのある行を以下のようにi2c-0を使用する設定に変更してください。
static char* default_axSmDevice_name = "/dev/i2c-0";
/sys/bus/i2c/devicesを見るとわかりますが、デモイメージでは標準でi2c-0, i2c-1, i2c-2が有効になっており、これはそれぞれi.MX 93のI2C1, I2C2, I2C3に対応しています。
FRDM-IMX93のP12にはI2C1が接続されているので、i2c-0をソースコード側で指定しています。I2C2, I2C3は外部接続用のピンヘッダには接続されていません。
ビルドを行う前に、Cmakeのオプションがi.MX用になっていないのでドキュメント4.4. i.MX Linux Buildに従いCmakeのオプションを以下に変更します。ただしSE050Eを使用するのでPTMW_AppletだけはSE050_Eにします。
PTMW_Applet SE050_E
PTMW_FIPS None
PTMW_Host iMXLinux
PTMW_HostCrypto MBEDTLS
PTMW_Log Default
PTMW_MBedTLS 2_X
PTMW_OpenSSL 3_0
PTMW_RTOS Default
PTMW_SBL None
PTMW_SCP None
PTMW_SE05X_Auth None
PTMW_SE05X_Ver 07_02
PTMW_SMCOM T1oI2C
WithCodeCoverage OFF
WithNXPNFCRdLib OFF
WithSSS_TestCounterPart ON
WithSharedLIB OFF
PTMW_mbedTLS_ALT None
以下コマンドでビルドディレクトリに移動し上記のオプションを設定します。
cd ../simw-top_build/simw-top-eclipse_jrcpv1
cmake -DPTMW_Applet=SE050_E -DPTMW_FIPS=None -DPTMW_Host=iMXLinux -DPTMW_HostCrypto=MBEDTLS -DPTMW_Log=Default -DPTMW_MBedTLS=2_X -DPTMW_OpenSSL=3_0 -DPTMW_RTOS=Default -DPTMW_SBL=None -DPTMW_SCP=None -DPTMW_SE05X_Auth=None -DPTMW_SE05X_Ver=07_02 -DPTMW_SMCOM=T1oI2C -DWithCodeCoverage=OFF -DWithNXPNFCRdLib=OFF -DWithSSS_TestCounterPart=ON -DWithSharedLIB=OFF -DPTMW_mbedTLS_ALT=None .
上記が完了したら以下のコマンドでビルドとインストールを行います。
cmake --build .
sudo make install
sudo ldconfig /usr/local/lib
simw-top_build/raspbian_native_se050_t1oi2c/binにビルドされたアプリケーションが入っています。
先ほどのインストール手順で/usr/local/bin/にもコピーされているためここのファイルを指定しなくても実行できます。
動作確認のため以下コマンドを実行します。
se05x_GetInfo
実行結果は以下のようになります。
App :INFO :Running se05x_GetInfo
App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
App :INFO :PlugAndTrust_v04.07.01_20250519
sss :INFO :atr (Len=35)
01 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 00
01 00 00 00 00 64 13 88 0A 00 65 53 45 30 35 31
00 00 00
App :WARN :No SemsLite Applet Available.
App :INFO :Running se05x_GetInfo
App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
sss :INFO :atr (Len=35)
01 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 00
01 00 00 00 00 64 13 88 0A 00 65 53 45 30 35 31
00 00 00
sss :WARN :Communication channel is Plain.
sss :WARN :!!!Not recommended for production use.!!!
App :WARN :#####################################################
App :INFO :uid (Len=18)
04 00 50 01 6A 17 2A E0 43 2E 7C 04 27 6A D2 9C
1D 90
App :WARN :#####################################################
App :INFO :Applet Major = 7
App :INFO :Applet Minor = 2
App :INFO :Applet patch = 0
App :INFO :AppletConfig = 3F9F
App :INFO :With ECDSA_ECDH_ECDHE
App :INFO :With EDDSA
App :INFO :With DH_MONT
App :INFO :With HMAC
App :INFO :WithOut RSA_PLAIN
App :INFO :WithOut RSA_CRT
App :INFO :With AES
App :INFO :With DES
App :INFO :With PBKDF
App :INFO :With TLS
App :INFO :With MIFARE
App :INFO :With I2CM
App :INFO :Internal = FFFF
App :WARN :#####################################################
App :INFO :Tag value - proprietary data 0xFE = 0xFE
App :INFO :Length of following data 0x45 = 0x45
App :INFO :Tag card identification data (Len=2)
DF 28
App :INFO :Length of card identification data = 0x42
App :INFO :Tag configuration ID (Must be 0x01) = 0x01
App :INFO :Configuration ID (Len=12)
00 01 A9 21 89 0A 6F 56 4A 23 9C 41
App :INFO :OEF ID (Len=2)
A9 21
App :INFO :Tag patch ID (Must be 0x02) = 0x02
App :INFO :Patch ID (Len=8)
00 00 00 00 00 00 00 01
App :INFO :Tag platform build ID1 (Must be 0x03) = 0x03
App :INFO :Platform build ID (Len=24)
4A 33 52 33 35 31 30 32 39 42 34 31 31 31 30 30
1A 08 FA 50 67 B5 F2 56
App :INFO :JCOP Platform ID = J3R351029B411100
App :INFO :Tag FIPS mode (Must be 0x05) = 0x05
App :INFO :FIPS mode var = 0x00
App :INFO :Tag pre-perso state (Must be 0x07) = 0x07
App :INFO :Bit mask of pre-perso state var = 0x00
App :INFO :Tag ROM ID (Must be 0x08) = 0x08
App :INFO :ROM ID (Len=8)
2E 5A D8 84 09 C9 BA DB
App :INFO :Status Word (SW) (Len=2)
90 00
App :INFO :se05x_GetInfoPlainApplet Example Success !!!...
App :WARN :#####################################################
App :INFO :cplc_data.IC_fabricator (Len=2)
47 90
App :INFO :cplc_data.IC_type1 (Len=2)
D3 21
App :INFO :cplc_data.Operating_system_identifier (Len=2)
47 00
App :INFO :cplc_data.Operating_system_release_date (Len=2)
00 00
App :INFO :cplc_data.Operating_system_release_level (Len=2)
00 00
App :INFO :cplc_data.IC_fabrication_date (Len=2)
41 50
App :INFO :cplc_data.IC_Serial_number (Len=4)
13 93 77 21
App :INFO :cplc_data.IC_Batch_identifier (Len=2)
05 57
App :INFO :cplc_data.IC_module_fabricator (Len=2)
00 00
App :INFO :cplc_data.IC_module_packaging_date (Len=2)
00 00
App :INFO :cplc_data.ICC_manufacturer (Len=2)
00 00
App :INFO :cplc_data.IC_embedding_date (Len=2)
00 00
App :INFO :cplc_data.IC_OS_initializer (Len=2)
07 27
App :INFO :cplc_data.IC_OS_initialization_date (Len=2)
6A 33
App :INFO :cplc_data.IC_OS_initialization_equipment (Len=4)
39 33 37 37
App :INFO :cplc_data.IC_personalizer (Len=2)
00 00
App :INFO :cplc_data.IC_personalization_date (Len=2)
00 00
App :INFO :cplc_data.IC_personalization_equipment_ID (Len=4)
00 00 00 00
App :INFO :cplc_data.SW (Len=2)
90 00
App :INFO :ex_sss Finished
以下のようにuid(Unique ID)を読み出している部分があれば正しく動作しています。uidはデバイス毎に異なる値のため使用されるボードでは異なる値が読み取られるはずです。
App :INFO :uid (Len=18)
04 00 50 01 6A 17 2A E0 43 2E 7C 04 27 6A D2 9C
1D 90
また以下のメッセージが表示されていますが、これはホスト-SE050間の通信の保護(メッセージ認証及び暗号化)が有効化されていないことを示しています。
量産時にはミドルウェアのビルド設定を変更して保護を有効化することを強く推奨します。
sss :WARN :Communication channel is Plain.
sss :WARN :!!!Not recommended for production use.!!!
コマンドラインツール(ssscli)のセットアップ
ssscliはse05xを制御するためのpythonベースのコマンドラインツールです。
ドキュメント9.3.1.2. i.MXに沿ってセットアップしてもよいですが、ここでは以前のRaspberry Piの記事と同様のvenvを使用したセットアップを紹介します。
なお以下ではsimw-top/pycliにvenvを作ることになりますが、好みに応じて変更してかまいません。
cd simw-top/pycli
python3 -m venv venv
source venv/bin/activate
python3 -m pip install -r requirements.txt
cd src
python3 setup.py develop
上記が完了したらssscliを使用してuidを取得してみます。
ssscli connect se05x t1oi2c none
ssscli se05x uid
ssscli disconnect
以下のような出力が得られ、se05x_GetInfoの実行結果と同じIDが得られれば正しく動作していることがわかります。
sss :INFO :atr (Len=35)
01 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 00
01 00 00 00 00 64 13 88 0A 00 65 53 45 30 35 31
00 00 00
sss :WARN :Communication channel is Plain.
sss :WARN :!!!Not recommended for production use.!!!
040050016a172ae0432e7c04276ad29c1d90
Unique ID: 040050016a172ae0432e7c04276ad29c1d90
以上でPlug and Trust Middlewareのセットアップが完了しました。
具体的な使用例についてはOpenSSL経由でSE05xを使用する方法やEclipse Mosquitto clientを使用したAzure IoT Hubへの接続を参照ください。ただしデモイメージではaptでのMosquitto clientのインストールはできないため、以下を参照してインストールしてください。
Mosquitto clientのビルドとインストール
以下ページにソースからのビルド方法の記載があります。
https://github.com/eclipse-mosquitto/mosquitto
以前は必須ではなかったのですが、本記事執筆時はcJSONも必須になったようなので先にそちらをインストールします。
https://github.com/davegamble/cjson
以下コマンドでcJSONのソースコードをダウンロード、ビルド、インストールします。
そのままだとライブラリが/usr/local/lib64にインストールされてしまいmosquitto clientがうまく動作しなかったため。インストール先ディレクトリを/user/local/libに変更しました。
/user/local/libにインストールされるlibmosquittoもlibcjsonもELF 64-bitでビルドされているようなので問題はないはずですが。
wget https://github.com/DaveGamble/cJSON/archive/refs/heads/master.zip -Ocjson.zip
unzip cjson.zip
cd cJSON-master
mkdir build
cd build
cmake -DCMAKE_INSTALL_LIBDIR=lib ..
make
make install
ldconfig /usr/local/lib
以下コマンドでMosquitto clientのソースコードをダウンロードし展開します。
wget https://github.com/eclipse-mosquitto/mosquitto/archive/refs/heads/master.zip -Omosquitto.zip
unzip mosquitto.zip
cd mosquitto-master
以下コマンドでconfig.mkを開きます。
vi config.mk
以下のようにWITH_DOCSの行を変更します。
WITH_DOCS:=no
以下でビルド及びインストールを完了させます。
make
sudo make install
/sbin/ldconfig
ldconfig /usr/local/lib
セットアップ完了後は
も同様に動作させることができますので、是非試してみてください。
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)