static struct msm_camera_i2c_client *device_i2c_client = NULL; 定义下sizeof(*device_i2c_client) 是什么意思
时间: 2023-09-16 13:12:54 浏览: 46
`sizeof(*device_i2c_client)` 返回的是 `device_i2c_client` 指向的结构体类型所占用的字节数。`*device_i2c_client` 是指针 `device_i2c_client` 所指向的结构体,因此 `sizeof(*device_i2c_client)` 等于该结构体的大小。通常在分配内存时使用 `sizeof` 来动态计算所需的内存大小。
相关问题
高通单安卓平台没有i2c_client_get_device_id函数怎么办
在 Android 平台上,如果没有 `i2c_client_get_device_id` 函数,可以尝试使用 `i2c_adapter_id` 和 `addr` 字段来实现类似的功能。具体的实现方法如下:
1. 获取 `i2c_adapter` 结构体对象:
```C
struct i2c_adapter *adapter = i2c_get_adapter(bus_num);
```
其中,`bus_num` 是 I2C 总线的编号。
2. 构造 `i2c_client` 结构体对象:
```C
struct i2c_client *client = kzalloc(sizeof(*client), GFP_KERNEL);
client->adapter = adapter;
client->addr = slave_address;
```
其中,`slave_address` 是 I2C 从设备的地址。
3. 获取从设备的 ID:
```C
int id = (int)client->adapter->nr << 16 | client->addr;
```
其中,`id` 可以作为从设备的唯一标识符来使用。
需要注意的是,不同的 I2C 控制器可能会有不同的实现方式,因此具体的实现细节可能会有所不同。建议先查看相关文档或者参考其他相关代码实现。
regmap中 .write_reg = i2c_smbus_write_i2c_block_data 实例
下面是一个使用 `i2c_smbus_write_i2c_block_data` 函数进行寄存器写入的 regmap 实例代码:
```c
#include <linux/i2c.h>
#include <linux/regmap.h>
struct regmap *map;
struct i2c_client *client;
// 初始化 i2c_client
client = i2c_new_client_device(adapter, &addr);
if (!client)
return -ENODEV;
// 创建 regmap
struct regmap_bus bus = {
.write_reg = i2c_smbus_write_i2c_block_data,
// 其他成员
};
map = devm_regmap_init_i2c(client, ®s_config, &bus);
if (IS_ERR(map)) {
ret = PTR_ERR(map);
dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
return ret;
}
// 向寄存器写入数据
u8 data_buf[2] = {0x12, 0x34};
ret = regmap_raw_write(map, reg_addr, data_buf, sizeof(data_buf) / sizeof(u8));
if (ret) {
dev_err(&client->dev, "Failed to write reg: %d\n", ret);
return ret;
}
```
在上述代码中,使用 `i2c_new_client_device()` 函数初始化了一个 `i2c_client` 结构体,并将其地址保存在 `client` 变量中。然后,创建了一个 `regmap_bus` 结构体,将其 `.write_reg` 成员指定为 `i2c_smbus_write_i2c_block_data` 函数,表示写寄存器时使用该函数进行写入操作。最后,使用 `devm_regmap_init_i2c()` 函数创建了一个 `regmap` 实例,并将 `regmap_bus` 结构体指针传递给该函数,表示指定的 `.write_reg` 函数将被用于寄存器的写操作。
在向寄存器写入数据时,通过调用 `regmap_raw_write()` 函数实现。该函数会将数据缓冲区中的数据写入到指定的寄存器地址中。在本例中,将 `data_buf` 缓冲区中的数据写入到指定的寄存器中,并将返回值保存在 `ret` 变量中。如果返回值为 0,则表示写入成功;否则,表示写入失败,需要根据返回值进行错误处理。
相关推荐
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)