Jump to content

    

BaN

Участник*
  • Content Count

    180
  • Joined

  • Last visited

Community Reputation

0 Обычный

About BaN

  • Rank
    Частый гость

Recent Profile Visitors

2387 profile views
  1. Все параметры берутся из Device Tree. При загрузке модуля какая-нибудь отладочная информация выдается в логе? Если нет, то остается вносить в модуль отладочную информацию и пересобирать, чтобы пошагово разобраться, что там в модуле происходит и на каком этапе возникает проблема. Если ничего не выводится, то можно настроит уровень логгирования: https://www.kernel.org/doc/html/latest/core-api/printk-basics.html
  2. Тут 2 проблемы: 1. Почему-то драйвер usb251xb не дергает или дергает но оставляет на нуле сигнал сброса, хотя, судя по коду драйвера, он должен подавать подавать короткий сигнал 0 на пин сброса и потом возвращать пин в 1. При этом через sysfs из юзерспейса пин сброса нормально экспортируется и управляется и сигнал на ножке меняется. 2. Если откинуть сам драйвер usb251xb и просто пытаться задетектить хаб драйвером I2C после ручного сброса из юзерспейса, то устройство не находится на шине I2C. При этом на этой же шине есть еще одно устройство и его драйвер I2C находит нормально.
  3. Можно и не рвать дороги, если у вас есть под рукой какой-нибудь i2c хост, например, программатор ch341а или подобный, то достаточно убрать резисторы R122 и R124 на линиях SMBCLK/SMBDATA и подсоединить к i2c хосту SMBCLK и SMBDATA, а ресет переключать как раньше.
  4. Чтобы убрать возможность влияния драйвера, попробуйте так: sudo echo 88 > /sys/class/gpio/unexport sudo rmmod usb251xb sudo echo 88 > /sys/class/gpio/export sudo echo "out" > /sys/class/gpio/gpio88/direction sudo echo "0" > /sys/class/gpio/gpio88/value sudo echo "1" > /sys/class/gpio/gpio88/value sudo i2cdetect -y -r 1 sudo i2cset 1 0x21 0x00 0x12 sudo i2cdetect -y -r 1 sudo i2cget 1 0x21 0x00 Если хаб после этого не определится по I2C, то остается только припаять новую микросхему хаба. Встретил, что у кого-то не детектилось устройство по I2C, пока он не сделал запись в него: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/379901/i2c-io-expander-ic-not-detected
  5. Можете взять вот этот пример модуля ядра для упровления GPIO с device tree, подредактировать только немного для пина сброса и попробовать: https://wiki.st.com/stm32mpu/wiki/How_to_control_a_GPIO_in_kernel_space
  6. Вот код самого драйвера: https://github.com/torvalds/linux/blob/master/drivers/usb/misc/usb251xb.c Там сначала получается дескриптор пина сброса: hub->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); if (PTR_ERR(hub->gpio_reset) == -EPROBE_DEFER) { return -EPROBE_DEFER; } else if (IS_ERR(hub->gpio_reset)) { err = PTR_ERR(hub->gpio_reset); dev_err(dev, "unable to request GPIO reset pin (%d)\n", err); return err; } И затем этот дескриптор используется для чтения/записи пина: static void usb251xb_reset(struct usb251xb *hub) { if (!hub->gpio_reset) return; i2c_lock_bus(hub->i2c->adapter, I2C_LOCK_SEGMENT); gpiod_set_value_cansleep(hub->gpio_reset, 1); usleep_range(1, 10); /* >=1us RESET_N asserted */ gpiod_set_value_cansleep(hub->gpio_reset, 0); /* wait for hub recovery/stabilization */ usleep_range(500, 750); /* >=500us after RESET_N deasserted */ i2c_unlock_bus(hub->i2c->adapter, I2C_LOCK_SEGMENT); } Возможно, управление пином в юзерспейсе через /sys/class/gpio/export итд и управление пином в драйвере даст разный результат. И в первом случае будет работать, а во втором - нет.
  7. Именно из модуля ядра через функции devm_gpiod_get_optional / gpiod_set_value_cansleep, а не в юзерспейсе экспортом?
  8. Странное дело тогда, конечно, если драйвер usb251xb держит ресет на нуле. Могу только предложить скомпилировать тестовый драйвер, чтобы проверить сам функционал вывода на пин ресет - раз в секунду выводить на пин инвертированное состояние пина, например.
  9. Может я понял неправильно, но вы же писали, что на пине RESET_N нормально выводится напряжение 0 и 1 (2мВ и 3.31в)? Или это про пин сброса uSD карты говорили? Тогда у вас сигнал ресета GPIO2.24 не работает? Может тогда дело не в пине SMBDATA хаба, а в пине GPIO2.24 процессора. Посмотрел драйвер, он сам этот пин дергает, сам себя запутал. static void usb251xb_reset(struct usb251xb *hub) { if (!hub->gpio_reset) return; i2c_lock_bus(hub->i2c->adapter, I2C_LOCK_SEGMENT); gpiod_set_value_cansleep(hub->gpio_reset, 1); usleep_range(1, 10); /* >=1us RESET_N asserted */ gpiod_set_value_cansleep(hub->gpio_reset, 0); /* wait for hub recovery/stabilization */ usleep_range(500, 750); /* >=500us after RESET_N deasserted */ i2c_unlock_bus(hub->i2c->adapter, I2C_LOCK_SEGMENT); } Я так понял, что если пин настроен как у вас: reset-gpios = <&gpio2 24 GPIO_ACTIVE_LOW>; То всё нормально должно выводиться на пин с инверсией.
  10. Понятно, такие подробности уже легко не вспоминаются. Тогда единственная мысль, которая остается - непропаянный или сгоревший пин SMBDATA.
  11. У вас же настройка пина: reset-gpios = <&gpio2 24 GPIO_ACTIVE_LOW>; Т.е. инвертируется сигнал. Когда в /sys/class/gpio/gpio88/value записываете 1 - RESET_N устанавливается в 0, когда записываете 0 - устанавливается в 1.
  12. Посмотрел описание на хаб, вы именно так инициализируете? Не смотрел, что именно делает драйвер usb251xb, но для включения конфигурации по I2C нужно: Подать 0 на линию RESET_N Подать 1 на линию SMBCLK/CFG_SEL Подать 1 на линию RESET_N После этого должно начать определяться I2C устройство.
  13. Ну, 4.х ядро может в старинных официальных образах до сих пор. Но когда я с BBB работал, то брал образы от RobertCNelson, там у него давно уже 5 ядро есть и стабильно образы и ядра обновляются.
  14. Понял, тогда, видимо, не в этом дело, нужно мне самому вспомнить, как там всё работет.
  15. Да, но функция у него не GPIO, а как LCD_PCLK.