OpenWrt 之 MT7628 移植第三方SPI驱动

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有没有正常执行!!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenWrt 之 MT7628 使用GPIO中断

在支持设备树的系统中使用中断一般有2种方式。 一、DTS配置interrupt节点 这里有个挺好的博客&#xff0c;链接地址&#xff1a;https://biscuitos.github.io/blog/DTS-interrupt/ 也即&#xff0c;找到dts文件中的GPIO中断控制器节点&#xff0c;然后在你的dts驱动节点中根…

CH9102 USB转串口应用体验

近期使用CH9102 USB转串口芯片成功用在原有使用CP2102的产品板上&#xff0c;整个替换和验证过程还是很顺利的&#xff0c;顺带写个blog做个记录。 原项目上使用CP2102搭载ESP32实现Arduino物联网应用&#xff0c;采用USB转串口芯片实现串口下载&#xff0c;代码的Debug调试&am…

CH9101 USB转串口替换FT232R和FT230XQ

学生党一枚&#xff0c;前段时间跟着导师做的项目因为上面用到USB转串口芯片FT232R迟迟买不到&#xff0c;所以打算更换成国产USB转串口芯片CH340&#xff0c;对CH340的认识也很早了&#xff0c;很多年前开始直到现在各种开发板上基本都会标配一颗CH340&#xff0c;像某宝上的S…

FT230X芯片的国产化替代

之前有些项目用到FT230XQ芯片&#xff0c;无奈不好买&#xff08;价格高&#xff09;&#xff0c;想找些替代的型号。原先使用国产CH340芯片比较多&#xff0c;顺带去官网找下有没有其他小封装的芯片型号。导航比较方便&#xff0c;从官网的产品中心&#xff0c;选择“USB”分类…

Java Code之多态

Java代码 package com.iteye.badpie.javacode.duotai; /** * 人民警察 */public interface IPolice { /** * 抓小偷 */public void catchThief(); }package com.iteye.badpie.javacode.duotai;/*** 人民警察*/ public interface IPolice {/*** 抓小偷*/public void catch…

最小生成树之prim

prim是设置一个初始结点&#xff0c;寻找其周围最小的边权值&#xff0c;并将该结点作为初始结点&#xff0c;继续寻找现在结点周围的边权值的最小值&#xff0c;但要注意如果这次寻找的某个边权值没有上次的小的话仍然保留上一次的边权值&#xff0c;即lowcast的值将会不变。 …

element-ui自定义表头;el-table自定义表头;render-header自定义表头

自定义表头有两种方式&#xff1a;一种是使用render-header 一种是通过设置 Scoped slot 来自定义表头 一、render-header方式 场景&#xff1a;给表头设置自定义按钮&#xff0c;点击时候 批量下载或做其他事件 给当前的那列设置 :render-header <el-table-column align&…

八皇后算法

From: http://blog.csdn.net/feixiaoxing/article/details/6877965 【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 八皇后是一道很具典型性的题目。它的基本要求是这样的&#xff1a;在一个8*8的…

手机进水急救——爆米花可用来吸干水分

第一步&#xff1a;切断电源一旦手机掉到水里或进了水&#xff0c;请马上断开电源。因为手机的损害往往不是由水本身导致的&#xff0c;而是因为水引发的内部元件的短路&#xff0c;甚至进一步导致元件烧坏或电池爆炸。一旦不能立马关掉手机电源的话&#xff0c;如果你的手机电…

NOIP2011 选择客栈

题目描述 Description丽江河边有 n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从1 到n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共k 种&#xff0c;用整数0 ~ k-1 表示&#xff09;&#xff0c;且每家客栈都设有一家咖啡店&#xff0c;每家咖啡店均有各自的…

vue项目转rem;H5配置rem;px转rem

H5可以配合vant组件库书写项目&#xff0c;和使用rem后vant组件样式变小了解决办法。&#xff08;引入方式&#xff09; 以下是配置rem步骤&#xff1a; 1.安装 flexible和 postcss-px2rem&#xff08;命令行安装&#xff09; lib-flexible 会自动在为你添加 meta name“viewp…

rip

如何使rip中实现等价均衡 目的&#xff0c;使r3收到的关于172.16.0.0的metric值由2变成5r1的出接口做首先定义访问控制列表access-list 1 permit 172.16.0.0 0.0.0.0router ripoffset-list 1 out 3 s1 172.16.1.0 12.1.10.0 13.1.1.0r2 ----------- r1 ------------…

通过进程ID获取基地址

From: http://blog.csdn.net/firefoxbug/article/details/7201351 下面代码是通过进程ID来获取进程的基地址&#xff0c;创建一个进程快照后&#xff0c;读取进程模块&#xff0c;一般情况下第一个模块就是进程的基地址&#xff0c;下面的程序通过模块的字符串匹配来找到基地址…

git代码回滚到以前某一版本

1.使用 git log 查看之前提交的版本&#xff0c;每一版对应的hash值&#xff0c;默认展示几条&#xff0c;如果想查看更多&#xff0c;一直按回车。 git reset --hard 目标版本hash值 &#xff0c;注意&#xff1a;这一步操作完后&#xff0c;目标版本之后的代码将全部清掉&am…

滑冰为什么这么难

春天快到了&#xff0c;冬天马上要过去了&#xff0c;不好好利用东北这地方的天然优势实在是可惜。所以趁着冰还没化的时候&#xff0c;我决定尝试滑冰。小时候也滑过&#xff0c;但是不像现在这么害怕&#xff0c;从穿起冰鞋的那一刻起&#xff0c;紧张感随之而来&#xff0c;…

python发送各类邮件的主要方法

From: http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html python中email模块使得处理邮件变得比较简单&#xff0c;今天着重学习了一下发送邮件的具体做法&#xff0c;这里写写自己的的心得,也请高手给些指点。 一、相关模块介绍 发送邮件主要用到了smtplib和e…

codevs4343 找回密码

题目描述 DescriptionjrMz 很喜欢动漫《叛逆的鲁鲁修》(额 不知道是不是因为他盯上了动画片里的 MM),他准备以一种神奇的方式降临《叛逆的鲁鲁修》世界,所以他先从《变形金刚》里把大黄蜂拐了出来,然后成功加入了黑色骑士团。不过比较坑的事情出现了,正在与机甲激烈战斗中的大黄…

图片保持比例自适应大小;图片保持比例自动充满父元素;图片保持比例充满盒子

需求&#xff1a;经常会有一个div盒子&#xff0c;里面放入一个img图片。需要是图片保持比例&#xff0c;缩放充满div盒子。 思路&#xff1a; 1.必须给父元素设置固定的宽高。2.给img设置 object-fit: scale-down; 属性 object-fit使用学习 先看效果&#xff1a; <!DOCTYP…

如何利用好新浪微博

本文可以简要概括为如何利用新浪微博并安全的使用微博等社交网站或工具。 随着互联网和计算机技术的发展&#xff0c;涌现了许许多多的技术应用。从以前的电子邮件到论坛到博客再到微博。尽管我们在许许多多的技术方面引用了国外成功的例子&#xff08;特别是在IT领域&#xff…

HibernateTemplate的一些常用方法总结

1&#xff1a;get/load存取单条数据public Teacher getTeacherById(Long id) { return (Teacher)this.hibernateTemplate.get(Teacher.class, id); } public Teacher getTeacherById(Long id) { return (Teacher)this.hibernateTemplate.load(Teacher.class, id); } 2&#xff…