Дерево устройств: как я могу изменить свойство дочернего узла устройства

#embedded-linux #xilinx #device-tree

#встроенный-linux #xilinx #устройство-дерево

Вопрос:

Мне нужно привязать драйвер к записи моего дерева устройств. Для этого мне нужно установить свойство идентификатора устройства из dma-channel @00000030 на «1»

Кажется, я не могу переопределить свойства этих подузлов. Как я могу это сделать?

Файл pl.dtsi, откуда взят этот фрагмент, не может быть изменен, поскольку он генерируется автоматически. Оно будет перезаписано в одно мгновение.

Что я делал до этого вопроса

Я попытался переопределить все это, вместо того, чтобы просто изменять нужные мне значения. Но для этого подхода потребуется новое имя узла, которое работает до тех пор, пока драйвер dma не захочет привязаться к узлу. Затем происходит сбой, потому что запись виртуальной файловой системы уже существует. Отсюда первый вопрос. Как я могу отменить только свойство дочернего узла?

 [    0.207961] sysfs: cannot create duplicate filename '/bus/platform/devices/a0000000.dma'
  

Цель состоит в том, чтобы загрузить драйвер ядра axidma на основе сообщества.

 axidma_dma.c: axidma_request_channels: 651: Unable to get slave channel 0: tx_channel.
  

Согласно страницам проблем в репозитории github, это означает одну из 2 вещей: либо драйвер не найден, либо драйвер используется. В моем случае оно должно быть первым.
Теперь я предполагаю, что имя узла должно оставаться неизменным в дереве устройств, чтобы драйвер axidma нашел его.
.

Автоматически сгенерированный файл dtsi

… который я хотел бы изменить в основной файловой системе -top.dts

 amba_pl: amba_pl@0 {
    #address-cells = <2>;
    #size-cells = <2>;
    compatible = "simple-bus";
    ranges ;
    axi_dma_0: dma@a0000000 {
        #dma-cells = <1>;
        clock-names = "s_axi_lite_aclk", "m_axi_sg_aclk", "m_axi_mm2s_aclk", "m_axi_s2mm_aclk";
        clocks = <amp;clk 71>, <amp;clk 71>, <amp;clk 71>, <amp;clk 71>;
        compatible = "xlnx,axi-dma-1.00.a";
        interrupt-names = "mm2s_introut", "s2mm_introut";
        interrupt-parent = <amp;gic>;
        interrupts = <0 89 4 0 90 4>;
        reg = <0x0 0xa0000000 0x0 0x1000>;
        xlnx,addrwidth = <0x40>;
        xlnx,include-sg ;
        xlnx,sg-length-width = <0x1a>;
        dma-channel@a0000000 {
            compatible = "xlnx,axi-dma-mm2s-channel";
            dma-channels = <0x1>;
            interrupts = <0 89 4>;
            xlnx,datawidth = <0x20>;
            xlnx,device-id = <0x0>;
            xlnx,include-dre ;
        };
        dma-channel@a0000030 {
            compatible = "xlnx,axi-dma-s2mm-channel";
            dma-channels = <0x1>;
            interrupts = <0 90 4>;
            xlnx,datawidth = <0x20>;
            xlnx,device-id = <0x0>;
            xlnx,include-dre ;
        };
    };
};
  

Комментарии:

1. Здесь недостаточно информации. Какое используемое ядро: ванильное, пользовательское? Как это строится? Какое свойство вы упомянули: существующее или новое? Как это называется? Вам нужно это время загрузки или время выполнения?

2. «Я попытался переопределить все это, поэтому ему потребуется новое имя узла, которое работает до тех пор, пока драйвер dma не захочет привязаться к узлу. Затем происходит сбой «. Можете ли вы уточнить это? Поделиться сообщением об ошибке? Исходя из этого , автоматически сгенерированная запись выглядит правильно.

3. @0andriy Спасибо за вашу помощь. Я не вижу актуальности этой дополнительной информации (пока), потому что она связана с деревом устройств, а не с ядром. Загрузка дерева устройств после загрузки — это вариант, который можно применить, но это сложно, поэтому пока мы придерживаемся его загрузки до загрузки ядра (4.14).

4. @SanchayanMaity Я обновил вопрос, чтобы прояснить некоторые вещи. Я знаю, что эти потоки следует использовать для справки на случай, если кто-то наткнется на это. DT в ссылке, которую вы показываете, действительно является похожим деревом устройств (генерируется автоматически), но всегда есть необходимость в настройке. Однако я не знаю, как это применяется при работе с этими дочерними узлами с тем же именем. Я просто не могу найти ни одной хорошей ссылки на это. Tnx 0andry и Sanchayan Maity

5. У вас есть клиентский узел axidma?

Ответ №1:

Спасибо @Ian Abbot за этот ответ.

Когда следующая строка добавляется после основного блока в вашем главном файле dts. ( в данном случае: system-top.dts ) вы можете переопределить даже свойства дочернего узла, даже если дочерние узлы имеют одну и ту же метку.

Вам нужно будет включить исходный файл, в котором происходит запись. ( В данном случае: pl.dtsi )

 /dts-v1/;
/include/ "pl.dtsi"

{
    main block where other magic stuff happens;
};

amp;axi_dma_0 {

    dma-channel@a0000030 {

         xlnx,device-id = <0x1>; 

     }; 
};