Код: Выделить всё
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");
Код: Выделить всё
obj-$(CONFIG_SND_SOC_FOO) += foo_driver.o
Код: Выделить всё
config SND_SOC_FOO
tristate "Foo driver"
depends on I2C
Код: Выделить всё
CONFIG_SND_SOC_FOO=y
Код: Выделить всё
&qupv3_se1_i2c {
foo@5d {
status = "okay";
compatible = "bar,foo";
reg = ;
}
}
Код: Выделить всё
ls -al /sys/bus/i2c/devices/
ls /proc/device-tree/soc/i2c*
Также я попробовал прослушивать линии I2C с помощью логического анализатора. Удалось найти зонд других устройств под qupv3_se1_i2c (их адреса отображаются), но не 0x5d для устройства foo.
Кроме того, попытался выполнить следующую команду, но не смог найти все, что касается драйвера foo. Судя по некоторым данным в Google, драйвер вообще не был в ядре, тем более что это встроенный драйвер, а не модуль ko.
Код: Выделить всё
objdump -x vmlinux | grep foo
Подробнее здесь: https://stackoverflow.com/questions/789 ... ng-or-init
Мобильная версия