[Suzaku:01173] Re: SUZAKU-VでPLBペリフェラルの作り方(レジスタの使い方)

Hiroki Takahashi email@hidden
2008年 5月 20日 (火) 02:37:52 JST


高橋です

川岡様、ご回答ありがとうございました。
アドレスとバイトレーンの関係よくわかりました。

確認したところ、sz410-92-add_slotは32bitレジスタではありましたが、ご指摘の通り、BBootからはcharで書
き込んでおり、Linuxからは、デバドラのソースを見たところ__raw_writelで書き込んでいるのでlongになって
いると思います。
そのために、レジスタの参照すべきbitの位置が異なっていたということだと思います。

先のメールで自作のBBootではどちらのケースでも書き込めないと言っていましたが、これは私の凡ミスで単に
ベースアドレスを渡し損ねていただけでした。お騒がせいたしてすいませんでした<(_ _)>
その部分を修正したところ、reg(4 to 7)を参照することで無事LEDを光らせることができました。

とにもかくにも、疑問が解けまして助かりました。ありがとうございました。


kawaoka さんは書きました:
> 川岡です。
> 
> もしかすると、BBootではcharでアクセスしていて、Linuxではlongでアクセスしているのではと思われます。
> そしてsz410-92-add_slotは8bitレジスタで、新しく作られたコアは32bitのレジスタなのかと思われます。
> 
> とっても、ややこしい話なのですが。。。
> ・ビックエンディアン
> ・ipifのレジスタビット幅
> のからこのようなことが起きると思っています。
> 
> まずは、ビックエンディアンについてです。
> 32bitレジスタの場合、アドレスとバイトレーンの関係は下記のようになります。
>             | reg(0 to 7) | reg(8 to 15)| reg(16 to 23)| reg(24 to 31)
> ------------+-------------+-------------+--------------+--------------
> charの場合  |  BASE_ADDR+0| BASE_ADDR+1 |  BASE_ADDR+2 | BASE_ADDR+3
> ------------+---------------------------+-----------------------------
> shortの場合 |  BASE_ADDR+0              |  BASE_ADDR+2
> ------------+---------------------------------------------------------
> longの場合  |  BASE_ADDR+0
> よって、charとlongでアクセスした場合のレジスタの操作できるbit位置が変わります。
> たとえば
>   (*(volatile char *)(BASE_ADDR) = (0x1))
> とするとreg(7)のbitが「1」になり
>   (*(volatile long *)(BASE_ADDR) = (0x1))
> とするとreg(31)のbitが「1」になります。
> 
> 次にipifレジスタビット幅についてです。
> 8bitレジスタとしてコアを自動生成すると、
> そもそも8bitしかないので、charでもshortでもlongでも常にBASE_ADDR+0でreg(0 to 7)がアクセスできるように
> ipifがバスを切り替えてくれているではと思われます。
> よって、
>   (*(volatile char *)(BASE_ADDR) = (0x1))
>   (*(volatile long *)(BASE_ADDR) = (0x1))
> もreg(7)が操作されるではと思っています。
> 
> 
> Hiroki Takahashi さんは書きました:
>> 高橋です。
>>
>> 川岡様、勝村様ご指摘ありがとうございます。
>> 遅くなりましたが一応解決(?)いたいしましたのでご報告いたします。
>>
>> もう一度何がやりたかったかを申しますと、自作のコアをSUZAKUのデフォルトに追加し、PLBバスを通じてコア
>> に4ビットの信号を送ることでLEDを光らせるということでした。
>>
>> LEDが光らなかった原因はやはりレジスタの読み込み部分にあり、user_logic.vhdで4ビットとしてslv_reg0(4
>> to7)を読み込んでいたのをslv_reg0(28 to 31)と変更することでLEDにアクセスできるようになりました。
>> ただし、この場合もEDKで作ったアプリケーションから直接書き込もうとすると反応せず、一旦BBootからLinux
>> を起動して、デバイスノードを通じて書き込むと光るという状況です。
>>
>> どちらにしても、ベースアドレスに書き込んだ時にPLBバスのどのビットから埋まっていくのかを正しく理解し
>> ていないのが問題なのだと思います。
>>
>> そもそも、最初にslv_reg0(4 to 7)から読み込もうとしていたのは、スターターキットにもあるスロットマシン
>> (sz410-92-add_slot-20080327)のソースを参考にしたためなのですが、再度見返してみてもやはりベースアドレ
>> スへの書き込みはslv_reg0(4 to 7)から取ってきているようように見えます。
>> というのも、slv_reg0(4 to 7)は7セグメントLED1用の信号seg_in1につながっており、
>> 7セグメントLEDへの書き込みはslot.cで、
>>
>> #define WRITE_SEG7(no,v) (*(volatile u8 *)(SLOT_BASE_ADDR + (no)) = (v))
>>
>> とマクロ定義されているように読めるからなのですが。。
>>
>> もともと、LinuxからFPGAを制御することを考えていたので、とりあえず書き込みはできるようになって、いま
>> の状況でも結果オーライなのですが、仕組みの理解という面では腑に落ちない部分が残ります。。
>>
>> _______________________________________________
>> suzaku mailing list
>> email@hidden
>> http://lists.atmark-techno.com/mailman/listinfo/suzaku
>>
> _______________________________________________
> suzaku mailing list
> email@hidden
> http://lists.atmark-techno.com/mailman/listinfo/suzaku
> 



suzaku メーリングリストの案内