資源簡(jiǎn)介
基于海思平臺(tái)Hi3559AV00的韋根輸入項(xiàng)目源碼。包含C源代碼,Makefile以及編譯說明。
推薦使用WGNET轉(zhuǎn)換器進(jìn)行測(cè)試。
推薦使用WGNET轉(zhuǎn)換器進(jìn)行測(cè)試。

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
//#include?
#include?
#include?
#include?
#define?WIEGAND_MAJOR 250
#define?TIMER_DELAY HZ/8
#define?DEVICE_NAME “wiegand_in“?
#define?GPIO12_4 (12?*?8?+?4)
#define?GPIO12_2 (12?*?8?+?2)
#define?WG_DATA0 GPIO12_4
#define?WG_DATA1 GPIO12_2
static?int?wiegand_dev_major?=?WIEGAND_MAJOR;
static?bool?dev_open_flag?=?false;
static?bool?overflow_flag?=?false;
struct?wiegand_dev
{
char?wiegand[34];?//wiegand-34
unsigned?int?data;?//actual?data
unsigned?int?count;?//global?counter
struct?cdev?cdev;
struct?semaphore?sem;
struct?completion?receive_completion;
struct?timer_list?wiegand_timer;
struct?work_struct?pen_event_work;
struct?workqueue_struct?*ts_workqueue;
int?gpio_d0;
int?gpio_d1;
int?d0_irq;
int?d1_irq;
};
struct?wiegand_dev?*wiegand_in_devp?=?NULL;
//使能中斷
static?void?enable_irqs(void)
{
enable_irq(wiegand_in_devp->d0_irq);
enable_irq(wiegand_in_devp->d1_irq);
}
//禁止中斷
static?void?disable_irqs(void)
{
disable_irq(wiegand_in_devp->d0_irq);
disable_irq(wiegand_in_devp->d1_irq);
}
static?char?convert_data(void)
{
int?i;
int?even?=?0;
int?odd?=?0;
//偶校驗(yàn)
for(i=1;?i<=16;?i++)
{
if(wiegand_in_devp->wiegand[i]?==?1)
even++;
}
//偶校驗(yàn)不通過的情況
//偶校驗(yàn):當(dāng)實(shí)際數(shù)據(jù)中1的個(gè)數(shù)為偶數(shù)的時(shí)候,這個(gè)校驗(yàn)位就是0,否則這個(gè)校驗(yàn)位就是1
if(even%2?!=?wiegand_in_devp->wiegand[0])
{
wiegand_in_devp->count?=?0;
goto?error;
}
//奇校驗(yàn)
for(i=17;?i<=32;?i++)
{
if(wiegand_in_devp->wiegand[i]?==?1)
odd++;
}
//奇校驗(yàn)不通過的情況
//奇校驗(yàn):當(dāng)實(shí)際數(shù)據(jù)中1的個(gè)數(shù)為偶數(shù)的時(shí)候,這個(gè)校驗(yàn)位就是1,否則這個(gè)校驗(yàn)位就是0
if(odd%2?==?wiegand_in_devp->wiegand[33])
{
wiegand_in_devp->count?=?0;
goto?error;
}
//奇偶校驗(yàn)通過,將韋根轉(zhuǎn)換為實(shí)際數(shù)據(jù)
wiegand_in_devp->data?=?0;
for(i=1;?i<=32;?i++)
{
wiegand_in_devp->data?<<=?1;
wiegand_in_devp->data?|=?wiegand_in_devp->wiegand[i];
}
wiegand_in_devp->count?=?0;
printk(“data?is:?%#x\n“?wiegand_in_devp->data);
return?0;
error:
printk(“parity?efficacy?error\n“);
return?-1;
}
static?void?wiegand_do_timer(unsigned?long?arg)
{
int?i?=?0;
//雖然超時(shí)時(shí)間已到達(dá),但還要等待維根數(shù)據(jù)傳送完畢才進(jìn)行轉(zhuǎn)換
//wait_for_completion(&(wiegand_in_devp->receive_completion));
printk(“%d\n“?wiegand_in_devp->count);
for(i=0;?icount;?i++)
printk(“%d?“?wiegand_in_devp->wiegand[i]);
printk(“\n“);
//如果不是數(shù)據(jù)位不是34(由于中斷中有限制,實(shí)際上不會(huì)超過,只能小于34),則返回全F代表出錯(cuò)
if(wiegand_in_devp->count?!=?34)
{
wiegand_in_devp->count?=?0;
wiegand_in_devp->data?=?0xFFFFFFFF;?//全F代表出錯(cuò)
up(&wiegand_in_devp->sem);
overflow_flag?=?false;
return;
}
//關(guān)閉外部中斷,防止wiegand_data在轉(zhuǎn)換期間發(fā)生變化
disable_irqs();
//如果轉(zhuǎn)換錯(cuò)誤,則返回全F代表出錯(cuò)
if(convert_data()?!=?0)
{
wiegand_in_devp->data?=?0xFFFFFFFF;?//全F代表出錯(cuò)
}
overflow_flag?=?false;
up(&wiegand_in_devp->sem);
//恢復(fù)中斷
enable_irqs();
}
stat
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????2253??2020-02-27?14:45??wiegand_in\drv\Makefile
?????文件????????381??2020-02-27?14:48??wiegand_in\drv\readme.txt
?????文件??????10702??2020-03-02?17:14??wiegand_in\drv\wiegand_in.c
?????目錄??????????0??2020-03-02?17:46??wiegand_in\drv
?????目錄??????????0??2020-02-27?14:45??wiegand_in
-----------?---------??----------?-----??----
????????????????13336????????????????????5
評(píng)論
共有 條評(píng)論