本人【Luckfox幸狐 RV1106 Linux 开发板测评】帖子链接:
一、开箱及测试
二、SDK获取与编译镜像
三、GPIO点灯
四、通过PC机共享网络接入Internet和Ubuntu下Python点灯
五、编译Buildroot系统并测试摄像头
六、PWM控制——命令和C方式
七、PWM控制——Python和设备树方式
八、ADC和UART测试
九、Python控制I2C驱动OLED
十、C程序控制I2C驱动OLED
十一、SPI驱动LCD
十二、实现FrameBuffer设备及LVGL应用
十三、五向开关作为LVGL输入设备
十四、LVGL显示DHT11的温湿度
本篇测评主要参考一篇博文:i2c子系统-----mpu6050(https://blog.csdn.net/qq_69255338/article/details/124005637),同时参考了Luckfox Wiki之温湿度传感器DHT11篇中的Makefile写法。
1、MPU6050的设备树节点
应该说是本次Luckfox幸狐RV1106板的测评活动促使自己开始真正了解Linux内核,前面测评I2C时也开始关注Linux源码的Document目录,所以在实验MPU6050时,首先想到从文档中搜索看看是否包含相关驱动。
图15-1 搜索mpu6050相关文档
在<Luckfox SDK>/sysdrv/source/kernel/Documentation目录下,执行命令:find -name *mpu6050*,找到了MPU6050的说明文档:./devicetree/bindings/iio/imu/inv_mpu6050.txt。
说明文档中给出了MPU6050在设备树文件中的节点描述的示例代码,如下截图所示,代码定义属性所代表的意义如下:
compatible = "invensense,mpu6050";:这个属性表示这个节点描述的硬件与"invensense,mpu6050"兼容。这通常用于驱动程序匹配,确保正确的驱动程序加载来支持这个硬件。
reg = <0x68>;:这个属性定义了MPU6050传感器的基地址,通常是它在I2C或SPI总线上的地址。
interrupt-parent = <&gpio1>;:这个属性指定了中断控制器的父节点,即MPU6050传感器将使用的GPIO(通用输入/输出)控制器。
interrupts = <18 IRQ_TYPE_EDGE_RISING>;:这个属性定义了MPU6050传感器使用的中断号(在这里是18)和中断类型(这里是边缘上升类型)。
mount-matrix:这是一个3x3的矩阵,用于描述MPU6050传感器在系统中的物理方向或安装方向。这个矩阵可以用于将传感器测量的方向转换到系统或设备的本地坐标系。
第一行和第二行定义了x轴和y轴的方向转换。
第三行定义了z轴的方向转换。
图15-2 mpu6050说明文档示例代码截图
本次实验只做MPU6050在Luckfox Pro Max下的驱动验证,所以不考虑接入传感器的IRQ信号(这个是MPU6050的中断输出信号,实际中可以在MPU6050中设置阈值,如果监测数据超限则产生唤醒电平,用以唤醒休眠中的处理器),也不考虑坐标转换了。所以最终的设备树文件rv1106g-luckfox-pico-pro-max.dts,在&i2c3节点内添加mpu6050节点:
&i2c3 {
status = "okay";
pinctrl-0 = <&i2c3m1_xfer>;
clock-frequency = <100000>;
// 下述为本例添加部分
mpu6050@68 { /*i2c client信息*/
compatible = "invensense,mpu6050";
reg = <0x68>;
};
};
2、MPU6050的驱动和测试程序
修改设备树后,依然是重新构建系统内核,并重新烧录开发板。当然,还需要编写MPU6050的驱动。
这里在虚拟机上创建一个目录,其中包含文件如下:
mpu6050.h —— 相关头文件,包含自定义联合体类型用以存放传感器读数;
mpu6050_drv.c —— 内核驱动源文件;
mpu6050_test.c —— 驱动测试程序源文件;
Makefile —— 针对两个源文件的编译命令等。
除了Makefile之外,其它文件的源码都是照搬参考文档1“i2c子系统-----mpu6050”,这里也就不再贴出来了,只是Makefile针对Luckfox SDK的情况做了改动,具体如下:
ARCH=arm
CROSS_COMPILE=~/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-
export ARCH CROSS_COMPILE
CC=$(CROSS_COMPILE)gcc
KERN_DIR = ~/luckfox-pico/sysdrv/source/kernel
PWD ?= $(shell pwd)
name=mpu6050
all:
make -C $(KERN_DIR) M=$(PWD) modules
$(CROSS_COMPILE)gcc $(name)_test.c -o $(name)
echo $(PWD)
clean:
rm -f *.ko *.o *.mod *.mod.o *.mod.c *.symvers *.order *.cmd
obj-m += $(name)_drv.o
make后,项目目录中包含内核驱动模块mpu6050_drv.ko和测试程序mpu6050,将这两个文件拷贝到本地,再adb push到开发板。
图15-3 mpu6050驱动项目目录
接着,进入开发板控制台,首先是安装内核模块,然后chmod赋予测试程序执行权限。最后,运行测试程序查看执行结果。
图15-4 mpu6050驱动模块安装(开发板上)
图15-5 mpu6050测试程序
|