トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

XMOS の XS1-G4 であそぶ - その2

[電子工作]

XMOS の XS1-G4 であそぶ - その2

テスト基板 XC-1,XC-2,XK-1 で遊んで気がついたことのメモを書いていきます。

OTP ROM の読み方?

XC-2 はイーサネット I/F のついた評価基板です。

ということは、当然 MAC アドレスがどこかに書かれている(か、ユニークになるように生成している)はず。
webserver デモプログラムを散歩していると、
webserver/httpd/getserial.xc に、妙なポートの割り当てが。

#define OTP_DATA_PORT XS1_PORT_32B
#define OTP_ADDR_PORT XS1_PORT_16C
#define OTP_CTRL_PORT XS1_PORT_16D

#define OTPADDRESS 0x7FF
#define OTPREAD 1
#define OTP_tACC_TICKS 4 // 40nS

on stdcore[3]: port otp_data3 = OTP_DATA_PORT;
on stdcore[3]: out port otp_addr3 = OTP_ADDR_PORT;
on stdcore[3]: port otp_ctrl3 = OTP_CTRL_PORT;

という記述が。

このポート記述の下に、int otpRead(unsigned address) という「そのままやんけ」という関数がありました。
これを参考にすればよさそうです.....

ちなみに、「プログラム中で OTP を読んでるのでは?」と思ったきっかけの MAC アドレス生成(読み取り)は上記で引用した箇所 ではなくて、webserver/mac/server/getmac.xc にそれらしい記述があります。

配列アクセスの高速化

XMOS 製のソースを見ていると、

#pragma unsafe arrays

というような記述がところどころにあります。
xlinkers で unsafe arrays で検索してみると、
「Theoretical Execution Speed of XC」というトピックに速度に関する話題がいろいろ載っています。

上記の pragma を配列を使うループの前に記述しておくと、配列の範囲チェックをしなくなる(危険)な分早くなるようです。

XN ファイルについて(1) (9.9.0)

最近の環境(9.9.0)では、プラットフォーム定義ファイル (.xn 拡張子)が必要なようです。

過去のプロジェクトを最近の環境で動かすには、C:\Program Files\Xmos\DesktopTools\9.9.0\configs から、該当する環境の .xn を持ってきて上書きする必要があります。

また、xflash も .xn が正しくないと動作しないようです。
過去に SPI ROM を無理やりひっつけた XC-1 に、新しい xflash で過去のバイナリを書こうとすると、怒られます。

EPCS1 をくっつけて改造した XC-1 用の .xn は下記のようになるみたいです。

<?xml version="1.0" encoding="UTF-8"?>
<Network xmlns="http://www.xmos.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.xmos.com  http://www.xmos.com">
  <Type>Board</Type>

  <Declarations>
    <Declaration>core stdcore[4]</Declaration>
  </Declarations>

  <Nodes>
    <Node Id="0" Type="XS1-G4B-FB512">
      <Core Number="0" Reference="stdcore[0]">
        <Port Location="XS1_PORT_1A" Name="PORT_SPI_MISO"/>
        <Port Location="XS1_PORT_1B" Name="PORT_SPI_SS"/>
        <Port Location="XS1_PORT_1C" Name="PORT_SPI_CLK"/>
        <Port Location="XS1_PORT_1D" Name="PORT_SPI_MOSI"/>
      
        <Port Location="XS1_PORT_4A" Name="PORT_CLOCKLED_0"/>
        <Port Location="XS1_PORT_4B" Name="PORT_CLOCKLED_1"/>
        <Port Location="XS1_PORT_4C" Name="PORT_CLOCKLED_2"/>

        <Port Location="XS1_PORT_1E" Name="PORT_CLOCKLED_SELG"/>
        <Port Location="XS1_PORT_1F" Name="PORT_CLOCKLED_SELR"/>
        <Port Location="XS1_PORT_4D" Name="PORT_BUTTON"/>
        
        <Port Location="XS1_PORT_1H" Name="PORT_UART_TX"/>
        <Port Location="XS1_PORT_1I" Name="PORT_UART_RX"/>
        
        <Port Location="XS1_PORT_1K" Name="PORT_SPEAKER"/>
        <Port Location="XS1_PORT_8D" Name="PORT_BUTTONLED"/>
      </Core>
      <Core Number="1" Reference="stdcore[1]"/>
      <Core Number="2" Reference="stdcore[2]"/>
      <Core Number="3" Reference="stdcore[3]"/>
    </Node>
  </Nodes>

  <Devices>
    <Device NodeId="0" Core="0" Class="SPIFlash" Name="bootFlash" Type="EPCS1">
      <Attribute Name="PORT_SPI_MISO"  Value="PORT_SPI_MISO"/>
      <Attribute Name="PORT_SPI_SS"   Value="PORT_SPI_SS"/>
      <Attribute Name="PORT_SPI_CLK"  Value="PORT_SPI_CLK"/>
      <Attribute Name="PORT_SPI_MOSI" Value="PORT_SPI_MOSI"/>
    </Device>
  </Devices>

  <JTAGChain>
    <JTAGDevice NodeId="0"/>
  </JTAGChain>

</Network>

※私はコレでもかけなかった(xflash がエラーになった)のですが、一旦 B ボタンを押しながら JTAG(OTP) ブートで書き込みモードにしてから、この .XN を付加した SPI ROM に書くと、それ以降は SPI ブートモードで問題なく書けるようになりました。

EPCS1 以外の FLASH をくっつけた場合は、該当箇所を変更してください。

XN ファイルについて(2) (9.9.0)

.XN ファイルで、リンクの定義をしておくと、2つ以上の XMOS chip の通信をする場合や、同時書き込みにも対応してくれるようです。

たとえば、下記の .xn を記述することで、XK-1 を2つ連結した場合でも、あたかもそれが1チップのマルチコア CPU であるが如くに、
1つの .xc プロジェクトと、1つの XTAG アダプタで、両方のボードのデバッグができ(これは JTAG がチェーンになっているからですが)、さらに、それぞれの基板の flash にブートコード書き込みが出来るようになります。

[出典](XMOS linkers):http://www.xmoslinkers.org/forum/viewtopic.php?f=6&t=576

   <?xml version="1.0" encoding="UTF-8"?>
   <Network xmlns="http://www.xmos.com"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.xmos.com http://www.xmos.com">
     <Type>Board</Type>

     <Declarations>
       <Declaration>core stdcore[2]</Declaration>
     </Declarations>

     <Nodes>
       <Node Id="0" Type="XS1-L1A-TQ128">
         <Boot>
           <Source Location="SPI:bootFlash_0"/>
         </Boot>
         <Core Number="0" Reference="stdcore[0]">
           <Port Location="XS1_PORT_1I" Name="PORT_UART_RX_0"/>
           <Port Location="XS1_PORT_1J" Name="PORT_UART_TX_0"/>

           <Port Location="XS1_PORT_1K" Name="PORT_BUTTON_0_0"/>
           <Port Location="XS1_PORT_1L" Name="PORT_BUTTON_1_0"/>

           <Port Location="XS1_PORT_1M" Name="PORT_SPI_MISO_0"/>
           <Port Location="XS1_PORT_1N" Name="PORT_SPI_SS_0"/>
           <Port Location="XS1_PORT_1O" Name="PORT_SPI_CLK_0"/>
           <Port Location="XS1_PORT_1P" Name="PORT_SPI_MOSI_0"/>

           <Port Location="XS1_PORT_4F" Name="PORT_LED_0"/>
         </Core>
       </Node>
       <Node Id="1" Type="XS1-L1A-TQ128">
         <Boot>
           <Source Location="SPI:bootFlash_1"/>
         </Boot>
         <Core Number="0" Reference="stdcore[1]">
           <Port Location="XS1_PORT_1I" Name="PORT_UART_RX_1"/>
           <Port Location="XS1_PORT_1J" Name="PORT_UART_TX_1"/>

           <Port Location="XS1_PORT_1K" Name="PORT_BUTTON_0_1"/>
           <Port Location="XS1_PORT_1L" Name="PORT_BUTTON_1_1"/>

           <Port Location="XS1_PORT_1M" Name="PORT_SPI_MISO_1"/>
           <Port Location="XS1_PORT_1N" Name="PORT_SPI_SS_1"/>
           <Port Location="XS1_PORT_1O" Name="PORT_SPI_CLK_1"/>
           <Port Location="XS1_PORT_1P" Name="PORT_SPI_MOSI_1"/>

           <Port Location="XS1_PORT_4F" Name="PORT_LED_1"/>
         </Core>
       </Node>
     </Nodes>

     <Packages>
       <Package id="0" Type="XS1-L1A-TQ128">
         <Component NodeId="0" InPackage="0"/>
       </Package>
       <Package id="1" Type="XS1-L1A-TQ128">
         <Component NodeId="1" InPackage="0"/>
       </Package>
     </Packages>

     <Links>
       <Link Encoding="2wire" Delays="4,4">
         <LinkEndpoint NodeId="0" Link="1"/>
         <LinkEndpoint NodeId="1" Link="0"/>
       </Link>
     </Links>

     <Devices>
       <Device NodeId="0" Core="0" Class="SPIFlash" Name="bootFlash_0" Type="AT25FS010">
         <Attribute Name="PORT_SPI_MISO" Value="PORT_SPI_MISO_0"/>
         <Attribute Name="PORT_SPI_SS"   Value="PORT_SPI_SS_0"/>
         <Attribute Name="PORT_SPI_CLK"  Value="PORT_SPI_CLK_0"/>
         <Attribute Name="PORT_SPI_MOSI" Value="PORT_SPI_MOSI_0"/>
       </Device>
       <Device NodeId="1" Core="0" Class="SPIFlash" Name="bootFlash_1" Type="AT25FS010">
         <Attribute Name="PORT_SPI_MISO" Value="PORT_SPI_MISO_1"/>
         <Attribute Name="PORT_SPI_SS"   Value="PORT_SPI_SS_1"/>
         <Attribute Name="PORT_SPI_CLK"  Value="PORT_SPI_CLK_1"/>
         <Attribute Name="PORT_SPI_MOSI" Value="PORT_SPI_MOSI_1"/>
       </Device>
     </Devices>

     <JTAGChain>
        <JTAGDevice NodeId="0"/>
        <JTAGDevice NodeId="1"/>
     </JTAGChain>

   </Network>

<<XMOS の XS1-G4 であそぶ | XMOS の XS1-G4,L1 であそぶ - その3>> 

 カテゴリ : もくしいゲームレシピコンピュータ雑文生活電子工作おいしい店マップ

                  Topページへ | もてないSNS「もくしい」