I2C需要分兩部分進行修改,第一部分是設備樹的配置,這部分主要是有關I2C控制器相關的參數、中斷等,另一部分是硬件引腳的配置,由于驅動用的是i2c-designware的通用驅動,所以需要讀取進行IO初始化,這就出現了額外的操作,希望后面對驅動進行適配,可以從設備樹對引腳進行配置,自動完成初始化。
下面就來看看I2C驅動的大概過程吧:
設備樹
// 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??>;
};
驅動源碼
使用的是i2c designware的框架。
控制器驅動
// 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) // 注冊設備
設備驅動
// linux_5.10/drivers/i2c/i2c-core-base.c
i2c_register_driver(struct module *owner, struct i2c_driver *driver)
driver_register(&driver->driver); // 注冊驅動
通過device_register和driver_register會進行match和probe的操作,從而關聯起來I2C適配器和設備驅動。
對于詳細得展開需要進一步的學習。
應用編程
i2c的驅動編程就是open/read/write/ioctrl這一套。
uint8_t reg_addr = 0x00;
uint8_t data_buf[2];
// 打開設備
int i2c_fd = open("/dev/i2c-0", O_RDWR);
// 方式一:
// 設置從機地址
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總線的使用,演示過程后面通過視頻展示。
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
控制器
+關注
關注
112文章
16482瀏覽量
179718 -
I2C
+關注
關注
28文章
1495瀏覽量
124765 -
溫濕度傳感器
+關注
關注
5文章
581瀏覽量
35878 -
開發板
+關注
關注
25文章
5141瀏覽量
98395
發布評論請先 登錄
相關推薦
【Milk-V Duo 開發板免費體驗】Milk-V Duo之開箱初體驗
一,第一印象
外觀設計方面,Milk-V Duo以簡約而精致的風格為主,采用沉金工藝,給人一種高端大氣的感覺。開發板的尺寸小巧,便于攜帶和使用,在我拿到的所有的開發板中,也只有
發表于 07-16 01:15
【Milk-V Duo 開發板免費體驗】Milk-V Duo 開發板學習初體驗
milkv-duo-20230616-2232.img自制成linux啟動盤
3、通過Type-C數據線連接電腦,小板系統順暢的啟動了
登錄Milk-V Duo小板的系統耍耍吧
1、正
發表于 07-28 15:58
【Milk-V Duo 開發板免費體驗】milkv-duo 申請成功體驗
。
引腳圖
總結
Milk-V Duo開發板的小巧精致設計和強悍的性能確實為創客和開發者提供了一個優秀的平臺。它的緊湊設計使得它適用于各種空間有限的場景,同時強大的性能可以支持復雜
發表于 07-29 14:31
【Milk-V Duo 開發板免費體驗】初步體驗 + 搭建開發環境
鏈接依賴過去即可了,后續可以直接修改文件系統去燒錄。【Milk-V Duo 開發板免費體驗】OpenCV的交叉編譯 - RISC-V MCU
發表于 08-01 12:49
【Milk-V Duo 開發板免費體驗】Milk-V Duo 開發板初體驗
。
Milk-V Duo開發板(圖4)是一款基于CV1800B芯片(RISC-V架構,C906@1Ghz +
發表于 08-18 00:26
【Milk-V Duo 開發板免費體驗】3-Linux控制小車方向
接上兩篇:【Milk-V Duo 開發板免費體驗】2控制螺旋槳電路https://bbs.elecfans.com/jishu_237105
發表于 08-20 23:57
【Milk-V Duo 開發板免費體驗】4-Linux控制小車動作(原創)首發
【Milk-V Duo 開發板免費體驗】2控制螺旋槳電路https://bbs.elecfans.com/jishu_2371054_1_
發表于 08-21 02:11
【Milk-V Duo 開發板免費體驗】②、ssh連接Milk-V Duo開發板
承接上期的開箱貼,此次將Milk-V Duo開發板運行linux系統。在此之前需要手頭準備一張8GB以上的TF卡,并使用讀卡器將TF燒錄Linux鏡像文件。這里需要借助燒寫工具rufus,這款工具
發表于 08-29 00:53
評論