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));

具体实现见下面代码。

[cpp] view plaincopy

  1. static struct spi_board_info spi2_board_info[] __initdata = {
  2. {
  3. .modalias = "rfid_rc522",
  4. .platform_data = NULL,
  5. .max_speed_hz = 10*1000*1000,
  6. .bus_num = 2,
  7. .chip_select = 0,
  8. .mode = SPI_MODE_0,
  9. .controller_data = &spi2_csi[0],
  10. }
  11. };
  12. static struct s3c64xx_spi_csinfo spi2_csi[] = {
  13. [0] = {
  14. .line = EXYNOS4_GPC1(2),
  15. .set_level = gpio_set_value,
  16. .fb_delay = 0x2,
  17. },
  18. }

2  spi_driver的构建与注册:

[cpp] view plaincopy

  1. spi_register_driver(&rc522_driver);
  2. static struct spi_driver rc522_driver = {
  3. .probe = rc522_probe,
  4. .remove = rc522_remove,
  5. .driver = {
  6. .name = "rfid_rc522",
  7. },
  8. };
  9. static int rc522_probe(struct spi_device *spi)
  10. {
  11. //默认读第一块(可选0 ~ 63)
  12. KuaiN = 1;
  13. printk("%s\n", __func__);
  14. rc522_spi = spi;
  15. return 0;
  16. };

二 注册好了SPI设备与驱动,就可以通过SPI总线实现数据读写了。

这里注册了一个混合设备:misc_register(&rc522_misc_device);

[cpp] view plaincopy

  1. static struct miscdevice rc522_misc_device = {
  2. .minor = MISC_DYNAMIC_MINOR,
  3. .name = "rfid_rc522_dev",
  4. .fops = &rc522_fops,
  5. };
  6. static struct file_operations rc522_fops = {
  7. .owner = THIS_MODULE,
  8. .open = rc522_open,
  9. .release = rc522_release,
  10. .read = rc522_read,
  11. .write = rc522_write,
  12. .poll = rc522_poll,
  13. .unlocked_ioctl = rc522_ioctl,
  14. };
  15. //省略号这里省略了fops里各个操作的具体函数。
  16. ……

在read, write操作里都会调用到WriteRawRC(unsigned char Address, unsigned char value)函数,在这个函数里才真正实现了通过SPI来对RC522寄存器的读写操作:

[cpp] view plaincopy

  1. //////////////////////////////////////////////////////////////////
  2. //功 能:写RC522寄存器
  3. //参数说明:Address[IN]:寄存器地址
  4. // value[IN]:写入的值
  5. /////////////////////////////////////////////////////////////////////
  6. void WriteRawRC(unsigned char Address, unsigned char value)
  7. {
  8. unsigned char ucAddr;
  9. struct spi_transfer st[2];
  10. struct spi_message msg;
  11. CLR_SPI_CS;
  12. ucAddr = ((Address<<1)&0x7E);
  13. spi_message_init( &msg );
  14. memset( st, 0, sizeof(st) );
  15. st[ 0 ].tx_buf = &ucAddr;
  16. st[ 0 ].len = 1;
  17. spi_message_add_tail( &st[0], &msg );
  18. st[ 1 ].tx_buf = &value;
  19. st[ 1 ].len = 1;
  20. spi_message_add_tail( &st[1], &msg );
  21. spi_sync( rc522_spi, &msg );
  22. SET_SPI_CS;
  23. };

三 添加定时器

为了节省CPU资源,需要添加一个定时器,每隔一定的时间才读卡一次。代码略。

到此为止,驱动的关键部分已经完工,只需把spi_register_driver(&rc522_driver)和misc_register(&rc522_misc_device)放进rfid_rc522_init()函数即可进行编译调试。

时间: 2024-10-09 04:59:04

RC522 模块驱动程序的相关文章

LINUX设备驱动程序笔记(二)构造和运行模块

         <一>:设置测试系统 首先准备好一个内核源码树,构造一个新内核,然后安装到自己的系统中.           <二>:HelloWorld模块 #include <linux/init.h> //定义了驱动的初始化和退出相关的函数 #include <linux/module.h> //定义了内核模块相关的函数.变量及宏 MODULE_LICENSE("Dual BSD/GPL"); //该宏告诉内核,该模块采用自由许可

RC522射频卡读写模块驱动(仅读取)

目录 说明 测试结果 main RC522.h RC522.c 说明 更改了网上的源代码,仅保留了读取序列号并通过串口回传的功能.版本号:V1 感谢 https://blog.csdn.net/qq_28877125/article/details/80437095 测试结果 main #include "sys.h" #include "delay.h" #include "usart.h" #include "lcd.h"

RC 522模块在LINUX平台调试笔记

硬件平台: 1 主控:SMDK Exynos4412 POP S5M8767A 2 RFID模块:君盾集团提供的RC522模块 3 通信接口:SPI 软件平台:Android ICS & kernel version 3.0.15 一,使能主控端SPI 1 硬件使能: 从SMDK原理图上可以看到SPI0与I2C共用,SPI1已经连接到其它设备,SPI2未用,故这里选用SPI2. 2 软件使能: SMDK Exynos4412 主控端已经配置好了SPI接口,使用时只需打开宏CONFIG_S3C64

第四十二天:Tiny4412模块驱动开发

因为前面写裸板程序的时候,已经详细的叙述过LED灯的控制,按键的控制,以及watchdog的配置,这里就不赘述了,主要是说明模块如何控制底层硬件的. 第一个程序是模块程序控制LED灯全亮. 因为友善之臂将LED灯的驱动默认加载到内核中,编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉. 首先进入linux源码目录.执行 make menuconfig 进入Device Drivers  ---> Character devices  ---> 将LED Support for Friendl

MSP430WARE++的使用3:modbus模块的调用方法

MSP430WARE++的使用3:modbus模块的调用方法 MSP430WARE是一套基于C++语言的开源的MSP430层次化软件架构,支持多种外设.本文将介绍modbus模块驱动程序的调用方法. 1.硬件原理图 使用modbus模块驱动程序需要与MSP430单片机的UART0端口相连接. 2.使用方法 a.加入驱动程序 选中modbus文件夹,右键点击"Exclude from Build"即可. modbus驱动程序由多个个文件组成,如下图所示.其中RSP1_config.hpp

linux模块驱动之led(ioremap)

一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的Device Drivers /Character devices目录下,进行完裁剪之后重新编译linux源码: (2)ioremap() define ioremap(cookie,size)        __arm_ioremap((cookie), (size), MT_DEVICE) 编写

MicroPython:基于TPYBoard集合MAX7219点阵模块制作表白女神神器

前言 又是一年毕业季,只有到了毕业季才会意识到自己又离青春远了一大步.毕业后,大家都各奔东西了,如果这个时候有喜欢的人还是 藏在心底的话,不免会给人生留下遗憾.为了不留遗憾,不老套,制作一款表白神器,是不是会更容易表白成功呢? 之前使用8*8LED点阵模块做过一款跳动的心,因为是直接用的点阵模块,所以控制就用了16个IO,未免有些繁琐,浪费资源.最近发 现了一个好东西--MAX7219多位LED 显示驱动器.使用该驱动器加上点阵屏或者数码管,驱动起来特别方便简单,而且加上电源脚 也不过就5根线而

Linux LCD驱动(四)--驱动的实现

目录(?)[-] 基本原理 写 framebuffer 驱动程序要做什么 LCD 模块 驱动程序 控制器 什么是 frame buffer 设备 Linux Frame Buffer 驱动程序层次结构 数据结构 接口 一个 LCD controller 驱动程序 分配系统内存作为显存 实现 fb_ops 结构 基本原理 通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来: 驱动程序分配系统内存作为显存:实现

Linux目录规范和含义(转)

Linux目录配置 在了解了每个文件的相关种类与属性,以及了解了如何更改文件属性/权限的相关信息后,再来要了解的就是, 为什么每套Linux distributions他们的配置文件啊.执行文件啊.每个目录内放置的咚咚啊,其实都差不多? 原来是有一套标准依据的 Linux目录配置的依据--FHS 因为利用Linux来开发产品或distributions的社群/公司与个人实在太多了, 如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰. 你能想象,你进入一个企业之后,所接