Hi Team
I am trying to get expertise on I2C device drivers
I am trying to interface an external EEPROM to my beagle bone
I am checking the default drivers that is present in drivers folder of Linux kernel
and trying to implement such and interface eeprom
I need support on how Linux client driver and hardware interfacing and software changes to be done
My initial driver code is as below
#include<linux/i2c.h>``` #include<linux/init.h> `#include<linux/module.h>
#include<linux/of.h>``` #include<linux/slab.h> `#include<linux/sysfs.h>
#include<linux/spinlock.h>``` #define MAX_SIZE 512 `#define SLICE_SIZE 16
#define EEPROM_SIZE 1024``` #define USER_EEPROM_SIZE 1024`struct` `eeprom_buffer{`char data[32]; ```struct mutex lock;
struct` `i2c_client *fake_client;` `};` `` `` `static` `ssize_t eeprom_read(``struct` `i2c_client *client , ``int` `slice)` `{` struct eeprom_buffer *buffer =i2c_get_clientdata(client); ```int i, j, addr;
char` `buf[32];` mutex_lock(&buffer->lock);`
```if``(i2c_smbus_write_byte_data(client,addr>>8,addr &0XFF))`
```{`
```goto` `exit``;`
```}`
``
```if``(i2c_check_functionality(client->adapter,I2C_FUNC_SMBUS_READ_I2C_BLOCK))`
```{`
```if``(i2c_smbus_read_i2c_block_data(client,MAX_SIZE,SLICE_SIZE,buf)!=SLICE_SIZE)`
```{`
```goto` `exit``;`
```}`
```}`
```else```
```{`
```for``(i=0;i<MAX_SIZE;i++)`
```{`
```j=i2c_smbus_read_byte(client);`
```}`
```buf[i]=j;`
```}`
exit``:` mutex_unlock(&buffer->lock); }``static ssize_t eeprom_read_wrapper(struct` `file *fp, struct kobject *kobj,struct` `bin_attribute *bin_attr, char *buf,loff_t off, size_t` `count)` `{` ```struct` `i2c_client *client =kobj_to_i2c_client(kobj);` ```struct` `eeprom_buffer *buffer= i2c_get_clientdata(client);` ```int` `slice ,max_slice;`
if``(off >EEPROM_SIZE)` return 0; ```eeprom_read(client,slice);
```memcpy(buf,&buffer->data[off],count); ```return count;
}
`static` `struct` `bin_attribute user_eeprom = {` ```.attr = {` ```.name =“eepromd” }, ```.size = USER_EEPROM_SIZE,
.read = eeprom_read_wrapper,` `};` `` `` `static` `int` `eeprom_probe(``struct` `i2c_client *client , ``const` `struct` `i2c_device_id *id)` `{` struct eeprom_buffer *buffer; ```int size = id->driver_data;
int` `ret;` `` buffer=devm_kzalloc(&client->dev,sizeof(struct` `eeprom_buffer)+size,GFP_KERNEL);` ```if(!buffer) ```return -ENOMEM;
i2c_set_clientdata(client,buffer);` `// ret=i2c_slave_register(client,i2c_slave_operations);
if``(ret)` { ```return ret;
}` ret = sysfs_create_bin_file(&client->dev.kobj,&user_eeprom); ```if``(ret)
goto` `exit_probe;` `` return 0; exit_probe: ```i2c_unregister_device(buffer->fake_client);
`}`
static int eeprom_remove(``struct i2c_client *client)
{
``
struct` `eeprom_buffer *buffer=i2c_get_clientdata(client);` i2c_unregister_device(buffer->fake_client);`
```sysfs_remove_bin_file(&client->dev.kobj,&user_eeprom);`
```return` `0;`
`}`
``
`static` `const` `struct` `i2c_device_id eeprom_table[] ={`
```{``"deepak_eeprom"``,0},`
```{ }`
`};`
`MODULE_DEVICE_TABLE(i2c,eeprom_table);`
``
`static` `struct` `i2c_driver eeprom_driver={`
```.driver = {`
```.name=``"eeprom"``,`
```.owner=THIS_MODULE,`
```},`
```.probe = eeprom_probe,`
```.``remove` `= eeprom_remove,`
```.id_table = eeprom_table,`
};
static int __init eeprom_init()
{
printk(``"adding eeporm driver\n"``);` return i2c_add_driver(&eeprom_driver); }``static void __exit eeprom_exit() { ```printk(``"removing eeprom driver\n"``);
```i2c_del_driver(&eeprom_driver); }`
Kindly help on development and changes to be done and how do I interface eeprom to My board
Thanks you
Deepak