RC522 模块驱动程序
本文主要讲述了基于SPI总线的RC522驱动程序的设计。描述了主控如何与从设备通过SPI总线进行数据的读写。
一 在SPI驱动中,有两个重要的结构:spi_device&spi_driver。
1 spi_device的构建与注册:
Spi_device板信息用spi_board_info结构体来描述,它描述了SPI外设(RC522模块)使用的主机控制器序号,片选信号,数据比特率,传输方式等。故要先填充struct spi_board_info这个结构体。--4412平台在mach-smdk4x12.c里,三星给的BSP包里面已经配置好了这些,我们要做的只是打开CONFIG_S3C64XX_DEV_SPI这个宏。
spi_register_board_info(spi2_board_info, ARRAY_SIZE(spi2_board_info));
具体实现见下面代码。
- static struct spi_board_info spi2_board_info[] __initdata = {
- {
- .modalias = "rfid_rc522",
- .platform_data = NULL,
- .max_speed_hz = 10*1000*1000,
- .bus_num = 2,
- .chip_select = 0,
- .mode = SPI_MODE_0,
- .controller_data = &spi2_csi[0],
- }
- };
- static struct s3c64xx_spi_csinfo spi2_csi[] = {
- [0] = {
- .line = EXYNOS4_GPC1(2),
- .set_level = gpio_set_value,
- .fb_delay = 0x2,
- },
- }
2 spi_driver的构建与注册:
- spi_register_driver(&rc522_driver);
- static struct spi_driver rc522_driver = {
- .probe = rc522_probe,
- .remove = rc522_remove,
- .driver = {
- .name = "rfid_rc522",
- },
- };
- static int rc522_probe(struct spi_device *spi)
- {
- //默认读第一块(可选0 ~ 63)
- KuaiN = 1;
- printk("%s\n", __func__);
- rc522_spi = spi;
- return 0;
- };
二 注册好了SPI设备与驱动,就可以通过SPI总线实现数据读写了。
这里注册了一个混合设备:misc_register(&rc522_misc_device);
- static struct miscdevice rc522_misc_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "rfid_rc522_dev",
- .fops = &rc522_fops,
- };
- static struct file_operations rc522_fops = {
- .owner = THIS_MODULE,
- .open = rc522_open,
- .release = rc522_release,
- .read = rc522_read,
- .write = rc522_write,
- .poll = rc522_poll,
- .unlocked_ioctl = rc522_ioctl,
- };
- //省略号这里省略了fops里各个操作的具体函数。
- ……
在read, write操作里都会调用到WriteRawRC(unsigned char Address, unsigned char value)函数,在这个函数里才真正实现了通过SPI来对RC522寄存器的读写操作:
- //////////////////////////////////////////////////////////////////
- //功 能:写RC522寄存器
- //参数说明:Address[IN]:寄存器地址
- // value[IN]:写入的值
- /////////////////////////////////////////////////////////////////////
- void WriteRawRC(unsigned char Address, unsigned char value)
- {
- unsigned char ucAddr;
- struct spi_transfer st[2];
- struct spi_message msg;
- CLR_SPI_CS;
- ucAddr = ((Address<<1)&0x7E);
- spi_message_init( &msg );
- memset( st, 0, sizeof(st) );
- st[ 0 ].tx_buf = &ucAddr;
- st[ 0 ].len = 1;
- spi_message_add_tail( &st[0], &msg );
- st[ 1 ].tx_buf = &value;
- st[ 1 ].len = 1;
- spi_message_add_tail( &st[1], &msg );
- spi_sync( rc522_spi, &msg );
- SET_SPI_CS;
- };
三 添加定时器
为了节省CPU资源,需要添加一个定时器,每隔一定的时间才读卡一次。代码略。
到此为止,驱动的关键部分已经完工,只需把spi_register_driver(&rc522_driver)和misc_register(&rc522_misc_device)放进rfid_rc522_init()函数即可进行编译调试。
RC522 模块驱动程序的更多相关文章
- LINUX设备驱动程序的注意事项(两)建设和执行模块
<一>:设置測试系统 首先准备好一个内核源代码树,构造一个新内核,然后安装到自己的系统中. <二>:HelloWorld模块 #inclu ...
- RC522射频卡读写模块驱动(仅读取)
目录 说明 测试结果 main RC522.h RC522.c 说明 更改了网上的源代码,仅保留了读取序列号并通过串口回传的功能.版本号:V1 感谢 https://blog.csdn.net/qq_ ...
- RC 522模块在LINUX平台调试笔记
硬件平台: 1 主控:SMDK Exynos4412 POP S5M8767A 2 RFID模块:君盾集团提供的RC522模块 3 通信接口:SPI 软件平台:Android ICS & ke ...
- 【模块应用】MFRC522开发笔记
一.了解基本概念 ①ISO-14443A协议:( 国际标准化组织:International Organization for Standardization)RFID协议的一种; PICC:临近 ...
- Arduino+RFID RC522 +继电器
博客园的第一篇博文就献给Arduino了.不知道能不能坚持自己喜欢的并且记录下来. 起码是个好的开始. 想实现一卡通代替钥匙开启电动车. 简单的原理,通过RC522模块读取一卡通的序列号,在程序中进行 ...
- linux模块驱动之led(ioremap)
一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...
- MSP430WARE++的使用3:modbus模块的调用方法
MSP430WARE++的使用3:modbus模块的调用方法 MSP430WARE是一套基于C++语言的开源的MSP430层次化软件架构,支持多种外设. 本文将介绍modbus模块驱动程序的调 ...
- MicroPython:基于TPYBoard集合MAX7219点阵模块制作表白女神神器
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 又是一年毕业季,只有到了毕业季才会意识到自己又 ...
- 基于 Arduino 的 RFID 识别实验
http://www.it165.net/embed/html/201512/3287.html 2015年12月04日(周五) 上午 博士的智能卡实验--RFID识别实验,基于51单片机: 我们的 ...
随机推荐
- <转>Logistic回归总结
转自http://blog.csdn.net/dongtingzhizi/article/details/15962797 当我第一遍看完台大的机器学习的视频的时候,我以为我理解了逻辑回归,可后来越看 ...
- mac下搭建cocos2d-x2.2.1版本android编译环境教程
首先我们先以引擎2.2.1为例子来新建一个TestJni的项目,来作为测试例. 创建方式如下: python create_project.py -project TestJni -package o ...
- Java三方---->Thumbnailator框架的使用
Thumbnailator是一个用来生成图像缩略图的 Java类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图.有了它我们就不用在费心思使用Image I/O API,J ...
- MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动
在MQTT 官网 (http://mqtt.org/software)中有众多MQTT的实现方式.具体参看官网,Moquette是基于Apache Mina 的模型的一个Java MQTT broke ...
- 360全景图three.js
1.three.js是JavaScript编写的WebGL第三方库.提供了非常多的3D显示功能. Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影. ...
- 【BZOJ4545】DQS的trie 后缀自动机+LCT
[BZOJ4545]DQS的trie Description DQS的自家阳台上种着一棵颗粒饱满.颜色纯正的trie. DQS的trie非常的奇特,它初始有n0个节点,n0-1条边,每条边上有一个字符 ...
- OC开发_代码片段——代码编写简单的tableViewCell
许久前写的简单的tableView例子,主要针对处理缓存.协议.数据源datasource.局部刷新等问题进行解析. 其实这是一篇不全面的记录,只是用来记录一些备忘的东西,更全面的是使用TablVie ...
- OC开发_代码片段——代码编写自定义的tableViewCell
一.介绍 之前已经实现过通过简单的XIB文件来自定义我们的tableViewCell,包括每一步的步骤和代码:http://www.cnblogs.com/daomul/p/4355999.html ...
- Windows使用filezilla搭建FTP服务器
参考:https://segmentfault.com/a/1190000009033181 下载软件https://filezilla-project.org/ 安装过程不详述,默认安装即可 启动软 ...
- mongdb ---shard
http://blog.fens.me/mongodb-shard/ https://segmentfault.com/a/1190000004263332 1. 和用户管理相关的操作基本都要在adm ...