BeagleBoneBlack имеет «внутреннюю» EEPROM, подключенную к линии i2c-0. Я ясно вижу это, когда делаю i2cdetect:
debian@beaglebone:~$ i2cdetect -y -r 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: UU -- -- -- -- -- -- --
Он отображается по адресу 0x50. Когда я пытаюсь выполнить ahexdump, я без проблем получаю следующие значения:
sudo hexdump -C /sys/class/i2c-dev/i2c-0/device/0-0050/eeprom | head -5
00000000 aa 55 33 ee 41 33 33 35 42 4e 4c 54 30 30 30 43 |.U3.A335BNLT000C|
00000010 31 38 33 37 42 42 42 47 30 36 32 32 ff ff ff ff |1837BBBG0622....|
00000020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00001000 aa 55 33 ee 41 33 33 35 42 4e 4c 54 30 30 30 43 |.U3.A335BNLT000C|
Теперь я хочу добавить еще один EEPROM (с накидкой) в линию i2c-2, которая поддерживается в соответствии с разделом 8.2 BBB SRM. Как упоминалось в SRM, это CAT24C256. Допустимый диапазон адресов для карт расширения: 0x54-0x57. Когда я делаю i2cdetect, я вижу следующее:
debian@beaglebone:~$ i2cdetect -r -y 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Я вижу адреса 0x54-0x57, но когда я пробую шестнадцатеричный дамп, я получаю сообщение об ошибке:
hexdump: /sys/class/i2c-dev/i2c-2/device/2-0054/eeprom: Connection timed out
Вопросов:
Почему я не могу читать данные из EEPROM? Я перепробовал все адреса с 0x54-0x57 безуспешно. Я могу подтвердить, что эти адреса отображаются в / sys / class / i2c-dev / i2c-2 / device, и в каждом каталоге есть следующее:
debian@beaglebone:~$ ls /sys/class/i2c-dev/i2c-2/device/2-0054/ -la
total 0
drwxr-xr-x 4 root root 0 Oct 26 19:46 .
drwxr-xr-x 8 root root 0 Oct 26 19:46 ..
drwxr-xr-x 3 root root 0 Oct 26 19:47 2-00540
lrwxrwxrwx 1 root root 0 Oct 26 19:47 driver -> ../../../../../../bus/i2c/drivers/at24
-rw------- 1 root root 32768 Oct 26 19:47 eeprom
-r--r--r-- 1 root root 4096 Oct 26 19:47 modalias
-r--r--r-- 1 root root 4096 Oct 26 19:47 name
lrwxrwxrwx 1 root root 0 Oct 26 19:47 of_node -> ../../../../../../firmware/devicetree/base/ocp/i2c@4819c000/cape_eeprom0@54
drwxr-xr-x 2 root root 0 Oct 26 19:47 power
lrwxrwxrwx 1 root root 0 Oct 26 19:47 subsystem -> ../../../../../../bus/i2c
-rw-r--r-- 1 root root 4096 Oct 26 19:47 uevent
Я могу видеть отображение адресов в ядре, но когда я пытаюсь выполнить шестнадцатеричный дамп eeprom, он вообще не работает. Я думал, что это должно было быть установлено ядром, поскольку оно упоминается в BeagleBone SRM. Мне понадобится для этого оверлей, чтобы добавить его в uboot?
Все, что я пытаюсь сделать, это прочитать из EEPROM, как я сделал с «внутренним», чтобы убедиться, что он работает. Что я делаю неправильно?
Проблема заключалась в том, что менеджер cape «забирал» эти адреса на i23c-2. Чтобы освободить эти адреса, нам нужно отключить диспетчер cape. После этого он показывает 0x57 под i2c-2, поэтому он должен работать позже.
Пожалуйста, ознакомьтесь со следующей ссылкой, чтобы узнать, как отключить Cape Manager на BeagleBone:
Обязательно отредактируйте файл am335x-boneblack-uboot.dts, удалите включение в строке 11 и замените следующим:
#include "am335x-bone-common-no-capemgr.dtsi"
Обратите внимание, что это отключит вашу строку i2c-2 по умолчанию, поэтому либо включите ее через наложения, либо отредактируйте am335x-bone-common-no-capemgr.dtsi и добавьте после & i2c0 (около строки 245):
&i2c2 {
pinctrl-names = "default";
pinctrl-0 = <&i2c2_pins>;
status = "okay";
clock-frequency = <100000>;
};