面试被问到IIC,总结。

Linux3.5内核中,IIC。

 1 i2c_add_driver
 2     i2c_register_driver
 3         a. at24cxx_driver放入i2c_bus_type的drv链表
 4            并且从dev链表里取出能匹配的i2c_client并调用probe
 5         driver_register
 6             
 7         
 8         b. 对于每一个适配器,调用__process_new_driver
 9            对于每一个适配器,调用它的函数确定address_list里的设备是否存在
10            如果存在,再调用detect进一步确定、设置,然后i2c_new_device
11         /* Walk the adapters that are already present */
12         i2c_for_each_dev(driver, __process_new_driver);
13             __process_new_driver
14                 i2c_do_add_adapter
15                     /* Detect supported devices on that bus, and instantiate them */
16                     i2c_detect(adap, driver);
17                         for (i = 0; address_list[i] != I2C_CLIENT_END; i += 1) {
18                             err = i2c_detect_address(temp_client, driver);
19                                         /* 判断这个设备是否存在:简单的发出S信号确定有ACK */
20                                         if (!i2c_default_probe(adapter, addr))
21                                             return 0;
22                                         
23                                         memset(&info, 0, sizeof(struct i2c_board_info));
24                                         info.addr = addr;    
25                                         
26                                         // 设置info.type
27                                         err = driver->detect(temp_client, &info);
28                     
29                                         i2c_new_device

使用读写IIC器件的函数接口:

/**
*I2c_Master_发送-在主传输模式下发出单个I2c消息
*@客户端:从设备的句柄
*@buf:将写入从系统的数据
*@计数:要写入的字节数,必须小于64K,因为msg.len是u16
*返回负的errno,或者返回写入的字节数。
*/

/*
* * i2c_master_send - issue a single I2C message in master transmit mode * @client: Handle to slave device * @buf: Data that will be written to the slave * @count: How many bytes to write, must be less than 64k since msg.len is u16 * * Returns negative errno, or else the number of bytes written. */ int i2c_master_send(const struct i2c_client *client, const char *buf, int count) { int ret; struct i2c_adapter *adap = client->adapter; struct i2c_msg msg; msg.addr = client->addr; msg.flags = client->flags & I2C_M_TEN; msg.len = count; msg.buf = (char *)buf; ret = i2c_transfer(adap, &msg, 1); /* * If everything went ok (i.e. 1 msg transmitted), return #bytes * transmitted, else error code. */ return (ret == 1) ? count : ret; }
/**
*I2c_Master_Recv-在主接收模式下发出单个I2c消息
*@客户端:从设备的句柄
*@buf:从从属服务器读取数据的存储位置
*@计数:要读取的字节数,必须小于64K,因为msg.len是u16
*返回负的errno,否则返回读取的字节数。
*/

/*
* * i2c_master_recv - issue a single I2C message in master receive mode * @client: Handle to slave device * @buf: Where to store data read from slave * @count: How many bytes to read, must be less than 64k since msg.len is u16 * * Returns negative errno, or else the number of bytes read. */ int i2c_master_recv(const struct i2c_client *client, char *buf, int count) { struct i2c_adapter *adap = client->adapter; struct i2c_msg msg; int ret; msg.addr = client->addr; msg.flags = client->flags & I2C_M_TEN; msg.flags |= I2C_M_RD; msg.len = count; msg.buf = buf; ret = i2c_transfer(adap, &msg, 1); /* * If everything went ok (i.e. 1 msg received), return #bytes received, * else error code. */ return (ret == 1) ? count : ret; }

猜你喜欢

转载自www.cnblogs.com/jason-linux/p/10619878.html