Forum Discussion
Altera_Forum
Honored Contributor
12 years agoActually, when parsing the device tree, the i2c-gpio driver could not retrieve the 'gpios' field use to describe the SDA and SCL pins. So I decided to come back to a module which create an i2c bus and then, populate this bus.
# include <linux/module.h>
# include <linux/init.h>
# include <linux/i2c-gpio.h>
# include <linux/i2c.h>
# include <linux/platform_device.h>
# include <linux/kernel.h>
# define GPIO_RTC_SDA 100
# define GPIO_RTC_SCL 99
MODULE_DESCRIPTION("i2c via gpio module");
MODULE_LICENSE("GPL");
static struct i2c_gpio_platform_data rtc_device_data = {
.sda_pin = GPIO_RTC_SDA,
.scl_pin = GPIO_RTC_SCL,
.udelay = 2.5, //f=400kHz
.scl_is_open_drain = 1,
.sda_is_open_drain = 1
};
static struct platform_device i2c_gpio_bus_rtc = {
.name = "i2c-gpio",
.id = 0,
.dev = {
.platform_data = &rtc_device_data,
}
};
static struct i2c_board_info i2c_gpio_bus_devices = {
{
I2C_BOARD_INFO("m41t83", 0x68),
.platform_data = &rtc_device_data,
},
};
static int __init i2c_gpio_bus_init(void)
{
int ret;
struct i2c_adapter *bus;
struct i2c_client *rtc;
ret = platform_device_register(&i2c_gpio_bus_rtc);
if (ret)
printk(KERN_ERR "i2c_bus_driver: Error when registering: %d\n",
ret);
/* Populate bus */
bus = i2c_get_adapter(0);
rtc = i2c_new_device(bus, i2c_gpio_bus_devices);
if (rtc == NULL)
printk(KERN_ERR "i2c_bus_driver: no device added to %s bus\n",
bus->name);
return ret;
}
static void __exit i2c_gpio_bus_exit(void)
{
platform_device_unregister(&i2c_gpio_bus_rtc);
}
module_init(i2c_gpio_bus_init);
module_exit(i2c_gpio_bus_exit);
However, I still do not found my device at the address 0x68 with the i2cdetect utility :-( Could someone help me?