為R329新增i2c裝置
阿新 • • 發佈:2021-11-02
新增裝置樹
裝置樹在/linux/arch/arm64/boot/dts/allwinner/
路徑下,和r329相關的裝置樹有
sun50i-r329-maix-iia.dtsi
sun50i-r329-maixsense.dts
sun50i-r329.dtsi
三個,其中沒有i2c的定義。
參考下隔壁H6的裝置樹:
引腳定義:
i2c0_pins: i2c0-pins {
pins = "PD25", "PD26";
function = "i2c0";
};
I2C描述:
i2c0: i2c@5002000 { compatible = "allwinner,sun50i-h6-i2c", "allwinner,sun6i-a31-i2c"; reg = <0x05002000 0x400>; interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>; clocks = <&ccu CLK_BUS_I2C0>; resets = <&ccu RST_BUS_I2C0>; pinctrl-names = "default"; pinctrl-0 = <&i2c0_pins>; status = "disabled"; #address-cells = <1>; #size-cells = <0>; };
註冊引腳
原理圖如下:
在pinctrl中,可以看到PH8 PH9是i2c1:
SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 8), SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x2, "i2c1"), /* SDA */ SUNXI_FUNCTION(0x3, "spi1"), /* WP/DBI-TE */ SUNXI_FUNCTION(0x4, "ledc"), /* DO */ SUNXI_FUNCTION(0x5, "ir"), /* TX */ SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 8)), /* PH_EINT8 */ SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 9), SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x2, "i2c1"), /* SCK */ SUNXI_FUNCTION(0x3, "spi1"), /* HOLD/DBI-DCX/DBI-WRX */ SUNXI_FUNCTION(0x4, "spdif"), /* IN */ SUNXI_FUNCTION(0x5, "ir"), /* RX */ SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 9)), /* PH_EINT9 */
在pio: pinctrl@2000400新增引腳定義:
i2c1_ph_pins: i2c1-ph-pins {
pins = "PH8", "PH9";
function = "i2c1";
};
新增i2c描述
查詢i2c暫存器地址
在USER manual中
7.1.5 Register List
Module Name | BaseAddress |
---|---|
TWI0 | 0x02502000 |
TWI1 | 0x02502400 |
R_TWI0 | 0x07081400 |
這裡使用的是TWI1,因此地址是0x02502400,地址範圍0x400;
查詢compatible
在 linux/drivers/i2c/busses/
查詢中斷號
Interrupt Number | Interrupt Source |
---|---|
41 | TWI0 |
42 | TWI1 |
參考標準串列埠使用的GIC_SPI
(SPI:shared processor interrupts 中斷號 32 ~32+224),
得到r_uart的中斷號42-32=10
查詢時鐘及復位號
在#include <dt-bindings/clock/sun50i-r329-ccu.h>
和#include <dt-bindings/reset/sun50i-r329-ccu.h>
中
#define RST_BUS_I2C1 18
#define CLK_BUS_I2C1 37
整體描述如下:
i2c1: i2c@2502400{
compatible = "allwinner,sun6i-a31-i2c";
reg = <0x02502400 0x400>;
interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_I2C1>;
resets = <&ccu RST_BUS_I2C1>;
pinctrl-names = "default";
pinctrl-0 = <&i2c1_ph_pins>;
status = "disabled";
};
新增到dtbs檔案中。
啟用I2C裝置
在sun50i-r329-maixsense.dts中開啟i2c1
&i2c1{
status = "okay";
};
宣告i2c1裝置名
aliases {
serial0 = &uart0;
serial1 = &r_uart;
mmc0 = &mmc0;
i2c1 = &i2c1;
};
編譯,然後將裝置樹檔案放入maixsense中。
測試
啟動後,可以列出i2c裝置:
maixsense:~:# ls /sys/bus/i2c/devices
i2c-1
maixsense:~:# ls /dev/i2c*
/dev/i2c-1
完整裝置樹檔案見linux/arch/arm64/boot/dts/allwinner at r329-wip · USTHzhanglu/linux (github.com)