I2C学习笔记二

at24c0x

at24c0x是一个2k位串行CMOS EEPROM,内部含有256个8位字节。该器件通过IC总线接口进行操作,有一个专门的写保护功能。
AT24C02 E2PROM介绍及驱动程序 - JUN - Juns channel

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);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值