I2C probléma Yocto 5 alatt Recomputer R1035 el

Fórumok

Jelenleg egy Recomputer R1035 alatt kicseréltem a CM4 et CM5 re és ehhez is elkezdtem egy működőképes konfigurációt összerakni Yocto 5 alatt, viszont még az RTC valamiért nem működik, amiben szeretnék egy kis segítséget kérni. Arra prróbálok rájönni, hogy az I2C n található PFC8563 as RTC t miként lehetne életre kelteni. Amikor megpróbálom kiolvasni a regiszter értékét, ott valamiért nem ad vissza értelmes doglokat. Míg ez a CM4 alatt gyönyörűen működik. További infók a jelenlegi renszeremről alább megtalálhatóak. Merre lenne érdemes tovább nyomozni? 
 

uname -a
Linux CE-CHANGEME 6.6.63-v8-16k #1 SMP PREEMPT Tue Sep  2 17:09:48 UTC 2025 aarch64 GNU/Linux


lsmod | grep -E '(rtc_pcf8563|i2c_dev)'
rtc_pcf8563            49152  0
i2c_dev                49152  0

ls /dev/i2c*
/dev/i2c-1  /dev/i2c-10  /dev/i2c-13  /dev/i2c-14

dmesg | grep -i rtc
[    0.000000] Kernel command line: reboot=w coherent_pool=1M 8250.nr_uarts=1 pci=pcie_bus_safe cgroup_disable=memory numa_policy=interleave  numa=fake=8 system_heap.max_order=0 smsc95xx.macaddr=2C:CF:67:C1:96:48 vc_mem.mem_base=0x3fc00000 vc_mem.mem_size=0x40000000  dwc_otg.lpm_enable=0 console=ttyAMA10,115200 rootfstype=ext4 rootwait root=/dev/mmcblk0p3  net.ifnames=0 loglevel=3 cgroup_enable=memory swapaccount=1 rpi_rtc.disable=1
[    0.254891] rpi-rtc soc:rpi_rtc: registered as rtc0
[    0.256274] rpi-rtc soc:rpi_rtc: setting system clock to 1970-01-01T02:06:17 UTC (7577)
[  135.442093] rtc-pcf8563 1-0051: pcf8563_write_block_data: err=-121 addr=0e, data=03
[  135.442099] rtc-pcf8563 1-0051: pcf8563_probe: write error
[  135.442183] rtc-pcf8563: probe of 1-0051 failed with error -5
[  135.448712] rtc-pcf8563 10-0051: pcf8563_write_block_data: err=-121 addr=0e, data=03
[  135.448722] rtc-pcf8563 10-0051: pcf8563_probe: write error
[  135.460632] rtc-pcf8563: probe of 10-0051 failed with error -5


i2cdump -y 10 0x51
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX

cat /uboot/config.txt
dtoverlay=disable-rtc
dtoverlay=dwc2,dr_mode=host
dtoverlay=i2c-rtc,pcf8563
dtoverlay=recomputer-r1035-rtc
dtoverlay=vc4-kms-v3d
dtparam=i2c1=on
dtparam=i2c_arm=on
dtparam=spi=on
enable_uart=1
gpu_mem=128

Hozzászólások

Bár pinout-ra majdnem azonos a két modul, a carrier board-oknál van eltérés és a cm-nek nincs is onboard setup-ja, ami alapján automatikusan el tudja dönteni. Így nem marad más, mint megmondani neki, szóval próbáld meg ezt:

device_tree=bcm2712-rpi-cm5-cm4io.dtb

vagy cm5 lite esetében:

device_tree=bcm2712-rpi-cm5l-cm4io.dtb

Csak tipp, megadni az I2C sebességét, pl.:

dtparam=i2c_baudrate=400000

Az `i2cdetect` mit mond ezekre a buszokra?

Az i2cdump az alábbiakat adja vissza.


i2cdetect -l
i2c-1   i2c             Synopsys DesignWare I2C adapter         I2C adapter
i2c-10  i2c             Synopsys DesignWare I2C adapter         I2C adapter
i2c-13  i2c             107d508200.i2c                          I2C adapter
i2c-14  i2c             107d508280.i2c                          I2C adapter


i2cdetect -F 1
Functionalities implemented by /dev/i2c-1:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               no
SMBus Block Write                yes
SMBus Block Read                 yes
SMBus Block Process Call         no
SMBus PEC                        no
I2C Block Write                  yes
I2C Block Read                   yes

i2cdetect -F 10
Functionalities implemented by /dev/i2c-10:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               no
SMBus Block Write                yes
SMBus Block Read                 yes
SMBus Block Process Call         no
SMBus PEC                        no
I2C Block Write                  yes
I2C Block Read                   yes

i2cdetect -F 13
Functionalities implemented by /dev/i2c-13:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 no
SMBus Block Process Call         no
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes

i2cdetect -F 14
Functionalities implemented by /dev/i2c-14:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 no
SMBus Block Process Call         no
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes

Es csak ugy siman? Azaz milyen slave address-eket lat? Latja azt amit latnia kell (0x51)? Valami ilyesmi:

# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:             04 05 06 07 -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- 51 -- 53 -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- UU -- -- -- -- UU --

Szerk: a sima szam az annyit jelent hogy rajta van a buszon (az adott slave address-re van ACK), az UU az az hogy egy driver mar korabban lefoglalta ezt a slave address-t (igy a scanning-bol kimarad). Ezutobbi nem feltetlen jelenti azt hogy minden oke az adott eszkozzel, de azert elegge eselyes hogy ez az adott driver az adott slave address-en logo eszkozt sikeresen "leprobalta".

Sajnos akármelyik i2c t próbálom kiolvasni, midnegyikre hasonló a kimenet. Elémletileg a cm4 nél az 6 os, míg a cm5 alatt 3 as i2c alatt kellene lennie ennek az rtc nek. Készítettem hozzá egy frissített drivert, amit betölt, de nem hajlandó működni vele.

i2cdump -y 3 0x51

No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX

Rtc driver

recomputer-r1035-rtc-new.dtbo
/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835";
};

&i2c6 {
    status = "okay";
    clock-frequency = <100000>;
    #address-cells = <1>;
    #size-cells = <0>;

    pcf8563@51 {
        compatible = "nxp,pcf8563";
        reg = <0x51>;
    };
};

Bootloader log

5.35 MESS:00:00:05.352180:0: Loaded overlay 'recomputer-r1035-rtc'
 

Az okes, de ez a dump a sok XX-szel nekem ugy nez ki mintha maga a slave nem lenne ott. Illetve az is kerdes hogyha az adott slave foglat (UU, ld. fentebb) akkor a dump megy-e es/vagy hogy reagal ra. Szoval ezt erdemes szerintem igy vegignyomozgatnod. 

Ilyesmit is kiprobalnek hogy ideiglenesen kiszedni a DT-bol ezt a slave-t hogy veletlenul se huzzon be semmi modult, es ugy lecsekkolni (i2cdetect, i2cdump kezzel, stb). Vagy ha mar bent van a modul akkor azt is ki lehet szedni (rmmod), es akkor ugy. 

Sikerült megoldanom a problémát. :) A hiányzó i2c3-pi5 fájl pótlása után már szépen le tudtam kérdenzni a regisztert. Utána módosítottam és újra forgattam a gyári drivert, melynek eredményeképpen megjelent a rendszerben rtc1 ként a pcf8563. Viszont sikított, hogy a battery low és nem engedte lekérdezni a pontos időt, amit beállítva ismét működött tovább. Egyedül még egy plusz driver kellett, ami letiltja az cm5 gyári óráját, hogy az akkumulátorral szereltet használja a rendszer alapértelmezetten.