at24c0x
at24c0x是一个2k位串行CMOS EEPROM,内部含有256个8位字节。该器件通过IC总线接口进行操作,有一个专门的写保护功能。
A0 A1 A2器件地址选择器
SDL串行数据/地址
SCL时钟
WP写保护
源码分析
init和exit
i2c_dev_init
ret = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);
i2c_dev_class = class_create(THIS_MODULE, "i2cdev"); //用于创建设备节点
ret = i2c_add_driver(&
i2c_dev_driver);
static struct i2c_driver i2c_dev_driver = {
.driver = {
.name = "i2cdev",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(i2cdev_dt_ids),
},
.probe = i2c_dev_probe,
.remove = i2c_dev_remove,
.id_table = i2c_dev_id,
};
i2c_dev_exit
i2c_del_driver(&i2c_dev_driver);
class_destroy(i2c_dev_class);
unregister_chrdev(I2C_MAJOR,"i2cdev");
i2c_dev_probe
i2cdev->dev = device_create(i2c_dev_class, NULL, MKDEV(I2C_MAJOR, client->adapter->nr),
NULL,"i2c-%d",client->adapter->nr);
另外,在里面进行了自测
#ifdef I2CDEV_TEST
INIT_DELAYED_WORK(&i2cdev->work, i2cdev_test_work);
i2cdev->wq = create_singlethread_workqueue("i2cdev_test_workqueue");
queue_delayed_work(i2cdev->wq, &i2cdev->work, 50);
#endif
i2cdev_fops
static const struct file_operations i2cdev_fops = {
.owner = THIS_MODULE,
.read = i2cdev_read,
.write = i2cdev_write,
.unlocked_ioctl = i2cdev_ioctl,
.open = i2cdev_open,
.release = i2cdev_release,
};
open
static int i2cdev_open(struct inode *inode, struct file *file)
{
struct i2c_client *client = i2cdev_client;
file->private_data = client;
return 0;
}
将设备的私有信息赋给file
release
static int i2cdev_release(struct inode *inode, struct file *file)
{
file->private_data = NULL;
return 0;
}
read
先写要读取的地址
tmp[0] = ((u8)(addr >> 8));
tmp[1] = ((u8)(addr));
ret = i2c_master_send(client, tmp, ADDR_REG);
读取数据
ret = i2c_master_recv(client, &rx_buf[(page_nr * FLASH_PAGE_SIZE)], FLASH_PAGE_SIZE);
write
copy_from_user(&tmp[ADDR_REG],buf,count))
ret += i2c_master_send(client, tmp, FLASH_PAGE_SIZE + ADDR_REG);