资源简介
维根协议驱动程序,linux平台下测试可用,采用中断方式读取数据,RFID学习必备,助你快速搞定RFID驱动
代码片段和文件信息
/*wiegand 协议驱动代码*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define WIEGAND_MAJOR 243
//delay 33ms to convert data
#define TIMER_DELAY HZ/30
#define DEVICE_NAME “wiegand“
bool TIMEER_FLAG = false;
bool RF_OPEN_FLAG = false;
struct wiegand_dev
{
char wiegand[26]; //Wiegand Data 26Bits
int hid;
int pid;
//unsigned char state;
int count; //Global Counter
struct cdev cdev;
struct semaphore sem;
struct completion receive_completion;
struct timer_list wiegand_timer;
};
static struct wiegand_dev *rf_card;
//应该除了初始化外,只能有这一个地方能够将rf_card->count置为0,其余地方置为0皆不合法
static char convert_data(void)
{
int ievenodd;
//奇校验
even = 0;
for(i = 1; i < 13;i++)
{
if(rf_card->wiegand[i] == 1)
even = (~even) & 0x01;
}
if(even != rf_card->wiegand[0])
{
rf_card->count = 0;
goto error;
}
//偶校验
odd = 1;
for(i = 13; i< 25;i++)
{
if(rf_card->wiegand[i] == 1)
odd = (~odd)& 0x01;
}
if(odd != rf_card->wiegand[25])
{
rf_card->count = 0;
goto error;
}
//奇偶校验通过
rf_card->hid = 0;
for(i = 1 ;i<=12;i++)//hid转换
rf_card->hid = rf_card->hid << 1 |rf_card->wiegand[i];
rf_card->pid = 0;
for(i = 13 ;i<=25;i++)//pid转换
rf_card->pid = rf_card->pid << 1 |rf_card->wiegand[i];
rf_card->count = 0;
return 0;
error:
printk(“Parity Efficacy Error!\n“);
return -1;
}
static void wiegand_do_timer(unsigned long arg)
{
printk(“%s:wait wieg_data completed\n“__func__);
wait_for_completion(&(rf_card->receive_completion));//等待维根数据传送完毕才进行转换
disable_irq(IRQ_EINT(17));
disable_irq(IRQ_EINT(18));//防止wieg_data在转换期间发生变化
convert_data();
up(&rf_card->sem);
printk(“%s:complete convert wieg_datahid = %dpid = %d \n“__func__rf_card->hidrf_card->pid);
TIMEER_FLAG = false;
enable_irq(IRQ_EINT(17));
enable_irq(IRQ_EINT(18));
}
static void enable_irqs(void)
{
enable_irq(IRQ_EINT(17));
enable_irq(IRQ_EINT(18));
printk(“%s:the irq is setup!\n“__func__);
}
static irqreturn_t wiegand_irq0(int irq void *dev_id)
{
disable_irq_nosync(IRQ_EINT(17));
printk(“%s:IN\n“__func__);
udelay(5);
if(gpio_get_value(S3C64XX_GPL(9)) == 0)
{
rf_card->wiegand[rf_card->count] = 0;
printk(“%s:wiegand[%d] = %d\n“__func__rf_card->countrf_card->wiegand[rf_card->count]);
rf_card->count ++;
udelay(300);
}
else
goto end;
enable_irq(IRQ_EINT(17));
if(rf_card->count == 1)
init_completion(&(rf_card->receive_completion));
else i
相关资源
- linux内核中断
- Linux课程设计—基于服务器的文件共享
- 英特尔集成显卡及核心显卡Intel(R)
- jdk-7u67-linux-x64.tar.gz
- Intel Parallel Studio XE 2018 Update 1 Windows
- Linux下的Socket聊天系统,QT完整界面
- Linux下的QT车牌识别门禁系统基于ope
- SElinux详细讲解
- Linux下使用UDP协议的点对点聊天程序含
- Linux系统自动不停重启并计数的shell脚
- ov9650摄像头在qt中的实现代码
- 将游戏手柄按键映射到键盘
- linux下tuxedo服务器安装与配置
- 华清远见uboot和linux内核移植实验手册
- linux外文翻译内含中英文
- 暴包括51,stm32,LINUXs三种和美的空调
- 基于Linux的模拟进程调度算法
- GCC中文手册 中国linux论坛man手册翻译
- centos7 linux 获取各个网口速率 占用率
- linux内存管理实验报告
- Linux下在shell脚本中设置锁的命令
- 基于Linux网络聊天室的设计
- linux C 多线程编程典型
- 基于linux和gtk的mp3播放器
- RFID技术的应用与现代物流
- linux 系统cpu、内存、IO等监控脚本
- linux Qt局域网聊天
- 2018马哥教育Linux老王云计算视频
- 嵌入式Linux设备驱动开发笔记--赖永诚
- linux下的设计QT计算器
评论
共有 条评论