Part Number:AM3352
我想要开发spi的从机模式,网上的案例都需要用到设备树,我尝试自己开发,但是很明显是不成功了,我想升级内核到5.0版本左右,然后再进行开发。我在3.2版本的内核中,linux-3.2.0-psp04.06.00.11/arch/arm/boot/dts找到了一些dts文件,但是我根本不会用。请告诉我一个升级设备树的方法,感谢
BobLu:
设备树只是一个配置文件,实际的程序逻辑还是在c里面,如果你已经有了驱动,那去掉设备树的支持,降级到3.x内核不是一个难得问题,如果不清楚可以发代码给AI问一下
,
?? ?:
感谢你的回复,我不知道slave模式怎么搞,我是这方面的新手,linux里面涉及到注册spi核心驱动,然后能够设置spi的从模式,但是我找不到,网上也没找到很好的资料。目前我不知道应该怎么实现,网上找到的资料是有设备树的,应该是在设备树配置好成为slave模式吧,我不太懂。
,
Gary Lu:
感谢分享解决方法
,
Gary Lu:
?? ? 说:请告诉我一个升级设备树的方法
为您提供一个一般的步骤:
1. 下载并编译新版本的内核
2. 更新设备树源文件
3. 重新编译设备树二进制文件: – 进入内核源代码目录。 – 使用以下命令编译设备树二进制文件:
make dtbs4. 安装新内核和设备树文件
5. 重启
,
Gary Lu:
?? ? 说:应该是在设备树配置好成为slave模式吧
1. 设备树配置
&spi1 { status = "okay"; spidev@0 { compatible = "spidev"; reg = <0>; mode = <0>; // 0 表示SPI从机模式 // 。。。 }; };2. SPI核心驱动注册:
#include <linux/spi/spi.h>static struct spi_board_info my_spi_board_info = { .modalias = "spidev", .max_speed_hz = 500000, .bus_num = 1, .chip_select = 0, .mode = SPI_MODE_0, // 0 表示SPI从机模式 };static struct spi_device *my_spi_device;static int __init my_spi_init(void) { my_spi_device = spi_new_device(spi_bus, &my_spi_board_info); // 其他初始化... return 0; }static void __exit my_spi_exit(void) { spi_unregister_device(my_spi_device); }module_init(my_spi_init); module_exit(my_spi_exit); MODULE_LICENSE("GPL");3. 编译和加载模块
,
?? ?:
首先,非常感谢你的回复。
设备树的配置方案是我找到的网络上较为通用方案。&spi1 {status = "okay";spidev@0 {compatible = "spidev";reg = <0>;mode = <0>; // 0 表示SPI从机模式// 。。。};};
中的mode = <0>; // 0 表示SPI从机模式。
但是在linux3.2的内核中,没有设备树,我也未找到相关的关于这个配置。而在SPI核心驱动注册中,my_spi_board_info里面我无论注册成SPI_MODE_0,SPI_MODE_1(我一直以为是spi的四种模式,是错的吗?),都是spi0_do这个拐角发送的消息。我用spi_sync这个函数直接执行,然后在硬件上用示波器检测出来的。那么是否可以在3.2内核中直接配置spi的slave模式?另一方面,内核移植的话,内核下载在哪里,我直接去下载linnux官方的?ti应该是由提供不同内核版本的sdk,但是我没找到。如果有,是在哪里?请帮助我
,
Gary Lu:
您好,
?? ? 说:那么是否可以在3.2内核中直接配置spi的slave模式?
为您提供一个SPI配置示例:
static struct spi_board_info my_spi_board_info = { .modalias = "spidev", .max_speed_hz = 500000, // 速率 .bus_num = 1, .chip_select = 0, .mode = SPI_MODE_0, // 或者 SPI_MODE_1 };static struct spi_device *my_spi_device;static int __init my_spi_init(void) { my_spi_device = spi_new_device(spi_bus, &my_spi_board_info); // ... return 0; }static void __exit my_spi_exit(void) { spi_unregister_device(my_spi_device); }module_init(my_spi_init); module_exit(my_spi_exit); MODULE_LICENSE("GPL");`my_spi_board_info`结构中的`mode`字段设置为`SPI_MODE_0`,你也可以尝试用MODE1
Thanks,
Gary