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

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

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、付费专栏及课程。

余额充值