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 

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/50d64371-87bb-44b0-8d20-7556f685e1ea%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to