东莞网站推广哪些,vps建wordpress,网络营销案例图文ppt,网站优化公司价格如何计算一. 简介
Linux下的SPI 驱动框架和 I2C 很类似#xff0c;都分为主机控制器驱动和设备驱动#xff0c;SPI主机控制器是半导体厂商编写的#xff0c;我们只需要编写 SPI设备驱动代码。
本实验的最终目的就是驱动 I.MX6ULL-ALPHA 开发板上的 ICM-20608 这个 SPI 接口的六轴…一. 简介
Linux下的SPI 驱动框架和 I2C 很类似都分为主机控制器驱动和设备驱动SPI主机控制器是半导体厂商编写的我们只需要编写 SPI设备驱动代码。
本实验的最终目的就是驱动 I.MX6ULL-ALPHA 开发板上的 ICM-20608 这个 SPI 接口的六轴传感器应用程序读取 ICM-20608 的原始传感器数据。
前一篇文章创建了SPI节点及SPI设备节点文章如下
Linux下SPI设备驱动实验验证SPI节点及ICM20608设备子节点-CSDN博客 SPI设备驱动实现思路实现SPI设备驱动框架加入字符设备驱动框架再实现SPI数据读 / 写函数。
本文开始编写SPI设备驱动框架。 二. Linux下SPI设备驱动实验SPI设备驱动框架编写
1. 创建工程
1创建 18_spi 工程目录将 17_i2c工程下的 .vscode 拷贝到 18_spi 工程
wangtianwangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers$ mkdir 18_spi
wangtianwangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers$ cp ./17_i2c/.vscode/ ./18_spi/ -rf
注意这里拷贝 .vscode目录及其下的文件因为 .vscode目录下的文件设置了所调用的内核源码的路径。因为驱动代码会调用到内核源码中一些头文件或函数。 (2) 将 17_i2c工程下的 Makefile 拷贝到 18_spi工程
wangtianwangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/18_spi$ cp ../17_i2c/Makefile ./(3) 进入 18_spi工程下创建 icm20608.h文件与spi_icm20608.c文件。
更改 Makefile文件中目标文件名更改后如下
obj-m : spi_icm20608.o 2. SPI设备驱动框架编写
vscode打开 17_i2c工程目录接下来开始编写 I2C设备驱动框架。
注意构造 spi_driver结构体注册 spi_driver与删除 spi_driverSPI设备驱动框架代码的实现都可以参考内核源码中一些设备因为内核源码中也有很多 spi设备驱动实现。找一个支持设备树匹配的结构体。
在 spi_icm20608.c文件中实现 SPI设备驱动框架spi_icm20608.c文件如下
#include linux/kernel.h
#include linux/init.h
#include linux/fs.h
#include linux/uaccess.h
#include linux/io.h
#include linux/cdev.h
#include linux/device.h
#include linux/module.h
#include linux/types.h
#include linux/of.h
#include linux/spi/spi.h
#include linux/delay.hstatic int icm20608_probe(struct spi_device* spi_dev)
{int ret 0;printk(icm20608_probe!\n);return ret;
}static int icm20608_remove(struct spi_device* spi_dev)
{printk(icm20608_remove!\n);return 0;
}//传统驱动与设备匹配方法
static struct spi_device_id spi_device_id_table[] {{icm20608, 0},{ }
};//设备树匹配方法
static struct of_device_id of_device_table[] {{.compatible alientek,icm20608}, //必须与设备树中设备节点compatible值一致{ }
};/*SPI驱动结构体*/
struct spi_driver icm20608_driver {.driver {.name icm20608,.owner THIS_MODULE,.of_match_table of_match_ptr(of_device_table),},.id_table spi_device_id_table,.probe icm20608_probe,.remove icm20608_remove,
};/*模块加载 */
static int __init icm20608_init(void)
{return spi_register_driver(icm20608_driver);
}/*模块卸载 */
static void __exit icm20608_exit(void)
{spi_unregister_driver(icm20608_driver);
}/*驱动加载与卸载 */
module_init(icm20608_init);
module_exit(icm20608_exit);
MODULE_LICENSE(GPL); //模块 Licence
MODULE_AUTHOR(WeiWuXian); //作者 三. 编译驱动
对以上的驱动代码进行模块编译
wangtianwangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/18_spi$ make
make -C /home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga M/home/wangtian/zhengdian_Linux/Linux_Drivers/18_spi modules
make[1]: 进入目录“/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga”CC [M] /home/wangtian/zhengdian_Linux/Linux_Drivers/18_spi/spi_icm20608.oBuilding modules, stage 2.MODPOST 1 modulesLD [M] /home/wangtian/zhengdian_Linux/Linux_Drivers/18_spi/spi_icm20608.ko
make[1]: 离开目录“/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga”可以看出驱动模块编译好。
接下来对驱动模块进行测试加载确定SPI驱动是否与设备匹配成功。测试方法前面已经说过验证驱动与设备是否匹配其实与 I2C通信一样的可以参考如下文章
I2C驱动实验测试I2C驱动是否与设备匹配-CSDN博客