Загрузка remoteproc при загрузке Linux или в драйвере устройства ядра init - PullRequest
0 голосов
/ 25 января 2019

Я бы хотел загрузить удаленный процессор при загрузке 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 не вручную, и яхотел бы сделать это автоматически при загрузке или загрузке модуля драйвера ядра.

...