spi(2)pxe8311+spi-altera+m25p驱动设计

This blog details the process of SPI (Serial Peripheral Interface) master, slave, and flash device registration in a Linux kernel environment. It explains the registration of SPI devices, their associated resources, driver matching, and the setup of SPI flash devices. The blog also covers the execution of probe functions for device functionality, the handling of messages through work queues, and the integration of mtd interfaces for file system operations.

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

这个是也是网上转载过来的,流程很有用

1. spi master设备相关数据
static struct resource ninja_platform_resources[] = {
 [0] = {
  .flags =IORESOURCE_MEM,
 }
};

static struct platform_device ninja_platform_device = {
 .name   ="spi_altera",
 .id    =0,
 .resource   =ninja_platform_resources,
 .num_resources =ARRAY_SIZE(ninja_platform_resources),
};

 

2. spi master设备注册
platform_device_register()  注册platform设备
-->device_initialize()   数据初始化  
-->platform_device_add()  添加platform设备
---->insert_resource()   添加设备资源
------>__insert_resource()  
--------> __request_resource()
---->device_add()   设备模型添加设备
------> platform_match()
-------->platform_match_id()  设备和驱动匹配
--------> strcmp(pdev->name,drv->name)
匹配条件设备名字和驱动名字相同,pdev->name = spi-altera,drv->name = spi-altera => driver =spi-altera.c

 

3. spi master驱动注册
driver - spi-altera.c
altera_spi_init()
--> platform_driver_register()
----> driver_register()
------> driver_attach()
--------> __driver_attach()
----------> driver_match_device()
------------> platform_match()
--------------> strcmp(pdev->name,drv->name)
匹配条件设备名字和驱动名字相同
----------> driver_probe_device()
------------> really_probe()
--------------> altera_spi_probe()
运行probe函数
altera_spi_probe()
--> spi_alloc_master()
--> platform_get_resource()
-->devm_ioremap_nocache()  get memresource
-->platform_get_irq()   getirq resource
--> spi_bitbang_start()
---->INIT_WORK(&bitbang->work,bitbang_work) 初始化工作队列
------> bitbang->txrx_bufs(spi,t)  以后会调用传输函数
-------->altera_spi_txrx()   具体的传输函数
---->spi_register_master()   注册master
------>scan_boardinfo()   扫描匹配spiflash设备
--------> if (chip->bus_num !=master->bus_num) continue;
匹配条件bus_num相同
master->bus_num = pdev->id = 0, chip= bi->board_info, chip->bus_num =0
--------> spi_new_device()
----------> spi_alloc_device()
----------> spi_add_device()

 

4. spi flash设备相关数据
static struct mtd_partition ninja_spi_flash_partitions[] = {
 {
  .name = "fpga_image",
  .size = 0x2000000,//32MB
  .offset = 0,
 },
};

static struct flash_platform_data ninja_spi_flash_data = {
 .name = "m25p80",
 .parts = ninja_spi_flash_partitions,
 .nr_parts =ARRAY_SIZE(ninja_spi_flash_partitions),
 .type = "n25q256",
};

static struct spi_board_info ninja_spi_board_info[] __initdata ={
 {
  .modalias = "m25p80",
  .max_speed_hz =25000000,//25MHz
  .bus_num = 0,// match with spimaster id
  .chip_select = 1,// only one cspin
  .irq = -1;
  .platform_data =&ninja_spi_flash_data,
 },
};

 

5. spi flash设备注册
spi_register_board_info()
-->list_add_tail(&bi->list,&board_list)
add to list board_list

 

6. spi flash驱动
m25p80_init()
--> spi_register_driver()
----> match : strcmp(spi->modalias,drv->name) == 0
匹配条件spi->modalias和drv->name相同
运行probe
----> m25p_probe()
------>spi->dev.platform_data->type ==plat_id->name
软件支持设备型号
------> jedec_probe()
从硬件获取设备型号,要与软件相匹配
------>add_mtd_partitions() 添加flash分区
--------> add_one_partition()
------>add_mtd_device() 添加mtd设备
写函数
write_sr()
-->spi_message_init()  初始化消息
-->spi_message_add_tail() 添加消息到消息队列
-->spi_sync()   处理消息队列
读函数
read_sr()
--> spi_write_then_read()
----> spi_message_init()
----> spi_message_add_tail()
---->spi_sync()    处理消息队列--同步
------>spi_async()    处理消息队列--异步
-------->master->transfer()   调用master传输函数
---------->spi_bitbang_transfer()  
------------>queue_work()   加入工作队列
-------------->bitbang_work()   工作队列工作
---------------->altera_spi_txrx()  具体传输函数
------>wait_for_completion()   等待完成,同步被调用需要等待完成

 

7. 提供的mtd接口
flash->mtd.erase = m25p80_erase;
flash->mtd.read = m25p80_read;

if (info->jedec_id >>16 == 0xbf)
 flash->mtd.write =sst_write;
else
 flash->mtd.write =m25p80_write;
文件系统操作顺序
fs->vfs->dev->mtd->ops

 

现在状态是代码能够编译通过,等待和硬件调试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值