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.hqwc.cn/news/313025.html

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

相关文章

FingerprintService启动-Android13

FingerprintService启动-Android13 1、指纹服务启动1.1 rc启动Binder对接指纹厂商TA库1.2 FingerprintService启动1.2.1 SystemServer启动FingerprintService1.2.2 注册Binder服务fingerprint 2、获取底层信息2.1 AIDL 对接TA中获取2.2 指纹类型判断 android13-release 1、指纹…

SpringBoot2.7.12整合Knife4j

SpringBoot2.7.12整合Knife4j 是什么 Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 添加依赖 <!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意--> <dependency><groupId>com.github.xiaoymin</groupId>&l…

Intellij建议用String替换StringBuilder

文章目录 前言String 和 StringBuilder 性能对比String 和 StringBuilder 使用的字节码对比总结 本文收发地址 https://blog.csdn.net/CSqingchen/article/details/135324313 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 最近编码时看到 Intellij 建议使用 Stri…

[附代码]稳态视觉诱发电位SSVEP之预训练模型提高性能

SSVEP 之深度学习 深度学习已经被广泛运用在脑电信号分析来提高脑机接口的性能,这是一个end-to-end的方法,简单来说,只要搭建好深度学习网络,做好特征工程,然后分类即可,对于一个刚刚接触脑机接口领域深度学习的学习者来说,可以先忽略中间的数学相关的东西,先建一个网…

Linux常用命令大全总结及讲解(超详细版)

前言&#xff1a; Linux 是一个基于Linux 内核的开源类Unix 操作系统&#xff0c;Linus Torvalds于 1991 年 9 月 17 日首次发布的操作系统内核。Linux 通常打包为Linux 发行版。 Linux 最初是为基于Intel x86架构的个人计算机开发的&#xff0c;但此后被移植到的平台比任何其…

【大数据面试知识点】分区器Partitioner:HashPartitioner、RangePartitioner

Spark HashParitioner的弊端是什么&#xff1f; HashPartitioner分区的原理很简单&#xff0c;对于给定的key&#xff0c;计算其hashCode&#xff0c;并除于分区的个数取余&#xff0c;如果余数小于0&#xff0c;则用余数分区的个数&#xff0c;最后返回的值就是这个key所属的…

【NLP论文】02 TF-IDF 关键词权值计算

之前写了一篇关于关键词词库构建的文章&#xff0c;没想到反响还不错&#xff0c;最近有空把接下来的两篇补完&#xff0c;也继续使用物流关键词词库举例&#xff0c;本篇文章承接关键词词库构建并以其为基础&#xff0c;将计算各关键词的 TF-IDF 权值&#xff0c;TF-IDF 权值主…

D45D46|动态规划之子序列问题

300.最长递增子序列&#xff1a; 初始思路&#xff1a; 动态规划五部曲&#xff1a; 1&#xff09;dp数组的定义&#xff0c;dp[i]表述数组第i个元素大于前面几个值&#xff1b; 2&#xff09;dp数组的迭代&#xff0c;min nums[x]表示递增数组中的最后一个值&#xff0c;如…

【python_数据分组】

对excel按照标签进行分组&#xff0c;例如按照“开票主体和对方公司”进行分组&#xff0c;并获取对应的明细。 表格如下&#xff1a; def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…

table表格中使用el-popover 无效问题解决

实例只针对单个的按钮管用在表格里每一列都有el-popover相当于是v-for遍历了 所以我们在触发按钮的时候并不是单个的触发某一个 主要执行 代码 <el-popover placement"left" :ref"popover-${scope.$index}"> 动态绑定了ref 关闭弹窗 执行deltask…

留言板(Mybatis连接数据库版)

目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段&#xff0c;补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…

在FC中手工创建虚拟机模板

1、Linux去除个性化信息 &#xff08;1&#xff09;编辑网卡配置文件&#xff0c;只保留以下内容&#xff08;以RHEL 7为例&#xff09; &#xff08;2&#xff09;清除主机密钥信息&#xff08;开机会自动生成&#xff09; &#xff08;3&#xff09;清除Machine ID&#xff…