Встроенный драйвер I2C не регистрируется или не инициализируетсяLinux

Ответить
Anonymous
 Встроенный драйвер I2C не регистрируется или не инициализируется

Сообщение Anonymous »

Я новичок в Linux, не считая прохождения ускоренного курса по Linux. Я пытаюсь добавить драйвер устройства I2C в ядро ​​4.19. Кажется, я добавил в файл .c драйвера необходимые условия. Вот фрагмент.

Код: Выделить всё

static const struct i2c_device_id foo_i2c_id[] = {
{ foo, 0 },
};

MODULE_DEVICE_TABLE(i2c, foo_i2c_id);

static const struct of_device_id foo_i2c_match[] = {
{ .compatible = "bar,foo"},
};
MODULE_DEVICE_TABLE(of, foo_i2c_match);

static struct i2c_driver foo_i2c_driver = {
.driver = {
.name = foo,
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(foo_i2c_match),
},
.probe    = foo_i2c_probe,
.remove   = foo_i2c_remove,
.id_table = foo_i2c_id,
};

static int __init foo_ctl_init(void)
{
int ret = 0;

ret = i2c_add_driver(&foo_i2c_driver);
if (ret != 0) {
printk("%s: i2c driver register failed.\n", __func__);
return ret;
}
else{
printk("%s: i2c driver register SUCCESS.\n", __func__);
}

return ret;
}

device_initcall(foo_ctl_init);

MODULE_DESCRIPTION("foo driver");
MODULE_LICENSE("GPL v2");
В Makefile того же каталога, который я добавил в этот. Он находится в файле sound/soc/codecs/, поскольку это звуковое устройство, управляемое через I2C.

Код: Выделить всё

obj-$(CONFIG_SND_SOC_FOO) += foo_driver.o
Затем в Kconfig я добавил это. Я не думаю, что это имеет большое значение, поскольку я включаю его через defconfig.

Код: Выделить всё

config SND_SOC_FOO
tristate "Foo driver"
depends on I2C
В defconfig это строка. Использование Arch/arm64/configs/vendor/bengal_defconfig.

Код: Выделить всё

CONFIG_SND_SOC_FOO=y
Я добавил их на стороне DeviceTree. Это плата Qualcomm Android, и другие устройства в qupv3_se1_i2c работают. Также я смог увидеть foo в списке i2c (подробнее об этом позже).

Код: Выделить всё

&qupv3_se1_i2c {
foo@5d {
status = "okay";
compatible = "bar,foo";
reg = ;
}
}
После компиляции я думаю, что часть DeviceTree в порядке, поскольку я могу видеть устройство foo@5d при запросе с помощью двух команд:

Код: Выделить всё

ls -al /sys/bus/i2c/devices/
ls /proc/device-tree/soc/i2c*
Однако в dmesg не было журналов, связанных с драйвером.
Также я попробовал прослушивать линии I2C с помощью логического анализатора. Удалось найти зонд других устройств под qupv3_se1_i2c (их адреса отображаются), но не 0x5d для устройства foo.
Кроме того, попытался выполнить следующую команду, но не смог найти все, что касается драйвера foo. Судя по некоторым данным в Google, драйвер вообще не был в ядре, тем более что это встроенный драйвер, а не модуль ko.

Код: Выделить всё

objdump -x vmlinux | grep foo
Это заставляет меня предположить, что драйвер foo никогда не был зарегистрирован должным образом? Пожалуйста, посоветуйте или укажите мне направление для расследования, спасибо!

Подробнее здесь: https://stackoverflow.com/questions/789 ... ng-or-init
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»