spi flash控制驱动

本文介绍了基于CPLD的SPI系统架构,包括spi控制器和spi设备的具体实现方式。详细阐述了pxe8311、CPLD及spi flash驱动的组成与作用,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统spi实现
x86 <-pci-> pxe8311 <-local bus-> cpld <-spi-> spi-flash <-spi-> cpld <-local bus-> fpga

1. spi包含spi control device和spi device
control device是spi总线控制器
device是spi设备,被control device控制
系统的spi control device是CPLD设备,挂载在pxe8311下,从pci总线可以配置
spi device是spi flash设备,用于存储fpga image

2. 相关驱动
驱动主要包含三个部分
2.1 pxe8311驱动
用于将cpld寄存器空间映射到pci空间
2.2 cpld驱动
用于控制spi controller
2.3 spi flash驱动
用于访问flash设备

3. 驱动实现
3.1 pxe8311
标准的pci设备驱动,将cpld寄存器映射到pci地址空间即可

3.2 cpld
cpld采用了altera的spi controller 软核实现,基本可以采用drivers/spi/spi-altera.c

3.3 spi flash
spi flash选用类m25p80设备,基本可以采用drivers/mtd/devices/m25p80.c

3.4 整合
pxe8311驱动扫描到cpld后需要向系统添加spi control 和spi flash两个平台设备,并设定相关参数
spi-control的寄存区地址区域,大小,总线号等等
spi-flash的所属总线号等等

3.5 代码举例
3.5.1向系统添加spi control device
用platform_device_register(&at572d940hf_spi0_device);
信息包含:
static struct nuc900_spi_info nuc900_spiflash_data = {
 .num_cs  = 1,
 .lsb  = 0,
 .txneg  = 1,
 .rxneg  = 0,
 .divider = 24,
 .sleep  = 0,
 .txnum  = 0,
 .txbitlen = 8,
 .bus_num = 0,
};

static struct resource nuc900_spi_resource[] = {
 [0] = {
  .start = W90X900_PA_I2C + SPIOFFSET,
  .end   = W90X900_PA_I2C + SPIOFFSET + SPIOREG_SIZE - 1,
  .flags = IORESOURCE_MEM,
 },
 [1] = {
  .start = IRQ_SSP,
  .end   = IRQ_SSP,
  .flags = IORESOURCE_IRQ,
 }
};

static struct platform_device nuc900_device_spi = {
 .name  = "nuc900-spi",
 .id  = -1,
 .num_resources = ARRAY_SIZE(nuc900_spi_resource),
 .resource = nuc900_spi_resource,
 .dev  = {
    .platform_data = &nuc900_spiflash_data,
   }
};

3.5.2向系统添加spi flash device
用spi_register_board_info(nuc900_spi_board_info,ARRAY_SIZE(nuc900_spi_board_info));
信息包含:
static struct mtd_partition nuc900_spi_flash_partitions[] = {
 {
  .name = "bootloader(spi)",
  .size = 0x0100000,
  .offset = 0,
 },
};

static struct flash_platform_data nuc900_spi_flash_data = {
 .name = "m25p80",
 .parts =  nuc900_spi_flash_partitions,
 .nr_parts = ARRAY_SIZE(nuc900_spi_flash_partitions),
 .type = "w25x16",
};

static struct spi_board_info nuc900_spi_board_info[] __initdata = {
 {
  .modalias = "m25p80",
  .max_speed_hz = 20000000,
  .bus_num = 0,
  .chip_select = 0,
  .platform_data = &nuc900_spi_flash_data,
  .mode = SPI_MODE_0,
 },
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值