• 大小: 8KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-23
  • 语言: 其他
  • 标签: linux  RFID  

资源简介

维根协议驱动程序,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

评论

共有 条评论