Jetson-nano使能spi管脚【jetson-io.py不可配置的情况】

前言

Jetson-nanospi管脚与gpio复用,默认情况配置为gpio,该管脚在载板上的40-pin40-pin如下图所示)。对于orin系列的Jetson我们可以用在/opt/nvidia/jetson-io/jetson-io.py这个脚本里配置载板上的40-pin,jetson-nano上无法通过该脚本进行配置。所以本文以官方L4T 32.7.2版本的BSP为例(该版本打了新的pcn,较为稳定),说一下如何通过修改设备树文件使能spi接口。

在这里插入图片描述

准备工作

笔者是在烧录系统前修改设备树,对于在烧录后的系统上修改设备树是否有效未经验证,因此本文的操作在烧录jetson-nano的系统前进行。

本文以使能SPI1控制器为例,对应40-pin上的SPI0管脚,即pin19pin21等管脚。

笔者使用的jetson-nano盒子上的40-pin与官方载板分布一致,硬件信息如下:
https://www.seeedstudio.com/reComputer-J1020-v2-p-5498.html

我们需要在用于烧录系统的PC(笔者PC的系统为ubuntu20.04)上准备好官方的BSP,进入nvidia的bsp下载官网
https://developer.nvidia.com/embedded/linux-tegra-r3272

下载如下图的BSP和最小根系统
在这里插入图片描述

下载后放到同一个目录下:
在这里插入图片描述
当前目录下终端运行,解压后把最小根系统放到指定路径:

tar xf Jetson-210_Linux_R32.7.2_aarch64.tbz2
cd Linux_for_Tegra/rootfs/
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R32.7.2_aarch64.tbz2
cd ..
sudo ./apply_binaries.sh

到这先不要着急烧录,下面说一下要使能SPI1需要修改设备树哪些地方。

使能SPI1控制器

在PC上安装依赖:

sudo apt update
sudo apt install device-tree-compiler

方法一 使用脚本

笔者这里写了个modify_spi.sh脚本,放到在Linux_for_Tegra目录下,然后sudo权限运行该脚本,会对设备树进行修改,启用spi1控制器。如果你需要修改其他SPI接口,可以跳过这里看一下后面的详细手动修改步骤。

#!/bin/bash
set -e


cd "$(dirname "$0")"
cd kernel/dtb

DTS=tegra210-p3448-0002-p3449-0000-b00.dts
DTB=tegra210-p3448-0002-p3449-0000-b00.dtb


echo "📥 Decompiling $DTB to $DTS..."
sudo dtc -I dtb -O dts -o "$DTS" "$DTB"

fix_spi_node() {
    local node=$1
    if grep -A5 "$node {" "$DTS" | grep -q 'status'; then
        sudo sed -i "/$node {/,/spi-max-frequency/ s/status = \".*\";/status = \"okay\";/" "$DTS"
    else
        sudo sed -i "/$node {/,/spi-max-frequency/ s/compatible = \"tegra-spidev\";/&\n\t\tstatus = \"okay\";/" "$DTS"
    fi
}

echo "🔧 Enabling spi@0 and spi@1..."
fix_spi_node "spi@0"
fix_spi_node "spi@1"


patch_pin() {
    local pin=$1
    sudo sed -i "/${pin} {/,/nvidia,enable-input/ {
        s/nvidia,function = \"rsvd1\"/nvidia,function = \"spi1\"/
        s/nvidia,tristate = <0x01>/nvidia,tristate = <0x00>/
        s/nvidia,enable-input = <0x00>/nvidia,enable-input = <0x01>/
    }" "$DTS"
}

echo "🔧 Patching pinmux blocks..."
for pin in spi1_mosi_pc0 spi1_miso_pc1 spi1_sck_pc2 spi1_cs0_pc3 spi1_cs1_pc4; do
    patch_pin "$pin"
done

echo "🔧 Fixing tristate and input-enable for SPI1 pins..."


fix_pinmux_field() {
  local pin=$1
  awk -v pin="$pin" '
  BEGIN { in_block = 0 }
  {
    if ($0 ~ pin " {") {
      in_block = 1
    }
    if (in_block && /nvidia,tristate =/) {
      sub(/<0x1>/, "<0x0>")
    }
    if (in_block && /nvidia,enable-input =/) {
      sub(/<0x0>/, "<0x1>")
    }
    print
    if (in_block && /}/) {
      in_block = 0
    }
  }' "$DTS" | sudo tee "$DTS.fixed" > /dev/null && sudo mv "$DTS.fixed" "$DTS"
}

fix_pinmux_field "spi1_mosi_pc0"
fix_pinmux_field "spi1_miso_pc1"
fix_pinmux_field "spi1_sck_pc2"
fix_pinmux_field "spi1_cs0_pc3"
fix_pinmux_field "spi1_cs1_pc4"


echo "📦 Recompiling DTS to $DTB..."
sudo dtc -I dts -O dtb -o "$DTB" "$DTS"

echo "✅ SPI DTS patch applied and DTB regenerated successfully."

运行脚本:

sudo bash modify_spi.sh

方法二 手动修改设备树

同样的,需要在PC上安装依赖:

sudo apt update
sudo apt install device-tree-compiler

Linux_for_Tegra下,输入下面终端指令反编译设备树文件:

cd kernel/dtb
sudo dtc -I dtb -O dts -o tegra210-p3448-0002-p3449-0000-b00.dts tegra210-p3448-0002-p3449-0000-b00.dtb

得到反编译后的dts文件,进行备份和修改:

sudo cp tegra210-p3448-0002-p3449-0000-b00.dts tegra210-p3448-0002-p3449-0000-b00-bak.dts
sudo gedit tegra210-p3448-0002-p3449-0000-b00.dts

.dts中搜索“spi@7000d400
在这里插入图片描述
修改“spi@7000d400”单元下的spi@0spi@1status设置为**“okay”**:
在这里插入图片描述
然后搜索spi1_mosi,按下图修改五个管脚的"nvidia, function"spi1"nvidia,tristate"0x0,
"Nvidia,enable-input"0x1.
在这里插入图片描述
把修改后的.dts编译为新的dtb文件,并覆盖旧的dtb文件:

sudo dtc -I dts -O dtb -o tegra210-p3448-0002-p3449-0000-b00.dtb tegra210-p3448-0002-p3449-0000-b00.dts

烧录并验证

完成设备的修改后,回到下烧录:

cd ../../
sudo ./flash.sh jetson-nano-emmc mmcblk0p1

完成烧录后打印如下:
在这里插入图片描述

短接pin19pin21,分别对应SPI0_MOSISPI0_MISO,进行SPI1控制器的自收发回环测试。
在这里插入图片描述

加载spi驱动模块,并git clone测试程序进行编译,终端输入:

sudo modprobe spidev
git clone https://github.com/rm-hull/spidev-test
cd spidev-test/
gcc spidev_test.c -o spidev_test

查看spi控制器是否存在,然后运行测试程序,指定spidev0.0(对应SPI1):

ls /dev/spidev*
./spidev_test -v -D /dev/spidev0.0 -p "Test"

正常效果如下,完成spi1自收发,说明成功使能。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值