Linux kernel 在Linux引导或内核设备驱动程序init中引导remoteproc
我想在linux引导下引导远程处理器,或者将其与内核设备驱动程序一起引导 我有一个带TI AM355x SoC的BeagleBone Black,它的主处理器在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
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
接口,使用DTB中定义的phandle,在我的内核模块中获取struct rproc*rproc_get_by_phandle(phandle)
句柄。幻影是这样的:struct rproc
用于PRUS,0x3
用于pru0,0x8
用于pru1。这些都不管用。事实上,我不认为任何幻影适用于这个函数0x9
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>;
};
(...)