SPI Device Driver on Jetson AGX Orin

需要在Jetson AGX Orin板子上外接一个MAX14830 spi转4路uart的外设,挂在40pin的SPI1上,L4T的版本是35.1.0。但实际添加驱动的过程中遇到一些问题:
1.是否有SPI1上驱动的文档/测试程序以供参考,编译、烧录都有哪些步骤和命令?
2.可否每次更新只烧录kernel/dtb部分而非全部烧录?全部烧录的话每次都要修改IP等配置工作才能正常ssh进去?

Hi firs003,

請問是使用devkit還是custom carrier board呢?
是否可使用前最新的R35.4.1驗證呢?

你可以先參考以下連結驗證SPI loopback test在你的板子上
Jetson Nano SPI Bus Not Working - #10 by KevinFFF - Jetson Nano - NVIDIA Developer Forums

針對你的MAX14830 SPI module,麻煩請向你的vendor取得porting guide

燒錄kernel image/dtb的話是在partition上,並不會在開機後生效
你要做驗證測試的話,可以直接替換/boot底下的Image和使用中的DTB檔案

基本上燒錄後IP位址會是固定的 這關係到你路由器那邊怎麼分配IP的

Hi KevinFFF,感谢回复。
就是用的官方的devkit,可以用R35.4.1试一下。
关于直接替换/boot下面的dtb,我之前试过,换的是/boot/dtb/kernel_tegra234-p3701-0000-p3737-0000.dtb,但我发现这个办法并不是每次都生效,不知道这个文件对不。
比如我把spi的dts修改后放进去,重启发现生效了,/proc/device-tree/spi@3210000/下面有max14830出现,但我想修改回默认,重新编译了dtb替换后发现就不生效了。

具体的修改,是在hardware/nvidia/platform/t23x/concord/kernel-dts/cvb/tegra234-p3737-0000-a00.dtsi这个文件里修改了spi@3210000

spi@3210000{ /* SPI1 in 40 pin conn */
	status = "okay";
	max14830@0 { /* chip select 0 */
		compatible = "maxim,max14830", "max310x";
		reg = <0>;
		#address-cells = <1>;
		#size-cells = <0>;

		// gpio-controller;
		// #gpio-cells = <2>;

		spi-max-frequency = <5000000>;
		interrupts = <27 IRQ_TYPE_EDGE_FALLING>;
		// interrupt-parent = <&gpio>;

		clocks = <&max14830_xtal>;
		clock-names = "xtal";
		max14830_xtal: max14830_xtal {
			compatible = "fixed-clock";
			#clock-cells = <0>;
			clock-frequency = <3686400>;
		};
	};
	// spi@0 { /* chip select 0 */
	// 	compatible = "tegra-spidev";
	// 	reg = <0x0>;
	// 	spi-max-frequency = <50000000>;
	// 	controller-data {
	// 		nvidia,enable-hw-based-cs;
	// 		nvidia,rx-clk-tap-delay = <0x10>;
	// 		nvidia,tx-clk-tap-delay = <0x0>;
	// 	};
	// };
	// spi@1 { /* chip select 1 */
	// 	compatible = "tegra-spidev";
	// 	reg = <0x1>;
	// 	spi-max-frequency = <50000000>;
	// 	controller-data {
	// 		nvidia,enable-hw-based-cs;
	// 		nvidia,rx-clk-tap-delay = <0x10>;
	// 		nvidia,tx-clk-tap-delay = <0x0>;
	// 	};
	// };
};

你可以檢查你的/boot/extlinux/extlinux.conf裡的設定
基本上,/boot/dtb/底下應該只有這個dtb,這是runtime燒錄開機後修改的方式

若你要在燒錄前就先設定好,那就是修改在你另外提到的這個地方

extlinux.conf的内容:

$ cat /boot/extlinux/extlinux.conf
TIMEOUT 30
DEFAULT JetsonIO

MENU TITLE L4T boot options
LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
FDT /boot/dtb/kernel_tegra234-p3701-0000-p3737-0000.dtb
INITRD /boot/initrd
APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 console=tty0 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0

When testing a custom kernel, it is recommended that you create a backup of

the original kernel and add a new entry to this file so that the device can

fallback to the original kernel. To do this:

1, Make a backup of the original kernel

sudo cp /boot/Image /boot/Image.backup

2, Copy your custom kernel into /boot/Image

3, Uncomment below menu setting lines for the original kernel

4, Reboot

LABEL backup

MENU LABEL backup kernel

LINUX /boot/Image.backup

FDT /boot/dtb/kernel_tegra234-p3701-0000-p3737-0000.dtb

INITRD /boot/initrd

APPEND ${cbootargs}

LABEL JetsonIO
MENU LABEL Custom Header Config: <HDR40 User Custom [2023-11-29-105722]>
LINUX /boot/Image
FDT /boot/kernel_tegra234-p3701-0000-p3737-0000-user-custom.dtb
INITRD /boot/initrd
APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 console=tty0 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0

刚刚又操作了一遍,想要撤销max14830的修改,还是没法还原spi1的dtb,操作步骤:
1.copy l4t文件夹中的kernel/dtb/tegra234-p3701-0000-p3737-0000.dtb这个pre-build到jetson/boot/dtb
2.改名并覆盖kernel_tegra234-p3701-0000-p3737-0000.dtb
3.重启jetson,发现dtb并没有改变

具体现象:
1.diff /boot/dtb/kernel_tegra234-p3701-0000-p3737-0000.dtb与tegra234-p3701-0000-p3737-0000.dtb(之前copy上来的prebuild文件),两者一致;
2./proc/device-tree/nvidia,dtbbuildtime显示dtb的时间还是Nov 29 202300:35:40,并没有变回到prebuild那个dtb的时间;
3./proc/device-tree/spi@3210000/下面还是max14830@0,并没有变回默认的spi@0 spi@1;

补充一下:
之前用jetson-io修改过40-pin header的配置,开启了SPI1

你可以看到他正在使用這個檔案作為kernel dtb

建議你還是從kernel source的部分加入你針對max14830的設定,最後再完整地燒錄板子

必須要重開機後DTB才會重新被載入

Jetson-IO是用來設定SPI pin的pinmux register,你仍需要確認device tree裡的node有設定正確和被打開

Hi KevinFFF,
隔了这几天,再次来请教。还是之前max14830的驱动,driver和dts添加了,生效了一部分,卡在了probe过程中的申请中断
ret = devm_request_threaded_irq(dev, irq, NULL, max310x_ist, IRQF_ONESHOT | IRQF_SHARED, dev_name(dev), s);
该函数返回-22,推测可能是我dts中的interrupts写的不对。

MAX14830的IRQ连的是40 Pin里面的GPIO32那个脚。不知道dts里面interrupts和interrupts-parent这两项指定的是否正确,应该怎么找?
原理图:


dts:

spi@3210000{ /* SPI1 in 40 pin conn */
	status = "okay";

	spi_uart_clk: osc_max14830 {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <3686400>;
	};

	max14830: max14830@0 {
		compatible = "maxim,max14830";
		reg = <0>;
		clocks = <&spi_uart_clk>;
		clock-names = "osc";
		interrupt-parent = <&tegra_main_gpio>;
		interrupts = <TEGRA234_MAIN_GPIO(R, 0) IRQ_TYPE_LEVEL_LOW>;
		gpio-controller;
		#gpio-cells = <2>;
	};
};

請問你的screen shot是從AGX Orin Carrier Board Specification來的嗎?
我這邊看到的是如下圖

40-Pin expansion header上的PIN-13是PWM01

麻煩確認你線路圖上的"GPIO32"接到的是哪裡

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.