1、在OpenWrt系统上移植SPI驱动前,首先要确保SPI相关引脚未被复用为其他功能,比如GPIO;以下操作已假定该条件成立,否则请修改相关dts和c文件中复用配置;

2、打开dts配置文件进行修改,这里我是用的硬件为WRTNODE2R,所以文件路径为:/target/linux/ramips/dts/WRTNODE2R.dts。在SPI控制器节点下添加与我们要添加的SPI设备及驱动匹配的信息,如下所示:

要注意该段代码要添加到SPI控制器节点下,为防止添加错误后面会给出这部分整段的SPI配置。

Note1 配置中“reg”属性有2个CELL,第一个用于指定片选;

Note2 配置中“compatible”参数需要与SPI设备驱动中字段相匹配,如下为我使用的第三方SPI设备驱动中相关配置:

#define CH43X_NAME_SPI       "ch43x_spi"static const struct of_device_id __maybe_unused ch43x_dt_ids[] = {{ .compatible = "wch,ch43x", .data = &ch43x_devtype, },{},
};
MODULE_DEVICE_TABLE(of, ch43x_dt_ids);static struct spi_driver ch43x_spi_uart_driver = {.driver = {.name   = CH43X_NAME_SPI,.bus    = &spi_bus_type,.owner  = THIS_MODULE,.of_match_table = of_match_ptr(ch43x_dt_ids),},.probe          = ch43x_spi_probe,.remove         = ch43x_spi_remove,
};

在一般情况下,匹配的信息应该是代码中“compatible ”的字符串,也即“wch,ch43x”,但这里匹配的具有特殊性,原因可能为系统修改过有关。匹配的是spi_drvier中,driver的name字符串,也即:"ch43x_spi";

Note3 如上的dts配置中有2行信息,是与中断相关的。本意是想实现通过dts配置interrupts节点后,在spi设备驱动中通过struct spi_device *spi结构体中的spi->irq获取相应IO口的中断号实现中断功能,奈何在本硬件平台上用不了,之所以保留是因为很多其他平台可以通过这种方式来配置和获取中断。本平台使用中断方法会在其他博客中涉及。

完整SPI部分的dts配置:

spi0: spi@b00 {status = "okay";m25p80@0 {#address-cells = <1>;#size-cells = <1>;compatible = "w25q256";reg = <0 0>;linux,modalias = "m25p80", "w25q256";spi-max-frequency = <10000000>;m25p,chunked-io = <32>;partition@0 {label = "u-boot";reg = <0x0 0x30000>;read-only;};partition@30000 {label = "u-boot-env";reg = <0x30000 0x10000>;read-only;};factory: partition@40000 {label = "factory";reg = <0x40000 0x10000>;read-only;};partition@50000 {label = "firmware";reg = <0x50000 0x1fb0000>;};};spidev@1 {#address-cells = <1>;#size-cells = <1>;//           compatible = "wch,ch43x";compatible = "ch43x_spi";reg = <1 0>;spi-max-frequency = <5000000>;interrupt-parent = <&gpio0>;interrupts = <0 2>;};};

3、OpenWrt系统中添加驱动模块

首先在目录package/kernel下创建自己的模块目录ch432,目录结构如下 :

rambo@ubuntu:~/OpenWrt/wrtnode/package/kernel$ tree ch432
ch432
├── Makefile
└── src├── ch432.c├── Kconfig└── Makefile1 directory, 4 files

至于里面的Makefile文件和Kconfig文件如何写,不建议照抄我的或网上找的,直接在package/kernel拷贝其他模块的,基于那个调整最快捷有效!而且拷贝那种最简单的就可以。这里拷贝button-hotplug这个驱动模块,然后照葫芦画瓢,修改成编译我们驱动的样式。(傻瓜式做法:直接把里面涉及到驱动文件名的统一换成你要编译的驱动文件名就可以)比如这里第一级的Makefile,如下:

#
# Copyright (C) 2008-2010 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mkPKG_NAME:=ch432
PKG_RELEASE:=3include $(INCLUDE_DIR)/package.mkdefine KernelPackage/ch432SUBMENU:=Other modulesTITLE:=ch432 spi driverDEPENDS:=+kmod-input-coreFILES:=$(PKG_BUILD_DIR)/ch432.koAUTOLOAD:=$(call AutoLoad,30,ch432,1)KCONFIG:=
endefdefine KernelPackage/ch432/descriptionKernel module to generate button uevent-s from input subsystem events.If your device uses GPIO buttons, see gpio-button-hotplug.
endefEXTRA_KCONFIG:= \CONFIG_CH432=mEXTRA_CFLAGS:= \$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \MAKE_OPTS:= \ARCH="$(LINUX_KARCH)" \CROSS_COMPILE="$(TARGET_CROSS)" \SUBDIRS="$(PKG_BUILD_DIR)" \EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \$(EXTRA_KCONFIG)define Build/Preparemkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/
endefdefine Build/Compile$(MAKE) -C "$(LINUX_DIR)" \$(MAKE_OPTS) \modules
endef$(eval $(call KernelPackage,ch432))

第二级src目录下的Kconfig文件如下:

config CH432tristate "This is CH432"

Makefile如下:

obj-$(CONFIG_CH432) += ch432.o

实际上我就把这3个文件中原有的字符串“button-hotplug”换成了“ch432”而已。

Note1 你要编译的驱动源文件和头文件一定也要放在这个src目录下。

4、下面配置内核,把我们添加到package中的模块选中就可以了。执行,“make menuconfig”:

然后在“Kernel Modules” -> "Other Modules"下找到我们添加的模块,选中它就可以了。

配置结束,下面只编译模块就可以了。不需要编译整个内核。编译命令为:

make package/kernel/ch432/compile V=s

Note1 因为spi驱动可以动态加载调试,所以建议编译成模块,不要静态编译,不然调试和看驱动log都不方便。

5、编译生成的驱动模块路径为:

ko原生驱动模块路径:

build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/ch432/

ipk文件路径为:

bin/ramips/packages/base/

将如上ko文件或者ipk拷贝到硬件上面就可以正常使用了。记得SPI驱动调试第一步,insmod之后确认spi_probe有没有正常执行!!!

OpenWrt 之 MT7628 移植第三方SPI驱动相关推荐

  1. 关于精英版stm32从模板工程移植RTT Spi驱动打开后编译不过的处理办法

    移植成功后天健SPI驱动代码,出现编译不过,编译器提示 SPI_HandleTypeDef 类型未定义 解决办法是: 打开下图中文件中的宏定义即可

  2. linux spidev 应用_Linux下SPI驱动的移植和应用程序的测试

    Linux2.6.32下SPI驱动的移植如下图所示: 下面需要修改部分内核代码,具体操作如下: 1.  修改arch/arm/mach-s3c2440/mach-mini2440.c文件 在inclu ...

  3. STM32F103以SPI 驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植

    0.  关于本文: 其实我一直都比较懒,不喜欢写博客.但网上关于详细讲解SPI驱动LCD的文章比较少,虽然也能下载到一些案例程序,但对于初学者来说,如果不懂LCD驱动的原理,不懂如何对文字和图片取模, ...

  4. mini2440 SPI驱动移植

    最近项目需要,需要在mini2440上移植SPI驱动,板子需要驱动SPI设备,上网找了很多资源,但是很多都是有问题,最终在基本理解驱动结构的前提下,将SPI驱动顺利移植到mini2440. ,我使用的 ...

  5. 移植SFUD,驱动SPI FLASH ZD25WQ80

    1.关于SFUD SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库,支持众多spi flash,关于SFUD的详细资料可参考:https://gi ...

  6. mini2440 SPI驱动移植 (基于SPI子系统) (转的记录)

    原文地址:mini2440 SPI驱动移植 (基于SPI子系统) 作者:三点水兽 参考一: 按照下面帖子的方法,本人试验成功,只需按照下面步骤进行就行了. 原帖地址: http://blog.csdn ...

  7. imx6 通过移植XRM117x(SPI转串口)对Linux中的SPI驱动框架进行分析

    最近分析了一下Linux 中的SPI驱动框架,将自己的理解总结一下,不足之处还请斧正! 1.SPI通信基础知识 SPI(Serial Peripheral Interface)是一种串行(一次发送1b ...

  8. 乐鑫esp8266学习rtos3.0笔记第7篇:我又来了,基于rtos3.0版本 SDK编程 SPI 驱动 ws2812b 七彩灯,代码全部开源奉献给你们!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  9. Linux驱动修炼之道-SPI驱动框架源码分析(上)

    Linux驱动修炼之道-SPI驱动框架源码分析(上)   SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设备可工作于m/s模式.主设备发起数据帧,允许多个从设 ...

最新文章

  1. python 调用函数内部参数
  2. Windows Phone 7范例游戏Platformer实战5——多点触控编程
  3. 限招2019应届计算机毕业生,2019年计算机专业应届毕业生自我鉴定
  4. webstorm基础使用总结
  5. Mybatis 一对多 结果集映射 简单入门 易懂
  6. OpenCV与Eclipse结合使用(插件CDT)
  7. python列表的内置方法_Python内置方法详解
  8. rmi full gc问题_RMI强制Full GC每小时运行一次
  9. javascript-发布订阅模式
  10. DIV+CSS基础教程
  11. MySQL——基本配置
  12. 《天天数学》连载05:一月五日
  13. jdk1.5、1.6、1.7新特性详细介绍(整理)
  14. ip跳转跟踪命令_在跟踪命令(-T272)的帮助下学习避免身份跳转问题(IDENTITY_CACHE)
  15. 2021-2025年中国地下装载机行业市场供需与战略研究报告
  16. 二叉树中和为某一值的路径(一)(C++)
  17. u8系统怎么连接服务器,u8客户端连接服务器流程
  18. E哥的Git教程(一)
  19. 001 计算思维-卡内基梅隆大学计算机系主任周以真(英汉对照版)
  20. 无法用“Point*”类型的值初始化“Point ”类型的引用(非常量限定)

热门文章

  1. 关系型数据库的核心单元是_核中的数据关系
  2. r psm倾向性匹配_南瓜香料指标psm如何规划季节性广告
  3. 机器学习 客户流失_通过机器学习预测流失
  4. leetcode LCP 19. 秋叶收藏集(dp)
  5. github pages_如何使用GitHub Actions和Pages发布GitHub事件数据
  6. sklearn.fit_两个小时后仍在运行吗? 如何控制您的sklearn.fit。
  7. akka 简介_Akka HTTP路由简介
  8. react发送和接收请求_React行为编程简介:请求,等待和阻止
  9. freeCodeCamp纳什维尔十月聚会回顾
  10. 如何使用TensorFlow构建简单的图像识别系统(第2部分)