通过nxp yocto工程获得的kernel 对应的imx7d-sdb.dts并不包含spi设备(即 在/dev/下没有spidev0.0 和 spidev1.0),想要访问spi设备需要自己添加。废话不多说,下面说一下我自己添加的过程,本人亲测,有效。
linux kerel大概从2.6以后用dts把一些跟板级硬件配置相关的东东都放在了Device Tree Source中,一般放置在内核的arch/arm/boot/dts/目录。这样做的好处多多,有多少,自己百度。
我添加spi的过程如下:
1:打开 imx7d-sdb.dts
添加spi节点:
&ecspi1 {
fsl,spi-num-chipselects = <0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi1 &pinctrl_ecspi1_cs>;
cs-gpios = <&gpio4 19 0>;
status = "okay";
spidev@1 {
spi-max-frequency = <48000000>;
reg = <0>;
compatible = "rohm,dh2228fv";
};
};
&ecspi2 {
fsl,spi-num-chipselects = <0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
cs-gpios = <&gpio4 23 0>;
status = "okay";
spidev@2 {
spi-max-frequency = <48000000>;
reg = <0>;
compatible = "rohm,dh2228fv";
};
};
2:定义相关引脚
pinctrl_ecspi1_cs: ecspi1_cs_grp {
fsl,pins = <
MX7D_PAD_ECSPI1_SS0__GPIO4_IO19 0x80000000
>;
};
pinctrl_ecspi1: ecspi1grp {
fsl,pins = <
MX7D_PAD_ECSPI1_SCLK__ECSPI1_SCLK 0x1
MX7D_PAD_ECSPI1_MOSI__ECSPI1_MOSI 0x1
MX7D_PAD_ECSPI1_MISO__ECSPI1_MISO 0x1
>;
};
pinctrl_ecspi2_cs: ecspi2_cs_grp {
fsl,pins = <
MX7D_PAD_ECSPI2_SS0__GPIO4_IO23 0x80000000
>;
};
pinctrl_ecspi2: ecspi2grp {
fsl,pins = <
MX7D_PAD_ECSPI2_SCLK__ECSPI2_SCLK 0x1
MX7D_PAD_ECSPI2_MOSI__ECSPI2_MOSI 0x1
MX7D_PAD_ECSPI2_MISO__ECSPI2_MISO 0x1
>;
};
3:make;找到编译好的dtb(即imx7d-sdb.dtb),替换原来的dtb,注意名字要和uboot里面 fdt_file设置一样。
4:重启,ls /dev/spi*
spidev0.0 spidev1.0
大功告成,哈哈。
note:有些板子kernel会启动失败,我遇到的情况是spi引脚被别的设备占用了,在dts中注释掉被占用的引脚即可。
例如: uart6 ,udsh2