Thank you for your reply. I've seen Maciej's DMA project and it is 
certainly something I'd like to try myself, similarly as writing a kernel 
module with similar capabilities as beaglelogic (using remoteproc to boot 
pruss, exchanging data with pruss etc.). The problem I have right now is 
that since kernel v4.9 which Kumar used in his newer beaglelogic some 
things have changed (I'm using v4.19). For example the function pruss_get, 
which in 4.9 was taking two arguments, first of them being struct device, 
now takes one argument of type rproc. The thing is, I have no idea where to 
get a handle to rproc from or how to get pruss handle without providing 
rproc handle. I can't see remoteproc defined anywhere 
in am335x-boneblack-uboot-univ.dts which I'm using and I don't know how 
(and whether it's a good way to go) to define it myself. I'll appreciate 
any hints regarding this topic.

My overlay:
/dts-v1/;
/plugin/;

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black", "ti,beaglebone-green";

// identification
part-number = "DRONEDRIVER";
version = "00A0";

fragment@1 {
target-path="/";
__overlay__ {
/* Add default settings for the LA core */
pru-dronedriver {
compatible = "dronedriver,dronedriver";
pruss = <&pruss>;
interrupt-parent = <&pruss_intc>;
interrupts = <22>, <23>, <24>;
interrupt-names = "from_dd_1", "to_dd", "from_dd_2";
};
};
};
};


Fragment of kernel module I'm trying to get to work:
static struct dronedriver_private_data dronedriver_pdata = {
    .fw_names[0] = "am335x-pru0-fw",
    .fw_names[1] = "am335x-pru1-fw",
};

static const struct of_device_id dronedriver_dt_ids[] = {
    { .compatible = "dronedriver,dronedriver", .data = &dronedriver_pdata, 
},
    { /* sentinel */ },
};

MODULE_DEVICE_TABLE(of, dronedriver_dt_ids);

static int dronedriver_probe(struct platform_device *pdev)
{
    struct rproc *rproc;
    struct device_node *node = pdev->dev.of_node;

    //if (!node)
    //    return -ENODEV; /* No support for non-DT platforms */
    printk(KERN_INFO "[1]\n");

    match = of_match_device(dronedriver_dt_ids, &pdev->dev);
    if (!match)
        return -ENODEV;
    printk(KERN_INFO "[2]\n");

    dddev = kzalloc(sizeof(*dddev), GFP_KERNEL);
    if (!dddev)
    {
        ret = -1;
        goto fail;
    }
    printk(KERN_INFO "[3]\n");

    dddev->fw_data = match->data;
    dddev->miscdev.fops = &pru_dronedriver_fops;
    dddev->miscdev.minor = MISC_DYNAMIC_MINOR;
    dddev->miscdev.mode = S_IRUGO;
    dddev->miscdev.name = "dronedriver";
    printk(KERN_INFO "[5]\n");

    dddev->p_dev = &pdev->dev;
    dev_set_drvdata(dddev->p_dev, dddev);
    printk(KERN_INFO "[6]\n");

    dev = &pdev->dev;
    rproc = pru_rproc_get(node,NULL);
    if(IS_ERR_OR_NULL(rproc))
    {
        ret = PTR_ERR(rproc);
        if (ret != -EPROBE_DEFER)
            dev_err(dev, "Unable to get rproc handle.\n");
        goto fail_free;
    }

    printk(KERN_INFO "[OK] pruss handle\n");
    printk(KERN_INFO "[OK] rproc:\nname = \n", rproc->name);

    dddev->pruss = pruss_get(rproc);

    if (IS_ERR(dddev->pruss))
    {
        ret = PTR_ERR(dddev->pruss);
        if (ret != -EPROBE_DEFER)
            dev_err(dev, "Unable to get pruss handle.\n");
        goto fail_free;
    }
    goto fail_free;
    printk(KERN_INFO "[OK] pruss handle\n");

...
}

static int dronedriver_remove(struct platform_device *pdev)
{
    return 0;
}

static struct platform_driver dronedriver_driver = {
    .driver = {
               .name = DRV_NAME,
               .owner = THIS_MODULE,
               .of_match_table = dronedriver_dt_ids,
    },
    .probe = dronedriver_probe,
    .remove = dronedriver_remove,
};

module_platform_driver(dronedriver_driver);


After insmoding this module the last log in dmesg is "Unable to get rproc 
handle.". Before I commented out checking "if (!node)" it wasn't making it 
to [1] in dmesg. I don't understand the relationship between device tree 
and kernel driver enough to tell why of_node is a null pointer here... 
Please, help.
  

On Monday, 23 March 2020 13:11:09 UTC+1, [email protected] wrote:
>
> I achieved decent throughput by using the standard RPMSG PRU driver with a 
> larger buffer size (MAX_FIFO_MSG in rpmsg_pru.c changed from 32 to 4096) 
> and by batching the PRU data into 496 byte chunks (512 byte RPMSG message - 
> header).
>
> There is a project using the DMA controller which might be a very fast 
> option, I haven't tested it yet (but it looks promising): 
> https://github.com/maciejjo/beaglebone-pru-dma
>
> IIRC there are other projects that use the second PRU for data shoveling 
> instead.
>
>
> Am Mittwoch, 18. März 2020 01:22:01 UTC+1 schrieb Igor Jędrzejczak:
>>
>>
>> I'm checking how fast can I copy data from Beaglebone Black PRU to an 
>> userspace app on ARM. I'm using kernel v4.19 TI PREEMPT-RT.
>>
>> So far I simply modified the PRU_RPMsg_Echo_Interrupt1 example from here: 
>> https://processors.wiki.ti.com/index.php/PRU_Training:_Hands-on_Labs#LAB_5:_RPMsg_Communication_between_ARM_and_PRU
>>  . 
>> Added IEP timer value as part of 480 byte message sent from PRU to ARM to 
>> check time delta between data dispatches. For RPMsg I'm using "rpmsg-pru" 
>> channel and on the ARM side in userspace app I'm reading the data from 
>> /dev/rpmsg_pru31 with function read() to get the data. In this 
>> configuration I'm reading the data on ARM side every 90us. 
>>
>> Here I wonder whether there is anything I could gather after writing 
>> custom kernel module (beaglelogic approach?) over using RPMsg character 
>> device. If yes, how much and what would be the best approach to collect the 
>> PRU data as quickly as possible?
>>
>

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/f7e8b112-8227-4d70-a7e2-56ff0ebcf89d%40googlegroups.com.

Reply via email to