I.MX8QM flexcan移植

Android SDK:imx8_13.0.0_1.2.0(android 13 + u-boot 2022.04 + kernel 5.15.74)
一、kernel
内核配置:

# 相应的defconfig中添加使能下面两个宏。
# 官方默认的配置可能是以模块的方式编译,这里直接将can驱动编译到内核中
CONFIG_CAN=y
CONFIG_CAN_FLEXCAN=y

设备树修改:

# 因为板子未用到"xceiver-supply",所以注释掉了
&flexcan1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_flexcan1>;status = "okay";
};&flexcan2 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_flexcan2>;status = "okay";
};&flexcan3 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_flexcan3>;status = "okay";
};

编译重新烧写镜像后,通过“ifconfig -a”查不到can0~can2,can未正常驱动。uboot中打印如下log:
在这里插入图片描述
进入内核读取下面的节点信息,可以看到“status”被设置成了“disabled”。

cat /sys/firmware/devicetree/base/bus@5a000000/can@5a8d0000/status
cat /sys/firmware/devicetree/base/bus@5a000000/can@5a8e0000/status
cat /sys/firmware/devicetree/base/bus@5a000000/can@5a8f0000/status

二、u-boot
通过上面uboot的log可以在uboot的源码中查找到如下代码:
arch/arm/mach-imx/imx8/fdt.c的update_fdt_with_owned_resources函数。
在这里插入图片描述
先尝试跳过这段代码(暴力注释掉或者定义“CONFIG_SKIP_RESOURCE_CHECKING”宏)看看问题是否能解决,结果虽然dts节点的"status"都是"okay",但是can已然有问题,内核中也会打印如下错误:
在这里插入图片描述
这里5acd0000地址对应can0_lpcg,5ace0000地址对应can1_lpcg,5acf0000地址对应can2_lpcg(dts中可以找到),看来上面的暴力修改行不通。
通过对u-boot的代码分析,可以看到主要原因就在"check_owned_resource(rsrc_id)"中,这个函数实际调用的是“sc_rm_is_resource_owned(-1, rsrc_id)”。至于为什么要移除有些资源呢,那是因为imx8qm包含m4核,而这些资源被设置成M4核使用。所以我们需要从M4核中将这些资源释放,以供linux内核使用。
三.SCU(System Control Unit)
上面已经分析到是因为M4核的影响,导致can无法正常驱动。下面就看看can在什么地方被分配给我m4核,通过“sc_rm_is_resource_owned” 名称看出肯定和sc(System Control)有关。sc的设置是在“scfw_tcm.bin”这个程序中进行的,另外对于pmic的配置也是在这个程序中完成的。“scfw_tcm.bin”是一个二进制程序文件,系统编译时被打包到flash.bin的32K字节位置。源码可以在NXP的官网上找到,其下载编译过程可参考参考《Android_User’s_Guide.pdf》中“8.7 SCFW configure”章节的步骤进行操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
i.MX Software and Development Tools:https://www.nxp.com/design/design-center/software/embedded-software/i-mx-software/android-os-for-i-mx-applications-processors:IMXANDROID
arm Developer GNU-RM Downloads:https://developer.arm.com/downloads/-/gnu-rm
scfw修改:
在“platform/board/mx8qm_mek/board.c”中找到“board_system_config”函数,注释掉“RM_RANGE(SC_R_CAN_0, SC_R_CAN_2)”和“RM_RANGE(SC_P_FLEXCAN0_RX, SC_P_FLEXCAN2_TX)”并修改相应数组的大小。
在这里插入图片描述
接下来重新编译,将scfw编译生成的“scfw_tcm.bin”替换SDK目录下的“vendor/nxp/fsl-proprietary/uboot-firmware/imx8q/mx8qm-scfw-tcm.bin”。在重新编译bootloader,烧写后“ifconfig -a”就可以看到can0~can2了。uboot的log中看到也不在“disabled”掉can了。
四.CAN应用程序编译
下载软件包
libsocketcan:https://public.pengutronix.de/software/libsocketcan/
canutils:https://public.pengutronix.de/software/socket-can/canutils/
解压‘libsocketcan-0.0.12.tar.bz2’和‘canutils-4.0.6.tar.bz2’到sdk的’external/'目录下。
在解压的libsocketcan-0.0.12下创建Android.bp,内容如下:

cc_library_static {name: "libsocketcan",host_supported: true,target: {darwin: {enabled: false,},},local_include_dirs: ["include"],cflags: ["-Werror","-Wno-pointer-arith","-Wno-pointer-sign",],srcs: ["src/libsocketcan.c",],export_include_dirs: ["include"],
}

在解压的canutils-4.0.6下创建Android.bp,内容如下:

cc_defaults {name: "canutils_common_defaults",cflags: ["-Wall","-Werror","-Wno-unused-parameter","-Wno-unused-value","-Wno-sign-compare",],local_include_dirs: ["include"],
}cc_binary {name: "candump",defaults: ["canutils_common_defaults"],srcs: ["src/candump.c",],static_libs: ["libsocketcan"],
}cc_binary {name: "cansend",defaults: ["canutils_common_defaults"],srcs: ["src/cansend.c",],static_libs: ["libsocketcan"],
}cc_binary {name: "cansequence",defaults: ["canutils_common_defaults"],srcs: ["src/cansequence.c",],static_libs: ["libsocketcan"],
}cc_binary {name: "canecho",defaults: ["canutils_common_defaults"],srcs: ["src/canecho.c",],static_libs: ["libsocketcan"],
}cc_binary {name: "canconfig",defaults: ["canutils_common_defaults"],srcs: ["src/canconfig.c",],static_libs: ["libsocketcan"],
}

说明:Android.bp中添加注释用’//'。
重新编译系统这时可能会报“fatal error: ‘can_config.h’ file not found”错误,如下:
在这里插入图片描述
“can_config.h”文件是Cmake工程执行编译配置后生成一个配置文件,因为这里并没有用到Cmake去编译所以,没有生成这个文件,可以把canutils-4.0.6源码复制到其它主机上,执行一下Cmake的配置过程就会生成这个文件,然后复制这个文件到canutils-4.0.6源码下的include目录就行。
五.FlexCan通信测试
这里通过can0和can1对发来测试CAN通信。
接线:
CAN0_L -> CAN1_L
CAN0_H -> CAN1_H

ip link set can0 up type can bitrate 125000    #配置can波特率,如果有错误可以先 ifconfig can0 down
ifconfig can0 up
candump can0 &ip link set can1 up type can bitrate 125000  #配置can波特率
ifconfig can1 up
cansend can1 --identifier=0x111 0x12 0x23 0x56 0x78

测试结果:
在这里插入图片描述
参考:
https://www.wpgdadatong.com.cn/blog/detail/43922
https://blog.csdn.net/liteblue/article/details/123061488

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

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

相关文章

C++面试宝典第12题:数组元素相除

题目 从控制台输入若干个整数作为数组,将数组中每一个元素除以第一个元素的结果,作为新的数组元素值。比如:可以先输入3,作为数组元素的个数;然后输入3个整数,作为数组元素的值。 解析 这道题本身并不复杂,但里面隐藏了不少“坑点”和“雷区”,主要考察应聘者全面思考问…

vue项目中实现预览pdf

vue项目中实现预览pdf 1. iframe <iframe :src"pdfSrc"></iframe> ​data() {return {pdfSrc: http://192.168.0.254:19000/trend/2023/12/27/5635529375174c7798b5fabc22cbec45.pdf,}},​iframe {width: 100%;height: calc(100vh - 132px - 2 * 20px -…

MATLAB --- interp1( )函数的用法

interp1() 是 MATLAB 中用于一维插值的函数&#xff0c; 它可以根据给定的数据点进行插值&#xff0c;从而在给定的插值点处估计函数的值 下面是 interp1() 函数的用法&#xff1a; Vq interp1(X, V, Xq) Vq interp1(X, V, Xq, method) Vq interp1(X, V, Xq, method, extr…

数据结构:堆的三部曲 (一)堆的实现

堆的实现 1.堆的结构1.1堆的定义理解 2.堆的实现&#xff08;以小根堆为例&#xff09;2.1 堆结构体的定义2.2 堆的插入交换函数向上调整算法插入函数的代码 2.3 堆的删除向下调整算法&#xff1a;删除函数的代码&#xff1a; 2.4其他操作 3.测试以及完整源代码实现3.1测试代码…

typore自定义删除线快捷键

打开高级设置 设置快捷键 重新打开typore

Java实现短信发送业务

1、业务需求 发送短信功能是一个很普遍的需求&#xff0c;比如验证码&#xff0c;快递单号&#xff0c;通知信息一类。 而在Java中实现短信功能相对简单&#xff0c;只需要调用短信服务商提供的API。接下来以阿里云为例&#xff0c;介绍如何实现短信发送功能&#xff0c;其他短…

x-cmd pkg | bat - cat 命令的现代化替代品

目录 简介首次用户功能特点进一步阅读 简介 bat 是 cat 命令的替代品&#xff0c;对 cat 命令进行功能扩展&#xff0c;如语法高亮、自动分页等&#xff0c;为用户提供更友好的显示和定制选项。对于需要在终端频繁查看文本内容的用户&#xff0c;推荐用 bat。 首次用户 使用 …

xinference

xinference Xorbits Inference&#xff08;xinference&#xff09;是一个性能强大且功能全面的分布式推理框架。可用于大语言模型&#xff08;LLM&#xff09;&#xff0c;语音识别模型&#xff0c;多模态模型等各种模型的推理。通过 Xorbits Inference&#xff0c;你可以轻松地…

计算机基础面试题 |01.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

linux 休眠唤醒中设备、总线、用户进程、内核线程调试分析流程

一、suspending consoles打印 代码位置&#xff1a;Kernel/power/suspend.c 函数调用流程&#xff1a;devices_and_enter(suspend_state_t state) --> suspend_console(); void suspend_console(void) { if (!console_suspend_enabled) 注释这一行&#xff0c;可以看到…

企业级依赖管理: 深入解读 Maven BOM

一、背景 当开发者在一个大型项目中使用 Maven 进行依赖管理时&#xff0c;项目往往会包含多个模块或子项目&#xff0c;并且这些模块会共享相同的依赖项。但是&#xff0c;不同模块可能会独立地指定各自的依赖版本&#xff0c;这可能导致以下问题&#xff1a; 依赖版本不一致…

头歌:实验十六 matplotlib数据可视化

第1关 各省gdp的和生成条状图 import pandas import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt matplotlib.rcParams[font.family]SimHei matplotlib.rcParams[font.sans-serif] [SimHei] datapandas.read_excel("test/各省GDP.xlsx",dtype…

在多Module项目中,给IDEA底部选项卡区域添加Services选项卡

一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时&#xff0c;如果要调试测需要依次启动各个项目比较麻烦。 idea其实提供了各module的启动管理工具了&#xff0c;可以快速启动和关闭各个服务&#xff0c;也能批量操作&#xff0c;比如一次…

25. 数组作为函数参数

写代码时&#xff0c;我们会将数组作为参数传给函数 冒泡排序&#xff1a; 两两相邻的元素进行比较&#xff0c;可能的话进行交换 一趟冒泡排序会将一个元素放在其最后应该在的位置 10个数字只需9趟&#xff0c;第一趟10个数字待排序&#xff0c;9对比较&#xff1b;第二趟…

计算机科学速成课【学习笔记】(1)——计算机早期历史

本集课程B站链接&#xff1a; 【计算机科学速成课】[40集全/精校] - Crash Course Computer Science_哔哩哔哩_bilibili【计算机科学速成课】[40集全/精校] - Crash Course Computer Science共计40条视频&#xff0c;包括&#xff1a;1. 计算机早期历史-Early Computing、2. 电…

【2024最新版】neo4j安装配置

neo4j安装 写在最前面下载配置环境&#xff08;还是不行&#xff1f;&#xff09;启动neo4jpython中调用 写在最前面 之前我安装过&#xff0c;还写了一篇笔记 结果意外发现没有了&#xff0c;而且和之前安装的步骤不一样了&#xff0c;因此再次记录安装过程 下载 https://ne…

vue3安装vue-json-viewer实现json格式化

一、安装插件 直接看效果&#xff1a;json格式化 安装版本不宜过旧也不宜过新&#xff0c;针对vue3安装这个版本即可 yarn add vue-json-viewer;"dependencies": {"vue-json-viewer": "3",}, 二、使用插件 <script> import JsonViewe…

Vue中的keep-alive缓存组件的理解

<keep-alive> 是一个抽象组件&#xff0c;用于将其内部的组件保留在内存中&#xff0c;而不会重新渲染。这意味着当组件在<keep-alive> 内部切换时&#xff0c;其状态将被保留&#xff0c;而不是被销毁和重新创建。 <keep-alive>用来缓存不经常变化的组件&am…

HLS 2017.4 导出 RTL 报错:ERROR: [IMPL 213-28] Failed to generate IP.

软件版本&#xff1a;HLS 2017.4 在使用 HLS 导出 RTL 的过程中产生如下错误&#xff1a; 参考 Xilinx 解决方案&#xff1a;https://support.xilinx.com/s/article/76960?languageen_US 问题描述 DESCRIPTION As of January 1st 2022, the export_ip command used by Vivad…

机器学习笔记 - 基于Python的不平衡数据的欠采样技术

一、简述 随着从不同的来源生成和捕获大量数据。尽管信息量巨大,但它往往反映了现实世界现象的不平衡分布。数据不平衡的问题不仅仅是统计上的挑战,它对数据驱动模型的准确性和可靠性具有深远的影响。 以金融行业欺诈检测为例。尽管我们希望避免欺诈,因为其具有高度破坏性,…