1. 程式人生 > 其它 >為R329新增i2c裝置

為R329新增i2c裝置

新增裝置樹

裝置樹在/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)