ラベル ARM の投稿を表示しています。 すべての投稿を表示
ラベル ARM の投稿を表示しています。 すべての投稿を表示

2017年3月5日日曜日

SoundCortexについて

GitHubで公開している音源チッププロジェクトSoundCortexについて、Qiita等で公開されている情報のリンクを集めてみました。2017/03/05時点で投稿した内容とぐぐった結果のまとめになります。

公式

I2Cで制御できる80円のPSG互換チップで遊ぼう

PSG音源部について利用方法の説明とArduino、Rasberry Pi、PCからの具体的な利用例。

I2Cで制御できるSCC+互換チップ

SCC音源部について利用方法の説明、SCC+レジスタについての概要説明など。

80円PSGをWindowsから鳴らしてみる

Windowsから利用する具体的な方法を紹介。実際にlibkssにパッチを当ててKSSファイルをチップから再生する例を紹介しています。

ユーザによる記事

FreeBSD+mrubyでサウンドプログラミング

yamori813さんによる記事。FreeBSDと言っていますが、謎のボード上から鳴らしているようです。

LPC810とArduino UNOでSCC互換音源を鳴らす(1)

LPC810とArduino UNOでSCC互換音源を鳴らす(2)

ImpactDrillさんによるArduino UNOで利用する際の具体的な記事。Arduino用のライブラリも作成されているようですので、Arduinoから利用してみたいという方には助けになるかと思います。I2Cはプロトコルの性質上、エラーが起きたときにバスハングしやすいのが難点です。通信が不安定だという方は(2)で書かれているように電圧やコンデンサなど、回路的な面をチェックすると改善されるかもしれません。

PCNベトナムキックオフ、80円コンピューターで拡張するIchigoJam、レキシライブに市長登場

IchigoJamの福野 泰介さん、IchigoJamに繋げる実験をしたようです。オリジナルのSoundCortexはI2Cのデバッグで詰まった時にデバッガを使いたくてSWD経由で開発できるようポート配置を変更したのですが、福野さんはシリアルで開発しやすいようにポート配置を再変更したforkを公開されています。書き込み環境としてはシリアルを利用している人の方が多いと思いますので参考になるかと思います。本家でも配置をビルド時に指定できるようにした方が良いかも。
IchigoJamみたいな開発環境から使うのはターゲットとして一番面白いと思います。Arduinoではやや実用的な用途に届かないし、Rasberry Piだと自分でサウンド出力を持ってるので実はあまり嬉しくない。自作の電子工作に直接組み込めればそれが一番美味しいんですが、それはそれで敷居が高いですから。

チップの入手について

ImpactDrillさんが(1)の記事でも報告していますが、一部店舗でLPC810が大幅に値上げされています。卸しの段階でキャンペーン価格が終了した等の可能性があり、今後ほかの店舗でも在庫がなくなり次第値上げされる事も考えられます。現時点(2017/03/05)ではマルツパーツが75円を維持していてお勧めです。仮に安く入手できるお店がなくなってしまったら、別のチップでの対応を考えたいと思います。コアをアセンブリで書いているのでCortex M系で適当なのがあれば良いのですが。まぁ、大した規模でもないのでMIPSやAVRに移動するのも辞さない覚悟で。

2017年3月2日木曜日

マイコン・インフィニット☆ひなまつりPRO-68K 告知

悪友イモリに誘われてマイコン・インフィニット☆PRO-68Kイモリプロダクション名義で参加します。

・日時:2017/03/12(日)
・場所:秋葉原 UDX GALLERY 4F
●第一部 展示・即売会 13:00~16:00
¥1,000- (高校生以下無料)
●第二部 懇親会・講演 16:30~18:00
¥4,500- (事前予約制・締切りました)
※第一部から通しで入場できます。

だそうです。

展示はイモリと僕とで絶賛準備中なわけですが、ひとまず僕の方から出す予定の物を紹介したいと思います。

CP/Mega88 - AVRで動作するCP/M

だいぶ古いネタで恐縮ですが、2009年から2010年にかけて制作したATMEGA88上で動作するCP/Mエミュレータです。エレキジャック・フォーラムで発表させて頂き、それなりに好評だったようです。当時、FPGAによるレトロPCの再現が流行っていたわけですが、本業が論理設計だった私は、敢えてマイコン1つでCP/M互換機を再現するという暴挙に出ました。


スライドのセンスが7年間変わっていなくてショックです。

Applerm II - ARMで動作するApple II BASICでLチカ

同じコンセプトでApple IIをLPC1114ワンチップで実装したもの。こっちはもっと最近の制作です。本来Apple IIはシリアルコンソールで動作するようなものではないのですが、VRAMの動きをトレースしつつ、シリアル端末情報に変換しています。画面スクロールとかの検出が大変だった。Apple IIのI/OにLPC1114のGPIOをマップしてあげているので、BASICからのPOKE命令でLチカできます。



4KBしかRAMがない中で、本来それより大きなRAMを必要とするBASICを動かすには、結構な黒魔術が必要でした。



雑誌の付録になっていたMARY-MB基板を使った動画もあります。

MegaZ-80K - AVRで動作するMZ-80K

CP/Mを作った後に、次はビデオ出力込みで何か作れないかな、という事で制作。4個のAVRを使ったヘテロマルチコア構成。ビデオ出力はATMEGA328が担当。RAMの大部分をVRAMとして使いつつ、クロック数えながらビデオ信号を生成しています。Z80エミュレーションはATMEGA644上で行っており、必要に応じてVRAMへの書き込みをフォワードするわけですが、書き込み可能な期間がVSYNCの間だけに限られているため、ATMEGA328との間にバッファとしてATTINY2313を挟んでいます。このチップはサウンドエミュレーションも兼任しています。また、キーボード代わりのファミコンコントローラ制御に別途ATTINY2313を1つ使っています。これらのチップは共有バスを通じて通信します。USARTベースの独自仕様。

SoundCortex - 80円で再現したPSG+SCC音源

Qiitaで何回か記事を書いていますが、(当時)80円のLPC810というARMを使ったPSG+SCC音源モドキです。I2Cで制御できるのがポイント。

今回はRas Pi上で動作する魔改造MSXエミュレータを通しての演奏デモを予定しています。写真のようにSDスナッチャーのオープニングを流す予定。



YouTubeにはGRADIUS 2を演奏するデモもあります。

今回このファームウェアを焼いたLPC810を持ち込み、実費+α(というか、送料考えると赤字)の100円で配布しようかなぁ、と思っています。実際に遊んでくれるユーザーを増やしたいので。まぁ10個くらいですかね。

SION2HD - X68k用ゲームをHTML5でHD化


X68k用のシューティングゲーム、SION2を最新の技術を駆使してウェブ上で動くようにしてみました。しかもハイレゾ化やステレオ表示といった謎の拡張が施されています。



実際に遊んでもらう方が早いかも。bit.ly/sion2で遊べます。また、黒魔術の詳細については以下のスライドで説明しています。


2015年1月9日金曜日

Getting ARM OABI environment after such a long time :-/

Background

Unfortunately, I need to use very very old ARM OABI Linux environment to salvage data from XFS used by broken NAS. XFS is designed to be compatible between platforms, but for some reasons, it was incompatible only with ARM OABI environment. As you may know, OABI used a curious middle endian and struct layout. It's a very old story around Linux kernel 2.6.1x, or so. But, it affects my HDL-GT1.0 actually. Linux box can not show any file entries even if the disk can be mounted, and xfs_repair has no power to solve the problem.
FYI, the first KURO BOX that was sold in Japan also used ARM OABI, but later versions used ARM EABI, AFAIK.

Basic Strategy

Install debian 4.0 (etch) onto QEMU. Etch was already out of maintenance, but this is the best choice since HDL-GT1.0 looks using the Linux that was based on it. Also there is enough information to install it onto QEMU, e.g. this site (*1). Debian 5.0 (lenny) provided two versions, OABI and EABI for ARM, but the next 6.0 (squeeze) had only EABI. Anyway these all were out of maintenance. There were no benefit to choose others.

How to Install

I used Ubuntu 14.04.1 with QEMU that is installed by "apt-get install qemu". Basically, I just followed the way described at (*1). But some tricks were needed since the information was already out of date, and meanwhile, etch was removed from the official place.

Boot files

Two mandatory files distributed at (*1) were also removed. I found them from web.archive.org. I can download them, but it seems that the server sometimes return 404 against them. Anyway, if you were lucky enough, you will be able to get them.
 Also, etch's initrd.gz was fetched from archive.debian.org/. The first initrd.img-2.6.18-6-versatile was used after installation, and the second initrd.gz was used on installation.

Use a manually chosen mirror site

Since etch was removed from the original place, I should specify an archive site manually. Mirror site name was archive.debian.org, and the path was default, /debian/. Here are some screen shots.
If you chosen one of default mirror sites, the installer will ask you to pick up a version of debian distributions from recent two or three choices that must use EABI.

Other Notices

In the page (*1),  that picture for the question "Continue without installing a kernel?" looks like the answer should be "<No>". But "<Yes>" is the right answer here.
Also, there is a critical issue to me. The provided kernel did not enable xfs support. So, even I install xfsprogs package and so on, xfs can not be mounted. According to the article, I can build kernel by myself. So, I'll try it next.
FYI, xfs_repair seems not working fine, but anyway it does not crash. Here, QEMU is launched with additional flags "-hdb HDL-GT-md13.img" here.
# apt-get install xfsdump  # it will install dependent xfs related packages including xfsprogs
# xfs_repair /dev/sdb  # it works somehow?

Kernel build

Let's build a kernel to support XFS. The system contains minimum set of packages. So, we need following packages to build the kernel at least. There are two choices, 2.6.18 and 2.6.24, but choose 2.6.18 that the original installation bases on.
# apt-get install make gcc linux-source-2.6.18 kernel-package build-essential libncurses5-dev initrd-tools
Then, prepare source files.
# cd /usr/src
# tar jxf linux-source-2.6.18.tar.bz2
# cd linux-source-2.6.18
Kernel 2.6.18 has a config template file for versatile. Here, we use it as a baseline, then enable XFS support in addition.
# make versatile_defconfig
# make menuconfig
In the menu, enable a following items. I'm not sure if this is the exactly necessary and sufficient condition. But at least, it is sufficient:)
  • Bus support ---> PCI support [built-in]
  • Device drivers ---> SCSI device support ---> SCSI device support [module]
  • Device drivers ---> SCSI device support ---> SCSI disk support [module]
  • Device drivers ---> SCSI device support ---> SCSI tape support [module]
  • Device drivers ---> SCSI device support ---> SCSI generic support [module]
  • Device drivers ---> SCSI device support ---> SCSI low-level drivers ---> SYM53C8XX Version 2 SCSI support [module]
  • File systems ---> Ext3 journalling file system support [module]
  • File systems ---> XFS filesystem support [module]
  • File systems ---> XFS Quota support [built-in]
  • File systems ---> XFS Security Level support [built-in]
  • File systems ---> XFS POSIX ACL support [built-in]
  • File systems ---> XFS Realtime subvolume support [built-in]
  • File systems ---> Filesystems in Userspace support [module]
  • File systems ---> Pseudo filesystems ---> Virtual memory file system support (former shm fs) [built-in]
  • File systems ---> Pseudo filesystems ---> Tmpfs POSIX Access Control Lists [built-in]
  • File systems ---> Pseudo filesystems ---> Userspace-driven configuration filesystem (EXPERIMENTAL) [module]
  • File systems ---> Native language support --> Japanese charsets (Shift-JIS, EUC-JP) [module]
  • File systems ---> Native language support ---> NLS UTF-8 [module]
then save and exit the menuconfig. Let's build the kernel.
# make dep
# make modules && make zImage && make modules_install && make install
# mkinitrd -o /boot/initrd-2.6.18.img 2.6.18
Now dependent modules should be installed into the internal file system, and kernel and initrd images that can be specified on launching QEMU are created. The kernel image should be placed at arch/arm/boot/zImage, and initrd image is /boot/initrd-2.6.18.img as you specified at the last command. I copied them to the host machine via scp. After shutting down the emulated ARM system, launch the system again with these new images, as
# qemu-system-arm -M versatilepb -kernel zImage -initrd initrd-2.6.18.img -hda hda.img -hdb want-to-read-fs-in-xfs.img -append "root=/dev/sda1"
The resolution of the boot console is finer than the original, and linux logo is not used. But anyway, it boots. Once you login the system, it will support XFS correctly, and it is exactly the XFS that is not compatible with current XFS. In my case, I launched QEMU with "-hdb HDL-GT-md13.img", then it can mount the image correctly.
# mount /dev/sdb /mnt
# ls -l /mnt
drwxr-xr-x 6 root  root  88 May 16  2012 share
drwxr-xr-x 6 root  root  88 May 16  2012 spool
Yep!

Lennyは新しすぎた

Etchでkernelの設定を変えて色々試してる間にLennyのイメージを見つけたので試してみた。XFSがデフォルトでオンになってたので期待したんだけど、互換性問題が修正された後のバージョンのようだ=Etch/OABI XFSは読めなかった、という残念な日記。

https://web.archive.org/web/20130605075901/http://people.debian.org/~aurel32/qemu/arm/

web.archive.orgにLennyのARM OABIイメージが残ってた。README.txt通りに起動すればXFSが有効になったカーネルで起動できるので、-hdbでイメージを渡せば普通にマウント可能。ただ、xfs_repairとかインストールされてないので、ちょっと作業が必要。

ちなみに運が良ければ、
# mount /dev/sdb /mnt
# ls -l /mnt
でメタ情報含めて正しく見えれば勝利。駄目だったらツール使ってfile systemの修復。まずは、このままだとaptが使えないので、/etc/apt/sources.listを編集。
deb http://archive.debian.org/debian/ lenny main
を追加すればOK。
# apt-get update
# apt-get install xfsprogs
あとは程度次第だとは思うんだけど、
# xfs_repair /dev/sdb
これで駄目なら
# xfs_repair -L /dev/sdb
あたりをマウント解除した状態で実施。で、僕の場合は最初から最後まで治らず。例のページにあったように shareというディレクトリ名は出てくるけど、メタデータが壊れて見えてる状況。xfs_repairはエラーなしで綺麗に終わったんだけど。

HDL-GTはEtchらしいのでバージョン揃えて試す作業を継続してみる。こっちは配布されてたイメージでXFSがONになってないので、kernelとinitrd.imgを作り直して見てるんだけど、boot中にpanicが出て、少しずつ修正しながらもうちょいでinitが走り出しそうなとこまで来たとこ。QEMU内でのkernel buildに時間かかってTATが……。

追記:HDL-GTのkernelは2.6.12.6ベースで予想通りOABIを使用、XFSまわりのkernel configは以下の通り。
CONFIG_XFS_FS=y
CONFIG_XFS_RT=y
CONFIG_XFS_QUOTA=y
# CONFIG_XFS_SECURITY is not set
CONFIG_XFS_POSIX_ACL=y

2014年12月13日土曜日

ARMの上で動くリンゴ印のOSで究極のLチカを楽しむ

ARMは仕事で初めてゲームを作ったコンシューマ機、ゲームボーイアドバンスのCPUという事で、とても思い入れのあるCPUです。ゆんゆんに「ちょっと手伝ってー」と言われて立ち寄ったのが今や泣く子も黙る神移植のM2さん。タイトルはデ・ジ・キャラット。楽曲は憧れの並木学さん。そしてサウンドプログラムを手がけていたのがX68k界でブイブイ言わせてた齊藤彰良さん。当時はお二方ともM2移籍前。僕もワクワクしながら仕事をしていました(最近は大きな仕事に慣れすぎてワクワク感が麻痺してしまってるかも……)。
そんな思い入れのあるARMですが、今やモバイルを中心とした組み込み世界の覇者。AndroidやiPhone向けの高性能プロセッサであると同時に、ホビー向けには個人でも100円程度で手に入るモデルが沢山あります。そこで、せっかくだから久々に何か遊べないかなー……という事で考えたのが……

120円ARMの上でリンゴ印のアイツを動かす!


そう、あれです、あれ。Apple II。
秋月で手に入るLPC1114の性能を見ていてピンと来ませんか?
  • ARM Cortex-M0
  • 50MHz(最大)
  • Flash: 32KB
  • RAM: 4KB
このギリギリ感!ちなみに以前からマイコンだけで古のマシンを再現する企画を続けており
  • CP/Mega88 ... CP/M Z-80 on ATMEGA88 (20MHz, Flash: 8KB, RAM: 1KB) + 外付けSRAM 64K
  • MegaZ-80K ... MZ-80K on ATMEGA644 (20MHz, Flash: 64KB, RAM: 4KB) + ATMEGA328 (20MHz, Flash: 32KB, RAM: 2KB) + TINY2313(20MHz, Flash: 2K, RAM: 128B)
に続く第三弾です。ソースはgithubに置いてありますが全てアセンブリで書かれています。毎回何かしら無駄な挑戦をしているわけですが、今回の見どころは
  1. I/O 4KB、ROM 12KB、RAM 48KBをFlash 32KB、RAM 4KBだけでごまかす
  2. ビデオ出力とキーボード入力をUARTのTX/RXに変換する
  3. 空いてるI/OにGPIOを割り当てて、Apple BASICからLチカ
の3点。

1は単純なローテクで実現。ROMはFlash側に埋め込み、VRAMについては一切記憶しない事でメモリ節約(次節でも説明)。ゼロページやスタック、Apple BASICが本気で使う空間にはRAMをまじめに割り当て、それ以外の領域に関しては全部同じ1-Byteを共有するようにしてあります。主記憶のないキャッシュみたいなもんで、書いて読んで比較……という単純なメモリチェックに対しては正しく動くけど、本当にワークとして触りだしたら動きません。まぁ、初期化コードを騙して、小さいプログラムを動かすには十分。

2は気合。UART入力をキーボードに変えるのは比較的簡単ですが、出力をUARTに変換するのはちょっと大変です。VRAMへの書き込みを見はりつつ、前に書いたアドレスからの差分でカーソル移動を行います。書き込み内容はTXに送るだけでVRAMの実体は実装しません。読まれたら固定値0xFFを返すだけ。スクロール時の画面書き換えは書き込みパタンから自動判別します。読んで1段上のラインに書き込んで……という処理を繰り返すのでアドレスパタンからも判別できるし、本来使われることのない"読み出し値0xFF由来の値"の書き込みを検知する事でも判断できます。スクロール処理中は再描画の書き込みを無視し、スクロール終了を検出したらしれっと改行を送って通常モードに戻ります。

3は特に難しいことはなく。拡張スロット用のI/O空間が開いているので、そこへのアクセスをGPIOにつなげてみました。Apple BASICからはPEEK/POKEで気軽に全メモリ空間へアクセスできるので、これだけでBASICからGPIO制御が可能になります。

という事で簡単なデモ。YouTubeの編集機能使って音とか説明つけてみた。携帯片手に左手でぽちぽち入力した映像なんですが、フラフラしてた画面も手ぶれ補正であっさり安定。



という事で、次はこのプロジェクトを始めた真の目的、佐藤一憲さんにもらったWIZnetを繋げて遊ぶ、というステップに進もうかと。宿題間に合いそうで良かった、良かった。