Расшифровка дерева устройств

Вот выдержка, которую я вытащил из дерева устройств на моем встроенном ядре Linux. Вот как я это понимаю сейчас:

1) Интерфейс aemif расположен по физическому адресу 0x30000000

2) Драйвер aemif находится в файле с именем davinci_aemif.c и использует часы с именем aemif

3) На aemif есть 2 устройства, одно cs2, а другое nand (я не думаю, что это предположение верно)

Теперь вопросы:

1) Что делает строка reg = <0x21000a00 0x100>;? Как может aemif, расположенный по адресу 0x30000000, иметь адресное пространство по адресу 0x21000a00?

2) Почему cs2 определяется cs2@30000000, а не cs2@1,0

3) Что делает строка reg = <0x2 0x0 0x8000000 0x6 0x0 0x100>;?

4) Было бы полезно любое объяснение того, как устроены сигнальные линии (ta, rhold, rstrobe и т. д.).

aemif@30000000 {
        compatible = "ti,davinci-aemif";
        #address-cells = <0x2>;
        #size-cells = <0x1>;
        reg = <0x21000a00 0x100>;
        ranges = <0x2 0x0 0x30000000 0x8000000 0x3 0x0 0x34000000 0x4000000 0x4 0x0 0x38000000 0x4000000 0x5 0x0 0x3c000000 0x4000000 0x6 0x0 0x21000a00 0x100>;
        clocks = <0x11>;
        clock-names = "aemif";

        cs2@30000000 {
            compatible = "ti,davinci-cs";
            #address-cells = <0x1>;
            #size-cells = <0x1>;
            ti,davinci-cs-ta = <0xc>;
            ti,davinci-cs-rhold = <0x6>;
            ti,davinci-cs-rstrobe = <0x17>;
            ti,davinci-cs-rsetup = <0x9>;
            ti,davinci-cs-whold = <0x8>;
            ti,davinci-cs-wstrobe = <0x17>;
            ti,davinci-cs-wsetup = <0x8>;
        };

        nand@2,0 {
            compatible = "ti,davinci-nand";
            reg = <0x2 0x0 0x8000000 0x6 0x0 0x100>;
            #address-cells = <0x1>;
            #size-cells = <0x1>;
            ti,davinci-chipselect = <0x0>;
            ti,davinci-mask-ale = <0x2000>;
            ti,davinci-mask-cle = <0x4000>;
            ti,davinci-mask-chipsel = <0x0>;
            ti,davinci-ecc-mode = "hw";
            ti,davinci-ecc-bits = <0x4>;
            ti,davinci-nand-use-bbt;
            ti,davinci-no-subpage-write;
            clocks = <0x11>;
            clock-names = "aemif";

            partition@0 {
                label = "u-boot";
                reg = <0x0 0x100000>;
                read-only;
            };

            partition@100000 {
                label = "params";
                reg = <0x100000 0x80000>;
                read-only;
            };

            partition@180000 {
                label = "ubifs";
                reg = <0x180000 0x1fe80000>;
            };
        };
    };

person whh4000    schedule 03.04.2014    source источник


Ответы (1)


Ваше дерево устройств явно неверно.

1/ reg = <0x21000a00 0x100>; сообщает, что aemif на самом деле находится по адресу 0x21000a00 и имеет 32 регистра (0x100/4), поэтому адрес устройства должен быть 0x21000a00: aemif@21000a00

2/опять же, адрес устройства должен соответствовать свойству reg, у вас нет свойства reg в cs2..

3/ reg = <0x2 0x0 0x8000000 0x6 0x0 0x100>; reg относится к свойству диапазонов родительского узла. Здесь это можно интерпретировать как: - из диапазона 0x2, по смещению 0x0 (это будет 0x30000000), размер 0x8000000 - из диапазона 0x6, смещение 0x0, размер 0x100

4/ вам придется искать драйвер, имеющий строку, совместимую с "ti, davinci-cs", я не могу помочь, так как она не поддерживается.

person Alexandre Belloni    schedule 04.04.2014