i2c设备驱动(ds1337实例:内核代码)

 

 

I2C驱动分为3层:
1. I2C BUS驱动

2. I2C核心层(协议相关)

3. I2C chip

 

I2C BUS 驱动分析:drivers\i2c\busses\i2c-s3c2410.c
1. 分配一个i2c_adapter
2. 设置: 实现发出I2C命令、数据的函数
3. 注册:i2c_add_adapter
4. 硬件相关的设置


I2C chip驱动分析:drivers\i2c\chips\ds1337.c
ds1337_init
    i2c_add_driver(&ds1337_driver);  /* 添加driver */
1. 分配i2c_driver
2. 设置: i2c_driver里有一个attach_adapter,用来识别是否存在I2C设备
3. 注册: i2c_add_driver

 

static struct i2c_driver ds1337_driver = {
    .driver = {
        .name   = "ds1337",
    },
    .attach_adapter = ds1337_attach_adapter,
    .detach_client  = ds1337_detach_client,
    .command    = ds1337_command,
}; 


drivers\i2c\busses\i2c-s3c2410.c:

    i2c_add_adapter => i2c_register_adapter => i2c_driver.attach_adapter
   
    i2c_register_driver => i2c_driver.attach_adapter
       
       
       
       
            i2c_driver.attach_adapter  //ds1337_attach_adapter
                i2c_probe(adapter, &addr_data, ds1337_detect);
                    ds1337_detect
                        i2c_attach_client  /* 添加设备 */  

 

分析drivers\i2c\chips\ds1337.c
ds1337_init
    i2c_add_driver(&ds1337_driver);
        i2c_register_driver
            // 把i2c_drvier放入键表
           
            // 对每一个adapter(发出I2C信息的能力),调用attach_adapter
            list_for_each_entry(adapter, &adapters, list) {
                driver->attach_adapter(adapter);
                        ds1337_attach_adapter // 识别I2C设备
                       
                            // i2c-core.c
                            i2c_probe(adapter, &addr_data, ds1337_detect);
                                i2c_probe_address(adapter, addr, kind, found_proc)
                                    err = found_proc(adapter, addr, kind);
                                            ds1337_detect(adapter, 0x68, xxxxx)
                                                // 分配一个i2c_client
                                                // 设置
                                               
                                                // 读I2C设备,确定该设备确实存在
                                                ds1337_read(new_client, DS1337_REG_STATUS, &data)
                                                    i2c_smbus_read_byte_data
                                                        i2c_smbus_xfer
                                                            // s3c24xx_i2c_algorithm
                                                            adapter->algo->smbus_xfer

/*
 *  linux/drivers/i2c/chips/ds1337.c
 *
 *  Copyright (C) 2005 James Chapman <jchapman@katalix.com>
 *
 * based on linux/drivers/acorn/char/pcf8583.c
 *  Copyright (C) 2000 Russell King
 *
 * This prog

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值