LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Newbie (https://www.linuxquestions.org/questions/linux-newbie-8/)
-   -   I2C-GPIO-Bit bang (https://www.linuxquestions.org/questions/linux-newbie-8/i2c-gpio-bit-bang-791226/)

betran 02-24-2010 05:41 AM

I2C-GPIO-Bit bang
 
Hi Everybody,

I have a question, on using the available i2c-gpio driver in linux kernel.
If I do a lsmod I can see the loaded driver, but can't see any relevant devie nod in /dev directory.It has been registered as platform driver.

How can I access this driver from user space.?
If I need to create a /dev node, then how can I get the major no.?

I am attaching the driver for your review.

Any help will be appreciated.

Many thanks, betz


/*********************************/

struct i2c_s3c2410_bit {
struct i2c_adapter adap;
struct i2c_algo_bit_data algo;
};

static void i2c_s3c2410_bit_setsda(void *data, int state)
{
if (state)
s3c2410_gpio_cfgpin(S3C2410_GPD8, S3C2410_GPIO_INPUT);
else
{
s3c2410_gpio_setpin(S3C2410_GPD8, 0);
s3c2410_gpio_cfgpin(S3C2410_GPD8, S3C2410_GPIO_OUTPUT);
}
}

static void i2c_s3c2410_bit_setscl(void *data, int state)
{
if (state)
s3c2410_gpio_cfgpin(S3C2410_GPD9, S3C2410_GPIO_INPUT);
else
{
s3c2410_gpio_setpin(S3C2410_GPD9, 0);
s3c2410_gpio_cfgpin(S3C2410_GPD9, S3C2410_GPIO_OUTPUT);
}
}

static int i2c_s3c2410_bit_getsda(void *data)
{
return !!s3c2410_gpio_getpin(S3C2410_GPD8);
}

static int i2c_s3c2410_bit_getscl(void *data)
{
return !!s3c2410_gpio_getpin(S3C2410_GPD9);
}

static struct i2c_algo_bit_data i2c_s3c2410_bit_algo = {
.setsda = i2c_s3c2410_bit_setsda,
.setscl = i2c_s3c2410_bit_setscl,
.getsda = i2c_s3c2410_bit_getsda,
.getscl = i2c_s3c2410_bit_getscl,
.udelay = 100,
.timeout = HZ,
};

static int i2c_s3c2410_bit_probe(struct platform_device *dev)
{
// printk("%s\n", __FUNCTION__);
struct i2c_s3c2410_bit *i2c;
int ret;

printk("%s\n", __func__);

i2c = kzalloc(sizeof(struct i2c_s3c2410_bit), GFP_KERNEL);
if (!i2c) {
ret = -ENOMEM;
goto err_out;
}

s3c2410_gpio_cfgpin(S3C2410_GPD9, S3C2410_GPIO_INPUT);
s3c2410_gpio_cfgpin(S3C2410_GPD8, S3C2410_GPIO_INPUT);

i2c->adap.owner = THIS_MODULE;
strlcpy(i2c->adap.name, "S3C2410 bit-bang I2C adapter", sizeof(i2c->adap.name));
i2c->adap.algo_data = &i2c->algo;
i2c->adap.dev.parent = &dev->dev;
i2c->algo = i2c_s3c2410_bit_algo;
i2c->algo.data = i2c;

ret = i2c_bit_add_bus(&i2c->adap);
if (ret >= 0) {
platform_set_drvdata(dev, i2c);
return 0;
}

kfree(i2c);
err_out:
return ret;
}

static int i2c_s3c2410_bit_remove(struct platform_device *dev)
{
struct i2c_s3c2410_bit *i2c = platform_get_drvdata(dev);

platform_set_drvdata(dev, NULL);

i2c_del_adapter(&i2c->adap);
return 0;
}

static struct platform_driver i2c_s3c2410_bit_driver = {
.probe = i2c_s3c2410_bit_probe,
.remove = i2c_s3c2410_bit_remove,
.driver = {
.name = "s3c2410-i2c-bit",
.owner = THIS_MODULE,
},
};

static int __init i2c_s3c2410_bit_init(void)
{

return platform_driver_register(&i2c_s3c2410_bit_driver);
}

static void __exit i2c_s3c2410_bit_exit(void)
{

platform_driver_unregister(&i2c_s3c2410_bit_driver);
}

module_init(i2c_s3c2410_bit_init);
module_exit(i2c_s3c2410_bit_exit);

MODULE_DESCRIPTION("S3C2410 bit-bang I2C bus driver");
MODULE_LICENSE("GPL");

/*********************************/


All times are GMT -5. The time now is 10:41 AM.