I2C需要分兩部分進行修改,第一部分是設(shè)備樹的配置,這部分主要是有關(guān)I2C控制器相關(guān)的參數(shù)、中斷等,另一部分是硬件引腳的配置,由于驅(qū)動用的是i2c-designware的通用驅(qū)動,所以需要讀取進行IO初始化,這就出現(xiàn)了額外的操作,希望后面對驅(qū)動進行適配,可以從設(shè)備樹對引腳進行配置,自動完成初始化。
下面就來看看I2C驅(qū)動的大概過程吧:
設(shè)備樹
// linux_5.10/arch/riscv/boot/dts/cvitek/cv180x_base.dtsi
i2c0: i2c@04000000 {
compatible = "snps,designware-i2c";
clocks = ?&clk CV180X_CLK_I2C??>;
reg = ?0x0 0x04000000 0x0 0x1000??>;
clock-frequency = ?400000??>;
#size-cells = ?0x0??>;
#address-cells = ?0x1??>;
resets = ?&rst RST_I2C0??>;
reset-names = "i2c0";
};
// linux_5.10/arch/riscv/boot/dts/cvitek/cv180x_base_riscv.dtsi
i2c0: i2c@04000000 {
interrupts = ?49 IRQ_TYPE_LEVEL_HIGH??>;
interrupt-parent = ?&plic0??>;
};
驅(qū)動源碼
使用的是i2c designware的框架。
控制器驅(qū)動
// linux_5.10/drivers/i2c/busses/i2c-designware-platdrv.c
dw_i2c_plat_probe(struct platform_device *pdev):
i2c_dw_probe(struct dw_i2c_dev *dev)
i2c_dw_probe_master(struct dw_i2c_dev *dev)
i2c_add_numbered_adapter(struct i2c_adapter *adap)
i2c_add_adapter(struct i2c_adapter *adapter)
i2c_register_adapter(struct i2c_adapter *adap)
device_register(struct device *dev) // 注冊設(shè)備
設(shè)備驅(qū)動
// linux_5.10/drivers/i2c/i2c-core-base.c
i2c_register_driver(struct module *owner, struct i2c_driver *driver)
driver_register(&driver->driver); // 注冊驅(qū)動
通過device_register和driver_register會進行match和probe的操作,從而關(guān)聯(lián)起來I2C適配器和設(shè)備驅(qū)動。
對于詳細(xì)得展開需要進一步的學(xué)習(xí)。
應(yīng)用編程
i2c的驅(qū)動編程就是open/read/write/ioctrl這一套。
uint8_t reg_addr = 0x00;
uint8_t data_buf[2];
// 打開設(shè)備
int i2c_fd = open("/dev/i2c-0", O_RDWR);
// 方式一:
// 設(shè)置從機地址
ioctl(i2c_fd, I2C_SLAVE, slave_addr);
write(i2c_fd, 0, ?_addr, 1);
read(i2c_fd, 0, data_buf, 2);
// 方式二:
struct i2c_rdwr_ioctl_data rdwr;
struct i2c_msg msgs[2];
msgs[0].addr = I2C_SLAVE;
msgs[0].flags = 0;
msgs[0].len = 1;
msgs[0].buf = ?_addr;
msgs[1].addr = I2C_SLAVE;
msgs[1].flags = I2C_M_RD;
msgs[1].len = 2;
msgs[1].buf = data_buf;
rdwr.msgs = msgs;
rdwr.nmsgs = 2;
ioctl(file, I2C_RDWR, &rdwr);
以上兩種方式選擇其中一種就行。
接下去就用溫濕度傳感器測試一下i2c總線的使用,演示過程后面通過視頻展示。
審核編輯:湯梓紅
-
控制器
+關(guān)注
關(guān)注
112文章
16433瀏覽量
178961 -
I2C
+關(guān)注
關(guān)注
28文章
1495瀏覽量
124228 -
溫濕度傳感器
+關(guān)注
關(guān)注
5文章
581瀏覽量
35801 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5117瀏覽量
97934
發(fā)布評論請先 登錄
相關(guān)推薦
評論