Help us understand the problem. What is going on with this article?

NXP SE050検証(ESP32へのポーティング編)(Porting NXP SE050 to ESP32)

はじめに

2019/12/14に開かれた IoTSecJPにてお時間をいただき
セキュアエレメントとIoTデバイスセキュリティ
と題してお話させていただきました。
その内容をベースにまとめていきたいと思います。

ESP32での動作検討

SE050はNXP社のプロセッサー、マイコンで動作させるためのドキュメントがそろっている。
SE050 Documentation内のQuick Start Guideには、
ARM Cortex-M4Fコアを採用したマイコンボード「FRDM-K64F」
ARM Cortex-M33コアを採用した「LPC55S69」
ARM Cortex-M7コアを採用した「i.MXRT1050」
ARM Cortex-A7コアを採用した「i.MXUltraLight」
Raspberry Piでの動作の事例もある。
これ以外のマイコンは基本的にポーティングが必要となる。

ポーティングの情報は、SE050 Plug & Trust middleware porting guidelinesを確認する。

それによると、以下のレイヤーで構成されているうち、I2C_Platform部分のポーティングが必要とのこと。
image.png

上記から、ESP32向けにHALを実装するためには最低限
I2C、タイマー部分を実装する必要がある。

I2Cで定義が必要な関数は、i2c_a7.hにある定義のうち、

i2c_error_t axI2CInit( void ); I2C初期化

void axI2CTerm(int mode); I2C開放

i2c_error_t axI2CWrite(unsigned char bus, unsigned char addr, unsigned char * pTx, unsigned short txLen);
I2C書き込み

i2c_error_t axI2CRead(unsigned char bus, unsigned char addr, unsigned char * pRx, unsigned short rxLen);
I2C読み込み

上記の4つ。

タイマーは、sm_timer.h内の

uint32_t sm_initSleep(void);
タイマー初期化

void sm_sleep(uint32_t msec);
msecスリープ

void sm_usleep(uint32_t microsec);
マイクロsecスリープ

上記の3つ。

I2Cは、ESP32のi2c_master コマンドで実装。
タイマーは、msecはFreeRTOSのvTaskDelay、
マイクロsecはESP32のets_delay_us(microsec)を実装。

ポーティングを実装して、テストプログラムを走らせてみる。

テストプログラム

Quick start guide with Raspberry Piで行われている流れを参考にしながら、テストプログラムのse05x_Get_Infoを実行してみる。
ソースコードを参考までにgithubにて公開。

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:6300
load:0x40078000,len:10112
load:0x40080400,len:6492
entry 0x40080750
I (29) boot: ESP-IDF 3.30300.190916 2nd stage bootloader
I (29) boot: compile time 08:53:35
I (29) boot: Enabling RNG early entropy source...
I (34) boot: SPI Speed      : 40MHz
I (38) boot: SPI Mode       : DIO
I (42) boot: SPI Flash Size : 4MB
I (46) boot: Partition Table:
I (50) boot: ## Label            Usage          Type ST Offset   Length
I (57) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (65) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (72) boot:  2 factory          factory app      00 00 00010000 00100000
I (80) boot: End of partition table
I (84) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x0c214 ( 49684) map
I (109) esp_image: segment 1: paddr=0x0001c23c vaddr=0x3ffbdb60 size=0x01ee8 (  7912) load
I (113) esp_image: segment 2: paddr=0x0001e12c vaddr=0x40080000 size=0x00400 (  1024) load
I (117) esp_image: segment 3: paddr=0x0001e534 vaddr=0x40080400 size=0x01adc (  6876) load
I (128) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x1a5c0 (107968) map
I (170) esp_image: segment 5: paddr=0x0003a5e0 vaddr=0x40081edc size=0x06af0 ( 27376) load
I (186) boot: Loaded app from partition at offset 0x10000
I (187) boot: Disabling RNG early entropy source...
I (187) cpu_start: Pro cpu up.
I (191) cpu_start: Application information:
I (195) cpu_start: App version:      1.0.0
I (200) cpu_start: Compile time:     Feb 10 2020 08:53:41
I (206) cpu_start: ELF file SHA256:  0000000000000000...
I (212) cpu_start: ESP-IDF:          3.30300.190916
I (218) cpu_start: Starting app cpu, entry point is 0x40081b50
I (0) cpu_start: App cpu up.
I (228) heap_init: Initializing. RAM available for dynamic allocation:
I (235) heap_init: At 3FFAE6E0 len 0000F480 (61 KiB): DRAM
I (241) heap_init: At 3FFC1608 len 0001E9F8 (122 KiB): DRAM
I (248) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (254) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (260) heap_init: At 400889CC len 00017634 (93 KiB): IRAM
I (267) cpu_start: Pro cpu start user code
I (285) cpu_start: Chip Revision: 1
W (285) cpu_start: Chip revision is higher than the one configured in menuconfig. Suggest to upgrade it.
I (289) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
       App:INFO :PlugAndTrust_v02.12.00_20191122
       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)
      00 A0 00 00    03 96 04 03    E8 00 FE 02    0B 03 E8 08
      01 00 00 00    00 64 00 00    0A 4A 43 4F    50 34 20 41
      54 50 4F
       sss:WARN :Communication channel is Plain.
       sss:WARN :!!!Not recommended for production use.!!!
       App:WARN :#####################################################
       App:INFO :uid (Len=18)
      04 00 50 01    XX XX XX XX    XX XX XX XX    XX XX XX XX
      XX XX
       App:WARN :#####################################################
       App:INFO :Applet Major = 3
       App:INFO :Applet Minor = 1
       App:INFO :Applet patch = 0
       App:INFO :AppletConfig = 6FFF
       App:INFO :With    ECDAA
       App:INFO :With    ECDSA_ECDH_ECDHE
       App:INFO :With    EDDSA
       App:INFO :With    DH_MONT
       App:INFO :With    HMAC
       App:INFO :With    RSA_PLAIN
       App:INFO :With    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 :SecureBox = 010B
       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 0x46 = 0x42
       App:INFO :Tag configuration ID 0x01 = 0x01
       App:INFO :Length configuration ID 0x0C = 0x0C
       App:INFO :Configuration ID (Len=12)
      00 02 A2 00    79 86 75 49    DC 85 18 48
       App:INFO :OEF ID (Len=2)
      A2 00
       App:INFO :Tag patch ID 0x02 = 0x02
       App:INFO :Length patch ID 0x08 = 0x08
       App:INFO :Patch ID (Len=8)
      00 00 00 00    00 00 00 01
       App:INFO :Tag platform build ID1 0x03 = 0x03
       App:INFO :Length platform build ID 0x18 = 0x18
       App:INFO :Platform build ID (Len=24)
      4A 33 52 33    35 31 30 32    31 45 45 45    30 34 30 30
      BC 03 04 79    33 8D 18 10
       App:INFO :JCOP Platform ID = J3RXXXXXXEEE0400
       App:INFO :Tag FIPS mode 0x05 = 0x05
       App:INFO :Length FIPS mode 0x01 = 0x01
       App:INFO :FIPS mode var = 0x00
       App:INFO :Tag pre-perso state 0x07 = 0x07
       App:INFO :Length pre-perso state 0x01 = 0x01
       App:INFO :Bit mask of pre-perso state var = 0x00
       App:INFO :Tag ROM ID 0x08 = 0x08
       App:INFO :Length ROM ID 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 :ex_sss Finished

問題なく動作した。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした