spidev0.0的正确打开方式

阅前必读

该平台基于Freescale的主控imx6ull,本人历时两周时间,走过无数坑,原因是无法精确的找到目前使用的文件,主要是nxp命名模式让我有点尴尬,以至于对于错误的spi文件修改了半天,例如spi-fsl-spi.c该文件就没有使用。以下是系统使用的文件,给后者一点建议免得重蹈覆辙。好了开始说重点部分,重点来了
首先驱动代码分为device和drivers,device在dts里面实现,drivers在spi-imx.c实现。之前通过compatible属性值匹配

  • drivers使用到的源码文件有spi.c、spi-imx.c、spi-bitbang.c、spidev.c,其他的spi-fsl-*统统用不上,就不用花时间在那个上面了。
    文件说明:spi-imx.c通过.compatible = "fsl,imx6ul-ecspi"得到适合当前cpu型号

    warning:虽然spi-bitbang.c是软件模拟spi功能实现函数,但是必须一起编译进内核,因为在spi-imx.c的peobe函数用到了spi-bitbang.c的master注册函数

  • make menuconfig需要打开的文件有
    -CONFIG_SPIDEV=y、CONFIG_SPI=y、CONFIG_SPI_BITBANG=y、CONFIG_SPI_IMX=y、CONFIG_SPI_MASTER=y

  • 需要修改的dts文件名为
    -arch/arm/boot/dts/myb/y6ull-14x14.dts
    增加以下内容即可编译出spidev0.0设备

	&ecspi1 {
		fsl,spi-num-chipselects = <1>;
		status = "okay";
		spidev:spidev@0 {
			compatible = "fsl,spidev";
			mode = <0>;
			status = "okay";
		};
	};
  • 到此为止,你成功的输出了spidev0.0,终于看到了希望,但是抱歉,这个设备无法正常使用,原因有如下两点(dts缺配置)
  • 一、使用硬件spi模式配置gpio

    1、编辑dts文件增加如下内容即可正常使用
		pinctrl_ecspi1_cs_1: ecspi1_cs_grp-1 {
			fsl,pins = <
				MX6UL_PAD_CSI_DATA05__GPIO4_IO26  0x10b0
			>;
		};

		pinctrl_ecspi1_1: ecspi1grp-1 {
			fsl,pins = <
				MX6UL_PAD_CSI_DATA06__ECSPI1_MOSI 0x10b0
				MX6UL_PAD_CSI_DATA07__ECSPI1_MISO 0x10b0
				MX6UL_PAD_CSI_DATA04__ECSPI1_SCLK 0x10b0
			>;
		};
		&ecspi1 {
			fsl,spi-num-chipselects = <1>;
			cs-gpios = <&gpio4 26 0>;
			pinctrl-names = "default";
			pinctrl-0 = <&pinctrl_ecspi1_1 &pinctrl_ecspi1_cs_1>;
			status = "okay";
		
			spidev1: spidev1@0 {
				#address-cells = <1>;
				#size-cells = <1>;
				compatible = "fsl,spidev1";
				spi-max-frequency = <1000000>;
				reg = <0>;
			};
		};
  • 二、使用Bitbang软件模拟spi模式配置gpio

    2、编辑dts增加一下内容即可
		gpio-spi1 {
			compatible = "spi-gpio";
			pinctrl-names = "default";
			gpio-sck = <&gpio4 25 GPIO_ACTIVE_LOW>;
	        gpio-miso = <&gpio4 28 GPIO_ACTIVE_LOW>;
	        gpio-mosi = <&gpio4 27 GPIO_ACTIVE_LOW>;
	        cs-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>;
	        num-chipselects = <1>;
	        spidev@0 {
				#address-cells = <1>;
				#size-cells = <0>;
				reg = <0x02008000 0x4000>;
				compatible = "fsl,spidev1";
				mode = <0>;
				status = "okay";
	            spi-max-frequency = <1000000>;
	        };
		};

写在最后:
好了,现在你可以正常的使用spi了,是不是很爽。最后在分享一下我所遇到的问题,
1、开始对于spi-imx.c里面调用bitbang函数让我迟迟不解,两个里面都有probe函数,实际该怎么用呢,最后发现这是spi的两种不同模式,一个硬件另一个是软件,只需要在dts里面区分配置即可
2、对于干扰文件例如spi-fsl-spi.c第一眼我就认中了这个驱动程序,可结果让我大失所望,我说一下我是如何找到正确的驱动文件的,首先还是看内核启动日志dmesg > log命令,它里面会有提示&pdev->dev打印信息;此过程需要仔细仔细在仔细的看。
3、对于dts文件我也是纠结了好久,发现之前修改的文件也是错的。我是通过cat /proc/model 来识别出来,可能很多dts都是同一个名称,而我是直接修改成不同的名称后在对比,最后终于被我给揪出来了

好了,花了两个小时终于啰嗦完了,希望对于有帮助的小伙伴点个关注,以后我还是不定时的更新项目遇到的问题,如果该文章有错误的内容,也欢迎大家指正,感谢的你阅读!!!

你可能感兴趣的:(Linux日志)