jetson tx2 nx使用wk2168通过spi实现扩展4个串口
首先:不要连接ssd,系统运行在emmc上进行调试
一、修改设备树
修改设备树,主要是完成外设在jetson平台下的设备信息的加载。这里采用源码编译的方式重新生成设备树文件,然后采用命令刷新的方式进行更新,主要步骤如下:
1.在Jetson Linux Archive下载对应的源码, 注意jetson平台下的Linux Version,下载1(BSP Drives) 和2(source) 如下图
2. 解压kernel_src
mkdir source
tar -jxvf public_sources.tbz2 -C ~/source/
cd ~/source/Linux_for_Tegra/source/public
tar -jxvf kernel_src.tbz2
在~/source/Linux_for_Tegra/source/public/kernel_src/hardware/nvidia/platform/t18x/lanai/kernel-dts/common中,找到tegra186-p3636-0001-common.dtsi进行修改:
注意1:具体的位置,需要根据系统版本(主要包括Soc、L4t、jetpack及P-number),其中我使用的是R32.7.4(jetpack4.6.4)对应的是tegra186-p3636-0001.包括上图修改部分中的宏TEGRA_MAIN_GPIO也是需要和版本对应。可以通过以下命令获取相关版本信息:
获取版本信息
sudo apt install python3-pip
sudo -H pip3 install -U jetson-stats
sudo systemctl restart jetson_stats.service
reboot
jtop # 在jtop界面的info页面可以确认多种版本信息
获取dtb版本
cat /proc/device-tree/nvidia,dtsfilename
注意2:其中spi@0中的irq_gpio信息是指绑定irq引脚,该中断引脚应为普通GPIO口,且初始状态应为input up(尽可能使用初始系统原有的符合状态的GPIO,这样比较方便,如果没有则需要根据pinmux spreadsheet进行修改后刷新)。我这里采用的是pin26(未被复用的spi0_cs1),其中TEGRA_MAIN_GPIO(Y, 3)的确定,主要是根据pinmux spreadsheet查询的,如下图.
注意:物理引脚的对应需要和原理图或者pin40图来对应
修改完成后,按照以下方法进行编译(这里采用交叉编译的方式):
# 1.下载交叉编译工具
wget http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz
# 2.下载完成后进行解压
# 3.安装工具
sudo apt install build-essential bc
# 4.进入源码目录
cd ~/source/Linux_for_Tegra/source/public/kernel_src/kernel/kernel-4.9/
# 5.设置编译输出目录
TEGRA_KERNEL_OUT=~/kout
mkdir -p $TEGRA_KERNEL_OUT
# 6. 设置交叉编译工具的环境变量
export CROSS_COMPILE=path:/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu
export LOCALVERSION=-tegra
# 7.内核编译
make ARCH=arm64 O=$TEGRA_KERNEL_OUT tegra_defconfig
make ARCH=arm64 O=$TEGRA_KERNEL_OUT -j${nproc}
二、刷新系统
根据上面下载的BSP Drives,按照如下步骤操作
# 解压Drives文件
mkdir ~/Drives
tar -jxvf Jetson_Linux_R32.7.4_aarch64.tbz2 -C ~/Drives/
cd ~/Drives/Linux_for_Tegra/rootfs
sudo tar xjf path:/Tegra_Linux_Sample-Root-Filesystem_R32.7.4_aarch64.tbz2
# 替换更新后的dtb
cp -i ~/kout/XXX/tegra186-p3636-0001-p3509-0000-a01.dtb ~/Drives/Linux_for_Tegra/kernel/dtb/
# 刷新系统
cd ~/Drives/Linux_for_Tegra/
sudo ./apply_binaries.sh
# 配置恢复模式,刷机
sudo ./flash.sh jetson-xavier-nx-devkit-tx2-nx mmcblk0p1
外设连接
将wk2168连接到spi0上,具体连接如下:
序号 | 标识 | 管脚描述 | board |
---|---|---|---|
1 | vcc | 3.3v | pin1 |
2 | GND | 电源地 | pin39 |
3 | SCLK | 时钟输入 | pin23 |
4 | MOSI | 数据输入 | pin19 |
5 | MISO | 数据输出 | pin21 |
6 | CS | 片选信号 | pin24 |
7 | IRQ | 中断信息 | pin26 |
加载驱动
1.利用jetson-io打开spi功能
sudo /opt/nvidia/jetson-io/jetson-io.py
打开spi后,reboot
2. 加载驱动
git clone https://gitee.com/alinn66/wk2168_2114_drive.git
cd wk2168_2114_drive
make
sudo insmod wk2xxx_spi.ko
ls /dev/ttysWK*
# 正常情况下可以出现4个串口,也可以查看log具体信息
sudo dmesg # 主要是分析错误,查看irq是否成功
串口测试
采用cutecom进行测试即可,查看是否可以正常收发数据
sc16is752 调试问题
按照以上同样的方法进行测试,主要是设备树有区别,如下
但是通过dmesg查看日志,会出现genirq的错误
欢迎交流,如有大佬调试成功,请告知下,万分谢谢!!!