Armadilloフォーラム

高速拡張バスモードの外部バスへの出力方法について

tomi_vhi

2023年9月25日 14時28分

渡邊です。

高速拡張バスモードの設定を行って、外部バスに出力しようと思っております。
どのようにすれば出力できますでしょうか?

バスタイミングの設定は下記を参考にして設定
https://armadillo.atmark-techno.com/howto/a460-lan9118

因みに下記のような方法で書き込むと、Segmentation fault になります。

・定義
#define sram_off *(( volatile unsigned short *)0xB2000000) /* CS3 Offset */
・プログラム
sram_off = 0x55;

よろしくお願いいたします。

コメント

溝渕です。

> 高速拡張バスモードの設定を行って、外部バスに出力しようと思っております。
> どのようにすれば出力できますでしょうか?
>
> バスタイミングの設定は下記を参考にして設定
> https://armadillo.atmark-techno.com/howto/a460-lan9118

ダイレクトCPUバスモードで利用するアドレス空間は、Linuxカーネルでmapする必要があります。

ご参照のHowtoでは、パッチ(linux-a460-lan9118.patch)内の"arch/arm/mach-mx25/armadillo460.c"への差分でmapしています。

同様の作業は行っていますか?

渡邊です

>ダイレクトCPUバスモードで利用するアドレス空間は、Linuxカーネルでmapする必要があります。
>同様の作業は行っていますか?
これについては、mapする必要があることを理解していなかったため行っておりませんでした。
linux-a460-lan9118.patch のコードの一部を適用する必要があるということと理解しました。

具体的にはどのようにすれば良いのでしょうか?
パッチの適用のされ方がわからないので、間違ったことを言っているかもしれませんが、
何となくざっと見た感じで解釈すると、400行目から3つが書かれている?部分のうしろ、つまり
下記の先頭の+を抜いたコードを「armadillo460.c」のソースファイルの最後の部分に追加するということでしょうか?

この方法で合っていますでしょうか? これ以外に追加するものが必要でしょうか?

(空白2行)
#include <linux/platform_device.h>
#include <linux/smsc911x.h>
 
static struct resource ext_smsc9118_resources[] = {
・
・
・
	return 0;
}
arch_initcall(armadillo460_with_smsc9118_init);

よろしくお願いいたします。

溝渕です。

> 具体的にはどのようにすれば良いのでしょうか?

ご参照のHowtoに記載の通り、
https://armadillo.atmark-techno.com/howto/a460-lan9118

次のようにパッチを適用できます。

[atde ~/linux-2.6.26-at]$ patch -p1 < ../linux-a460-lan9118.patch

割り込みやアドレスの範囲が問題無ければそのまま使えると思います。

> 何となくざっと見た感じで解釈すると、400行目から3つが書かれている?部分のうしろ、つまり
> 下記の先頭の+を抜いたコードを「armadillo460.c」のソースファイルの最後の部分に追加するということでしょうか?

そうですね。上記解釈で合っています。

> この方法で合っていますでしょうか? これ以外に追加するものが必要でしょうか?

アドレス空間をマップするだけであれば、これで十分です。

渡邊です。

linux-a460-lan9118.patch をそのまま当てましたが、「Segmentation fault」の状態のままです。
(該当するソースファイルは更新されていました)

外部バスへ出力するには、どのようにすればよいのでしょうか?
(CS3空間である、0xB2000000(物理アドレス)へ直接出すのではない? 現在起動中のプロセスのメモリ空間にアクセスしている?)

よろしくお願いいたします。

溝渕です。

> linux-a460-lan9118.patch をそのまま当てましたが、「Segmentation fault」の状態のままです。

今更ですみませんが、Armadillo-460はMMUを利用しているので、次のように物理メモリアクセスを行う事はできません。

> ・定義
> #define sram_off *(( volatile unsigned short *)0xB2000000) /* CS3 Offset */
> ・プログラム
> sram_off = 0x55;

https://armadillo.atmark-techno.com/howto/accessing-any-address

を参考に、"/dev/mem"経由でアクセスする事になります。

まずは、上記Howtoで紹介されているdevmem2をそのまま利用してCS3空間にアクセスしてみてください。

渡邊です。

./devmem2 0xb2000000 h を実行すると、CS3 に Low 波形が出てきました。
./devmem2 0xb4000000 h を実行すると、CS4 に Low 波形が出てきました。
CS信号だけ見たのですが、問題なく動いているように思えます。
(CS信号のLow継続時間は約60nsでした。サイクル時間67.5nsなので、妥当な時間だと思います)

devmem2を参考に作っていけばよいということでしょうか?
(Windowsのファイルオープンのように、”/dev/mem/”をオープンして読み書きする感じ?)

よろしくお願いいたします。

溝渕です。

> devmem2を参考に作っていけばよいということでしょうか?

そうです。

> (Windowsのファイルオープンのように、”/dev/mem/”をオープンして読み書きする感じ?)

"/dev/mem"はデバイスファイルと呼ばれます。Linux(UNIX)の設計思想の1つに"Everything is a file"という考え方があり、デバイスファイルへの読み書きによってデバイス(今回の場合は各チップセレクトに該当するアドレス空間)アクセスを行う事ができます。

[1]: https://en.wikipedia.org/wiki/Everything_is_a_file

渡邊です。

承知しました。
devmem2 を参考に作ってみようと思います。

ありがとうございました。