大体上可分为以下几个部分:

1.注册设备驱动 spi_register_driver

2.分配 mtd_info 结构体

3.配置 mtd_info 结构体

4.注册 mtd_info 结构体

构建 spi_driver 并注册

static struct spi_driver spi_flash_drv = {

.driver = {

.name= "spi_flash",

.owner= THIS_MODULE,

},

.probe= spi_flash_probe,

.remove= __devexit_p(spi_flash_remove),

};

static int spi_flash_init(void)

{

return spi_register_driver(&spi_flash_drv);

}

当内核中注册了同名的设备,会调用该驱动的 probe 程序

/* 分配 mtd_info 结构体 */

static struct mtd_info spi_flash_dev;

static int __devinit spi_flash_probe(struct spi_device *spi)

{

int mid, did;

spi_flash = spi;

s3c2410_gpio_cfgpin(spi->chip_select, S3C2410_GPIO_OUTPUT);

SPIFlashInit();

SPIFlashReadID(&mid, &did);

printk("SPI Flash ID: %02x %02x\n", mid, did);

memset(&spi_flash_dev, 0, sizeof(spi_flash_dev));

/* 构造并注册这个 mtd_info

* mtd_device_register(master, parts, nr_parts)

*/

/* Setup the MTD structure */

spi_flash_dev.name = "spi_flash";

spi_flash_dev.type = MTD_NORFLASH;

spi_flash_dev.flags = MTD_CAP_NORFLASH;

spi_flash_dev.size = 0x200000; /* 2M */

spi_flash_dev.writesize = 1;

spi_flash_dev.writebufsize = 4096; /* 没有用到 */

spi_flash_dev.erasesize = 4096; /* 擦除的最小单位 */

spi_flash_dev.owner = THIS_MODULE;

spi_flash_dev._erase = spi_flash_erase;

spi_flash_dev._read = spi_flash_read;

spi_flash_dev._write = spi_flash_write;

mtd_device_register(&spi_flash_dev, NULL, 0);

return 0;

}

spi_flash_dev._erase = spi_flash_erase;

spi_flash_dev._read = spi_flash_read;

spi_flash_dev._write = spi_flash_write;

这三个函数与前面一篇文章所调用的函数基本相同,只是 SPI 的发送我们需要调用内核中的函数来完成,程序如下(linux/spi.h):

static inline int

spi_write(struct spi_device *spi, const void *buf, size_t len)

{

struct spi_transfert = {

.tx_buf= buf,

.len= len,

};

struct spi_messagem;

spi_message_init(&m);

spi_message_add_tail(&t, &m);

return spi_sync(spi, &m);

}

忙等待函数我们也要加以修改,避免浪费 CPU 资源,程序如下:

static void SPIFlashWaitWhenBusy(void)

{

while (SPIFlashReadStatusReg1() & 1)

{

/* 休眠一段时间 */

set_current_state(TASK_INTERRUPTIBLE);

schedule_timeout(HZ/100); /* 休眠10MS后再次判断 */

}

}

将进程设置为可中断的等待状态 TASK_INTERRUPTIBLE 。

状态解释:进程被挂起(睡眠),直到某个条件变为真。产生一个硬件中断,释放进程正在等待的系统资源,或传递一个信号都是可以唤醒进程的条件 (把进程的状态放回到 TASK_RUNNING)。

使用 schedule_timeout 函数,该方法会让需要延迟的任务睡眠到指定的延时时间后在重新运行。

linux下spi flash驱动程序,SPI Flash(W25Q16DV) 驱动相关推荐

  1. linux 下chrome 73 自动打开flash 设置

    linux 下chrome 73 自动打开flash 设置 chrome flash auto allow 指定chrome的flash 官网下载flash, 建议下载ppapi的: https:// ...

  2. Linux下PCI设备驱动程序开发[转]

    PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...

  3. linux显卡驱动程序,在Linux下安装显卡驱动程序

    相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...

  4. 嵌入式linux中断驱动,嵌入式Linux下硬件中断驱动程序的开发.pdf

    嵌入式Linux下硬件中断驱动程序的开发.pdf 2003 年 6 月 航空精密制造技术 Jun. 2003 第 39 卷 第 3 期 AVIATION PRECISION MANUFACTURING ...

  5. 显卡linux驱动安装教程,在Linux下安装显卡驱动程序

    相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...

  6. Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)

    <script type="text/javascript"> </script><script type="text/javascript ...

  7. 关于linux下的嵌入式文件系统以及flash文件系统选择(转)

    嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件 ...

  8. 关于linux下的嵌入式文件系统以及flash文件系统选择

    嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件 ...

  9. linux下的iic驱动程序,实战经验吐血推荐:怎样在Linux环境下轻松实现基于I2C总线的EEPROM驱动程序...

    4开发实例本文引用地址:http://www.eepw.com.cn/article/279351.htm Linux内核已经提供了I2C驱动中所需要的基本模块.i2c-core.i2c-dev和i2 ...

  10. ds18b20驱动程序Linux,基于linux下的ds18b20驱动程序的编写

    基于Linux操作系统下面的驱动程序的编写 一.所用的平台: 硬件平台:Mini2440 Size of NAND:256M linux kernel:linux-2.6.32.2 二.编写ds18b ...

最新文章

  1. EL之GB(GBC):利用GB对多分类问题进行建模(分层抽样+调1参)并评估
  2. 原平 计算机培训,原平编程培训,原平编程培训班,原平编程培训完找什么工作 - IT教育频道...
  3. DOM 基础 HTML标签 元素 属性
  4. IRasterStatistics Interface
  5. 1618D. Array and Operations
  6. linux windows 动态库导出查看 ld -r
  7. 蓝桥杯 ALGO-26 算法训练 麦森数
  8. 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?(转)
  9. 拓端tecdat|R语言rjags使用随机效应进行臭氧数据分析
  10. 7-4 是不是顺子 (10 分)
  11. 如何轻松集成VARCHART XGantt
  12. MacbookAir2011用U盘重装10.13.6High Sierra系统
  13. Ruby on Rails 中你使用了Kaminari 后,千万不要再引入will_pagination 这个Gem 了
  14. mysql comment_mysql中的comment用法
  15. python倒数切片_python的切片操作
  16. 我的 2020 总结:Never Settle
  17. vue3.0 ts版项目配置axios
  18. 接口中默认方法的重要作用
  19. 微信支付调用第三方系统无返回值的问题
  20. antv x6踩坑记录二

热门文章

  1. 微软CCID智能卡读卡器驱动(Microsoft Class Drivers for USB CCID Smart Cards)
  2. 最新版MySQL-8.0.22-winx64 安装
  3. DiskGenius——数据恢复及分区管理软件
  4. PPT:烟草行业互联网智能工厂
  5. 高铁售票系统 —— 代码篇
  6. 02- ElasticSearch(简称ES)- 文档批量操作
  7. 下载并安装微软模拟火车(MSTS)
  8. c语言三子棋详解!!! (电脑智能下棋)(附上完整代码)
  9. Linux操作系统几大发行版本的介绍与如何选择Linux操作系统
  10. 使用office 365管理和调度会议室