資源簡介
基于海思平臺Hi3559AV00的韋根輸入項目源碼。包含C源代碼,Makefile以及編譯說明。
推薦使用WGNET轉換器進行測試。
推薦使用WGNET轉換器進行測試。

代碼片段和文件信息
#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;
//偶校驗
for(i=1;?i<=16;?i++)
{
if(wiegand_in_devp->wiegand[i]?==?1)
even++;
}
//偶校驗不通過的情況
//偶校驗:當實際數據中1的個數為偶數的時候,這個校驗位就是0,否則這個校驗位就是1
if(even%2?!=?wiegand_in_devp->wiegand[0])
{
wiegand_in_devp->count?=?0;
goto?error;
}
//奇校驗
for(i=17;?i<=32;?i++)
{
if(wiegand_in_devp->wiegand[i]?==?1)
odd++;
}
//奇校驗不通過的情況
//奇校驗:當實際數據中1的個數為偶數的時候,這個校驗位就是1,否則這個校驗位就是0
if(odd%2?==?wiegand_in_devp->wiegand[33])
{
wiegand_in_devp->count?=?0;
goto?error;
}
//奇偶校驗通過,將韋根轉換為實際數據
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;
//雖然超時時間已到達,但還要等待維根數據傳送完畢才進行轉換
//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“);
//如果不是數據位不是34(由于中斷中有限制,實際上不會超過,只能小于34),則返回全F代表出錯
if(wiegand_in_devp->count?!=?34)
{
wiegand_in_devp->count?=?0;
wiegand_in_devp->data?=?0xFFFFFFFF;?//全F代表出錯
up(&wiegand_in_devp->sem);
overflow_flag?=?false;
return;
}
//關閉外部中斷,防止wiegand_data在轉換期間發生變化
disable_irqs();
//如果轉換錯誤,則返回全F代表出錯
if(convert_data()?!=?0)
{
wiegand_in_devp->data?=?0xFFFFFFFF;?//全F代表出錯
}
overflow_flag?=?false;
up(&wiegand_in_devp->sem);
//恢復中斷
enable_irqs();
}
stat
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????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
- 上一篇:用QT做的LINUX下串口通信測試可用
- 下一篇:標準的CAD電氣塊圖,經典
評論
共有 條評論