I.MX8QM flexcan移植

2024-01-02 00:36
文章标签 移植 flexcan mx8qm

本文主要是介绍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

这篇关于I.MX8QM flexcan移植的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560913

相关文章

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

libmad音频解码库-Linux交叉编译移植

下载并解压libmad-0.15.1b.tar.gz 下载链接:https://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz $tar -xvf libmad-0.15.1b.tar.gz$cd libmad-0.15.1b 1、先执行下面的命令:这条命令是为了适配高版本的gcc,因为高版本的gcc已经将-fforce-mem去除了:

arm linux lua移植

lua: lua home 1.下载lua源码 lua下载 lua-5.3.4.tar.gz 2.解压: tar xvf lua-5.3.4.tar.gz 3.修改makefile and luaconf.h $修改 lua-5.3.4/Makefile #INSTALL_TOP= /usr/local INSTALL_TOP= $(shell pwd)/out #修改安装目录(当前目录/o

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

【GD32】---- 移植工程模板及点灯测试

1 新建模板文件夹 新建一个名叫03_GD32TemplateProject的文件夹,用于建造工程模板 2 移植官方库文件 在模板文件夹里新建5个文件夹,分别存放官方库文件和系统驱动文件 01_main 存放main函数 02_Startup 存放系统启动文件 03_System 存放官方的系统文件 04_Firmware_PeripheralDriver 存放官方

[rk3588 ubuntu20.04]移植ROS2

目录 1 使用命令行安装ROS2 1.1设置语言 1.2添加源 1.3安装ROS2 1.4设置环境变量 2 在编译源码阶段安装ROS2 2.1调整roofts.img大小 2.2 安装ROS2 3 ROS2功能测试 1 使用命令行安装ROS2 1.1设置语言         设置语言为UTF-8。 sudo apt update && sudo apt insta

让linux下无线网卡变身随身wifi----hostapd移植-Nazgul

有了前面的检测,确定了我们的网卡是能够拥有热点共享功能的,但是如何让它共享出来呢? 于是有了这篇文章的诞生,hostapd移植 hostapd    可以让我们的网线网卡变成热点 1、下载     git clone git://w1.fi/srv/git/hostap.git   得到hostap目录,但是里面wpa_supplicant and hostapd的结合在

让linux下无线网卡变身随身wifi----前言--iw移植-Nazgul

最痛苦的事莫过于--上班 最最痛苦的事莫过于--上班有网不能上 最最最痛苦的事莫过于--上班有网能上却没有wifi 最最最最痛苦的事莫过于--你有无线网卡却没有U口可插 最最最最最痛苦的事莫过于--有U口插却发现U口只在开发板上 最最最最最最痛苦的事莫过于--开发板上有u口但是跑的是linux 最最最最最最最痛苦的事莫过于--linux能驱动网卡,但是如何共享出wifi来啊 于是,,,

游戏图片移植问题!DDS转PVR

折腾了两天,PS转PNG脚本无法批处理执行,Texturepacker PNG转PVR保存文件无效果。 最后还是用了神器PVRTexTool+BAT解决 首先下载:http://ishare.iask.sina.com.cn/f/18008068.html?from=like 配置好环境变量,右键点击我的电脑>属性>高级>环境变量,双击Path变量在最后的位置添加字段:F:\PVRTexTo