2015年7月12日日曜日

ZYNQで追加のUARTポートを使う(2) Linux側

だいぶ日付が開いてるけど前回の続き

PL側にIPが配置できて割り込みを61番につないだところからスタートです。


まずはDTSファイルにポート情報の記述。PL側で自動割付したレジスタアドレスと割り込み番号を反映させます。
uartlite_1@42C00000 {
   compatible = "xlnx,xps-uartlite-1.00.a";
   reg = <0x42C00000 0x10000>;
   device_type = "serial";
   interrupt-parent = <&ps7_scugic_0>;
   interrupts = <0 29 4>;
   clock = <100000000>;
};
この例だとアドレスは0x42C00000で、割り込み番号は61から32を引いて29と記述してます。


次にLinuxドライバですが、xilinx / digilent配布のものにソースは入っています。標準ツリーにも入っているようです。ただし、menuconfigでこれが選択肢に出るにはARCHとCROSS_COMPILEをそれっぽく指定してmenuconfigする必要があります。
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig 
これで出たメニューで、driver → character → serialの中に、Xilinx uartlite serial port supportという項目があるのでチェックを付けて再ビルドします。

なお、ドライバのソースuartlite.c内に書かれているデバイス名候補と、DTSに記述したcompatible項目"xlnx,xps-uartlite-1.00.a"が対応していないとデバイスが認識されないのですが、最新のソースを見てもここは上記の名前ともう一つくらいしか記述がありません。

ネットをぐぐるとDTS内にuartlite-1.02を記述してる人がいたり、そもそもvivadoに入ってるIPのバージョンはuartlite2.00になってるのですが、そういう名称は自分でuartlite.cに追加しない限り認識されないので、新しいほうがいいかもとか悩まずに上記の古い名前を記述してください。どうせIP自体は1.00のころから完全互換です。


これでブートすると、/dev/ttyUL0というデバイスが出点して、echoでAとか送ると文字が送信されます。

が! 割り込みが機能してなくて、3文字以上を送ると固まるし、受信も全く反応無しです。



いろいろ調べたところ、ドライバソース uartlite.c 内のirqハンドラ生成のところをレベルではなく立ち上がりエッジ指定にしなきゃいけないようです。
ret = request_irq(port->irq, ulite_isr, IRQF_TRIGGER_RISING, "uartlite", port);

これでカーネルを最ビルドして、やっとuartliteが動作しました。

0 件のコメント:

コメントを投稿