Linux内核i2c子系统的宏module_i2c_driver详解

本文深入探讨了在Linux内核中,通过module_i2c_driver宏如何将I2C设备驱动模块化,分解为init和exit接口。具体分析了ov4689 I2C驱动的注册与注销过程,展示了宏展开后的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在文件/include/linux/i2c.h中:

根据解释宏module_i2c_driver可以分解成相应驱动模块的init和exit接口。

文件include/linux/device.h中有对module_driver的分解:

 


综上所述,如果代码中出现 :

module_i2c_driver(ov4689_i2c_driver);

经过上述宏的作用之后,就成为如下形式:

static int __init ov4689_i2c_driver_init(void)
{
    return i2c_add_driver(&ov4689_i2c_driver);
}

static void __exit ov4689_i2c_driver_exit(void)
{
    return i2c_del_driver(&ov4689_i2c_driver);
}

 

 

监视报错i2c:CONFLICT driver_ng is not allowed to be used with this old driver请告诉我我下面的代码哪些函数需要改变#include "i2c-driver.h" #include <cstddef> #include "driver/i2c.h" #include "esp_log.h" #define I2C_MASTER_NUM I2C_NUM_0 #define I2C_MASTER_SDA_IO 12 #define I2C_MASTER_SCL_IO 11 #define I2C_MASTER_FREQ_HZ 400000 #define I2C_TIMEOUT_MS 1000 void i2c_init() { i2c_config_t conf = {}; conf.mode = I2C_MODE_MASTER; conf.sda_io_num = I2C_MASTER_SDA_IO; conf.scl_io_num = I2C_MASTER_SCL_IO; conf.sda_pullup_en = GPIO_PULLUP_ENABLE; conf.scl_pullup_en = GPIO_PULLUP_ENABLE; conf.master.clk_speed = I2C_MASTER_FREQ_HZ; i2c_param_config(I2C_MASTER_NUM, &conf); i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0); } void i2c_write(uint8_t addr, uint8_t reg, uint8_t value) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (addr << 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, reg, true); i2c_master_write_byte(cmd, value, true); i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, I2C_TIMEOUT_MS / portTICK_PERIOD_MS); i2c_cmd_link_delete(cmd); } void i2c_read(uint8_t addr, uint8_t reg, uint8_t* data, size_t len) { if (len == 0) return; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (addr << 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, reg, true); i2c_master_start(cmd); i2c_master_write_byte(cmd, (addr << 1) | I2C_MASTER_READ, true); if (len > 1) { i2c_master_read(cmd, data, len - 1, I2C_MASTER_ACK); } i2c_master_read_byte(cmd, data + len - 1, I2C_MASTER_NACK); i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, I2C_TIMEOUT_MS / portTICK_PERIOD_MS); i2c_cmd_link_delete(cmd); }
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值