Linux kernel 在Linux引导或内核设备驱动程序init中引导remoteproc

Linux kernel 在Linux引导或内核设备驱动程序init中引导remoteproc,linux-kernel,linux-device-driver,device-tree,Linux Kernel,Linux Device Driver,Device Tree,我想在linux引导下引导远程处理器,或者将其与内核设备驱动程序一起引导 我有一个带TI AM355x SoC的BeagleBone Black,它的主处理器在4.14-TI内核上运行Debian 9.5 IoT armhf 2018-10-17,两个PRU处理器可通过remoteproc获得。Remoteproc处于活动状态,并且PRU在sysfs中的/sys/class/Remoteproc/Remoteproc{1/2}/下可用。我可以使用上面的接口成功地引导PRU 我试过: 设置一个r

我想在linux引导下引导远程处理器,或者将其与内核设备驱动程序一起引导

我有一个带TI AM355x SoC的BeagleBone Black,它的主处理器在
4.14-TI
内核上运行
Debian 9.5 IoT armhf 2018-10-17
,两个PRU处理器可通过remoteproc获得。Remoteproc处于活动状态,并且PRU在sysfs中的
/sys/class/Remoteproc/Remoteproc{1/2}/
下可用。我可以使用上面的接口成功地引导PRU

我试过:

  • 设置一个
    rc.d
    脚本来引导处理器,但在执行时它们似乎不可用
  • 通过
    linux/remoteproc.h
    中的
    struct rproc*rproc_get_by_phandle(phandle)
    接口,使用DTB中定义的phandle,在我的内核模块中获取
    struct rproc
    句柄。幻影是这样的:
    0x3
    用于PRUS,
    0x8
    用于pru0,
    0x9
    用于pru1。这些都不管用。事实上,我不认为任何幻影适用于这个函数
我尝试了
insmod
和将引导时要加载的模块添加到
/lib/modules/$(uname-r)
中,并在
/etc/modules
中添加了一个条目。两个版本检索结构失败

我可以看到4.14-ti内核的linux头文件有一个
linux/pruss.h
文件,其中包含
pruss\u get
函数,但它将
struct rproc
作为参数,因此我无法使用它

rc.d脚本 模块文件的片段
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>;
                    };

                    (...)
/dts-v1/;
/ {
compatible=“ti,beaglebone”,“ti,beaglebone黑色”,“ti,beaglebone绿色”;
零件号=“AM335X-PRU-RPROC-4-14-TI”;
version=“00A0”;
fragment@0 {
目标路径=[2f 00];
__覆盖层{
ocp{
#地址单元=;
#大小单元格=;
普鲁士大学_bus@4a326004 {
compatible=“ti,am3356普鲁士soc总线”;
reg=;
ti,hwmods=“普鲁士”;
#地址单元=;
#大小单元格=;

ranges=只是一个想法-创建一个依赖于remoteproc模块的内核模块,然后在那里启动PRU?
/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>;
                    };

                    (...)