spi驱动

二、spi_master、spi_device和spi_driver的关系。

ref:

linux spi子系统_yuanlulu的博客 -优快云博客_linux spi子系统

spi_device的注册里面,会在ARM上面的Linux的/sys/bus/spi/devices下面出现我们注册的device设备,如图:

spi0.2就是我们所注册的device设备,这个命名就和我们的spi_board_info有关系了,

内核重新编译并重启之后,如果系统中运行了udev,/dev下就会生成一个spidevX.D设备节点,其中X是总线编号,D是片选号。

这里还有个坑,就是片选信号的数值大小和master里面的片选num的问题,linux的spi api要求,master的num-chipselect必须大于 spi_board_info里面chip_select的数值。你也看到上面初始化程序,为什么master->num_chipselect = 4; 这个语句了

spi_board_info的chip_select具体含义有spi master指定

spi_register_board_info(),,可以填入一个boardinfo的数组

ref:

Linux中的SPI: VFD驱动开发快速入门 [暮光小猿Linux开发系列]_哔哩哔哩_bilibili

linux SPI驱动框架(二) -- 设备驱动_flaoter的博客-优快云博客

Linux内核SPI支持概述 - 冷烟花 - 博客园

linux spi子系统_yuanlulu的博客 -优快云博客_linux spi子系统

https://segmentfault.com/a/1190000020905696

源码解析:

Linux设备驱动剖析之SPI(二) - lknlfy - 博客园

小白自制Linux开发板 四. 通过SPI使用ESP8266做无线网卡 - 淡墨青云 - 博客园

### Linux 下 SPI 驱动的实现原理 在 Linux 系统中,SPI 驱动的核心功能在于管理与控制 SPI 总线上的设备通信。其工作流程主要包括初始化、配置以及数据传输三个主要部分。 #### 初始化阶段 当系统启动时,SPI 主控制器会注册到 `spi_master` 结构体中,并调用相应的函数完成硬件资源分配和初始化操作。此过程中,驱动程序需要向内核注册自己支持的 SPI 设备及其对应的驱动模块[^1]。 #### 配置阶段 为了确保能够正常与其他外设进行交互,在实际应用之前还需要进一步设定具体的通讯参数,比如波特率(即 SCK 的频率)、CPOL 和 CPHA 属性等。这些属性决定了何时采样输入比特流以及如何同步输出比特流的时间点[^4]。 以下是关于如何设置上述提到的一些重要选项的一个简单例子: ```c static struct spi_board_info boardinfo[] __initdata = { { .modalias = "example_spi_device", .max_speed_hz = 500*1000, /* 设置最大速度为500kHz */ .bus_num = 0, .chip_select = 0, .mode = SPI_MODE_0 | SPI_CS_HIGH, }, }; ``` 在此代码片段中可以看到我们定义了一个名为boardinfo数组用来描述连接至第一个SPI总线上编号为零号CS引脚的目标器件;其中指定该目标运行于模式0之下并且保持高电平有效作为默认状态[^2]。 #### 数据传输阶段 一旦完成了前期准备工作之后就可以开始真正的信息交换环节了。这通常涉及到构建消息队列并通过submit命令提交给底层处理单元执行具体动作直到全部完成后才会返回结果给上层应用程序接口(API)层面使用[^3]。 下面展示了一段用于发起一次典型事务请求的小型示范源码: ```c struct spi_message msg; struct spi_transfer xfer; memset(&msg, 0, sizeof(msg)); memset(&xfer, 0, sizeof(xfer)); /* Prepare transfer details here... */ spi_message_init(&msg); spi_setup(spi); list_add_tail(&xfer.transfer_list,&msg.transfers); status=spi_sync(spi,&msg); if(status!=0){ printk(KERN_ERR"Error during SPI transaction\n"); } else{ // Handle successful completion... } ``` 以上就是有关Linux环境下开发定制化专用集成电路(ASICs)或者微控制器(MCU)所必需掌握的基础知识点概述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值