search
LoginSignup
8

More than 3 years have passed since last update.

posted at

updated at

M5StickV で RISC-V での 開発 事始め (HW情報編)

M5StickVとは?

※ 本項は、HWについての情報が主となります。SW編はlink先です

公式、及び、Switch Scienceの紹介ページもご参照。

好評を博しているESP32を利用したM5Stack, M5StickCとは違い、今話題のRISC-VをHost CPUとし、また、AI acceleratorも搭載したSoC Kendryte K210を利用したM5Stickシリーズの新シリーズです。

RISC-Vは、ARMのいわゆるCortexのとは別のCPUのアーキテクチャで、openなコアとして注目を集めています。

M5StickVは、ESP32とは違い、WiFi/BTは搭載していませんが、先の通り、RISC-VとAI engineを搭載しているのが特徴になっています。また、8MBitという広大な "SRAM" も搭載しています。

なお、Kendryte K210自体はQuad Coreみたいですが、M5StickVとしてはDual-Coreのようです。

特徴は、

  • CPU (Dual-Core 64-bit RISC-V RV64IMAFDC (RV64GC) CPU / 400Mhz(Normal))
  • Flash 16MBit
  • TFT : ST7789 135*240
  • Camera!
  • PMIC : AXP192 (M5StickCと共通ですね) もちろんLipo 200mAhも搭載!
  • AI engine は0.8TOpsとのことです。
  • Dual hardware 512-point 16bit Complex FFT (audio用だが、単体でも利用可能そう)
  • AES-128/192/256, SHA256 accelerator のCrypt HW Engine内蔵
  • Audio Codec with D class Power Amp : MAX98357

なお、TSCM 28n HPMで製造とのこと

HWについて

Kendryte K210

https://kendryte.com/downloads/ から Kendryte K210 datasheetより参照可能です

K210 Overview

  • 144pinあり、FPIOA (Field Programmable I/O Array)により、各種I/Oのpinアサインを自由に設定できます。(IO_0からIO_47まで)

Host CPU : RISC-V RV64GC (IMFADC)

  • Dual Core
  • 400MHz
  • I/D-cache: 32KB per core
  • ISA
    • RV64 (64bit RISC-V)
    • I: Integer
    • M: Multiply and Divider
    • A: Atomic
    • F: Single Float
    • D: Double Float
    • C: Compression Instruction (thumb的なもの)

PLIC (Platform Level Interrupt Controller)

  • 64 external interrupts
  • 7 priority level

KPU (Netral Network Processor)

  • convolution (1x1, 3x3)
  • batch normalization
  • activation
  • pooling operaration
  • FIXED point (not FLOAT!)
  • max NN parameter size is 5Mbit (から5.9MBit)
  • SWで入れ替えるようにすれば、flash size - software sizeまでとありますが。

Audio Processor

  • 内部処理は16bit
  • 12/16/24/32 bit inputをサポート
  • 最大192KHzまでサポート
  • 後述のFFTをサポート

FFT accelerator

  • 64, 128, 256, 512 pointでのFFT/IFFTが可能
  • 1 pointは32bitまたは64bit
  • DMA対応

SRAM

Region Access Start Address End Address Size
General-purpose SRAM CPU cached 0x80000000 0x805FFFFF 0x600000
AI SRAM CPU cached 0x80600000 0x807FFFFF 0x200000
General-purpose SRAM CPU non-cached 0x40000000 0x405FFFFF 0x600000
AI SRAM CPU non-cached 0x40600000 0x407FFFFF 0x200000

SRAMは、

  • 6MBitをRISC-VのHost CPU側に
  • 2MBitをAI processor側に (このエリアはKPUが動作時はKPUが専有)

割り当てています。

そして、同一のメモリーに対して、2つのアドレス空間にmapしている

  • CPUのcacheにcoherentにアクセスする
  • CPUのcacheにnon-coherentにアクセスする

なので、HostCPUとやりとりをする部分に関しては、cache coherentがよいけど、
dataを渡した後、AI processorでだけ使う場合メモリーは、cache non-coherentとして
アクセスするほうが、Host CPUのcacheが荒らされないのでよい、ということでしょう。

(できる設計者がいる会社なんですね。kendryte!)

加えて、General-purpose SRAMエリアは、MEM0とMEM1の2 bankになっているそうです。

Region Access Start Address End Address Size
MEM0 CPU cached 0x80000000 0x803FFFFF 0x400000
MEM1 CPU cached 0x80400000 0x805FFFFF 0x200000
MEM0 CPU non-cached 0x40000000 0x403FFFFF 0x400000
MEM1 CPU non-cached 0x40400000 0x405FFFFF 0x200000

で、上のエリアは、DMACにより同時にアクセスできるそうです。

ようは、SRAMもbus(おそらくクロススイッチ)につながっているのですが、
なにかのIPがアクセスしていると(burst transferしている間は)他のIPのアクセスができなくなりますので、
最大限パフォーマンスを引き出そうとする場合には、上のバンクを意識する必要があります。

Bank:MEM1の2MBitのエリアをデータの受け渡し用に使って、bank:MEM0の4MBitのエリアは
演算エリアにするなどすれば、Host CPUであるRISC-Vがそのbank:MEM0のエリアをほぼ専有することができる、
などからです。

例えば、LCDの表示エリアを、Bank1の2MBitのエリアにしておけば、他のIPによって帯域が食われるなどにより
表示が乱れることが少なくなります。(優先度付きのバスの場合、優先度の高いものがアクセスするので、表示のような優先度の高いものが優先され、画乱れを防ぐなどをSoCの設計としてよくやります。このSoCがそうなっているかどうかは不明)

OTP (One-Time Programmable Memory)

  • 128KBitもの容量があるようです!
  • 64bitは、SoCのバリエーションのためのfeature flag
  • 他、128bitのAES用のkeyとしても利用されます。(Encrypted firmwareが対応できるため。でも128bitなんですね)

HW crypto engine

  • AES128/192/26 (ECB/CBC, GCM)
    • Enc/Dec
    • OTP written key (HW)も、SWからでも鍵設定は可能
    • DMA対応なので、よろしく、で動作可能
  • SHA256 accelerator
    • 入力データに対して、DMA可能 (結果はレジスタ読めということかと)

DVP (Digital Video Port)

  • SCCB protocol
  • Up to 640x480
  • YUV422, RGB565 input
  • KPU(AI (NN) processor)への流し込みと、displayへのoverlay対応
    • To KPU, RGBB888 and Y成分のみ of YUV422 (輝度成分だけ流せる)
    • To display, RGB565
  • カメラの入力のVSyncの始まりまたは終わりで、割り込み可能

UART

UART Max baudrate DMA mode
UART0 5Mbps No DMA (8byte TX/RX FIFO only) Async only
UART1-3 5Mbps DMA w/8byte TX/RX FIFO Async and Sync

I2C

  • i2c-0,1,2の3 channelで、個々にmaster/slaveの設定が可能
  • 100KBPSまでの標準速度モード
  • 400KHzまでのFast mode
  • 7bit/10bit Slave Address対応
  • Bulk転送モードをサポート
  • 割り込みでのアクセスと、ポーリングの両方をサポート

sensor側に割り込み通知があるとき、SW介在でよく割り込みで読み出ししますが、HWとして割り込み通知での読み出しに対応している模様 (低消費電力に有利)

SPI (Serial Peripheral Interface)

  • 4つのSPI-0,1,2,3がある。
  • 1/2/4/8 wire モードを対応 (full duplex可)
  • DMA対応
  • DDR転送対応
Type Master/Slave Clock XIP
SPI0 master 25MHz No
SPI1 master 25MHz No
SPI2 slave 25MHz No
SPI3 master 100MHz Yes

ようは、SPI3にSPI-NORをつなげってことです。

  • SPI-NOR : 8, 16, 32MBitをサポート
  • SPI-NANDは、64MBit 128MBit, 256MBitをサポート

I2S (Inter IC Sound)

  • 3chのI2S Audio Interface
  • 各chは、4 stereo channelをサポートしている
  • 12/16/20/24/32 bitのaudio dataをサポート
  • FIFO
    • I2S-0は64bytesのTX FIFOと8 byteのRX FIFO
    • I2S-1,2は8 byteのTX/RX FIFO
  • DMA転送をサポート
  • 他、I2S-0は、Audio Processorとの接続をサポート

Timer

  • 3つのtimerを内蔵 (/dev/timer0-11の12個設定可能。各タイマーには4つのチャネルがある)
  • 32 bit counter
  • count upとcount downの両方をサポート
  • 独立クロック動作
  • 割り込みの極性を設定可能
  • 一括あるいは独立した割り込み出力を設定可能
  • 個々のタイマーが独立した形のレジスター構成
  • PWM出力として利用が可能で0-100%のduty cycleで設定が可能

PWM (Pulse Width Modulation)

  • pwm0-2の3ch (FreeRTOS SDKに記載あり)
PWM Timer
pwm0 timer0-3と排他
pwm1 timer4-7と排他
pwm2 timer8-11と排他

結局、物理的にはtimerは3つあり、これを使って、PWMを実現している。
(各物理タイマー内にクロックを共有するlogical timerが4つあるので、PWMとして利用時には4つずつ使えなくなる)

WDT (Watch Dog Timer)

  • System Reset mode
  • 1回目は割り込みでそれがクリアされなければsystem resetするmode がある。
  • wdt0,1の2つある

RTC (Real Time Clock)

  • 外部クロック対応
  • RTCでのAlarm interruptが可能
  • 精度としては1秒以下も可能だが、外部のクロックに依存
  • power-on/reset後にデータがクリアされる!(えっ、、、ということで、外部にRTC必要っぽい)

内蔵Mask ROM

  • AES-128-CBCによる暗号firmwareをサポート
  • Flashの書き込みをサポート (UOP mode)
  • SHA256での改ざん検出
  • OTPで、UOPモード、SHA256の改ざん検出、AESによる暗号化firmwareを無効化可能
  • 起動時にTURBOモードで起動可能

特別なpinについて

Pin Desc Trigger mode 1 mode 2
IO_16 boot mode selection During power-on reset High to boot from FLASH Low to enter ISP mode
Pin Desc
IO_0, IO_1, IO_2, IO_3 JATG pin
IO_4, IO_6 ISP pin (記載なしだが、MaskROMでのFlash焼き込みモードのことか?)

GPIO (General Purpose Input Output)

Type count I/O Interrupt-able Assignable
GPIOHS 32 I/O(PU/PD/HiZ) 各ピンが独立割り込み (edge/level) Yes to 48pin of FPIOA
GPIO 8 I/O(PU/PD/HiZ) この8つを1つの割り込みとして共有 (edge/level) Yes to 48 pin of FPIOA

というわけで、GPIO1-8は、wake up interruptとかに使い、基本はlevel triggerとかにしたほうが良いかも (edgeの検出statusレジスタがあるかどうかは不明)

  • drive能力は、DS[3:0]で設定可能で、Typical値で、

    • Low出力時: 5.4mAのモードから、23.4mAのモードまで
    • High出力時: 7.6mAのモードから、33.7mAのモードまで
  • FPIOAは、8つのpower domainからなり、各ドメインごとに、3.3Vか、1.8Vかを設定可能

DMAC (Direct Memory Access Controller)

  • 8 ch (個々にsource, destinationを設定可能、チャンネル間のarbitration対応、個々にステータスや完了割り込み可能)

scatter-gatherではなく、独立した8つのDMACのようです。

Schematics

K210 pin Func Type Device
G34 GPIO34 I/O Ext. G34
G35 GPIO35 I/O Ext. G35

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8