需要在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.