本文档详细记录了在Linux 2.6.33内核环境下,针对SPI Flash芯片进行驱动程序移植的实际操作经验与技术细节,旨在为开发者提供有价值的参考和指导。
### 基于Linux 2.6.33的SPI Flash驱动移植总结
#### SPI驱动架构概述
在基于Linux 2.6.33的SPI Flash驱动移植过程中,主要涉及到了三个关键组件:SPI主机驱动(dm644x上的SPI功能模块驱动)、SPI Flash芯片驱动(w25x80的芯片驱动)以及SPI总线驱动。
**1. SPI主机驱动(dm644x上的SPI功能模块驱动)**
- **组件介绍**:这部分驱动主要负责实现DM644x平台上的SPI功能。SPI主机驱动的核心文件为`davinci_spi.c`,它包含了SPI主机的基本操作,如初始化、配置和数据传输等功能。
- **实现细节**:
- 为了启用SPI功能,需要设置PINMUX1[8] = 1,这一设置激活了SPI0外设模块。
- 在Linux系统中,SPI主机被注册为平台设备和平台驱动,主要包括`davinci_spi_device`和`davinci_spi_driver`两个结构体。这些设备和驱动被挂载到`platform`总线下,实现了对SPI主机的管理和控制。
**2. SPI Flash芯片驱动(w25x80的芯片驱动)**
- **组件介绍**:这部分驱动主要负责与SPI Flash芯片进行通信,并提供必要的操作接口。该驱动的核心文件为`m25p80.c`。
- **实现细节**:
- 设备芯片驱动通过SPI总线注册,这通常意味着使用`spi_board_info`结构体来描述SPI Flash的具体信息,如其地址、大小等。
- 通过指定`bus_num`的值,可以确定该SPI Flash是挂在哪个SPI总线上(例如SPI.0或SPI.1)。
- `flash_platform_data`结构体用来描述SPI Flash的特定参数,比如存储容量和读写速度。
**3. SPI总线驱动**
- **组件介绍**:这部分驱动主要负责管理SPI总线上的设备,并协调SPI主机与SPI Flash之间的数据交换。核心文件为`spi.c`。
- **实现细节**:
- 由于DM644x具有两个SPI功能模块,因此需要注册两个SPI总线,即SPI.0和SPI.1。
- 使用`spi_board_info`结构体描述SPI总线的特性,并指定了与之相连的SPI Flash信息。通过指定`bus_num`字段确定了设备在哪个总线上挂载。
- 通过调用`spi_register_master`函数将SPI主机驱动注册到相应的SPI总线上,然后使用`scan_board_info`函数扫描并自动检测和挂载已定义的设备。
#### 数据交互机制
SPI上的数据交换主要由驱动内部的工作队列来维护。具体实现如下:
- 初始化工作队列:通过调用`create_singlethread_workqueue`创建一个单线程工作队列。
- 工作队列初始化:使用`INIT_WORK`宏初始化工作队列结构,并指定处理函数为`bitbang_work`。
**数据结构说明**
- `struct davinci_spi_platform_data` 描述SPI主机的功能模块属性设置,如DMA通道的使用情况和时钟信号源选择等。
- `struct davinci_spi_platform_data davinci_spi_data` 定义了具体的配置参数,例如时钟源选择、等待时间等。
- `struct resource` 描述与SPI功能模块相关的寄存器地址和中断号。
#### 总结
本段落详细分析了基于Linux 2.6.33的SPI Flash驱动移植过程中的主要组件和技术要点。通过理解这些组件的设计和实现方式,开发人员能够更好地掌握SPI Flash驱动的移植流程,并将其应用到实际项目中。