关于qualcomm平台i2c和spi配置学习

前言:

此篇blog主要是要使能qualcomm平台的i2c和spi,例如怎么在设备树文件中添加节点信息,其次是对设备树文件的改。eg.主要修改了msm8916-pinctrl.dtsi msm8916.dtsi两个文件。


一、msm8916-pinctrl.dtsi是配置MSM8916芯片中的GPIO。在此文件中定义i2c使用哪个gpio。

因为引脚复用功能的存在,所以要先配置i2c的引脚复用功能,在msm8953-pinctrl.dtsi中进行如下配置:

i2c_4{
	i2c_4_active:i2c_4_active { /*i2c处于active状态*/
	/* active state */
		mux{
			pins= "gpio14", "gpio15"; /*i2c有两根线,分别是SDA和SCL*/
			/* SDA用到了gpio14,SCL用到了gpio15*/
			function= "blsp_i2c4"; /*这个gpio组支持功能复用,在i2c_4_active中,gpio说明采用"blsp_i2c4"功能*/
			};
		config{
			pins= "gpio14", "gpio15";
			drive-strength= <2>; /*设置gpio14,gpio15这个pin脚组的驱动能力为2MA*/
			bias-disable;/*选项有bias-pull-up、bias-pull-down和bias-disable。这里使用bias-disable,代表no-pull*/
			};
		};
	i2c_4_sleep:i2c_4_sleep { /*i2c处于sleep状态*/
	/*suspended state */
		mux{
			pins= "gpio14", "gpio15";
			function= "gpio"; /*这时pins的功能设置为普通的gpio功能。这里体现出了pin脚的功能复用。*/
		};
		config{
			pins= "gpio14", "gpio15";
			drive-strength= <2>; /*驱动能力设置为2MA*/
		bias-disable;
		};
	};
};



二、需要在文件msm8916.dtsi中添加一个新的i2c设备树节点:

根据spec获取物理地址,中断号等。

i2c_4:i2c@78b8000 { /* BLSP1 QUP4 */ /*i2c_4使用的是BLSP1 QUP4,对应的物理地址为0x78b8000*/
	compatible ="qcom,i2c-msm-v2";
	#address-cells = <1>;
	#size-cells = <0>;
	reg-names ="qup_phys_addr";
	reg = <0x78b8000 0x600>;/*i2c_4对应的物理地址*/
	interrupt-names ="qup_irq";
	interrupts = <0 98 0>;/*根据spec可以得到BLSP1 QUP4对应的中断号为98,第三                                           	/*个0的含义为:*/
       /*1: low-to-high edge triggered;
            2: high-to-low edge triggered;
            3: active high-level-sensitive;
            4: active low-       level-sensitive*/
	qcom,clk-freq-out =<400000>; /*希望得到的i2c总线时钟频率,HZ*/
	qcom,clk-freq-in =<19200000>; /*提供的核心时钟频率,HZ*/
	clock-names ="iface_clk", "core_clk";
	clocks = <&clock_gccclk_gcc_blsp1_ahb_clk>,
                 <&clock_gccclk_gcc_blsp1_qup4_i2c_apps_clk>;
 
	pinctrl-names ="i2c_active", "i2c_sleep"; /*用到的pinctrl。*/
	pinctrl-0 =<&i2c_4_active>;
	pinctrl-1 =<&i2c_4_sleep>;
	qcom,noise-rjct-scl =<0>;
	qcom,noise-rjct-sda =<0>;
	qcom,master-id = <86>;
	dmas = <&dma_blsp1 10 640x20000020 0x20>,
       <&dma_blsp1 11 32 0x200000200x20>;
	dma-names = "tx","rx";
	status = "okay";
};


确认i2c是否配置成功的方法:

adbshell

cd/dev/

lsi2c*

会看到所添加的i2c设备。


使用示波器可以观察到正确的波形,证明配置正确了。

 

对spi的配置和i2c类似,主要在msm8916-pinctrl.dtsi和msm8916.dtsi中进行修改:

在msm8916-pinctrl.dtsi中添加如下代码:

spi3{
	spi3_default:spi3_default {
	/*active state */
		mux{
		/* MOSI, MISO, CLK */
			pins = "gpio8", "gpio9","gpio11"; /* 在这里,spi使用四根线,MOSI、MISO、CLK和                                                           CS。*/
			/*MOSI对应gpio8,MISO对应gpio9,CLK对应gpio11,CS对应gpio10*/
                     /* spi普遍使用三根或四根线,在需要片选时需要加CS线*/
			function = "blsp_spi3"; /* 功能复用,设置功能为"blsp_spi3"*/
		};
	config{
		pins= "gpio8", "gpio9", "gpio11";
		drive-strength= <12>; /* 12 MA */ /*驱动能力为12MA*/
		bias-disable= <0>; /* No PULL */ /*有三个选项:bias-disable、bias-pull-down、bias-pull-up*/
		};
	};
	spi3_sleep:spi3_sleep {
	/*suspended state */
		mux{
		/*MOSI, MISO, CLK */
			pins= "gpio8", "gpio9", "gpio11";
			function= "gpio"; /* 功能复用,在sleep状态时作为gpio。*/
		};
		config{
			pins= "gpio8", "gpio9", "gpio11";
			drive-strength= <2>; /* 2 MA */ /* 睡眠状态时的驱动能力设为2MA */
			bias-pull-down;/* PULL Down */
			};
		};
	spi3_cs0_active:cs0_active { /*设置CS片选线的gpio*/
	/*CS */
		mux{
			pins= "gpio10";
			function= "blsp_spi3"; /*功能复用*/
		};
		config{
			pins= "gpio10";
			drive-strength= <2>;
			bias-disable= <0>;
			};
		};
	spi3_cs0_sleep:cs0_sleep {
	/*CS */
		mux{
			pins= "gpio10";
			function= "gpio";
		};
		config{
			pins= "gpio10";
			drive-strength= <2>;
			bias-disable= <0>;
		};
	};
};
 


在msm8916.dtsi中添加节点:

 

spi_3:spi@78b7000 { /* BLSP1 QUP3 */ /*使用BLSP1QUP3*/
	compatible= "qcom,spi-qup-v2";
	#address-cells= <1>;
	#size-cells= <0>;
	reg-names= "spi_physical", "spi_bam_physical";
	reg= <0x78b7000 0x600>,
		<0x78840000x1f000>;
	interrupt-names= "spi_irq", "spi_bam_irq";
	interrupts= <0 97 0>, <0 238 0>; /*根据表2确定中断号*/
	spi-max-frequency= <19200000>; /*最大的SPI设备的频率*/
	pinctrl-names= "spi_default", "spi_sleep"; /*所用到的pin脚和功能*/
	pinctrl-0= <&spi3_default &spi3_cs0_active>;
	pinctrl-1= <&spi3_sleep &spi3_cs0_sleep>;
	clocks= <&clock_gcc clk_gcc_blsp1_ahb_clk>,
		<&clock_gccclk_gcc_blsp1_qup3_spi_apps_clk>;
	clock-names= "iface_clk", "core_clk";
	qcom,infinite-mode= <0>;
	qcom,use-bam;/*使用BAM模式*/
	qcom,use-pinctrl;
	qcom,ver-reg-exists;
	qcom,bam-consumer-pipe-index= <8>;
	qcom,bam-producer-pipe-index= <9>;
	qcom,master-id= <86>;
};

 

如果配置正确,可以在/sys/class/spi_master/spi下看到spi总线:

adbshell

cd/sys/class/spi_master/

ls

 

spi和i2c知识总结:

SPI总线由三条信号线组成。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。 

如果用通用IO口模拟SPI总线,必须要有一个输出口,一个输入口,另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。

I2C总线是双向、两线、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。 

如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口,另外还需一个输出口。

 

iic的两根线:SDA、SCL,结构如下图所示。分别表示:


SDA:串行数据线。

SCl:串行时钟线。

 


图IIC结构示意图、总线数据传输协议示意图

spi的四根线:MOSI、MISO、CS、CLK,spi总线的结构和数据的传送格式如下图所示。分别代表:

MOSI:主输出,从输入。

MISO:主输入,从输出。

CS:片选。

CLK:同步时钟。



图spi结构和数据传送格式示意图

 

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值