ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

自分用メモ Kinetisやる際によむとこ

SDK内のフォルダのDocの中のこれ

f:id:gsmcustomeffects:20170705025103p:plain

DriverExampleのReadme

リファレンスマニュアル

f:id:gsmcustomeffects:20170705025354p:plain

SDKのGettingStartおよびファイル構造解説

f:id:gsmcustomeffects:20170705025514p:plain

基本ここ読めばだいたいのコツはつかめる。
あとはInit系のAPIはマクロ化でウザったいので注意

GettingStartKinetisVer2

以前こんなの書いたんですけど
gsmcustomeffects.hatenablog.com


いつの間にかNXPになりそしてMCUXpressoSDKなるものが出てIDEも変わったので初心者のためにかきます。
あくまで初心者のためです。強い人はかえってどうぞ

必要なもの

  • FRDMボード
  • MCUXpressoIDE

の二つが必要です。

評価ボードについては定番であるFRDM-K64Fを使っていきたいと思いますので同じようにやりたい方は購入してください。
IDEに関しては此方からダウンロードできます。

MCUXpresso IDE|NXP

SDKのビルド

Kinetisの場合STM32のCubeHALとは違いオンラインで色々選択してSDKをダウンロードして使う仕組みなので先ずはそれをやって行く

mcuxpresso.nxp.com

上記のサイトでNXPアカウントでログインする。

FRDM-K64Fを選択するとこのような画面になる

f:id:gsmcustomeffects:20170705015403p:plain

次にSDK Builderに進んでDownloadをすればSDK関連は終わりです。(ミドルウエアは適宜選んでください

f:id:gsmcustomeffects:20170705015615p:plain

MCUXpressoにSDKを入れていくぞ

まず起動してワークスペースを開くと基本画面が出てくるので下部のSDK部分からさっき落としてきたZipファイルをインポートしてあげます。(右クリックでアーカイブZip)

f:id:gsmcustomeffects:20170705020216p:plain

するとこうなります。

新規プロジェクトを作っていく

New projectをクリックすると先ほど入れたSDKが出てくると思います。(なんかかっこいいw

f:id:gsmcustomeffects:20170705020400p:plain

今回はK64をつかうのでこれ

f:id:gsmcustomeffects:20170705020431p:plain

するとこうなるので適宜選んで進む
f:id:gsmcustomeffects:20170705020530p:plain

ここではUtilityについては割愛

あとはC言語のlib関連とFloating Pointの設定とかしてく

f:id:gsmcustomeffects:20170705020743p:plain

んで終了

ソースコード

書くところは二つあります。
まずはpin_mux.cです。

#include "fsl_common.h"
#include "fsl_port.h"
#include "pin_mux.h"


#define PIN16_IDX                       16u   /*!< Pin number for pin 16 in a port */

#define PIN17_IDX                       17u   /*!< Pin number for pin 17 in a port */

#define PIN22_IDX                       22u   /*!< Pin number for pin 22 in a port */
#define SOPT5_UART0TXSRC_UART_TX      0x00u   /*!< UART 0 transmit data source select: UART0_TX pin */

/*
 * TEXT BELOW IS USED AS SETTING FOR THE PINS TOOL *****************************
BOARD_InitPins:
- options: {coreID: singlecore, enableClock: 'true'}
- pin_list:
  - {pin_num: '62', peripheral: UART0, signal: RX, pin_signal: PTB16/SPI1_SOUT/UART0_RX/FTM_CLKIN0/FB_AD17/EWM_IN}
  - {pin_num: '63', peripheral: UART0, signal: TX, pin_signal: PTB17/SPI1_SIN/UART0_TX/FTM_CLKIN1/FB_AD16/EWM_OUT_b}
 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE PINS TOOL ***
*/

/*FUNCTION**********************************************************************
 * 
 * Function Name : BOARD_InitBootPins
 * Description   : Calls initialization functions.
 * 
 *END**************************************************************************/
void BOARD_InitBootPins(void) {
  BOARD_InitPins();
}


/*FUNCTION**********************************************************************
 *
 * Function Name : BOARD_InitPins
 * Description   : Configures pin routing and optionally pin electrical features.
 *
 *END**************************************************************************/
void BOARD_InitPins(void) {
  CLOCK_EnableClock(kCLOCK_PortB);                           /* Port B Clock Gate Control: Clock enabled */

  PORT_SetPinMux(PORTB, PIN16_IDX, kPORT_MuxAlt3);           /* PORTB16 (pin 62) is configured as UART0_RX */
  PORT_SetPinMux(PORTB, PIN17_IDX, kPORT_MuxAlt3);           /* PORTB17 (pin 63) is configured as UART0_TX */
  PORT_SetPinMux(PORTB, PIN22_IDX, kPORT_MuxAsGpio);
  SIM->SOPT5 = ((SIM->SOPT5 &
    (~(SIM_SOPT5_UART0TXSRC_MASK)))                          /* Mask bits to zero which are setting */
      | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)       /* UART 0 transmit data source select: UART0_TX pin */
    );
}

PORTへのクロック供給と22ピンをGPIOにアサインする記述を追加しています。

次にMain.c

#include <stdio.h>
#include "board.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "fsl_gpio.h"
#include "MK64F12.h"

/* TODO: insert other include files here. */

/* TODO: insert other definitions and declarations here. */

/*
 * @brief   Application entry point.
 */
void delay(void)
{
    volatile uint32_t i = 0;
    for (i = 0; i < 800000; ++i)
    {
        __asm("NOP"); /* delay */
    }
}

/*!
 * @brief Main function
 */
int main(void)
{
    /* Define the init structure for the output LED pin*/
    gpio_pin_config_t led_config = {
        kGPIO_DigitalOutput, 0,
    };

    /* Board pin, clock, debug console init */
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();

    /* Print a note to terminal. */

    /* Init output LED GPIO. */
    GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PIN, &led_config);

    while (1)
    {
        delay();
        GPIO_TogglePinsOutput(BOARD_LED_RED_GPIO, 1u << BOARD_LED_RED_GPIO_PIN);
    }
}

こんな感じです。

デバッグ

デバッガの設定はCMSIS-DAPファームが入ってるならNXPがプラグインでやってくれてるので楽になった

f:id:gsmcustomeffects:20170705021513p:plain

JLINK GDBやOpenOCDでつなぐなら各自設定してほしい。

あとはブレイクしてステップ実行なりでデバッグ機能の確認ができる

f:id:gsmcustomeffects:20170705024340p:plain

その他機能

こういった使い方のほかにサンプルをそのままインポート補助する機能もあるのでそれを使うともっと楽だ(むしろKinetisは豊富なサンプル使ってなんぼですよねw

f:id:gsmcustomeffects:20170705024547p:plain

こんな感じで80個ぐらいサンプルあるので強すぎるとw

まとめ

Kinetisの新しい開発環境を紹介した。

いろいろサンプル増えててあせったw
CMSISの管轄の境界線はどこなんやという感想を持ちましたw
共通化はレジスタ定義のヘッダーとかぐらいにしてくれればわかりやすくていいと思います。

記事のまとめ

当てつけでもありませんが真面目に書いてるやつが日記的なのに埋もれてきたのでWikiっぽいの作った。

https://gsmcustomeffects.github.io/stm32


f:id:gsmcustomeffects:20170701230319p:plain
でもWikiほど固くなくて記事の重要な部分だけ抜き出しただけ
ちなみにJekyllっていうの使って作りました

Jekyll • シンプルで、ブログのような、静的サイト


でもこれで文句言われることが少なくなりそうで・・・・・・・

ESP-WROOM-32

f:id:gsmcustomeffects:20170628022904p:plain

f:id:gsmcustomeffects:20170628033924p:plain

ESP-WROOM-32はケイデンス(元てんしりか)のIPであるXtensa LX6内蔵のESP32というSoCがのってる。

ちなみにIPコア自体のデータシート読むとデバッグはARMのCoresight内蔵なのでJTAGでつながるみたい

f:id:gsmcustomeffects:20170628022540p:plain

開発はGNUベースであるらしい

f:id:gsmcustomeffects:20170628023431p:plain

SDKもESP IDFってのがあるのでARMマイコン的な楽ちん開発が可能?

f:id:gsmcustomeffects:20170628023515p:plain

いうてラインナップが少ないのでアブストラクションレイヤーなんてなくても専用コード書けば問題ない(そういうことじゃないw

高クロックなので強い

f:id:gsmcustomeffects:20170628024403p:plain

ペリフェラルもいい感じ

f:id:gsmcustomeffects:20170628024515p:plain

興味があるのがFIFO付きI2S

こいつ使ってエフェクタ作れそうじゃねとか思ってるw

というわけで今後はこのおもちゃで記事書いていこうと思う

自分用メモ Device Qualifier Descriptor

STのCDCのコードみてたら出てきたので調べてみた

f:id:gsmcustomeffects:20170624211149p:plain

high-speed capable device that has different device information for full-speed and high-speed must have a Device Qualifier Descriptor (USB_DEVICE_QUALIFIER_DESCRIPTOR).

とあるのでハイスピードデバイスが有するディスクリプタでデバイスが他の速度で動作していた場合に変更される高速対応デバイスに関する情報を記述するものらしい。

すっごい回りくどいので要約するとハイスピードデバイスが低速互換で動く場合に必要とされるやつと覚えとけばいいと思う

Offset Field Type Size Value Description
0 bLength uint8_t 1 Number Size of this descriptor in bytes.
1 bDescriptorType uint8_t 1 Constant Device Qualifier Descriptor Type = 6.
2 bcdUSB uint16_t 2 BCD USB Specification Release Number in Binary-Coded Decimal (i.e., 2.10 is 210h). This field identifies the release of the USB Specification with which the device and its descriptors are compliant. At least V2.00 is required to use this descriptor.
4 bDeviceClass uint8_t 1 Class

Class code (assigned by the USB-IF).

If this field is

reset to zero, each interface within a configuration specifies its own class information and the various interfaces operate independently.
set to a value between 1 and FEh, the device supports different class specifications on different interfaces and the interfaces may not operate independently. This value identifies the class definition used for the aggregate interfaces.

If this field is set to FFh, the device class is vendor specific.

5 bDeviceSubClass uint8_t 1 SubClass

Subclass code (assigned by the USB-IF).

These codes are qualified by the value of the bDeviceClass field. If bDeviceClass is

reset to zero, this field must also be reset to zero.
not set to FFh, all values are reserved for assignment by the USB-IF.

6 bDeviceProtocol uint8_t 1 Protocol

Protocol code (assigned by the USB-IF). These codes are qualified by the values of the bDeviceClass and bDeviceSubClass fields. If a device supports class-specific protocols on a device basis as opposed to an interface basis, this code identifies the protocols that the device uses as defined by the specification of the device class.

If this field is

reset to zero, the device does not use class-specific protocols on a device basis. However, it may use class-specific protocols on an interface basis.
set to FFh, the device uses a vendor specific protocol on a device basis.
7 bMaxPacketSize0 uint8_t 1 Number Maximum packet size for other speed.
8 bNumConfigurations uint8_t 1 Number Number of other-speed configurations.
9 bReserved uint8_t 1 Zero Reserved for future use, must be zero.

補助的な意味合いなので特別困ることはない

上記の例ではCDCなのでbDeviceClassは0x02になってる。
あとは上位のディスクリプタ見つつかけばOK

自分用メモ Interface Association Descriptor

Interface Association Descriptor

USB2.0により増えた規格。
それまでは複合デバイスを作る際どれがどのインターフェイスがわからず無法地帯だったらしい
そこでIAD増やして明示的にした

結局どゆことかというと
USBデバイスではコンフィグに複数のInterfaceを持つことができる。
そのときにどれがどのファンクションに対応するかわからんのでそいつの補足をする機能
f:id:gsmcustomeffects:20170621022247p:plain

でぃすくりぷたと兼ねて説明

バイスディスクリプタ欄にあらかじめIADであると明示することで最初のGetDesicriptorの段階でホスト側にIADですよ~と伝える
そうするとホストはInterfaceが複数いる何かがつながったな?やれやれと理解するわけだ

f:id:gsmcustomeffects:20170621023624p:plain

んで肝心なInterface Association Descriptorはこういう構成

f:id:gsmcustomeffects:20170621025130p:plain


あとは

コンフィグ→IAD→インターフェイス→その他→エンドポイント

的な感じでディスクリプタを記述していく

STでDualCOMを実現するときのディスクリプタはこんな感じ

device descriptor

__ALIGN_BEGIN uint8_t USBD_HS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = // Virtual_Com_Port_DeviceDescriptor
  {
    0x12,                       /* 00 bLength */
    USB_DESC_TYPE_DEVICE,       /* 01 bDescriptorType*/
#if (USBD_LPM_ENABLED == 1)
    0x01,                       /* 02 bcdUSB */ /* changed to USB version 2.01
                                               in order to support LPM L1 suspend
                                               resume test of USBCV3.0*/
#else
    0x00,                       /* 02 bcdUSB */
#endif

    0x02,						/* 03 */
    0xEF,                       /* 04 bDeviceClass IAD*/
    0x02,                       /* 05 bDeviceSubClass*/
    0x01,                       /* 06 bDeviceProtocol IAD*/
    USB_MAX_EP0_SIZE,           /* 07 bMaxPacketSize*/
    LOBYTE(USBD_VID),           /* 08 idVendor*/
    HIBYTE(USBD_VID),           /* 09 idVendor*/
    LOBYTE(USBD_PID_HS),        /* 10 idVendor*/
    HIBYTE(USBD_PID_HS),        /* 11 idVendor*/
    0x00,                       /* 12 bcdDevice rel. 2.00*/
    0x02,						/* 13 */
    USBD_IDX_MFC_STR,           /* 14 Index of manufacturer  string*/
    USBD_IDX_PRODUCT_STR,       /* 15 Index of product string*/
    USBD_IDX_SERIAL_STR,        /* 16 Index of serial number string*/
    USBD_MAX_NUM_CONFIGURATION  /* 17 bNumConfigurations*/
  } ;

config descriptorおよび他の記述

__ALIGN_BEGIN uint8_t USBD_IAD_CfgHSDesc[USB_IAD_CONFIG_DESC_SIZ] __ALIGN_END =
{
	//Configuation Descriptor
	0x09,								// 00 bLength: Configuation Descriptor size
	USB_DESC_TYPE_CONFIGURATION,		// 01 bDescriptorType: Configuration
	USB_IAD_CONFIG_DESC_SIZ,			// 02 wTotalLength:no of returned bytes
	0x00,								// 03
	0x04,								// 04 bNumInterfaces: 4 interface
	0x01,								// 05 bConfigurationValue: Configuration value
	0x00,								// 06 iConfiguration: Index of string descriptor describing the configuration
	0xC0,								// 07 bmAttributes: self powered
	0x32,								// 08 MaxPower 100 mA

	// IAD 1 -> CDC1
	0x08,// 09 bLength: Interface Descriptor size
	0x0B,								// 10 bDescriptorType: IAD
	0x00,								// 11 bFirstInterface
	0x02,								// 12 bInterfaceCount
	0x02,								// 13 bFunctionClass: CDC
	0x02,								// 14 bFunctionSubClass
	0x01,								// 15 bFunctionProtocol
	0x02,								// 16 iFunction

	//Interface Descriptor
	0x09,								// 17 bLength: Interface Descriptor size
	USB_DESC_TYPE_INTERFACE,			// 18 bDescriptorType: Interface
	// Interface descriptor type
	0x00,								// 19 bInterfaceNumber: Number of Interface
	0x00,								// 20 bAlternateSetting: Alternate setting
	0x01,								// 21 bNumEndpoints: One endpoints used
	0x02,								// 22 bInterfaceClass: Communication Interface Class
	0x02,								// 23 bInterfaceSubClass: Abstract Control Model
	0x01,								// 24 bInterfaceProtocol: Common AT commands
	0x00,								// 25 iInterface:

	//Header Functional Descriptor
	0x05,								// 26 bLength: Endpoint Descriptor size
	0x24,								// 27 bDescriptorType: CS_INTERFACE
	0x00,								// 28 bDescriptorSubtype: Header Func Desc
	0x10,								// 29 bcdIAD: spec release number
	0x01,								// 30

	//Call Managment Functional Descriptor
	0x05,								// 31 bFunctionLength
	0x24,								// 32 bDescriptorType: CS_INTERFACE
	0x01,								// 33 bDescriptorSubtype: Call Management Func Desc
	0x00,								// 34 bmCapabilities: D0+D1
	0x01,								// 35 bDataInterface: 1

	//ACM CDC1 Functional Descriptor
	0x04,								// 36 bFunctionLength
	0x24,								// 37 bDescriptorType: CS_INTERFACE
	0x02,								// 38 bDescriptorSubtype: Abstract Control Management desc
	0x02,								// 39 bmCapabilities

	//Union Functional Descriptor
	0x05,								// 40 bFunctionLength
	0x24,								// 41 bDescriptorType: CS_INTERFACE
	0x06,								// 42 bDescriptorSubtype: Union func desc
	0x00,								// 43 bMasterInterface: Communication class interface
	0x01,								// 44 bSlaveInterface0: Data Class Interface

	//Endpoint CDC1 CMD Descriptor
	0x07,								// 45 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_ENDPOINT,				// 46 bDescriptorType: Endpoint
	IAD_CDC1_CMD_EP,					// 47 bEndpointAddress: (IN2)
	0x03,								// 48 bmAttributes: Interrupt
	LOBYTE(IAD_CDC_CMD_PACKET_SIZE),	// 49 wMaxPacketSize:
	HIBYTE(IAD_CDC_CMD_PACKET_SIZE),	// 50
	0xFF,								// 51 bInterval:
	//---------------------------------------------------------------------------

	//Data class interface descriptor
	0x09,								// 52 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_INTERFACE,			// 53 bDescriptorType:
	0x01,								// 54 bInterfaceNumber: Number of Interface
	0x00,								// 55 bAlternateSetting: Alternate setting
	0x02,								// 56 bNumEndpoints: Two endpoints used
	0x0A,								// 57 bInterfaceClass: CDC
	0x00,								// 58 bInterfaceSubClass:
	0x00,								// 59 bInterfaceProtocol:
	0x00,								// 60 iInterface:

	//Endpoint CDC1 OUT Descriptor
	0x07,								// 61 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_ENDPOINT,				// 62 bDescriptorType: Endpoint
	IAD_CDC1_OUT_EP,					// 63 bEndpointAddress: (OUT1)
	0x02,								// 64 bmAttributes: Bulk
	LOBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 65 wMaxPacketSize:
	HIBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 66
	0x00,								// 67 bInterval: ignore for Bulk transfer

	//Endpoint CDC1 IN Descriptor
	0x07,								// 68 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_ENDPOINT,				// 69 bDescriptorType: Endpoint
	IAD_CDC1_IN_EP,						// 70 bEndpointAddress: (IN1)
	0x02,								// 71 bmAttributes: Bulk
	LOBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 72 wMaxPacketSize:
	HIBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 73
	0x00,								// 74 bInterval

	// IAD 2 -> CDC2
	0x08,// 75 bLength: Interface Descriptor size
	0x0B,								// 76 bDescriptorType: IAD
	0x02,								// 77 bFirstInterface
	0x02,								// 78 bInterfaceCount
	0x02,								// 79 bFunctionClass: CDC
	0x02,								// 80 bFunctionSubClass
	0x01,								// 81 bFunctionProtocol
	0x02,								// 82 iFunction

	//Interface Descriptor
	0x09,// 83 bLength: Interface Descriptor size
	USB_DESC_TYPE_INTERFACE,			// 84 bDescriptorType: Interface
	// Interface descriptor type
	0x02,								// 85 bInterfaceNumber: Number of Interface
	0x00,								// 86 bAlternateSetting: Alternate setting
	0x01,								// 87 bNumEndpoints: One endpoints used
	0x02,								// 88 bInterfaceClass: Communication Interface Class
	0x02,								// 89 bInterfaceSubClass: Abstract Control Model
	0x01,								// 90 bInterfaceProtocol: Common AT commands
	0x00,								// 91 iInterface:

	//Header Functional Descriptor
	0x05,								// 92 bLength: Endpoint Descriptor size
	0x24,								// 93 bDescriptorType: CS_INTERFACE
	0x00,								// 94 bDescriptorSubtype: Header Func Desc
	0x10,								// 95 bcdCDC: spec release number
	0x01,								// 96

	//Call Managment Functional Descriptor
	0x05,								// 97 bFunctionLength
	0x24,								// 98 bDescriptorType: CS_INTERFACE
	0x01,								// 99 bDescriptorSubtype: Call Management Func Desc
	0x00,								// 100 bmCapabilities: D0+D1
	0x03,								// 101 !! bDataInterface:

	//ACM CDC2 Functional Descriptor
	0x04,								// 102 bFunctionLength
	0x24,								// 103 bDescriptorType: CS_INTERFACE
	0x02,								// 104 bDescriptorSubtype: Abstract Control Management desc
	0x02,								// 105 bmCapabilities

	//Union Functional Descriptor
	0x05,								// 106 bFunctionLength
	0x24,								// 107 bDescriptorType: CS_INTERFACE
	0x06,								// 108 bDescriptorSubtype: Union func desc
	0x02,								// 109 !! bMasterInterface: Communication class interface
	0x03,								// 110 !! bSlaveInterface0: Data Class Interface

	//Endpoint CDC2 CMD Descriptor
	0x07,								// 111 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_ENDPOINT,				// 112 bDescriptorType: Endpoint
	IAD_CDC2_CMD_EP,					// 113 bEndpointAddress: (IN4)
	0x03,								// 114 bmAttributes: Interrupt
	LOBYTE(IAD_CDC_CMD_PACKET_SIZE),	// 115 wMaxPacketSize:
	HIBYTE(IAD_CDC_CMD_PACKET_SIZE),	// 116
	0xFF,								// 117 bInterval:
	//---------------------------------------------------------------------------

	//Data class interface descriptor
	0x09,								// 118 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_INTERFACE,			// 119 bDescriptorType:
	0x03,								// 120 bInterfaceNumber: Number of Interface
	0x00,								// 121 bAlternateSetting: Alternate setting
	0x02,								// 122 bNumEndpoints: Two endpoints used
	0x0A,								// 123 bInterfaceClass: CDC
	0x00,								// 124 bInterfaceSubClass:
	0x00,								// 125 bInterfaceProtocol:
	0x00,								// 126 iInterface:

	//Endpoint CDC2 OUT Descriptor
	0x07,								// 127 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_ENDPOINT,				// 128 bDescriptorType: Endpoint
	IAD_CDC2_OUT_EP,					// 129 bEndpointAddress: (OUT3)
	0x02,								// 130 bmAttributes: Bulk
	LOBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 131 wMaxPacketSize:
	HIBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 132
	0x00,								// 133 bInterval: ignore for Bulk transfer

	//Endpoint CDC2 IN Descriptor
	0x07,								// 134 bLength: Endpoint Descriptor size
	USB_DESC_TYPE_ENDPOINT,				// 135 bDescriptorType: Endpoint
	IAD_CDC2_IN_EP,						// 136 bEndpointAddress: (IN3)
	0x02,								// 137 bmAttributes: Bulk
	LOBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 138 wMaxPacketSize:
	HIBYTE(IAD_DATA_HS_MAX_PACKET_SIZE),// 139
	0x00,								// 140 bInterval
};

恥ずかしい余談

ちなみにCDCはInterfaceがもともと二つある。
DATAクラス、CDCクラスがそれにあたる。
なのでCDCが2つあるとどっちがどっちのDATAやねん?という問題が発生する。
それを解決するのがIAD1とIAD2なわけ
CDCが2つ→DATAクラス2個、CDCクラス2個→よって総インターフェイス数は4つ(最初CDC2つなら2やん?と勘違いしてた僕
なので下記の記述が4になってる
f:id:gsmcustomeffects:20170621030224p:plain

まとめ

f:id:gsmcustomeffects:20170621030336p:plain