一 丶配置SPI和I2C
msm8953使用spi和i2c主要是配置它的dtb,一些以msm8953为基础的平台上已经为你配置好了I2C和spi,你只需要使能就行了。没有配置的,需要自己去配置,下面提供两个参考,如何配置msm8953的SPI和DTB:
https://blog.csdn.net/weixin_36274916/article/details/52703604
https://blog.csdn.net/xuecz1230/article/details/92809340#comments
注: msm8953.dtsi (添加节点) msm8953-pinctl.dtsi(引脚配置),它们位于 KERNEL/arch/arm64/boot/dts/qcom中。KERNEL为内核根目录。
一些以msm8953为基础的平台已经配置好了SPI和I2C,但与上面两篇文章讲的有一点不同的是自己节点信息上多了“status="disabled"”,也就是它并没有使能,因为I2C和SPI有引脚复用,而dtb里面又配置了,所以默认不使能。所以此平台提供了一个使能的dtsi,名为msm8953-mtp.dtsi。例如我使能spi6,
&spi_6{
status = "ok"
};
这样就能避免引脚冲突,在原理图中可以知道,spi3和i2c3就引脚冲突了,但在msm8953-mtp.dtsi里面就只使能了i2c3。
经过上述设置,你就可以在/sys/class/spi_master中看到如下:
二丶使用SPI和I2C
spi和i2c都可以通过write/read来操作,那前提是/dev下得有相应的节点。在上节配置后,在msm8953-mtp.dtsi中使能了,在/dev下面会出现i2c设备节点,比如:
现在我们可以直接open("/dev/i2c-2")来对它进行操作了。但是经过上述配置,在/dev下面并不会出现spi设备节点,可以:
① 修改msmcortex_defconfig:将 SPIDEV选项 = y(原先是m)
② 修改msm8953-mtp.dtsi :
&spi6{
status = "ok";
spidev@0{
compatible = "spidev";
reg = <0>;
spi-max-frequency = <5000000>;
#address-cells = <1>;
#size-cells = <1>;
};
};
这样,就在/dev下产生spi节点了:
接下来我们就可以通过open,write,read函数来操作它们了!
三丶使用spidev_test测试spi
位置:KERNEL/Documentation/spi/spidev_test.c
① 进入KERNEL/Documentation/spi,修改Makefile
hostprogs-y := spidev_test
always := $(hostprogs-y)
HOSTCFLAGS_spidev_test.o += -I$(objtree)/usr/include
② 添加Android.mk:touch Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES += spidev_test.c
LOCAL_MODULE := spidev_test
LOCAL_LDFLAGS += -L$(LOCAL_PATH)
LOCAL_LDLIBS := -llog
include $(BUILD_EXECUTABLE)
③ 进入android源码根目录:
source build/envsetup.sh
lunch msm8953_64-userdebug
返回KERNEL/Documentation/spi,执行mm
这样spidev_test就生成在system/bin目录下了。
注意:在使用mm命令前要确保整个系统已经编译过了:make -j8