在线课堂:https://www.100ask.net/index(课程观看)
论  坛:http://bbs.100ask.net/(学术答疑)
开 发 板:https://100ask.taobao.com/ (淘宝)
     https://weidongshan.tmall.com/(天猫)
交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
交流群二:QQ群:536785813(单片机-嵌入式)
公 众 号:百问科技


版本 日期 作者 说明
V1 2020 韦东山 摘自《嵌入式Linux应用开发完全手册》

之前发了LCD调试笔记,大家很感兴趣,所以这次再来一篇:六轴传感器ICM20608驱动移植笔记,大家还需要什么移植笔记?可以留言。我们尽量满足。

1.1 移植思路

先找到驱动:也许内核里已经有,也许需要去网上查找。

打开bing.com,搜“ICM20608 linux driver”,发现这个网址:

https://github.com/torvalds/linux/blob/master/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c

大胆假设,在linux内核中应该也有驱动,找到:

$ cd  drivers/iio/imu/inv_mpu6050$ grep "20608" * -nr

果然找到一堆驱动,比如:

inv_mpu_i2c.c:173:      {"icm20608", INV_ICM20608},inv_mpu_iio.h:75:       INV_ICM20608,inv_mpu_iio.h:232:#define INV_ICM20608_WHOAMI_VALUE             0xAFinv_mpu_spi.c:85:       {"icm20608", INV_ICM20608},

100ASK_IMX6ULL上使用SPI接口连接ICM20608,所以我们要找的驱动就是inv_mpu_spi.c。

这样事情就好办了。

接下来就是配置设备树,

最后测试。

1.2 SPI驱动程序框架

我们需要弄清楚SPI驱动程序的结构,才能够理解驱动程序,添加设备树信息。

特别是对于ICM20608,在内核的设备树文档Documentation/devicetree/bindings目录下,找不到任何有用的信息。

那我们只能看源码了,看源码之前先弄清结构。


我们需要阅读源码来确定设备树的上述4点内容。

1.2 ICM20608设备树

100ASK_IMX6ULL开发板上,ICM20608接在哪一个SPI控制器上?

如上图,接在ECSPI3这个SPI控制器上。

打开设备树文件arch/arm/boot/dts/100ask_imx6ull-14x14.dts,可以看到如下代码:

&ecspi3 {        pinctrl-names = "default";        pinctrl-0 = <&pinctrl_ecspi3>;        cs-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;        status = "okay";        spidev: icm20608@0{                compatible = "invensense,icm20608";                interrupt-parent = <&gpio1>;                interrupts = <1 1>;                spi-max-frequency = <8000000>;                reg = <0>;        };};

这是我们同事写出来的,具体过程就省略掉,看着挺简单,写的时候花了不少时间。

我们来研究一下,它位于ecspi3节点之下,ecspi3节点肯定就是SPI控制器之一。要找到它的compatible属性,才能找到SPI控制器的驱动程序。

打开 imx6ull.dtsi,果然有:

把ecspi3节点和ICM20608节点合并起来,内容如下:

1.3 SPI控制器驱动程序

1.3.1 找到驱动程序

根据上述设备树信息,在Linux内核源码目录下搜"fsl,imx6ul-ecspi",就可以找到SPI控制器的驱动程序:

book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88/drivers$ grep "fsl,imx6ul-ecspi" * -nrBinary file built-in.o matchesspi/spi-imx.c:782:      { .compatible = "fsl,imx6ul-ecspi", .data = &imx6ul_ecspi_devtype_data, },

可见,spi/spi-imx.c就是我们要找的SPI控制器驱动程序。

1.3.2 我们能做的不多,只能在设备树中指定片选

设备树已经在前面列出来了。

一个SPI控制器可以连接多个SPI设备,每个SPI设备使用都有单独的片选信号,如下图:

在SPI控制器驱动和设备树中,我们最关心的是片选信号,其他信号我们无法修改。

阅读spi-imx.c的spi_imx_probe函数:

我们得找到设备树的处理代码,看看它是怎么从设备树中设置cs_gpios的,搜“cs_gpios”,得到:

打开drivers/spi/spi.c第1846行,它确实是用来处理设备树的:

of_spi_register_master函数的调用流程:
spi_imx_probe  (drivers/spi/spi-imx.c)master = spi_alloc_master(&pdev->dev, sizeof(struct spi_imx_data));ret = spi_bitbang_start(&spi_imx->bitbang);   (drivers/spi/spi-bitbang.c)        ret = spi_register_master(spi_master_get(master));  (drivers/spi/spi.c)                 status = of_spi_register_master(master);  (drivers/spi/spi.c,就是它处理cs-gpios)

1.3 SPI设备驱动程序

设备树已经在前面列出来了。

SPI设备跟SPI控制器之间的硬件连接,能确定的也就3点,我们需要在设备树中指定:

a. 接到哪个SPI控制器去?

IMX6ULL中有多个SPI控制器,在设备树里,把SPI设备的节点放到某个SPI控制器节点之下就可以。

b. SPI设备有没有中断?用哪一个中断?

我们的ICM20608如下设置:

interrupt-parent = <&gpio1>;interrupts = <1 1>;

c. SPI设备使用哪个片选?

在SPI控制器节点里有cs-gpios属性,里面定义有1个或多个片选。

在SPI设备的节点中,用reg属性指定使用cs-gpios中的哪个片选(从0开始),如下:

reg = <0>;

你看,我们只关心设备树,似乎没怎么看驱动程序啊。

根据设备节点的compatible属性可找到ICM20608的驱动程序为:

drivers\iio\imu\inv_mpu6050\inv_mpu_spi.c

打开drivers/iio/imu/inv_mpu6050/Makefile,其内容如下:


上图中的2个ko文件,都需要安装。前一个要先安装,它为后一个ko提供一些函数。

1.4 测试

ICM20608的驱动程序是基于IIO驱动来编写的,我们还没深入研究IIO。

所以本节只是简单地讲讲怎么测试ICM20608,以后再深入研究。

首先,请确保你的设备树文件arch/arm/boot/dts/100ask_imx6ull-14x14.dts中,ICM20608节点的属性中含有cs-gpios,

注意:不是cs-gpio。(我们曾经提供一个补丁,它处理的是cs-gpio属性,最新版本的内核已经去除了这个补丁,使用drivers/spi/spi.c处理的是cs-gpios属性)

然后在开发板上安装驱动程序:

[root@imx6ull:~]# insmod inv-mpu6050.ko[root@imx6ull:~]# insmod inv-mpu6050-spi.ko[   56.892312] inv-mpu6000-spi spi2.0: mounting matrix not found: using identity...

你就可以看到设备节点了:

[root@imx6ull:~]# ls /dev/iio*/dev/iio:device0    /dev/iio:device1

也可以看到/sys下创建了一些文件:

[root@imx6ull:~]# ls /sys/bus/iio/devicesiio:device0  iio:device1  trigger0

是iio:device0还是iio:device1对应ICM20608?可以cat上述目录里的name文件:

[root@imx6ull:~]# cat /sys/bus/iio/devices/iio\:device1/nameicm20608

然后就可以进入/sys/bus/iio/devices/iio:device1目录,读取里面的文件,同时转动开发板,可以观察到值在变化:

[root@imx6ull:~]# cd  /sys/bus/iio/devices/iio\:device1[root@imx6ull:/sys/bus/iio/devices/iio:device1]# lsbuffer                        in_anglvel_y_calibbiascurrent_timestamp_clock       in_anglvel_y_rawdev                           in_anglvel_z_calibbiasin_accel_matrix               in_anglvel_z_rawin_accel_mount_matrix         in_gyro_matrixin_accel_scale                in_temp_offsetin_accel_scale_available      in_temp_rawin_accel_x_calibbias          in_temp_scalein_accel_x_raw                namein_accel_y_calibbias          of_nodein_accel_y_raw                powerin_accel_z_calibbias          sampling_frequencyin_accel_z_raw                sampling_frequency_availablein_anglvel_mount_matrix       scan_elementsin_anglvel_scale              subsystemin_anglvel_scale_available    triggerin_anglvel_x_calibbias        ueventin_anglvel_x_raw[root@imx6ull:/sys/bus/iio/devices/iio:device1]# cat in_accel_x_raw-141[root@imx6ull:/sys/bus/iio/devices/iio:device1]# cat in_accel_x_raw-4652[root@imx6ull:/sys/bus/iio/devices/iio:device1]# cat in_accel_x_raw844

注意:我们对ICM20608并无深入研究,上述/sys目录中各值有什么含义,留待你们去发现。

【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608相关推荐

  1. keil4怎么移植其他人的程序_【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608...

    之前发了LCD调试笔记,大家很感兴趣,所以这次再来一篇:六轴传感器ICM20608驱动移植笔记,大家还需要什么移植笔记?可以留言.我们尽量满足. 1.1 移植思路 先找到驱动:也许内核里已经有,也许需 ...

  2. [调试记录]3288 7.1平台上移植美格 SLM790 4G模块

    [调试记录]3288 7.1平台上移植美格 SLM790 4G模块 一 驱动配置 1.1 PPP 配置 需要配置 Android 内核来支持 PPP 功能,按照以下步骤来配置 PPP 选项 Devic ...

  3. 【STM32Cube】学习笔记(三):六轴传感器

    文章目录 摘要 一.简介 1.I2C原理 2.MPU6050介绍 3.MPU6050寄存器介绍 4.DMP使用 二.硬件电路设计 三.软件设计 1.CubeMX配置 2.CubeIDE代码 3.结果显 ...

  4. IMX6ULL裸机学习----LED正点原子在韦东山开发板上实现

    前言 一.IMX6ULL 启动流程? 二.LED代码移植 1.硬件介绍 2.代码移植 总结 前言 最近在学习IMX6ULL这个开发板,手边有韦东山老师的imx6ull全功能板子,为了练习学习的初步效果 ...

  5. linux学习路线-韦东山:史上最全嵌入式Linux学习路线图

  6. 移植QT5.6到韦东山JZ2240嵌入式开发板(史上最最最最最详细的QT移植教程)

    首先感谢http://blog.csdn.net/lizuobin2/article/details/52673494的博主,应该是韦东山团队的老师,说实话,拿到JZ2440的板子很长时间了,每次都有 ...

  7. 鸿蒙系统移植imx6dl,韦东山鸿蒙系统移植课程:在IMX6ULL上体验鸿蒙系统

    请先下载以下文件,里面含有烧写软件: 鸿蒙内核Liteos-a的官方代码目前只支持海思的芯片,我作为首批开发者入驻华为一个多月,成功在100ASK_imx6ULL上移植了Liteos-a. 本文先让大 ...

  8. linux笔记(8):东山哪吒D1H移植lvgl(HDMI输出)

    文章目录 1. 下载,修改,编译源码 1.1下载源码 1.1.1新建一个`lvgl`目录,在该目录下下载源码 1.1.2 在`lvgl`目录下再建一个`myspace/lvgl_demo`目录,把参与 ...

  9. android 调试笔记

    android 调试笔记 adb使用: 连接不上手机 C:\Users\Administrator\.android\adb_usb.ini   增加一行内容:  0x1782 安装第三方应用 $ a ...

最新文章

  1. 表格cell之间的横线不显示
  2. Java谓词的延迟执行
  3. App Store新规即将到来 你准备好了吗?
  4. 附加属性来控制控件中,要扩展模块的visibility
  5. pthread之条件变量pthread_cond_t
  6. loadrunner视频资料地址-boobooke
  7. 人工智能——特征工程思维导图
  8. 打印纸张尺寸的简单说明
  9. gif动图怎么制作?手把手教你视频转gif动图
  10. calico更换ip地址池-k8s
  11. 解决安装vmware以后,系统服务增多,系统变慢的问题。
  12. windows打开iis7服务器远程桌面管理器
  13. jdk8新特性-Lambda表达式,方法引用
  14. zabbix 自带模板监控mysql_zabbix使用自带模板监控mysql
  15. 【前端】【请求】什么是websocket?
  16. iOS 仿系统指南针
  17. Aria2离线下载搭建
  18. 从数据孪生发展到元宇宙
  19. 磁盘数据线接触不良的故障排查
  20. Mybatis错误——Could not find resource com/kuang/dao/UserMapper.xml

热门文章

  1. 京东方Java实习面经
  2. 使用NOKIA OVI MAP作为手机应用程序的基础地图
  3. 让生活更智能,十款智能电表给你充充电
  4. 隐私计算唯一代表厂商!洞见科技入选《爱分析·数据智能厂商全景报告》
  5. 常用国内天气API汇总
  6. 成就动机理论由谁提出_什么是心理学的成就动机理论?
  7. 【iOS】接口与API设计
  8. 20200223——起点文学免费小说爬取
  9. 未来网络白皮书—无服务器边缘计算网络​丨附下载
  10. 安装、文件-Windows 8 完美越狱教程 -by小雨