Совместное использование переменной между узлами в дереве устройств

Я пытаюсь найти способ доступа из node_1 к переменной в node_0 (см. код ниже) в этом дереве устройств:

/ {
    amba_pl: amba_pl@0 {
      node_0: node@a8000000 {
         node_id = <0x0>;
         node0State = <0x0>;
      };
   };

      node_1: node@a9000000 {
         node1State = <node_0's node0State>;
      };
   };
};

Основная цель состоит в том, чтобы иметь возможность совместно использовать состояние между модулями ядра. Я знаю, что я могу EXPORT_SYMBOL(переменная) в узле записи, а затем extern *variable в узле чтения, но хотел посмотреть, смогу ли я выполнить это в самом дереве устройств. node_0 всегда будет единственным узлом для установки nodeState, а node_1 будет только читать. Это возможно?


person plasmaphase    schedule 01.03.2021    source источник
comment
Внезапно я знаю, что в ACPI это просто, но в DT, вероятно, вы можете использовать предварительную обработку C. Я не уверен, возможно ли это во время выполнения (опять же, ACPI может делать все это).   -  person 0andriy    schedule 02.03.2021


Ответы (1)


Вы можете сохранить фандл, относящийся к узлу, содержащему node0state:

/ {
    amba_pl: amba_pl@0 {
      node_0: node@a8000000 {
         node_id = <0x0>;
         node0State = <0x0>;
      };
   };

      node_1: node@a9000000 {
         stateNode = <&node_0>;
      };
   };
};

В коде драйвера, если struct device_node *mynode; относится к узлу node_1, доступ к свойству node0state другого узла, на который ссылается свойство stateNode phandle, можно получить следующим образом:

    int rc = 0;
    struct device_node *np;
    u32 node0state;

    np = of_parse_phandle(mynode, "stateNode", 0);
    if (!np) {
        // error node not found
        rc = -ENXIO;
        goto error1;
    }
    
    // Do whatever is needed to read "node0state".  Here is an example.
    rc = of_property_read_u32(np, "node0state", &node0state);
    if (rc) {
        // error
        of_node_put(np);  // decrement reference to the node
        goto error2;
    }

    // Finished with the node.
    of_node_put(np);  // decrement reference to the node
person Ian Abbott    schedule 02.03.2021
comment
Это именно то, что я искал. Так можно ли изменить stateNode с помощью node_1? Кроме того, можно ли изменить node0State с помощью node_0? Я использовал of_property_read_u32() для получения значения поля, но похоже, что в of_property_write_u32() нет of_property_write_u32() - person plasmaphase; 02.03.2021
comment
@plasmaphase, На ОФ писать нельзя — он только для получения данных. Но вы можете изменить его с помощью наложений. - person 0andriy; 03.03.2021