Настроить расширение EEPROM i2c-2 BeagleBoneBlack Rev-C

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

Вопросов:

  1. Почему они отображаются как не настоящие номера адресов U? Я знаю, что U означает использованный ресурс?
  2. Почему я не могу читать данные из 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, как я сделал с «внутренним», чтобы убедиться, что он работает. Что я делаю неправильно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
227
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что менеджер cape «забирал» эти адреса на i23c-2. Чтобы освободить эти адреса, нам нужно отключить диспетчер cape. После этого он показывает 0x57 под i2c-2, поэтому он должен работать позже.

Пожалуйста, ознакомьтесь со следующей ссылкой, чтобы узнать, как отключить Cape Manager на BeagleBone:

https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/beagleboard/NG8cDWuv2Y0/69vk5F5ZAgAJ)

Обязательно отредактируйте файл 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>;
};

Другие вопросы по теме