ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示
ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示

Raspberry Pi でタッチパネル

Raspberry Pi でタッチパネルを試してみました。

使用した液晶モジュールや接続、設定は以前の記事どおりです。
そのM028C9325TPにはタッチパネルも付いているので、これを使ってみます。
あとRPiはB+でないとGPIOの数が足らないです...(´~`)

ハード的な接続は
を参考に繋いでます。

Linuxカーネルのビルドや準備は
を参考に手元のカーネルソースに追加・設定しビルドしました。

/boot/config.txt を以下のように修正して画面サイズを小さくしています。
framebuffer_width=640
framebuffer_height=480
hdmi_group=2
hdmi_mode=4
タッチパネルの調整も必要なので入力イベントをコンソール上で見れるツールもインストールしておきます。
sudo apt-get -y install xinput evtest
カーネルビルドで参考にしたHPにも書いていますがヘルパーモジュールも必要なので
cd
git clone https://github.com/notro/fbtft_tools.git
cd ~/fbtft_tools/ads7846_device; make && sudo make install
でインストールしています。

ここで一旦タッチパネルを使えるようにして調整~
sudo modprobe ads7846_device gpio_pendown=4
evtest
しかし、調整しようと思ったらXY座標が入れ替わってるっぽいので
sudo modprobe -r ads7846_device
sudo modprobe -r ads7846
でモジュールを削除して、 swap_xyの引数を追加して組み込みしなおします。
sudo modprobe ads7846_device gpio_pendown=4 swap_xy
でも、まだおかしい...Y方向のみ逆になってる...
しかも、入れ替える設定がないっぽい?
仕方ないので、モジュールのソースコードを修正しました。
カーネルソースの linux/drivers/input/touchscreen/ads7846.c の 861 行目辺り
if (Rt) {
    struct input_dev *input = ts->input;

    if (ts->swap_xy)
        swap(x, y);

    y = (y-4095)*-1;

    if (!ts->pendown) {
            input_report_key(input, BTN_TOUCH, 1);
            ts->pendown = true;
            dev_vdbg(&ts->spi->dev, "DOWN\n");
    }

    input_report_abs(input, ABS_X, x);
    input_report_abs(input, ABS_Y, y);
    input_report_abs(input, ABS_PRESSURE, ts->pressure_max - Rt);

    input_sync(input);
    dev_vdbg(&ts->spi->dev, "%4d/%4d/%4d\n", x, y, Rt);
}                
オレンジ色の1行を追加してY座標を反転させています。
これをコンパイル、組み込みしなおし
evtest
を起動している状態で4隅をタップしてXY座標の最小値、最大値をメモします。
最小値、最大値を引数にして組み込みなおします。
私の環境だと以下のようになりました。
sudo modprobe ads7846_device gpio_pendown=4 swap_xy x_min=523 x_max=3822 y_min=451 y_max=3711
これで調整完了。

今回、動作確認アプリにはJavaFX8を使用しました。
JavaFXだとXWindowなしでUIアプリが作れます。

からARM用JDKをダウンロードして
sudo tar zxvf jdk-8u6-linux-arm-vfp-hflt.gz -C /opt
でインストール。
アプリを640x480の画面サイズで作成し、
/opt/jdk1.8.0_06/bin/java -cp test.jar fx.JavaFXMain
などで実行できます。
JavaFXアプリはRPiに依存することなく、ごく一般的な作り方をすればOKです。

動作確認のため、以下のようにし液晶表示できるようにします。
sudo modprobe fbtft_device name=itdb28 fps=15 rotate=90 gpios=reset:13,dc:5,wr:12,cs:6,db00:14,db01:15,db02:17,db03:27,db04:22,db05:23,db06:24,db07:25
fbcp &
(3行に見えるかもしれませんが、2行です。)

で、実際に動かしてみた動画は以下になります。


JavaFXアプリの起動はさすがに遅いですね (;´д`)
タッチパネルの反応もいまいちな感じです。



Raspberry pi I2S PCM1716でハイレゾ再生

moraでKalafinaのハイレゾ音源(24bit、96kHz)を購入したのでRPiのI2S出力で再生してみようと思います。

PCM1716を使用するにはシステムクロックが必要になるので
Raspberry Pi I2S 出力で外部クロック使用 その2
のようにPLL1707で外部クロックを生成するのですが、当時は16bit、48kHzまでしか想定していないのと768fsを使いたかったせいで、そのままでは使えませんでした。
そんなわけでシンプルにしてみました。


PLL1707は96kHzだと384fsまでしか出せないっぽいので、システムクロックにはPLL1707のSCKO3の384fsを。
RPiの入力に必要なビットクロック64fsはSCKO2の256fsを74AC163で4分周しました。


次にI2Sドライバー側です。過去の記事とほぼ一緒ですが...
以下、GPIOのピン番号はRPi B+用になってます。

sound/soc/bcm/bcm2708-i2s.c
53行目辺り
#include <linux/gpio.h>
#include <linux/delay.h>
539行目辺り
gpio_request_one(26, GPIOF_OUT_INIT_LOW, "MyTest");
if (sampling_rate == 48000 || sampling_rate == 96000) {
  gpio_set_value(26, 0);
} else {
  gpio_set_value(26, 1);
}
gpio_free(26);

gpio_request_one(13, GPIOF_OUT_INIT_LOW, "MyTest");
if (sampling_rate == 96000) {
  gpio_set_value(13, 1);
} else {
  gpio_set_value(13, 0);
}
gpio_free(13);

gpio_request_one(16, GPIOF_OUT_INIT_LOW, "MyTest");
if (data_length == 16) {
  gpio_set_value(16, 0);
} else {
  gpio_set_value(16, 1);
}
gpio_free(16);
GPIO26をPLL1707のFS1に繋いで44.1kHzか48kHzかを設定。
GPIO13をPLL1707のSRに繋いで上記周波数を2倍にするか否かを設定。
GPIO16をPCM1716のIWOに繋いで16bitか24bitかを設定しています。

694行目辺り
struct bcm2708_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
uint32_t mask;
int myerr;

switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  myerr = gpio_request_one(12, GPIOF_OUT_INIT_LOW, "MyTest");
  if (myerr == 0) {
    gpio_set_value(12, 1);
    gpio_free(12);
    mdelay(100);
  }

  bcm2708_i2s_start_clock(dev);

  if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
          mask = BCM2708_I2S_RXON;
  else
          mask = BCM2708_I2S_TXON;

  regmap_update_bits(dev->i2s_regmap,
                  BCM2708_I2S_CS_A_REG, mask, mask);
  break;

case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  myerr = gpio_request_one(12, GPIOF_OUT_INIT_LOW, "MyTest");
  if (myerr == 0) {
    gpio_set_value(12, 0);
    gpio_free(12);
    mdelay(100);
  }

  bcm2708_i2s_stop(dev, substream, dai);
  break;
GPIO12をPCM1716のMUTEに繋いでます。

791行目辺り
static struct snd_soc_dai_driver bcm2708_i2s_dai = {
        .name   = "bcm2708-i2s",
        .probe  = bcm2708_i2s_dai_probe,
        .playback = {
                .channels_min = 2,
                .channels_max = 2,
                .rates =        SNDRV_PCM_RATE_8000_192000,
                .formats =      SNDRV_PCM_FMTBIT_S16_LE
                  // : disable for now, it causes white noise with xbmc
                                | SNDRV_PCM_FMTBIT_S24_LE
                                | SNDRV_PCM_FMTBIT_S32_LE
                },
        .capture = {
                .channels_min = 2,
                .channels_max = 2,
                .rates =        SNDRV_PCM_RATE_8000_192000,
                .formats =      SNDRV_PCM_FMTBIT_S16_LE
                                | SNDRV_PCM_FMTBIT_S24_LE
                                | SNDRV_PCM_FMTBIT_S32_LE
                },
        .ops = &bcm2708_i2s_dai_ops,
        .symmetric_rates = 1
};
24bitの所がコメントアウトされていたので外しました。しかし、最新のソースコードだと元々上記のようになってますね。

sound/soc/codecs/pcm1794a.c
24行目辺り
static struct snd_soc_dai_driver pcm1794a_dai = {
        .name = "pcm1794a-hifi",
        .playback = {
                .channels_min = 2,
                .channels_max = 2,
                .rates = SNDRV_PCM_RATE_8000_192000,
                .formats = SNDRV_PCM_FMTBIT_S16_LE |
                           SNDRV_PCM_FMTBIT_S24_LE |
                           SNDRV_PCM_FMTBIT_S32_LE
        },
};
一応、SNDRV_PCM_FMTBIT_S32_LEを追加。

sound/soc/bcm/rpi-dac.c
45行目辺り
static struct snd_soc_dai_link snd_rpi_rpi_dac_dai[] = {
{
        .name           = "HifiBerry Mini",
        .stream_name    = "HifiBerry Mini HiFi",
        .cpu_dai_name   = "bcm2708-i2s.0",
        .codec_dai_name = "pcm1794a-hifi",
        .platform_name  = "bcm2708-i2s.0",
        .codec_name     = "pcm1794a-codec",
        .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
                                //SND_SOC_DAIFMT_CBS_CFS,
                                SND_SOC_DAIFMT_CBM_CFS,
        .ops            = &snd_rpi_rpi_dac_ops,
        .init           = snd_rpi_rpi_dac_init,
},
};
外部クロックを使うように設定しています。

あとはドライバーをコンパイルして適当な場所にコピーして組み込めばOK。
sudo insmod snd-soc-bcm2708-i2s.ko
sudo insmod snd-soc-pcm1794a.ko
sudo insmod snd-soc-rpi-dac.ko

MPDで再生してみるとみごと鳴ってくれました。ヽ(´▽`)ノ




Raspberry Pi B+ 到着 & I2S出力確認

Raspberry Pi B+ が届きました。
しかし、P5がなくなってI2Sが使えるか謎でなんですよね~(´~`)
でも、公式フォーラムによると使えるとのことで試してみました。

sudo rpi-update

でファームウェア更新。

カーネルソースコードもってきてコンパイル。

bcm2708-i2s.c を以下のように赤字部分を修正。
static void bcm2708_i2s_setup_gpio(void)
{
        /*
         * This is the common way to handle the GPIO pins for
         * the Raspberry Pi.
         * TODO Better way would be to handle
         * this in the device tree!
         */
#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))

        unsigned int *gpio;
        int pin;
        gpio = ioremap(GPIO_BASE, SZ_16K);

        /* SPI is on GPIO 7..11 */
        for (pin = 18; pin <= 21; pin++) {
                INP_GPIO(pin);          /* set mode to GPIO input first */
                SET_GPIO_ALT(pin, 0);   /* set mode to ALT 0 */
        }

#undef INP_GPIO
#undef SET_GPIO_ALT
}

でもって、このドライバーを組み込み、
http://elinux.org/RPi_BCM2835_GPIOs
を見つつ GPIO18、19、21 をDACに繋げば今までと同じように使えました。

/etc/modules に bcm2708_dmaengine も追加する必要あり。







Raspberry Pi に液晶(LCD)を繋いでみました

Raspberry Pi に液晶(LCD)を繋いでみました。
使用したのは Aitendo の M028C9325TP です。


参考HPは以下の通り。
https://github.com/notro/fbtft/wiki
http://www.raspberrypirobot.com/tft-2-8-lcd-raspberrypi-240x320-ili9325c-touch-screen-display-monitor/
http://www.myu.ac.jp/~xkozima/lab/raspTutorial3.html
http://www7b.biglobe.ne.jp/~nobosan_flute/lab_theme31.htm


まずは M028C9325TP を8bitモードにしなくてはなりませんが、
参考HPによるとAitendoのHPの説明が間違っています!
実際、動作しなかったしね...(;´д⊂)

ガバッ!っと液晶をはがして、緑丸で囲ったR2の抵抗をはがして、R1をショートさせる必要があります。
 

あとは
https://github.com/notro/fbtft/wiki/LCD-Modules#itdb02-28
のParallel databusのように繋いでおきます。
(今回はタッチパネルは使用しません)

次に
https://github.com/notro/fbtft/wiki
からSDカードイメージ(2014-01-07-wheezy-raspbian-2014-03-12-fbtft-master-firmware.zip)をダウンロードして起動~!
以下のコマンドで、ドライバをインストール。
sudo modprobe fbtft_device name=itdb28 gpios=reset:17,dc:3,wr:2,cs:27,db00:9,db01:11,db02:18,db03:23,db04:24,db05:25,db06:8,db07:7,led:4 rotate=90
配線間違っていなければ、以下のように表示されると思います。






正面だと白飛びが激しいですね (;´д`)


ちょっと角度をつけると、いい感じです。

動画の再生は fbcp と omxplayer を使えばハードウェア支援ありで再生可能です。
でもLCD自体が10~20fpsみたいなので、少々カクカクですがね~(´~`)
あと、4:3に縮小されるようなので、
omxplayer --win "0 150 1704 870" bbb.mp4
のように横長表示させてあげればLCD上では丁度いいサイズになってくれます。



Raspberry Pi i2s出力とPCM1716でノイズ対策

raspbian だと標準で I2S 出力できるようになりましたが、
手元の PCM1716 を普通に繋いで MPD で再生すると
以下のケースでノイズが出てしまいます。

・再生開始時
・停止時
・シーク時
・音楽フォーマット変更時(16bit<=>24bit、44.1kHz <=> 48kHz など)

いくつか試した結果、外部クロックにしてドライバ内で設定が変わるたびに PCM1716 をミュートして0.1秒のウェイトを入れると、いい感じになりました。ヽ(´▽`)ノ
今まで出ていたポップノイズみたいなのが聞こえなくなってます。
以下、その改良内容です。

クロスコンパイルしたカーネルにRPi上でコンパイルしたドライバを組み込もうとすると、
ハングアップしちゃいます。
前はうまくいってたのになぁ~(;´д⊂)
しかたないのでRPi上でカーネル、ドライバをコンパイル!

https://github.com/raspberrypi/linux
から branch rpi-3.10.y を選択してダウンロード。

いざ、コンパイルしようとすると bc がないと言われちゃいます。
ので、
sudo apt-get install bc
でインストール。
でもってコンパイル!
5~6時間放置!!

コンパイルしたカーネル&ドライバでI2S出力できることを確認してから改良していきます。
赤文字が追加、緑文字が更新です。

rpi-dac.c
53行目辺り
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
             //SND_SOC_DAIFMT_CBS_CFS,
             SND_SOC_DAIFMT_CBM_CFS,
これで外部クロックを使えるようになります。

bcm2708-i2s.c
41行目辺り
#include <linux/gpio.h>
#include <linux/delay.h>
を追加。

462行目辺り bcm2708_i2s_hw_params() 内
switch (params_channels(params)) {
case 2:
    format = BCM2708_I2S_CH1(format) | BCM2708_I2S_CH2(format);
    format |= BCM2708_I2S_CH1(BCM2708_I2S_CHPOS(ch1pos));
    format |= BCM2708_I2S_CH2(BCM2708_I2S_CHPOS(ch2pos));
    break;
default:
    return -EINVAL;
}

int myerr = gpio_request_one(4, GPIOF_OUT_INIT_LOW, "MyTest");
if (myerr == 0) {
  if (sampling_rate == 48000) {
  gpio_set_value(4, 0);
  } else {
  gpio_set_value(4, 1);
  }
  gpio_free(4);
}

myerr = gpio_request_one(8, GPIOF_OUT_INIT_LOW, "MyTest");
if (myerr == 0) {
  if (data_length == 16) {
  gpio_set_value(8, 0);
  } else {
  gpio_set_value(8, 1);
  }
  gpio_free(8);
}
フォーマットに応じてPCM1716とPLL1707の設定を変更しています。
GPIO4はPLL1707のFS1 (PIN 5)、GPIO8はPCM1716のIW0 (PIN 23) に繋いでいます。
PCM1716のフォーマット選択はしなくても音鳴ってたけど、ついでなので制御するようにしました。

645行目辺り bcm2708_i2s_trigger() 内
int myerr;

switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
    myerr = gpio_request_one(7, GPIOF_OUT_INIT_LOW, "MyTest");
    if (myerr == 0) {
      gpio_set_value(7, 1);
      gpio_free(7);
      mdelay(100);
    }

    bcm2708_i2s_start_clock(dev);

    if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
        mask = BCM2708_I2S_RXON;
    else
        mask = BCM2708_I2S_TXON;

    regmap_update_bits(dev->i2s_regmap,
            BCM2708_I2S_CS_A_REG, mask, mask);
    break;

case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
    myerr = gpio_request_one(7, GPIOF_OUT_INIT_LOW, "MyTest");
    if (myerr == 0) {
      gpio_set_value(7, 0);
          gpio_free(7);
      mdelay(100);
    }

    bcm2708_i2s_stop(dev, substream, dai);
    break;
default:
    return -EINVAL;
}
停止や再開の時にPCM1716をミュートにして0.1秒ウェイトしています。
GPIO7をPCM1716のMUTE (PIN 25)に繋いでいます。

以上の修正をしたらドライバをコンパイルして組み込めばOK~

MPDクライアントでどんな操作してもポップノイズみたいなのが出なくなりました。ヽ(´▽`)ノ





Raspberry Pi 最近のI2S出力事情

最近のRPiは標準でI2S出力ができるようですね。
一昔前はドライバのコンパイルが必要だったのに~(;´д⊂)

どんな感じなのか 2014-01-07-wheezy-raspbian で試してみました。
インストール直後は使えないのかな?
/etc/modules
を以下のように編集すると使えるようになりました。
赤字の部分を追加しています。
snd-bcm2835
snd_soc_bcm2708_i2s  
bcm2708_dmaengine  
snd-soc-pcm1794a   
snd_soc_rpi_dac
以前と同じようにPCM1716を繋いで鳴らしてみました。
システムクロックはBCKをICS570を使って4倍にしてます。


普通に使えてます。
随分手軽に使えるようになったのね~(´∀`)






Raspberry Pi I2S 出力で外部クロック使用 その2

前回、Raspberry Pi I2S 出力で外部クロックを使用できるようにしましたが
そのままでは44.1kHzの音楽ファイルしか正しく再生出来ません。
ちなみに48kHzな音楽ファイルを再生すると少しスロー再生になります。(´~`)

PLL1707のFS1をLOWやHIGHにしてやれば 48kHz と 44.1kHz を切り替えられるので、
i2sドライバ内でGPIOを操作してやればうまくいきそうな感じがしますよねぇ~

MPDの場合、音楽ファイルのフォーマットが変われば bcm2708-i2s.c の bcm2708_i2s_hw_params()関数が呼ばれることがわかっているので、ここにGPIO操作の処理を追加してやります。

bcm2708-i2s.c の適当な場所に
#include <linux/gpio.h>
を追加。
bcm2708-i2s.c の444行目辺りに以下のコードを追加します。
int myerr = gpio_request_one(4, GPIOF_OUT_INIT_LOW, "MyTest");
if (myerr == 0) {
  if (sampling_rate == 48000) {
    gpio_set_value(4, 0);
  } else {
    gpio_set_value(4, 1);
  }
  gpio_free(4);
}
これで音楽ファイルのフォーマットが48kHzの時はGPIO4がLOWに、44.1kHzの時はHIGHになります。

あとはRPiのGPIO4とPLL1707のFS1を繋いでやればOKなのですが...
直接繋ぐと私の環境ではノイズだらけに...
配線を遠回りさせてやるとノイズが消えました...
素人にはわけわかめ謎すぎです( ̄~ ̄;)

でもまぁ、これでMPDで48kHz、44.1kHz混在プレイリストでも問題なく再生できるようになりました。ヽ( ´ー`)ノ
もちろん外部クロックにしているので曲間(フォーマット切り替わり時)でポップノイズみたいなのは出ません。




どうもPLL1707の出力にバッファを付ければ配線を遠回りさせなくてもノイズがでないもよう。
36MHzくらい出てるはずなので74AC14を付けてみました。
PIN9のGNDもつなぎ忘れてた~(;´д`)





Raspberry Pi I2S 出力で外部クロック使用

システムクロックの線を抜き差しするとポップノイズっぽいのが聞こえたので、
外部クロックを使うようにすればポップノイズが消えるかも知れないと思って試してみました。

結論から言うと、今までの低い音のポップノイズはしなくなったけど、
代わりに高い音のポップノイズが出るようになっただけでした...(´・ω・`)

外部クロックを使用するには、またドライバのソースをいじるのですが、
念のために今までの修正を全て元に戻しておきます。
で、/usr/src/3.8.10+/sound/soc/bcm2708/rpi-tda1541a.c の 46行目を以下のようにします。
        .name           = "TDA1541A",
        .stream_name    = "TDA1541A HiFi",
        .cpu_dai_name   = "bcm2708-i2s.0",
        .codec_dai_name = "tda1541a-hifi",
        .platform_name  = "bcm2708-pcm-audio.0",
        .codec_name     = "tda1541a-codec",
        .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
                             // SND_SOC_DAIFMT_CBS_CFS,
                        SND_SOC_DAIFMT_CBM_CFS,

        .ops            = &snd_rpi_tda1541a_ops,
        .init           = snd_rpi_tda1541a_init,
これで64fsなビットクロックを外部入力することが出来ます。
でもって、何かしらの外部クロックを接続すればOKです。
今回は PLL1707 を繋いでみました。


丁度いいピッチ変換基板が売られていなくて、かなりごちゃごちゃしちゃってます。( ̄~ ̄;)
PLL1707の768fs出力をDACのシステムクロックへ入力、
PLL1707の768fs出力を12分周した64fsをRPiとDACのビットクロックに入力しています。
分周には
http://homepage2.nifty.com/y-daisan/html/B100529-2.html
を元に 74AC163 と 74HC10 を使用しています。

768fsとなると36MHz以上になります。
74HCシリーズの動作速度は30MHzくらいまでらしいのでカウンターの74163には74AC163を使用しています。
7410のほうは最高でも768fsの半分の周波数なので、74HC10でも大丈夫と思われます。

電子工作を始めるまではデジタル回路にノイズなんてないだろう~
と思っていましたがノイズでまくるんですね(>_<)
今回もノイズに苦しめられましたが、なんとかなってよかった~(;´д`)
検証はしてませんが 74AC163 と 74HC10 にパスコン付けたらノイズが消えた...気がします。




Raspberry Pi I2S 出力 24bit 48kHz 再生

公式フォーラムではこのドライバをちょこっと修正で192kHzでも再生出来た~って書き込みがありますね。

じゃ~試してみよう!...と、思っても192kHzなデータは持ってません。
そんなわけで24bit 48kHzを試してみました。
PCM1716を使えるようにしたのもこれを試したかったからなのよね~(´―`)

ちなみに何もドライバを修正せずに48kHzの音楽を鳴らしてみるとハングアップしてしまいます。
電源をOFFにするしかない状態です。( ̄~ ̄;)

修正前にちょっと準備します。
クロスコンパイル環境でコンパイルしてもいいのですが、何度も「コンパイル > RPiに転送」は面倒くさいので RPi 上でドライバだけコンパイル出来るようにします。
https://github.com/koalo/linux
からソースコードの linux-rpi-3.8.y-asocdev.zip をダウンロードし、/usr/src に展開します。
ディレクトリ名は 3.8.10+ とでもしておきます。
既にクロスコンパイル環境で作成したカーネル 3.8.10+ で起動しているものとします。
cd /usr/src/3.8.10+
zcat /proc/config.gz > .config
make oldconfig
make modules_prepare
クロスコンパイル環境から Module.symvers を RPi の /usr/src/3.8.10+ へコピー
これでドライバのコンパイル準備完了です。

まずは /usr/src/3.8.10+/sound/soc/bcm2708/bcm2708-i2s.c 420行目辺りを修正します。
今回はIISフォーマット入力可能なDACを使用するため、以前紹介した標準フォーマット出力の修正は行いません。
//      if (bcm2708_clk_freq[clk_src] % target_frequency == 0
//                      && bit_master && frame_master) {
//              divi = bcm2708_clk_freq[clk_src]/target_frequency;
//              divf = 0;
//      } else {
                uint64_t dividend;

                /*
                 * Overwrite half frame length, because the
                 * above trick is not needed.
                 * This is fixed, because a bit clock of 64*fs
                 * seems to be what most codecs want.
                 * Is it necessary to have this dynamic?
                 */
                half_frame = 32;
                target_frequency = sampling_rate*half_frame*2;

                clk_src = BCM2708_CLK_SRC_PLLD;
                mash = BCM2708_CLK_MASH_1;

                dividend = bcm2708_clk_freq[clk_src];
                dividend *= 1024;
                do_div(dividend, target_frequency);
                divi = dividend / 1024;
                divf = dividend % 1024;
  if (sampling_rate == 48000) {
     divi = 162;
     divf = 3000;
  }
//      }
どうやら48kHzの場合、if文のほうに流れて後の処理でハングアップするようです。
ので、コメントアウトしちゃいます。
でもって、diviとdivfで出力周波数を設定するようです。else内の計算だと48.1kHzになっちゃうので48kHzデータの場合は自前で値を代入しちゃってます。上記の数値でだいたい48.008kHzになります。
で、コンパイル!
cd /usr/src/3.8.10+/sound/soc/bcm2708
make -C /usr/src/3.8.10+ M=/usr/src/3.8.10+/sound/soc/bcm2708 modules
次に /usr/src/3.8.10+/sound/soc/codecs/tda1541a.c 24行目を修正します。
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
32bitのデータを受け付けるようにします。
この修正をしない場合は mplayer かドライバが16bitに変換するようです。
あと24bitを表す定数は存在するけど意味ないっぽいです。
mplayerだと24bitの音楽ファイルでも32bitとして扱っているみたいです。この辺はよくわかりません~(;´д`)
で、コンパイル!
cd /usr/src/3.8.10+/sound/soc/codecs
make -C /usr/src/3.8.10+ M=/usr/src/3.8.10+/sound/soc/codecs modules
でもって、ドライバを登録します。
cd /usr/src/3.8.10+/sound/soc/bcm2708
sudo insmod snd-soc-bcm2708-i2s.ko
sudo insmod snd-soc-rpi-tda1541a.ko
sudo insmod ../codecs/snd-soc-tda1541a.ko
あとはmplayerなどで再生すればOK!ヽ( ´ー`)ノ
もちろん、DAC側でIISを入力出来るようにしておく必要があります。PCM1716だとIIS、IW0ピンをHにします。


上がデータ、下がLRクロックです。24bitで出力されているようですね。


さて、16bit 44.1kHz と 24bit 48kHzの違いですが...あんまり変わらない...( ̄~ ̄;)
市販のAVアンプだと結構変わった印象があったので、ちょっと期待していたのですが残念ですなぁ。

MPDで使用する場合は /etc/mpd.conf を以下のように修正しておきましょう。
audio_output {
        type            "alsa"
        name            "ALSA I2S Device"
        device          "hw:1,0"        # optional
#        format          "44100:16:2"    # optional
}
formatはコメントアウトしておかないと常に 44.1kHz 16bit で出力されるようです。


あと、ついでなのでOPアンプを NJM2114DD から OPA2604 に変えました。
OPアンプの交換は変化がわかりやすいですね~
NJM2114DDは平べったい音で眠気を誘う音でしたが、OPA2604はメリハリがあり、聴いてて楽しい音です。
ここでフト思ったのですが、眠気を誘うアンプって以外と需要あったりしないのだろうか?
そんな時はNJM2114DDのような音をお試しあれ~(´―`)




RaspberryPiにPCM1716をつないでみた

以前 RaspberryPi の I2S 出力に PCM1716 を繋ごうとしたけど、システムクロック出力がなくて繋げませんでした。

しかし、世の中には便利なICがあるんですね。ネットを徘徊していると ICS570 という周波数をn倍してくれるICがあるそうです。
これを使えば PCM1716 も繋げそうですね。
ただリアル店舗では売られてないのかな?
でも、RSコンポーネンツなどで注文できます。今回は3.3V用のICS570Bを注文しました。

届いたのがこちら。



小さめのICなのでピッチ変換基板に乗せています。

PCM1716を繋ぐには一例として44.1kHzの256倍のクロック信号が必要です。
RPiのI2S出力は片チャンネル32ビットなので、ビットクロックが既に64倍になっています。
ってことはこれを4倍すれば256倍になることになります。

実際にICS570を動かしてオシロで信号を見てみると...



ほぼ4倍されてますね~(´~`)
黄色の線がRPiのビットクロック。青色の線がICS570の出力。

さっそくPCM1716を繋いでみました。
が、またまたノイズに悩まされることに...



結論をいいますと、矢印で示した白い線を追加すればノイズが消えてくれました。
GNDってコの字型でも繋がってればOKと思っていたのですが、だめなんですかね。
白い線を足すことでGNDが口の字に繋がることになります。
こんなことでノイズが出たり消えたりするなんて、素人には難しすぎるわ~(>_<)

RPiから直接PCM1716に繋ぐとノイズがでてたので、間に74HC04を挟んでいます。
 

ちょこっとギュウギュウ詰めにしてみました。

音に関しては...とりあえず鳴っています。
前にCS8416と繋いだ時はLPFとかなしでもクリアに聞こえていた気がしたのですが、今回はLPFないとノイズだらけ...
こういうもんなんですかね~( ̄~ ̄;)



Big Raspberry JAM TOKYO 2013

5月25日にBig Raspberry JAM TOKYO 2013が開催されれますね。


申し込みはこちら。 http://atnd.org/event/E0015063/

これを知ったころは申し込もうにも定員いっぱいで申し込めませんでしたが、
今日ちょこちょこ申し込みページ見てたら119/120になってたので申し込んでみました。
申し込み後でもキャンセル出来るようで空きができる場合があるようです。
この記事書いてる時もまた119/120になってました。


そんな今日5/21は22日発売のCDやDVDが届き始める日ですね。
うちにもRSコンポーネンツで注文したICとともに届いてました。(´∀`)
明日辺りにはRaspberryPi用カメラモジュールも届く予定です。






Raspberry Pi ALSA I2S ドライバ その2

以前、http://abc002.blogspot.jp/2013/01/raspberry-pi-alsa-i2s.html
の記事で紹介した Raspberry Pi ALSA I2S ドライバですが
5月頭に動きがあったみたいですね。
1月のころはドライバのみ公開されていましたが、今はLinuxカーネルごとgitに登録されています。

それじゃ、さっそく試してみよう~(´∀`)

いくつか失敗したのですが、失敗談は省略しちゃいます。
以下、2013/5/15時点の話になります。
そうそう、バックアップとっといたほうがいいかもね~
作業中何度か /boot のファイルの一部壊れたりしました(>_<)

クロスコンパイルにカーネル設定ファイルが必要になります。
まぁ、一から自分で設定してもいいのですが無理!(;´д`)
だったので、まずRPiのカーネルを3.8にアップデートします。
rpi-update 2c4e92c01ff14d8f3e1ee35b995d430b4e6d1e1b
で3.8.4になります。
BRANCH=next rpi-update
で 3.8.12 になります。
ここで再起動し、3.8.12にRPiを起動します。
起動したら
zcat /proc/config.gz > .config
で、.configを生成。
まずはRPi上の作業はこれで置いときます。

次にソースコードの取得ですね。
gitで直接取得はものすごく遅かったので、
Windows上で https://github.com/koalo/linux からzipでダウンロードします。

TeraTermでクロスコンパイル環境に接続して、TeraTermのメニューの
 ファイル>SSH SCP...
で linux-rpi-3.8.y-asocdev.zip を転送。
適当な場所で
[VirtualBox]$ unzip linux-rpi-3.8.y-asocdev.zip
[VirtualBox]$ cd linux-rpi-3.8.y-asocdev
[VirtualBox]$ scp pi@192.168.xxx.xxx:/home/pi/.config .
[VirtualBox]$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --config menuconfig configure
最後のコマンドはTeraTermの画面が狭いとエラーになるので普通以上のウィンドウサイズにしておきましょう。
カーネル設定メニューが表示されたら以下のオプションに「*」や「M」をつけて有効にします。

Device Drivers -> DMA Engine Support -> BCM2708 DMA engine support
Device Drivers -> Sound card support  -> Advanced Linux Sound Architecture  ->ALSA for SoC audio support  ->SoC Audio support for the Broadcom BCM2708 I2S module 
   Support for AudioCODEC for mbed (TLV320AIC32B)     
   Support for TDA1541A                               
   Support for Audio Codec Board - PROTO (WM8731)     
   Support for ESS9018

でもってコンパイル! (**手順A**)
[VirtualBox]$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --us --uc kernel_image modules_image
1個上のディレクトリに linux-image-3.8.10_0.1_armhf.deb ができていれば成功です。
[VirtualBox]$ scp linux-image-3.8.10_0.1_armhf.deb pi@192.168.xxx.xxx:/home/pi
で、RPiに転送します。

次からRPi上での作業になります。
sudo dpkg -i linux-image-3.8.10_0.1_armhf.deb
で新カーネルをインストール。
/boot/config.txt に以下の行を追加してインストールしたカーネルで起動するように設定します。
kernel=vmlinuz-3.8.10
再起動!
再起動したら以下のコマンドでドライバを組み込みます。
raspberrypi:~> sudo insmod /lib/modules/3.8.10/kernel/sound/soc/bcm2708/snd-soc-bcm2708-i2s.ko
raspberrypi:~> sudo insmod /lib/modules/3.8.10/kernel/sound/soc/bcm2708/snd-soc-rpi-tda1541a.ko
raspberrypi:~> sudo insmod /lib/modules/3.8.10/kernel/sound/soc//codecs/snd-soc-tda1541a.ko
ふぅ~これで準備完了です。(;´д`)
適当なwavやmp3をRPiに転送して再生してみましょう~
raspberrypi:~> aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: sndrpitda1541a [snd_rpi_tda1541a], device 0: TDA1541A HiFi tda1541a-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
となっている場合は
mpg321 -a hw:1 pppp.mp3
aplay -D hw:1 aaa.wav
aplay -D hw:1 -B10000000 aaa.wav  (underrun!!!と出る場合こうするといいかもしれない)
で再生出来ます。
が!
前回もそうでしたが出力されるデータはI2Sフォーマットです。
オシロの画面を見てみましょう。
黄色い線がLRクロック、左の青い線がビットクロック、右の青い線がシリアルデータです。
 

ふむ、1月頃のと同じ出力ですね~システムクロックが必要なくてI2Sフォーマットを入力できるDAC ICは手軽に手に入らないんですよね~というか売ってるのか?ってレベルです。

ということで、前回と同じように標準フォーマットを出力できるようにいじってみます。

クロスコンパイル環境上で
 linux-rpi-3.8.y-asocdev/sound/soc/bcm2708/bcm2708-i2s.c
を編集します。
492行目(github上だと559行目)の次行辺りに赤文字の1行を足します。
        /*
         * Set format for both streams.
         * We cannot set another frame length (and therefore word length) anyway,
         * so the format will be the same.
         */
format = 0<<31 | 1<<30 | 16 << 20  | 8<<16   |   0<<15 | 1<<14 | 48<<4 | 8 ;
        bcm2708_i2s_write_reg(dev, BCM2708_I2S_RXC_A_REG, format);
        bcm2708_i2s_write_reg(dev, BCM2708_I2S_TXC_A_REG, format);
これで強制的に標準フォーマットを出力するようにします。
前回同様LRクロックは反転しないといけないかもですが音は鳴るはず!(´~`)
RPi上でカーネルを元に戻して起動するため /boot/config.txt を編集します。
#kernel=vmlinuz-3.8.10
コメントアウトするだけです。
一旦再起動!
sudo  dpkg -r linux-image-3.8.10
で、linux-image-3.8.10_0.1_armhf.deb からしインストールたカーネルをアンインストール。
でもって(**手順A**)からやり直します。

では出力信号を見てみましょう。
黄色い線がLRクロック、青い線がシリアルデータです。

右詰な標準フォーマットっぽくなっていますね。(´∀`)

前回同様、DACに BU9480F、OPアンプは NJM2114DD を繋いで再生してみると~みごとに鳴ってくれました。(ノ゜o゜)ノ
(ブレッドボード中央のICは関係ありません。)
 



今回のドライバは前回より改良されてますね。
aplayとの相性が悪かったのですが、今回のはaplayで問題なく再生出来ます。
また、前のは瞬断が頻発してましたが、今回のは発生しませんでした。たまにしか起きません。
(起動直後は音飛びしやすいっぽいかな。)
このI2S ALSA ドライバは十分オーディオ再生に使えるドライバだと思われます。





DAI CS8416 と DAC PCM1716

Raspberry Pi でI2Sを出力する際、PCM1716を使おうとしたんだけど
システムクロックが出力されないので使えませんでした。

そのことに気付く前に CS8416 と組み合わせて鳴らしてたので
ちょろっと紹介~(´―`)

まずは CS8416 のSPI、I2Cモードの選択についてです。
これ、よくわかってなかったのですが
どうも電源投入直後は不安定な状態で、リセットすると I2C モードになり、
さらに、AD0/CS ピンをHighからLowにしてやると SPI モードになるみたい。
データシート読むとそんなことが書いている気がします...タブン...(;´д`)
データシートが英語なのでよくわかんないのよねぇ~ヽ( ´ー`)ノ

CS8416 にコンデンサーとダイオードでリセット回路を追加しました。
これで電源スイッチ入れれば、ほぼI2Cモードになってくれます。
たまに失敗していますが...その時は手で線を抜き挿しして
手動リセットしちゃいます。


オーディオデータはPCからUSB経由で送ります。
秋月電子でPCM2704を買ってきて、SPDIF を取り出していたのですが
結構、必要な部品が多くてブレッドボードがゴチャゴチャに(;´д`)
ので、Aitendoで売っている以下の物を買ってきました。





秋月だと PCM2704 だけで400円。
写真のはAitendoで666円。
ブレッドボードに自分で組んでて思いました...
SPDIFを取り出すだけなら、これを買った方が楽ですな。(´・ω・`)


次は Raspberry Pi で I2C についてです。
Rev.2だと i2cdetect、i2cdump、i2cset などのコマンドの引数が変わったようですね。
i2cdetect -y 0
i2cdetect -y 1
上がRev.1の時、下がRev.2です。
引数が0から1になっただけですね。


PCM1716は直接ブレッドボードに刺せない小さなICなので、
ピッチ変換基板を使います。
いつも通り1回じゃうまくいきません...(´・ω・`)
でもまぁ、写真のようになってもハンダ吸取り線で取り除きつつ
ピッチ変換基板にハンダ付けしていきます。



以前は CS8416 で標準フォーマットを出力していましたが、今回はI2Sを出してみました。
データシートを見て、Serial Audio Data Format (05h)をそれっぽい設定値を
設定していったのですが SODEL と SOSPOL がよくわからず...
でも、それぞれ1ビットなので総当りで4回試せばどれかうまくいくはず!(´―`)
で、結局以下のようにするとI2Sフォーマットで出力されました。
i2cset -y 1 0x13 0x04 0x80
i2cset -y 1 0x13 0x05 0xa8  # 標準フォーマット、右詰、16bit
i2cset -y 1 0x13 0x05 0xa5  # I2Sフォーマット、16bit
で、ヘッドホンを繋いで聞いて見ると...ノイズだらけ( ̄~ ̄;)
いろいろいじってみましたが素人にはすぐ解決できませんでした。
なぜかオシロスコープのワニ口クリップを電源ラインに繋ぐとノイズが消えます。
もぅ謎すぎ~(>_<)
仕方なく、USBのデジタル出力から調べてきましたが
おかしなところはありませんでした。
で、もう一度繋ぎなおすと...アレ~クリアになった!(;´д`)
最初との違いは机の上のケーブルをかたづけたくらいですかね。
ふ~む、ケーブルが散乱している上で回路組むとダメなのかもしれません。


PCM1716の音ですが...BU9480Fと比べると音質いいですね。
密度の濃い音って感じでした。








Raspberry Pi ALSA I2S ドライバ

※Raspberry Pi ALSA I2S ドライバ その2 UPしました。※


今回は前々回チラッっと書いた I2S ネタです。
以下のスレッドで公開されているドライバーを組み込んでみます。
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496&p=257874

I2SはIC間でオーディオ系データをやりとりする規格らしいです。
Rasspberry Pi でそれが出力されると何が出来るのかというと、
マイコンのように DAC IC を直接接続することが出来ます。

ドライバのコンパイルはうまくいかなし、電子回路は素人だし...
で、音が鳴るまでには結構時間かかっちゃいました。(;´д`)

まずはドライバのコンパイルですね。
rootで作業します。
ドライバのソースコードは
で公開されていますので、/root/i2s 辺りにダウンロードしておきます。

ドライバコンパイルにはカーネルソースも必要なのでダウンロードします。
カーネルのバージョンは3.6.11my+だと仮定します。
cd /usr/src
git clone -b rpi-3.6.y https://github.com/raspberrypi/linux.git
mv linux 3.6.11my+
cd 3.6.11my+
zcat /proc/config.gz > .config
make oldconfig
Makefile編集(4行目 EXTRAVERSION = my)
make modules_prepare
クロスコンパイル環境から Module.symvers を RPi の /usr/src/3.6.11my+/ へコピー
※Module.symvers はカーネルをコンパイルしないと生成されません。
cd /root/i2s
make -C /usr/src/3.6.11my+ M=/root/i2s modules
depmod -a
makeでエラーでなければOK。snd_pcm_pi_i2s.ko というファイルが出来ていると思います。
insmod snd_pcm_pi_i2s.ko
でドライバーを組み込めます。

mpg123 や aplay は相性が悪い?ようなので、他のプレイヤーをインストールします。
apt-get install alsaplayer alsaplayer-text
おっと、忘れてました。

I2Sの信号は以下のピンから出力されます。
参考HP
http://elinux.org/RPi_BCM2835_GPIOs
http://www.raspberrypi-spy.co.uk/2012/09/raspberry-pi-p5-header/
GPIO28 PCM_CLK
GPIO29 PCM_FS
GPIO30 PCM_DIN
GPIO31 PCM_DOUT
 


Rev2のRPiだと赤丸の所にヘッダーピンを取り付けやすくなっているので半田付けします。

それでは再生~(ノ゜o゜)ノ
root@raspberrypi:~/i2s# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: I2s [Pi I2s], device 0: Dummy PCM [Raspberry Pi PCM I2S]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
となっている場合は
alsaplayer -i text -d hw:1,0 test.mp3

で、I2Sの方に出力してくれます。
終了は別ターミナルから
alsaplayer --quit

ここでどんな信号が出ているのか見ておきます。

 


左詰になっていますね~これはI2Sフォーマットかな。
手軽に扱える DAC IC は BU9480F しか持っていなくて、
これは右詰の標準フォーマットでないといけないんですよね~。

I2Sフォーマットを入力出来る PCM1716 を買ってきたのですが、
組んでるうちにシステムクロックの出力がないので使えないことに気付いた~ ( ̄~ ̄;)

何か手軽な方法ないかと bcm2835 のデータシートPDFを眺めていると、
信号の出力フォーマットを変えられそうなことに気付きました。(・∀・)
最初に何度か見ていたんだけど、英語なので気付かなかったわ~(;´д`)

snd_pcm_pi_i2s.c の632行目を以下のように変更します。
//    *(i2s_registers+TXC_A) = 0<<31 | 1<<30 | 1 << 20  | 8<<16   |   0<<15 | 1<<14 | 33<<4 | 8 ;
    *(i2s_registers+TXC_A) = 0<<31 | 1<<30 | 16 << 20  | 8<<16   |   0<<15 | 1<<14 | 48<<4 | 8 ;
これで右詰っぽくなります。
LRクロックも反転しないといけないみたいですが、音は鳴るでしょう(タブン...
信号を見てみます。




それっぽくなっていますね。(・∀・)
DAC、アンプを繋いでヘッドホンで聴いてみると...
(写真の真ん中のICは関係ありません)


鳴った~!(ノ゜o゜)ノ
でも、たまに音が瞬断みたいな感じになりますね~
ドライバーの今後の修正に期待ってところでしょうか。

にしても Raspberry Pi はいろいろできて、おもしろいですな~(=´∇`=)
部品があればハイレゾ音源も試してみたいですわ。



オペアンプ追加

DAC(BU9480F)の後にオペアンプを追加しました。
今回は NJM2114DD を使用。
秋月電子で5個入り350円で購入~
CIMG0749.JPG
で、ブレッドボード上に組んでみたのですが、雑音だらけ...
これまた一日中悩みまくり解決できず(>_<)
通勤中、そういえばオペアンプの電源繋いでたっけ...と思って
帰宅後見てみたら、電源が繋がってませんでした...(;´д`)

電源3.3Vに繋いでCDを鳴らしてみました。
しかし、まだ雑音は消えず...もう、お手上げ状態ですな Ψ(;∀;)Ψ

ダメもとでオペアンプのV+を3.3Vから9V電源に変えてみたら...音がクリアに!
5Vでもクリアでした。
オシロスコープで DAC(BU9480F) の出力を見てみると1.5V±0.5Vくらいの信号が出ていたので
電源3.3Vだと電圧が足りないのかもしれませんね。

でも、まだ、少し変です...シンバルの音などが綺麗にならない...
まだ、何かあるのか...NJM2114DDはこれが限界なのか、
もうちょっと調べないといけないなぁ('~')

後日、NJM2114DD 周辺の回路を別の物にしてみました。
ボルテージフォロアから二倍増幅にすると...
DAC出力直前の音と同じクリアな音になった~!(´∀`)
シンバルの音の違和感もなくなっています。
CIMG0753.JPG
ふぅ~なんとかクリアに音が鳴ってよかった~
こんなことでクリアになるとは...電子回路は難しいですなぁ(;´д`)




CS8416 + BU9480F でノイズがぁ~(>_<)

そろそろ、ブレッドボード上からユニバーサル基板に移植しようと思って、
電源とSPDIF入力周りを移してみました。(下記写真はSPDIF入力周り)
CIMG0744.JPG
しかし!!
SPDIF入力がないときにノイズが出まくるようになってしまいました。(>_<)

私は電子回路の知識のない素人なので、一日中悩んでしまいましたが、
どうやら、以下の回路の部品を CS8416 から遠ざけるとダメなようです。
abc.png
できるだけ、CS8416 に近い方がいいみたい。

ってなわけで、またブレッドボード上に戻ることに...
CIMG0745.JPG
上記写真くらい近くに配置してやるとノイズがでなくなりました。(;´д`)



CD-ROMドライブが壊れた

ある日IDE-USB変換ケーブルで繋いだCD-ROMドライブをWindowsから使おうと繋いでみると、
反応がありません...
何度やってもダメなので、どうやら壊れたみたい。(>_<)
前から調子悪かったけど、ついに逝ってしまわれたようです。

しかも、IDE-USB変換ケーブル、CD-ROMドライブ両方こわれたようで...
変換ケーブルは繋いでも反応ナシ状態。
CD-ROMドライブはトレイが出てこなくなりました。
分解して動きを見ていると...CDを上下から挟んでいる磁石が離れないようです。
試しに上下に振ってやるとトレイが出てきます(;´д`)

壊れた物はしかたないので、新しい変換ケーブルを買ってきました。
CIMG0721.JPG

結構この手の商品はCD-ROMドライブとの相性があるみたいだけど、
これはパッケージに光学ドライブ対応と書いてあるので期待できそうです。(´∀`)

自宅に戻って試してみると...問題ないですね。
Raspberry Pi からでも使えてます。

これもいつ壊れるかわからないし、IDEなCD-ROMドライブも残り1台しかありません。
ほかのSPDIF出力方法も考えておこうかなってことで、
USBオーディオでかなりメジャーな PCM2704 を使って作成中~で~す。
CIMG0722.JPG




CS8416 + BU9480F の動作に成功 その2

今回はDAI、DAC部分の紹介です。
DAIにはシーラスロジックの CS8416、DACにはロームの BU9480F を使用しました。

CS8416を選んだ理由は、単純に入手しやすいってだけです。
秋葉原の若松通商で850円。
足の幅が広いのと狭い物の二種類ありましたが、もちろん幅の広い方を購入しました! (`・ω・´)
ハンダ付けしやすいからね...w

BU9480F は足の数が少なくて扱いやすいです。
私の頭の中では 「足の数が少ない = 簡単」となってます。 (`・ω・´)
こちらは秋葉原の鈴商で210円で購入~

あとはネットの回路を参考にブレッドボード上に構築してみました。

とはいえ、数日前にCS8416のハードウェアモードは挫折しています。
今回はソフトウェアモードなので、CS8416を何かでコントロールしてやる必要があります。
これはRaspberryPiでやりましょう。
当初はCD-ROMドライブの操作しか考えてませんでしたが、意外なところで役に立ちそうです~(´∀`)

CS8416をコントロールするには I2C とかいうシリアル通信で操作できるようです。
そういえば、RaspberryPi の仕様に I2C ってありましたよね...
調べてみると GPIO-0とGPIO-1が I2C 用に使えるようです。
しかも!
Linux自体がI2Cに対応してるようで、コマンドラインから操作できちゃいます。
なにかしらのプログラミング言語でシリアル通信のプログラムを作る覚悟をしていたのですが、
かな~り手間を省けました。(=´∇`=)

ただ、デフォルトではLinuxの I2C 関係の機能は使えないので、
 http://www.skpang.co.uk/blog/archives/575
を参考に使えるようにします。

I2Cの機能が使えるようになったら、以下のようにコマンド入力します。
sudo -i

i2cdetect -y 0

PowerOff.png←DAI電源OFF状態










SPI.png←電源ON状態
通信方法がSPIモードの時はこんな風になるようです。
実はI2Cへの切り替え方法わかってません。
リセットしたらI2Cモードになったり、
電源投入直後すでにI2Cモードになってたりします。(;´д`)


I2C.png←電源ON状態 I2Cモード

ぉ、どうやらチップアドレス 0x13 で認識しているようですね。








では現在の設定状況を確認します。
コマンドと結果は以下の通り。
raspberrypi:~#  i2cdump -y 0 0x13

0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 00 00 00 00 01 00 00 00 00 00 00 01 00 00 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 00 00 00 03 ff 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f
80: 00 00 00 00 01 00 00 00 00 00 00 01 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 03 ff 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f
この状態では音が鳴りません。
以下、この状態で動作させた場合のDAIの出力波形です。
DCS00002.pngDCS00001.png

そこで、DACの BU9480F に合わせてオーディオフォーマットなどを以下のように設定してやります。
・よくわからんRUNフラグを1に
・SPDIF入力端子はRXP0
・出力オーディオフォーマット 右寄せ
・出力オーディオフォーマット 16bit
・出力オーディオフォーマット MSBファースト

コマンドは以下の通り。値の意味は CS8416 のデータシート参照にょろ。
i2cset -y 0 0x13 0x04 0x80

i2cset -y 0 0x13 0x05 0xa8
設定後、現在の設定状況を確認すると以下のようになっていると思います。
(データアドレス0x06以降は状況によって変わるので無視)
raspberrypi:~# i2cdump -y 0 0x13

0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 00 00 00 00 80 a8 00 00 00 00 41 40 00 00 01 09
10: 01 01 05 18 00 42 37 07 02 00 10 00 00 00 00 10
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 00 00 00 0f ff 00 00 00 00 00 00 07 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f
80: 00 00 00 00 80 a8 00 00 00 00 41 40 00 00 01 09
90: 01 01 05 24 00 42 37 13 00 00 10 00 00 00 00 10
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 0f ff 00 00 00 00 00 00 07 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f
ここまでできれば cdplay でCD再生するとスピーカーから音が鳴ると思います。

いやぁ~それなりに手こずったので、最初に音が鳴ったときは感動しまっせヽ(´▽`)ノ

CIMG0716.jpg

正常に音が鳴ってるときのDAI出力波形
成功.png