U-Boot i2c обнаруживает мое устройство (70), а Linux i2c - нет. Почему? - PullRequest
1 голос
/ 17 октября 2019

Я нахожусь в процессе перехода с Linux 3.10 на немного более новую версию, Linux 4.4.8. После миграции кажется, что i2c больше не может видеть часть моего оборудования. Само оборудование не изменилось и работает нормально в предыдущей версии Linux (3.10).

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мои команды i2c больше не работают.

При попыткедля записи на устройство я получаю ошибку записи.

[]# i2cset -y 0 0x70 0 1 b
Error: Write failed

Затем я решил запустить i2cdetect, чтобы определить, что можно увидеть, и это вывод, который я получаю

В Linux:

[]# i2cdetect -y -a 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 21 -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- 64 -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

В U-Boot:

[u-boot]# i2c probe
Valid chip addresses: 20 21 64 70

По какой причине я вижу свое устройство в U-Boot, но не вижу свое устройство в Linux?

Я подозреваю, что дерево устройств может потребоваться изменить? Но я проверил старые файлы dtsi, и между i2c0 в двух версиях Linux ничего не изменилось ...

i2cdump выдает все X для вывода

[]# i2cdump -y 0 0x70
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...

хост-контроллер i2c:linux-4-4-8 / drivers / i2c / busses / i2c-mv64xxx.c

Устройства

0x20, 0x21: Расширители портов ввода-вывода PCA9555

0x70: PCA9548A i2c Multiplexer

1 Ответ

1 голос
/ 22 октября 2019

Более новое ядро ​​имеет другой родительский файл dtsi, который определяет различные mpp для pinctrl

Используемый мной файл dts содержал некоторые устройства Ethernet, которые были определены, но никогда не использовались нами, мы свалили с копий другой командыдерево устройств, так как наше оборудование было почти идентичным. Эти Ethernet использовали следующие mdio

mdio@72004 {
    pinctrl-names = "default";
    pinctrl-0 = <&mdio_pins>; //<==== This was the problem

    phy0: ethernet-phy@0 {
        reg = <0>;
    };
};

mdio использует & mdio_pins и в более новом ядре определяется как

mdio_pins: mdio-pins {
    marvell,pins = "mpp4", "mpp5";
    marvell,function = "ge";
};

что сброс gpio для моего устройства mpp5 .

Я изменил раздел ethernet дерева устройств на следующий

ethernet@70000 {
    status = "disabled";
};

mdio@72004 {
    status = "disabled";
};

ethernet@30000 {
    status = "disabled";
};

Thisрешил проблему с тем, что устройство не отображается в i2cdetect, а оборудование работает, как и раньше.

Я сам виноват в том, что унаследованное дерево устройств было конкретным в определении используемого оборудования.

...