This service is available only in Japanese-language.

Ti社製AM3358におけるPRUの使用について

デモビデオ:https://www.ti.com/ja-jp/video/5982634862001によれば、SDK:https://www.ti.com/tool/PROCESSOR-SDK-AM335Xを用いることで本CPUにおいてPRUがセットアップできるようになっておりこちらを使用したいと思っています。
Yoctoに関しては、Meta-ti kirkstone branchにPRU-ICSSのフォルダがあり、bb-layerに追加済みで、ビルド時に
おそらくインストール済みではないかと考えています。
ただし、
https://layers.openembedded.org/layerindex/recipe/378053/root/meta-ti-ex...
・PRU-ICSS<->ARM
/dev/以下にrpmsgがあるか確認したところ存在しておらず、インストール手順で抜けているところがあればコメントいただきたくお願いします。
また、デモビデオではADとの接続ができておりましたが、CAN・GPIOとの通信は可能でしょうか。(AM335xn構成をみれば、PRU-ICSS⇔L3andL4 interconnect⇔CAN/GPIOの経路はあると思われます)

回答いたします。

本件2つ質問がある理解です。

1. meta-ti-extrasのpru-icssをインストールしたが、/dev配下に「rpmsg_pru30」や「rpmsg_pru31」が存在しない
2. PRUでCAN・GPIOとの通信は可能かどうか

■ /dev/rpmsg_pru30/31ができない

まず1番目について回答いたします。

/dev/rpmsg_pru30などのデバイスが作成される条件は以下のようになっています。

1. PRUのファームウェアが正しくロードされること
2. PRUのファームウェアがペリフェラルと通信する機能を持つこと

kirkstoneのpru-icssパッケージには以下の2つのファームウェアが収録されています。

1. PRU_RPMsg_Echo_Interrupt0.out / PRU_RPMsg_Echo_Interrupt1.out
2. PRU_Halt.out

ファームウェアは以下の手順でロードします。

$ echo pru/PRU_RPMsg_Echo_Interrupt0.out > /sys/class/remoteproc/remoteproc1/firmware
$ echo start > /sys/class/remoteproc/remoteproc1/state

「/sys/class/remoteproc/remoteproc1/firmware」に実行するファームウェアのパスを書き込み
「/sys/class/remoteproc/remoteproc1/state」にstartを書き込むことでファームウェアがPRUで実行されます。

上記はPRU0の例で、remoteproc1をremoteproc2にすることでPRU1にロードすることができます。

これでファームウェアが正しくロードされ、PRUのファームウェアがCPUと通信する機能を実装している場合、
「/dev/rpmsg_pru30」が作成されます。

初期状態のcore-image-baseなどのイメージではPRUのファームウェアの
ロードに必要なカーネルモジュールがインストールされていないため、
local.confに以下の内容を追加する必要があります。

===============================
MACHINE ?= "beaglebone"
UBOOT_EXTLINUX_ROOT:beaglebone = "root=/dev/mmcblk0p2"

IMAGE_INSTALL:append = " \
kernel-module-pru-rproc \
kernel-module-pruss \
kernel-module-irq-pruss-intc \
kernel-module-rpmsg-pru \
kernel-module-virtio-rpmsg-bus \
pru-icss \
"
===============================

また、kirkstoneのカーネルではPRU_RPMsg_Echo_Interrupt0.outを
ロードするための割り込みの設定が削除されているため、
カーネルを修正する必要があります。今回は暫定的に下記のようなパッチを作成して確認しました。

===============================
From 1612463308e9e7c77dad2f567cb22d9e852cdb8a Mon Sep 17 00:00:00 2001
From: example <example@example.com>
Date: Tue, 30 Apr 2024 22:27:05 +0900
Subject: [PATCH] debug pru interrupts

---
arch/arm/boot/dts/am33xx-l4.dtsi | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/arch/arm/boot/dts/am33xx-l4.dtsi b/arch/arm/boot/dts/am33xx-l4.dtsi
index a2a418687a3c..9e15e3c8cd96 100644
--- a/arch/arm/boot/dts/am33xx-l4.dtsi
+++ b/arch/arm/boot/dts/am33xx-l4.dtsi
@@ -923,6 +923,9 @@ pru0: pru@34000 {
<0x22400 0x100>;
reg-names = "iram", "control", "debug";
firmware-name = "am335x-pru0-fw";
+ interrupt-parent = <&pruss_intc>;
+ interrupts = <16 2 2>;
+ interrupt-names = "vring";
};

pru1: pru@38000 {
@@ -932,6 +935,9 @@ pru1: pru@38000 {
<0x24400 0x100>;
reg-names = "iram", "control", "debug";
firmware-name = "am335x-pru1-fw";
+ interrupt-parent = <&pruss_intc>;
+ interrupts = <18 3 3>;
+ interrupt-names = "vring";
};

pruss_mdio: mdio@32400 {
--
2.25.1
===============================

当方が確認した手順を下記に示します。

$ git clone git://git.yoctoproject.org/poky.git -b kirkstone
$ source poky/oe-init-buile-env
$ bitbake-layers layerindex-fetch meta-ti-bsp
$ bitbake-layers add-layer ../poky/meta-ti/meta-ti-extras
$ bitbake-layers create-layer meta-work
$ bitbake-layers add-layer meta-work

local.confに上記の修正を加える。
カーネルのパッチファイルを「/tmp/0001-debug-pru-interrupts.patch」として保存する。

$ recipetool appendsrcfile ./meta-work virtual/kernel /tmp/0001-debug-pru-interrupts.patch
$ bitbake core-image-base

生成されたbuild/deploy-ti/images/beaglebone/core-image-base-beaglebone.wic.xzをSDカードに書き込み、ボードを起動する。

ボード上で下記を実行しファームウェアの動作を格納する。

# echo pru/PRU_RPMsg_Echo_Interrupt0.out > /sys/class/remoteproc/remoteproc1/firmware
# echo start > /sys/class/remoteproc/remoteproc1/state
[ 91.125042] remoteproc remoteproc1: powering up 4a334000.pru
[ 91.139321] remoteproc remoteproc1: Booting fw image pru/PRU_RPMsg_Echo_Interrupt0.out, size 71952
[ 91.158919] rproc-virtio rproc-virtio.2.auto: registered virtio0 (type 7)
[ 91.172891] remoteproc remoteproc1: remote processor 4a334000.pru is now up
root@beaglebone:~# [ 91.240921] virtio_rpmsg_bus virtio0: creating channel rpmsg-pru addr 0x1e
[ 91.253517] virtio_rpmsg_bus virtio0: rpmsg host is online
[ 91.292364] rpmsg_pru virtio0.rpmsg-pru.-1.30: new rpmsg_pru device: /dev/rpmsg_pru30

この状態で「/dev/rpmsg_pru30」が作成されます。
PRUのファームウェアは「/lib/firmware」からの相対パスで記述しています。
このファームウェアはテキストをエコーするだけのものなので、/dev/rpmsg_pru30にechoで書き込み、
catで読み出しを行います。catを終了するにはCtrl+Cでシグナルを送ります。

# echo "Hello, World!" > /dev/rpmsg_pru30 && cat /dev/rpmsg_pru30
Hello, World!
^C

■ PRUでCAN・GPIOとの通信は可能かどうか

PRUのファームウェアの実装次第になるかと思われます。
こちらに関しましてはYocto Projectの使用方法の範囲ではなく
ハードウェアおよびファームウェアの設計、実装の範囲になりますので、
マニュアルやドキュメントをお調べいただくか、TIのポータルなどでご相談いただくのが良いかと思います。

■ PRUでCAN・GPIOとの通信は可能かどうか
については承知いたしました。

1件目についてご回答ありがとうございます。
現在環境構築している環境はcore-image-minimalのためこちらでビルドしたところ
以下のようなエラーがでました。ご回答ではcore-image-baseで通ったと理解しました。もし、可能であればcore-image-minimalで必要な設定があれば教示いただきたいです。

NOTE: Resolving any missing task queue dependencies
ERROR: Nothing RPROVIDES 'ethtoolkernel-module-pru-rproc' (but
/home/***/build/../poky/meta/recipes-core/images/core-image-minimal.bb
RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'ethtoolkernel-module-pru-rproc' is unbuildable,
removing...
Missing or unbuildable dependency chain was: ['ethtoolkernel-module-pru-rproc']
ERROR: Required build target 'core-image-minimal' has no buildable providers.
Missing or unbuildable dependency chain was: ['core-image-minimal',
'ethtoolkernel-module-pru-rproc']

Summary: There were 2 ERROR messages, returning a non-zero exit code.
NOTE: Reconnecting to bitbake server...
NOTE: Previous bitbake instance shutting down?, waiting to retry...
NOTE: Retrying server connection (#1)...

> ERROR: Required build target 'core-image-minimal' has no buildable providers.
> Missing or unbuildable dependency chain was: ['core-image-minimal',
> 'ethtoolkernel-module-pru-rproc']

こちらのエラーは、core-image-minimalだから発生するエラーというわけではなく、
local.confに、「IMAGE_INSTALL:append」を指定した際に、値の先頭に空白文字を入れていないことが原因のエラーとなります。

「:append」はオーバーライドシンタックスと呼ばれるもので、こちらの構文では値の先頭に空白が挿入されないため自分で追加する必要があります。
> When you use this syntax, no spaces are inserted.

詳細はこちらをご参照ください。
https://docs.yoctoproject.org/bitbake/2.8/bitbake-user-manual/bitbake-us...

アドバイスありがとうございます。
ビルドは通り、イメージにpru関連のモジュールが追加されていることをlicense.manifestから確認できました。

※kirkstoneのカーネルではPRU_RPMsg_Echo_Interrupt0.outをロードするための割り込みの設定が削除されている
とありますが、いただいたパッチはすでにカーネルソースに適用されている状態でした。

$ echo pru/PRU_RPMsg_Echo_Interrupt0.out > /sys/class/remoteproc/remoteproc1/firmware

の部分を実行しましたが、permissionエラーが出てしまい実行できませんでした。
firmwareのロードがまだできる状態でないようにみえています。
もし他に確認できる部分があれば教示いただきますようお願いします。

回答いたします。

本件、一度手元の環境にて実際に実行が確認できた手順をご案内しております。

ntaka8765さまのご状況を見るに

1. bitbakeのエラーではない
2. 実機にて特定のコマンドを実行した際に意図した結果にならない

ことから、ご案内した手順のうち一部が実行ができていない、
もしくは失敗している状況と推測されます。

これ以上のご質問への回答には、詳細なヒアリングを元に実機上でのデバッグを行う必要があるため、
・再現環境の詳細情報(バージョンやリビジョンなど)
・再現手順の詳細情報(実際に実行した全てのコマンドラインなど)
・ログファイル一式
などをご提供頂いての調査が必要になりそうです。
こちらでの調査をご希望の場合には、リネオソリューションズが提供する有償のLinuxサポートをご検討ください。
ご依頼される場合はお手数をおかけしますが、下記のお問合せフォームまでご連絡をお願い出来ればと存じます。
https://www.lineo.co.jp/contact/

ご検討よろしくお願いいたします。