Я бы хотел загрузить удаленный процессор при загрузке Linux или загрузить его вместе с драйвером устройства ядра.
У меня BeagleBone Black с SoC TI AM355x, на котором основной процессор работает Debian 9.5 IoT armhf 2018-10-17
на 4.14-ti
ядре и двух процессорах PRU, доступных через remoteproc.Remoteproc активен, и PRU доступны в sysfs под /sys/class/remoteproc/remoteproc{1/2}/
.Я могу успешно загрузить PRU, используя вышеуказанный интерфейс.
Я попытался:
- Установка скрипта
rc.d
, который будет загружать процессоры, но кажется, что они недоступныв момент его выполнения. - Получение дескриптора
struct rproc
в моем модуле ядра через интерфейс struct rproc *rproc_get_by_phandle(phandle)
в linux/remoteproc.h
с использованием пакета, определенного в DTB.Phandles таковы: 0x3
для PRUSS, 0x8
для pru0, 0x9
для pru1.Ни одна из этих работ.На самом деле, я не думаю, что какой-либо фандл работает для этой функции.
Я попробовал оба insmod
и добавление модуля для загрузки при загрузке в /lib/modules/$(uname -r)
и добавление записи в /etc/modules
.Обе версии не смогли получить структуру.
Я вижу, что заголовочные файлы linux из ядра 4.14-ti имеют файл linux/pruss.h
с функцией pruss_get
, но он принимает struct rproc
в качестве параметра,поэтому я не могу его использовать.
rc.d script
#!/bin/bash
### BEGIN INIT INFO
# Provides: config_pru
# Required-Start: kmod
# Required-Stop:
# Default-Start:
# Default-Stop:
# Short-Description: Configure pins and launch pru
# Description:
### END INIT INFO
config-pin P8_11 pruout
config-pin P8_15 pruin
config-pin P8_12 pruout
config-pin P8_16 pruin
echo am335x-pru0-fw > /sys/class/remoteproc/remoteproc1/firmware
echo start > /sys/class/remoteproc/remoteproc1/state
Фрагмент файла модуля
static struct rproc *pru0_rproc;
(...)
static int get_pru0_rproc(void)
{
pru0_rproc = rproc_get_by_phandle(0x3); // Both 0x8 0x9 doesn't work
printk(KERN_INFO "rproc_get_by_phandle: trying 0x3");
return -(pru0_rproc == NULL);
}
static int __init prusw_init(void)
{
(...)
if (get_pru0_rproc())
{
printk(KERN_INFO "prusw: Failed to retrieve PRU0 rproc handle");
goto deinit_rproc;
}
(...)
}
Декомпилированный dtb
/dts-v1/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";
part-number = "AM335X-PRU-RPROC-4-14-TI";
version = "00A0";
fragment@0 {
target-path = [2f 00];
__overlay__ {
ocp {
#address-cells = <0x1>;
#size-cells = <0x1>;
pruss_soc_bus@4a326004 {
compatible = "ti,am3356-pruss-soc-bus";
reg = <0x4a326004 0x4>;
ti,hwmods = "pruss";
#address-cells = <0x1>;
#size-cells = <0x1>;
ranges = <0x0 0x4a3000
status = "okay";
linux,phandle = <0x2>;
phandle = <0x2>;
pruss@0 {
compatible = "ti,am3356-pruss";
reg = <0x0 0x80000>;
interrupts = <0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b>;
interrupt-names = "host2", "host3", "host4", "host5", "hh
ost6", "host7", "host8", "host9";
#address-cells = <0x1>;
#size-cells = <0x1>;
ranges;
status = "okay";
linux,phandle = <0x3>;
phandle = <0x3>;
(...)
pru@34000 {
compatible = "ti,am3356-pru";
reg = <0x34000 0x2000 0x22000 0x400 0x22400 0x100>;
reg-names = "iram", "control", "debug";
firmware-name = "am335x-pru0-fw";
interrupt-parent = <0x1>;
interrupts = <0x10 0x11>;
interrupt-names = "vring", "kick";
linux,phandle = <0x8>;
phandle = <0x8>;
};
pru@38000 {
compatible = "ti,am3356-pru";
reg = <0x38000 0x2000 0x24000 0x400 0x24400 0x100>;
reg-names = "iram", "control", "debug";
firmware-name = "am335x-pru1-fw";
interrupt-parent = <0x1>;
interrupts = <0x12 0x13>;
interrupt-names = "vring", "kick";
linux,phandle = <0x9>;
phandle = <0x9>;
};
(...)
Я не могу загрузить любой PRU не вручную, и яхотел бы сделать это автоматически при загрузке или загрузке модуля драйвера ядра.