加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

spi flash控制驱动

发布时间:2020-12-15 18:13:12 所属栏目:百科 来源:网络整理
导读:系统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设备,挂

系统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,?},};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读