RTC модуль

Miroslav

New member
30.07.2026
2
0
1
Приветствую всех. Хотелось бы узнать смог ли кто-нибудь подключить RTC модуль (DS3231) через DeviceTree, с помощью оверлеев на RepkaOS.
Использую 11 вариант распиновки. При использовании i2cdetect -y 3, устройство находится (стандартный 68).

Код ds3231.dts описал следующим образом.
Код:
/dts-v1/;
/plugin/;

/ {
    fragment@0 {
        target = <&i2c3>;
       
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;

            ds3231@68 {
                compatible = "maxim,ds3231";
                reg = <0x68>;
                status = "okay";
            };
        };
    };
};

Следом скомпилировал ds3231.dtbo командой dtc -@ -I dts -O dtb -o ds3231.dtbo ds3231.dts

Скопировал файл в /boot/overlays и дописал ds3231 в repkaEnv.txt

overlays = w1_gpio i2c3 ds3231
Как я понимаю сгенерированый файл даже не проверяется во время загрузки системы.
Буду благодарен за помощь.
 
Последнее редактирование:
Спустя несколько дней работы и изучения форумов у меня наконец получилось разобраться с этой проблемой.

В целом решение оказалось не очень сложным - просто нужно было быть немного внимательнее (хотя вопросы у меня всё равно остались).
Кто прочитал данный материал Конфигурация устройств, уже примерно понимает, что такое оверлеи и как они "варятся".

Немного разобравшись с device tree compiler, я стал копать, а что такое этот i2c3. Закидываем команду dtc -I dtb -O dts /boot/overlays/i2c3.dtbo получаем след. результат.

Код:
/dts-v1/;

/ {

    fragment@0 {
        target = <0xffffffff>;

        __overlay__ {
            status = "disabled";
        };
    };

    fragment@1 {
        target = <0xffffffff>;

        __overlay__ {
            status = "okay";
        };
    };

    __fixups__ {
        spi1 = "/fragment@0:target:0";
        i2c1 = "/fragment@1:target:0";
    };
};

Обращаем внимание на строку i2c1 = "/fragment@1:target:0";
Получается что i2c3 является "алиасом" i2c1 и через __overlay__ он устанавливает статус "okay".

По аналогичной схеме оверлей i2c1.dtbo соответствует алиасу i2c0, но это мне уже не понадобилось. Попробовал поменять в своём dts target с i2c3 на i2c1 — не сработало.

Решил декомпилировать /boot/repka-pi.dtb проверил алиас i2c1 = "/soc/i2c@5002400"; и вижу что статус там "disabled"

Код:
i2c@5002400 {
    compatible = "allwinner,sun50i-h6-i2c\0allwinner,sun6i-a31-i2c";
    reg = <0x5002400 0x400>;
    interrupts = <0x00 0x05 0x04>;
    clocks = <0x06 0x4b>;
    resets = <0x06 0x1a>;
    pinctrl-names = "default";
    pinctrl-0 = <0x2a>;
    status = "disabled";
    #address-cells = <0x01>;
    #size-cells = <0x00>;
    phandle = <0x72>;
};

В своем оверлее сделал статус активным (хотя казалось бы зачем если в i2c3.dtbo он и так включается). И заработало .....

В системе появился новый файл устройства /dev/rtc1, могу читать и записывать время в модуль.
Итоговый dts файл

Код:
/dts-v1/;
/plugin/;

/ {
    fragment@0 {
        target = <&i2c1>;
        
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            status = "okay";

            external_rtc: rtc@68 {
                compatible = "maxim,ds3231";
                reg = <0x68>;
                status = "okay";
            };
        };
    };
};

Могу предположить, что если использовать i2c1 в качестве основы с самого начала, танцев с бубном можно было бы избежать и всё сработало бы сразу.

К сожалению, полного понимания решения этой проблемы у меня нет. Надеюсь, материал кому-то поможет, и в эту тему придёт тот самый человек, который объяснит подробнее и предложит решение ещё лучше (скорее всего, оно есть).