「Uncategorized」カテゴリーアーカイブ

H.265/HEVCな.mp4ファイルをMacのQuickTime Playerで再生できるようにする方法

H.265/HEVCでエンコードされた.mp4ファイルは、一般的にはMacのQuickTime Playerでは再生できません。これは、ファイル内でコーデック名を表すFourCCが”hev1″となっているからです。対処法として、FourCCを”hvc1″に変更すれば、QuickTime Playerで再生できるようになります。

ここではffmpegコマンドを使います。

ffmpeg -i input.mp4 -c:v copy -c:a copy -tag:v hvc1 output.mp4

これでMacのQuickTime Playerで再生可能なファイルに変換できます。

Certumの証明書を取得した話

自作アプリを配布するにあたって、SmartScreenの警告画面が鬱陶しくなったので、コードサイン証明書を個人でも取得できるところを探してみました。その結果、他のブログで紹介されていたCertumを選ぶことにしました。

Certumの証明書は、カードリーダを接続して使うタイプと、クラウド型のタイプがあるようです。私はポーランドからカードリーダが届くまで待てなかったので、クラウド型を選択しました。Open Source Code Signing in the Cloudという商品です。

まずは購入します。このとき使ったメールアドレスを後々使っていくことになるので気をつけます。

購入するとメールが届きます。リンクを開いて証明書の作成を開始します。SHA256しか対応していませんでした。LocalityはTokyoでOKでした。

さらにメールが来ます。次の項目が必要と書いてありました。

  • 身分証明書の両面スキャン(パスポートの顔写真のページと表紙で通した)
  • 公共料金の明細のスキャン(要、英文住所記載。ゆうちょ銀行の残高明細で通した)
  • OSSプロジェクトのURL(著作権のところにフルネームが入っている必要がある)

以上を用意したら、ccp@certum.plにZIPファイルで送りつけます。営業時間内なら数十分で処理されます。

さらにメールが届きます。ここから先は24時間以内にやらないといけないそうです。まず1通目、証明書のダウンロードページへのリンクがありますので、ダウンロードします。次の1通のメールに書かれている6桁のシークレットを控えたら、さらにもう1通のメールのリンクを開きます。すると、QRコードが出てきます。

ここで、SimplySignという名前のコードジェネレータをスマホにインストールするのですが、iPhoneかiPadが必要になります。なぜなら、Android版は日本向けに配信していないからです。SimplySignのiOS版をインストールして、先ほどのQRコードを読み込みます。すると、コードジェネレータとして機能するようになります。

さらに、Windows上でもWindows版のSimplySign (proCertum SmartSign)というソフトをインストールします。インストール後、メールアドレスと、コードジェネレータの吐き出すコードを入力すると、セットアップが完了となります。

signtool sign /n "Open Source Developer, Keiichi Tabata" /tr http://time.certum.pl/ /fd sha256 suika.exe

Windows上でSimplySign (proCertum SmartSign)にログインしている間だけ、秘密鍵を所有していて、サインできるという仕組みのようです。

コードジェネレータの端末が壊れたら、オペレータと英語でやりとりしないと復旧できないと思います。つらつらと書いてきましたが、結構オペレータと英語でやりとりしました。

さて、自作アプリがどれくらいダウンロードされたらSmartScreenの警告が消えるか、後日追記しようと思います。

PICマイコンのUARTでシリアル通信する

秋月でPICマイコン(AE-USBPIC44, PIC18F4553)を買ったので、UARTでPCとシリアル通信させてみました。

はまった点として、PICkit3でVDDが5.0V出なくて4.75Vになり、エラー表示で書き込みできないというのがありました。

PICkit 3 is trying to supply 5.000000 volts from the USB port, but the target VDD is measured to be 4.750000 volts. This could be due to the USB port power capabilities or the target circuitry affecting the measured VDD.

The target circuit may require more power than the debug tool can provide. An external power supply might be necessary.
Connection Failed.

そこで、プロジェクトのプロパティ→PICkit3→Powerを選び、Voltage Levelを4.5Vに設定すると、うまく書き込めました。(参考サイト)

UARTの送信は putch() で行います。この関数名にしておくことで、printf() が利用できます。

UARTの受信は getch() で行います。この関数名にしておくことで、gets() が利用できますが、gets() にはバッファオーバーランのバグがあるので決して使ってはいけません。そこで、今回は、UARTに接続されたターミナルで1行入力する(バックスペースで編集できる)関数 read_line() を用意しました。コンパクトで便利なのでよかったら使ってください。きちんとバッファオーバーランのないように作ってます。

さて、このプログラムの使い方は、まず、5VのUSBシリアル変換器を用意して、AE-USBPIC44ボード上のGND, TX, RXをクロス結線します。次にターミナルで9600bps 8bit ストップビット1で繋ぐと、PIC> というプロンプトが表示されますので、helpなどと入力してリターンキーを押してください。プロンプトが表示されないときはリターンキーを押してみてください。

/*
 * UART example
 * PIC18F4553 (AE-USBPIC44) + MPLAB X IDE + XC8
 */

#include <xc.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define _XTAL_FREQ  48000000L

#pragma config PLLDIV   = 5
#pragma config CPUDIV   = OSC1_PLL2
#pragma config USBDIV   = 2
#pragma config FOSC     = HSPLL_HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config CCP2MX   = OFF
#pragma config STVREN   = ON
#pragma config LVP      = OFF
#pragma config ICPRT    = OFF
#pragma config XINST    = OFF
#pragma config CP0      = OFF
#pragma config CP1      = OFF
#pragma config CP2      = OFF
#pragma config CP3      = OFF
#pragma config CPB      = OFF
#pragma config CPD      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
#pragma config WRT2     = OFF
#pragma config WRT3     = OFF
#pragma config WRTB     = OFF
#pragma config WRTC     = OFF
#pragma config WRTD     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
#pragma config EBTR2    = OFF
#pragma config EBTR3    = OFF
#pragma config EBTRB    = OFF

#define BAUD_RATE   9600L

#define SW1         PORTEbits.RE0
#define SW2         PORTEbits.RE1
#define LED         PORTEbits.RE2

void pic_init(void);
void uart_init(unsigned long baud);
void putch(unsigned char c);
unsigned char getch(void);
void read_line(char *buf, int buf_size);

void main(void)
{
    pic_init();
    uart_init(BAUD_RATE);

    while (1) {
        char s[16];

        /* Show prompt. */
        printf("PIC> ");

        /* Read command. */
        read_line(s, sizeof(s));

        /* Run command. */
        if (strcmp(s, "") == 0)
            continue;
        else if (strcmp(s, "help") == 0)
            printf("hello led switch\r\n");
        else if (strcmp(s, "hello") == 0)
            printf("Hello, world!\r\n");
        else if (strcmp(s, "led") == 0)
            LED = (unsigned char)~LED;
        else if (strcmp(s, "switch") == 0)
            printf("Switch is %s.\r\n", SW1 == 0 ? "ON" : "OFF");
        else
            printf("Command not found.\r\n");

        __delay_ms(10);
    }
}

void pic_init(void)
{
    ADCON1 = 0b00001111;
    TRISA = 0b00000000;
    TRISB = 0b00000000;
    TRISC = 0b00110000;         /* D-, D+ */
    TRISD = 0b00000000;
    TRISE = 0b00000011;         /* SW1, SW2, LED */
    LATA = 0b00000000;
    LATB = 0b00000000;
    LATC = 0b00000000;
    LATD = 0b00000000;
    LATE = 0b00000000;
}

void uart_init(unsigned long baud)
{
    /* Set baud rate generator */
    if (_XTAL_FREQ / (baud * 16L) <= 255) {
        BRGH = 1;
        SPBRG = (unsigned char)(_XTAL_FREQ / (baud * 16L));
    } else {
        BRGH = 0;
        SPBRG = (unsigned char)(_XTAL_FREQ / (baud * 64L));
    }

    SYNC = 0;       /* Asynchronous mode (UART) */
    SPEN = 1;       /* Enable serial port */
    TRISC6 = 1;     /* Use TX */
    TRISC7 = 1;     /* Use RX */
    CREN = 1;       /* Enable continuous reception */
    TXEN = 1;       /* Enable transmission */
}

void putch(unsigned char c)
{
    while(!TRMT)
        ;
    TXREG = c;
}

unsigned char getch(void)
{
    while(!RCIF)
        ;
    return (char)RCREG;
}

void read_line(char *buf, int buf_size)
{
    int pos = 0;
    while (1) {
        char c = getch();
        if (isprint(c) && pos <= buf_size - 2) {
            buf[pos++] = c;
            putch(c);
        } else if (c == 0x08 && pos > 0) {
            pos--;
            printf("\x08 \x08");
        } else if (c == '\r') {
            buf[pos] = '\0';
            printf("\r\n");
            break;
        }
    }
}

Android Studio 3.1でNDKを使うまで

Android Studio 2.1で開発したNDKを利用したアプリを、Android Studio 3.1に移植するまでの流れをまとめました。環境はUbuntu 18.04を想定。

準備編

  • udevルールを追加する
$ cat /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666", GROUP="plugdev"
$ sudo service udev reload
  • 32bit依存関係をインストールする
$ sudo apt-get install libz1:i386 libncurses5:i386 libbz2-1.0:i386 libstdc++6:i386

インストール編

  • Android Studio 3.1.4をダウンロードする
  • ZIPを展開する
  • binにパスを通す
  • studio.shを起動する
  • Android Studioのインストールを行う
  • インストール後、起動画面でConfigure->SDK Managerを選択する
  • CMake, LLDB, NDKを選択してインストールする

プロジェクト作成編

  • 新しいプロジェクトを作る
    • Include C++ supportにチェックを付ける
  • ソースファイルを配置する
    • app/src/main/java に Javaソースコードを置く
    • app/src/main/cpp に C/C++ ソースコードを置く
  • File->New->Folder->Assets Folder
    • app/src/main/assets にアセットを置く
  • app/src/main/resにリソースを配置する
  • AndroidManifest.xmlを既存のものに置き換える(activityを記述する)
  • CMakeLists.txtにライブラリのソースコードの名前を全部書く
add_library( # Sets the name of the library.
             suika

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/cmd_bg.c
             src/main/cpp/cmd_bgm.c
             src/main/cpp/cmd_ch.c )
  • 利用しているライブラリがあれば、CMakeLists.txtのtarget_link_librariesに追加する
target_link_libraries( # Specifies the target library.
                       suika
                       jnigraphics

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
  • 下記のエラーメッセージが出る
Failed to find Build Tools revision 27.0.3
  • “Install Build Tools 27.0.3 and sync project”のリンクをクリックすると解決できる

以上

ZYBO リンク集

ZYBOを購入後、いろんなページにお世話になりました。忘れないようにまとめておきます。

Base System Design

チュートリアル用のデザインです。まずはこれをベースにしてDebianを起動し、無事、Lチカができました。VDMAやらディスプレイコントローラやらがついてきますが、思い切って削除すると、合成の時間が20分→3分と減り、しかもDebianの挙動には影響ありませんでした。

PDFではramdiskを使うように記述がありますが、uEnv.txtでSDカードを指定することができます。

ボード定義ファイル

XDC

AXI4 全般

これを見てとりあえずAXI4 Lite SlaveのメモリマップドI/Oができるようになりました。タイミングチャートからは読み取れなかったのですが、ライトアドレスチャネルとライトデータチャネルが同時に有効になるという点に気づくまで1日かかりました……。

AXI4 Lite Slave

AXI4 (Full) Slave

AXI4 (Full) Master

割り込み

ACP

最終的にはキャッシュコヒーレントなアプリケーションを作成したいのですが、ACPに関する情報が少なくてまだまだ難しいです。

FreeBSD

Linuxを動かすのは、チュートリアルがしっかりしているので割と簡単なのですが、なんとFreeBSDを動かしてしまった方もいらっしゃるようです。

(編集中)

ERLite-3 USB Stick Replacement

After running Debian for two years, the USB stick of my ERLite-3 finally broke with many write errors.

ERLite-3 has compatibility problem on the USB port. Very few USB sticks are available on it. I found some articles and they all say “Sandisk Cruzer Fit” works well.

I had bought a 16GB model on Amazon… and… YES! It worked!! I should buy some spares!

FYI: Gentoo people says that sectors before 2048 contain something, but I could simply fdisk, mkfs and cp to recover the system.

Don’t forget to keep the half of disk empty.  That’s for “overprovisioning”.  You can create empty partition.  And never touch the partition.

ERLite3のUSBメモリを交換した

Debianで運用していたERLite3のUSBメモリが、2年経って、ついに書き込みエラーが頻発するようになりました。

じゃあ交換すればいいじゃん、と思うでしょうが、このルータはUSBメモリの相性問題がすごくて、適当に買っても動かないんです。

ちょっと検索してみると、下記の情報を発見。前に調べたときにはなかった情報が増えていてうれしい。

Amazonで手に入るSandisk Cruzer Fitでの動作報告があったので、自分も16GB (900円くらいの)を買ってみました。

結果は、動きました!いままで何種類かUSBメモリを試してきて全部だめだっただけに、とてもうれしい。入手できるうちに何個か買っておかねば。

fdiskして、オリジナルのUSBメモリからファイルをコピーしただけで、元の環境に戻せました。また、オリジナルのUSBメモリでは、4GBのうち2GBを未使用にすることで寿命を延ばしているように見えたため、真似をして12GBほど未使用領域にしました。

ただ……。USBメモリが届くまでの間に、NFSルートで運用するように切り替えたところ、ファイルI/Oが速い!Emacsもさくさく動いてくれる。結局、NFSルートで運用することになりましたとさ。

OCTEON Linux Kernel Build How To

This is just a memorandum of my personal instructions to cross-build linux kernel for EdgeRouter Lite (ERLite-3).  I’ve been using ERLite-3 with the latest Linux kernels for three years.  The user land distribution I use is Debian.  It works quite well for my usage of PPPoE router at home.

The important thing is to set BFD target name “mips64-unknown-linux-gnu”.

Buinding cross binutils

$ cd binutils-x.y.z
$ mkdir build
$ cd build
$ ../configure --target=mips64-unknown-linux-gnu --prefix=/opt
$ make
$ sudo make install

Building gcc

$ cd gcc-x.y.z
$ mkdir build
$ cd build
$ ../configure --target=mips64-unknown-linux-gnu --prefix=/opt --enable-languages=c --with-float=soft --disable-threads --without-ppl --without-cloog --disable-nls --disable-plugin --disable-shared --disable-tls --disable-sjlj-exceptions --disable-libssp --disable-libmudflap --disable-libgomp --disable-libquadmath --disable-libstdc__-v3 --disable-libitm
$ make
$ sudo make install

Building Linux kernel

# cd /src/linux-3.18.9
# export ARCH=mips
# export CROSS_COMPILE=mips64-unknown-linux-gnu-
# cp ../linux-3.14.1/.config .
# make oldconfig
# make
# make modules_install INSTALL_MOD_PATH=/nfsroot
# mips64-unknown-linux-gnu-strip vmlinux

Kernel Config

Here is my kernel configuration for Linux 4.2. I hope it helps you.

ConnectBotで日本語の記号が半角になる問題の対応

ConnectBotで日本語の記号が半角になる問題の対応

いわゆるEast Asian Ambiguous Width Charactersの問題。私の場合、EmacsでSKKを使用するため、”▼”が全角でないとターミナルの表示が崩れて使い物になりません。そこで、簡単に修正できそうだったので、対応してみました。

ソースの差分

変更の概要は、接続先ホストごとの設定に、「記号の全角化」というチェックボックスを追加したことです。英語環境だと”East Asian Wide Width”という項目になります。

注意点として、AndroidマーケットからインストールしたConnectBotを予め削除しておかないと、設定項目の数の違い(SQLiteのテーブル定義の違い)から、アプリケーションを起動できません。本家ConnectBotではバージョン番号を考慮してテーブルを拡張するようになっていますが、本サイトの改変版ではそのようなテーブルの拡張は行っていないからです。

動かない、動作がおかしいなどのフィードバックをいただければ修正いたします。また、Androidのこのバージョンで動いた、という動作報告もいただければうれしいです。

余談ですが、自分用のビルドではこちらを参考にしてフォントを埋め込んでいます。

Running Debian on ERLite-3 (JP)

この記事はRunning Debian on ERLite-3 (EN)の翻訳と補足である。[2015/05/12更新]

ERLite-3

EdgeRouter LiteでひたすらDebian/MIPSを動かし続ける趣味のページ。

バイナリ

はじめに

MIPS実機の入手性は年々低くなっており、教育機関ではシミュレータで代用されることもしばしばである。そこで紹介したいのがこのERLite-3(EdgeRouter Lite-3)。わずか100ドルという低価格で、2コアのMIPS64プロセッサ、Cavium OCTEON CN5020を搭載している。

OCTEONというと聞いたことがないかもしれないが、日本でもYAMAHA RTX1200にCN5010が採用されており実績がある。最近ではLinuxカーネルのメインラインにOCTEONサポートが取り込まれ、3.11からは特にパッチを必要とせずに動作する。

ERLite-3のソフトウェアであるEdgeOSはVyattaをベースとしており、apt-getでDebian squeezeのパッケージを利用可能であるという利点がある。ところが、実際に使ってみるとわかる事柄として、

  • 付属のUSBメモリが遅い (後で気づくが、USB1.1相当の転送速度らしい)
  • USBポートに癖があり、付属品以外のUSBデバイスを利用できない (ごく少数動くUSBメモリが報告されている)
  • NFSを利用したいが、付属カーネルはNFSやFUSEが無効である
  • EdgeOSのまま利用するとユーザubntを無効にできない (公開ホストとして問題)

といった、ルータとして利用する上では問題ないが、MIPSボードとして利用する上での制約がある。このため、NFSとFUSEを有効にした最新のカーネルをビルドすることにした。また、USBの問題に関しても調査を行って、簡単な回避策をとった。これらの情報を共有するため、まとまりはないがこのページに残しておく。

USBブート

次の手順でUSBメモリの内容を置き換える。vmlinuxとrootfsはこのページの先頭にある。

  • USBメモリのFATパーティションにあるカーネルvmlinux.64を差し替える
  • USBメモリのExt3パーティションにあるファイルを削除し、rootfsを展開する(※suで)
  • 注意: USBメモリをアンマウントする際に念のためsyncする。数分待たされる。

NFSROOT (DHCP+TFTP+NFS diskless)

ERLite-3にはブートローダのu-bootが搭載されており、TFTPを用いてネットワーク経由でカーネルをロードできる。DHCP+TFTP+NFSという構成は定番なので、 nfsroot, dhcpd, tftpd などのキーワードで検索すれば詳細な情報が得られる。

NFSサーバとなるマシンがDebian や Ubuntu であれば、次のパッケージをインストールして設定すればよい。

  • isc-dhcp-server (u-bootの設定によっては必要ない)
  • nfs-kernel-server (rootfsを提供するために使う)
  • tftpd (カーネルをネットワーク経由でロードするために使う)

u-bootコンソールの操作

ブートローダを操作することで、USBメモリやTFTPサーバから自由にカーネルをロードすることができる。

  • Cisco互換RJ45コンソールケーブル(500円くらい) 115200bps 8N1の設定
  • 下記の表示のタイミングでCtrl-Cを送信する
USB: (port 0)
  • 自動起動がキャンセルされ、u-bootのプロンプトに落ちる
Octeon ubnt_e100#
  • USBメモリからカーネルをロードする場合
# fatload usb 0 $loadaddr vmlinux.64
# bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw single
  • dhcp + tftp + nfsrootでカーネルをロードする場合
# dhcp
# tftpboot $loadaddr vmlinux
# bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=dhcp single
  • シングルユーザでの設定を終えた後、自動起動を設定するには、下記のようにbootcmdを保存する
# setenv bootcmd 'dhcp;tftpboot $loadaddr vmlinux;bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=dhcp'
# saveenv
  • なお、DHCPサーバはなくてもよい。その場合、TFTPサーバと通信するために下記のようなIPアドレスの設定と、rootパスの設定を行う。
# setenv serverip x.x.x.x
# setenv ipaddr y.y.y.y
# tftpboot $loadaddr vmlinux
# bootoctlinux $loadaddr coremask=0x3 root=/dev/nfs rw ip=y.y.y.y::gateway:mask:edge:eth0:off nfsroot=x.x.x.x:/nfsroot/,tcp,vers=3
  • もし出荷時の設定に戻したければ、下記のコマンドを実行する
# setenv bootcmd 'bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw rootsqimg=squashfs.img rootsqwdir=w mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)'
# saveenv

USBポートの問題

付属のUSBメモリ以外のUSBデバイスを接続するとI/Oエラーが発生して利用できないことが知られている。この現象はブートローダの段階から発生し、カーネル起動後でも直ることがない。

試行錯誤しているうちにわかったことは、

  1. USB1.1ハブを挟むとUSBデバイスが正常動作する。ただしUSB1.1で。 [これを利用]
  2. lsusb -vの結果、full speedしかサポートしていないように見える
  3. そもそも製品の仕様としてUSBの記述がなく、2GB Flashとなっている

以上のことから、少なくともUbiquiti社は、このボードでUSB2.0を利用できるとは考えていないようである。また、USB1.1ハブさえ入手できれば、USB1.1モードでUSBポートを利用できることがわかった。

入手性のよろしくないUSB1.1ハブであるが、手元にない場合は、USBキーボードについているハブや、KVMスイッチのUSB切り替え器などがUSB1.1専用である可能性があり、試してみるとよいかもしれない。

この問題の原因がOCTEONのチップにあるのか、プリント基板の配線にあるのか、はたまたLinuxのドライバにあるのか、まだわからないが、部分的な回避策は以上である。一言で言うと、ダメな子ほどかわいい

DSC_0012

USB1.1ハブを取り付けられたERLite-3の図。裏側にニッパーで穴を開けてケーブルを通した。

USBメモリの入手

その後、 https://wiki.gentoo.org/wiki/MIPS/ERLite-3 の情報により、Sandisk Cruzer FitというUSBメモリがそのまま利用可能であるということがわかった。

最新カーネルでのUSBの問題

最新のLinuxカーネルでは”parent hub has no TT“というUSB関連のエラーが発生する。これに対するworkaroundはこちらの英文ページに書いた。

時刻の設定

  • ntpでntp.nict.jpに合わせるなどする

運用実績

安定性を確認するため、付属のUSBメモリをDebianに書き換えて、SSHゲートウェイとして実際に運用している。今のところ問題なく動作しており、消費電力は7Wから8W程度である。

どこで買えるの?

アメリカのamazon.comにはたくさん取り扱いがあるが、日本には発送してくれない。参考までに私が購入したショップを紹介する。

  • ttp://import.buy.com/ja/product/252512866/
  • 個人輸入なので自己責任で!

楽天アカウントで決済可能で、到着までは15日だった。ebayで購入するのと同じくらいの覚悟は必要だと思われる。このほかに実際に入手できたショップをご存じの方は、コメント欄で教えていただければ幸いである。

余談

Cavium社のOCTEONプロセッサは、cnMIPSという独自の実装を元に、ルータ用のマルチコアプロセッサとして発展してきた。[1][2][3] 一方、他の半導体ベンダは、MIPS Technologies社の24KのようなIPコアを利用してSoCを製造している。両者はまったく別の実装であるものの、Cavium社がMIPS Technologies社からMIPS64 ISAのライセンスを受けることで、ISAレベルでの互換性を保っている。

Cavium社の独自仕様については、OCTEON Executiveというハードウェア抽象化レイヤのライブラリを用意することで、様々なOSへの移植を容易にしている。これは位置付けと名前がWindows NTのExecutiveというレイヤに似ている。OCTEON Executiveの一部のソースコードは、FreeBSDやLinuxにマージされている。より詳しく知りたい場合、cnusers.orgに情報がある。

伝統的にMIPSと名の付くプロセッサでは、パイプラインの外側にある割り込み等の処理を、まるごと「コプロセッサ0」という形骸化した部分に押しつけて設計してきた。この部分の仕様は歴代のプロセッサで変遷しており、Cavium社による実装もまた別物らしい。例えばOpenBSDをOCTEONに移植する際には、このように違って見えたそうだ。

他のMIPS系SoCで入手性のそこそこよいものとして、「ARMじゃない」Androidとして一部で有名なIngenicのJZシリーズがある。他にも、AtherosのSoCを使ったWi-Fiルータがあり、入手性はそこそこよい反面、技適マークの問題がある。あと、SoCではなくプロセッサと言うべきだが、RMSのマシンとして知る人ぞ知るLemote YeeloongのLoongsonがある。

最後に、本稿ではあまり触れなかったが、出荷時に搭載されているEdgeOSは十分に実用的で魅力的なシステムである。本来のルータとしての用途では、EdgeOSの利用を勧めたい。

参考書籍

  • マイクロプロセッサ・アーキテクチャ入門, 中森 章 著

Computer Organization and Design”だけだともやもやするところ、例えば、キャッシュメモリが非同期式でなく同期式のとき、パイプラインの構成はどうなるのか?、といった現実的な問題に対して、わかりやすく答えを用意している本。

  • See MIPS Run, Second Edition, Dominic Sweetman著

MIPSにおける割り込みや特権命令の動作を知りたいときに読むとよい。組み込み系エンジニアや、カーネルのプログラマにとって有益なリファレンスである。