資源簡介
維根協議驅動程序,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;?i25;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
評論
共有 條評論