pxe8311+spi-altera+m25p驱动设计

来源:互联网 发布:服装大师软件 编辑:程序博客网 时间:2024/05/22 06:41

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 mem resource
--> platform_get_irq()   get irq resource
--> spi_bitbang_start()
----> INIT_WORK(&bitbang->work, bitbang_work) 初始化工作队列
------> bitbang->txrx_bufs(spi, t)  以后会调用传输函数
--------> altera_spi_txrx()   具体的传输函数
----> spi_register_master()   注册master
------> scan_boardinfo()   扫描匹配spi flash设备
--------> 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 spi master id
  .chip_select = 1,// only one cs pin
  .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


原创粉丝点击