linux下spi flash驱动程序,SPI Flash(W25Q16DV) 驱动
大体上可分为以下几个部分:
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) 驱动相关推荐
- linux 下chrome 73 自动打开flash 设置
linux 下chrome 73 自动打开flash 设置 chrome flash auto allow 指定chrome的flash 官网下载flash, 建议下载ppapi的: https:// ...
- Linux下PCI设备驱动程序开发[转]
PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...
- linux显卡驱动程序,在Linux下安装显卡驱动程序
相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...
- 嵌入式linux中断驱动,嵌入式Linux下硬件中断驱动程序的开发.pdf
嵌入式Linux下硬件中断驱动程序的开发.pdf 2003 年 6 月 航空精密制造技术 Jun. 2003 第 39 卷 第 3 期 AVIATION PRECISION MANUFACTURING ...
- 显卡linux驱动安装教程,在Linux下安装显卡驱动程序
相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡.而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window.即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大 ...
- Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)
<script type="text/javascript"> </script><script type="text/javascript ...
- 关于linux下的嵌入式文件系统以及flash文件系统选择(转)
嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件 ...
- 关于linux下的嵌入式文件系统以及flash文件系统选择
嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件 ...
- linux下的iic驱动程序,实战经验吐血推荐:怎样在Linux环境下轻松实现基于I2C总线的EEPROM驱动程序...
4开发实例本文引用地址:http://www.eepw.com.cn/article/279351.htm Linux内核已经提供了I2C驱动中所需要的基本模块.i2c-core.i2c-dev和i2 ...
- ds18b20驱动程序Linux,基于linux下的ds18b20驱动程序的编写
基于Linux操作系统下面的驱动程序的编写 一.所用的平台: 硬件平台:Mini2440 Size of NAND:256M linux kernel:linux-2.6.32.2 二.编写ds18b ...
最新文章
- EL之GB(GBC):利用GB对多分类问题进行建模(分层抽样+调1参)并评估
- 原平 计算机培训,原平编程培训,原平编程培训班,原平编程培训完找什么工作 - IT教育频道...
- DOM 基础 HTML标签 元素 属性
- IRasterStatistics Interface
- 1618D. Array and Operations
- linux windows 动态库导出查看 ld -r
- 蓝桥杯 ALGO-26 算法训练 麦森数
- 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?(转)
- 拓端tecdat|R语言rjags使用随机效应进行臭氧数据分析
- 7-4 是不是顺子 (10 分)
- 如何轻松集成VARCHART XGantt
- MacbookAir2011用U盘重装10.13.6High Sierra系统
- Ruby on Rails 中你使用了Kaminari 后,千万不要再引入will_pagination 这个Gem 了
- mysql comment_mysql中的comment用法
- python倒数切片_python的切片操作
- 我的 2020 总结:Never Settle
- vue3.0 ts版项目配置axios
- 接口中默认方法的重要作用
- 微信支付调用第三方系统无返回值的问题
- antv x6踩坑记录二
热门文章
- 微软CCID智能卡读卡器驱动(Microsoft Class Drivers for USB CCID Smart Cards)
- 最新版MySQL-8.0.22-winx64 安装
- DiskGenius——数据恢复及分区管理软件
- PPT:烟草行业互联网智能工厂
- 高铁售票系统 —— 代码篇
- 02- ElasticSearch(简称ES)- 文档批量操作
- 下载并安装微软模拟火车(MSTS)
- c语言三子棋详解!!! (电脑智能下棋)(附上完整代码)
- Linux操作系统几大发行版本的介绍与如何选择Linux操作系统
- 使用office 365管理和调度会议室