色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Linux下編寫zlg7290驅動(3)-鍵盤驅動編寫

Linux下編寫zlg7290驅動(3)-鍵盤驅動編寫 時間:2018-09-25      來源:未知

2.3. 數據處理實現

執(zhí)行上述代碼后系統(tǒng)中就注冊了我們的input設備,接下來我們要做的是活得鍵盤的鍵值,zlg7290多可以支持64個按鍵,每個按鍵按下后都會產生一個中斷,我們寫驅動是可以使用輪詢不斷檢測是否有按鍵也可以觸發(fā)中斷來判斷是否有按鍵按下。本例使用中斷方式,當按鍵按下后會觸發(fā)終端,終端讀取zlg7290相應寄存器,讀出鍵值,然后將鍵值提交給上層。這寫這個中斷處理函數是需要注意,zlg7290是使用i2c總線通信的,但是linux內核提供的i2c數據交互函數i2c_transfer是一個可能引起睡眠的操作,所以不能出現在終端處理函數中,但是我們又需要通過這個函數從設備上讀出我們的鍵值,所以我們在這里需要使用linux內核為我們提供的下半部機制工作隊列。

中斷處理函數:啟動工作隊列

irqreturn_t zlg7290_interrupt(int irq, void *devid)

{

printk("irq = %d\n", irq);

schedule_work(&zlg7290->work);

return IRQ_HANDLED;

}

工作隊列處理函數:中斷返回后執(zhí)行,讀取設備的鍵值并提交給上層。

static void zlg7290_work(struct work_struct *work)

{

struct zlg7290 *ctr_zlg7290 = container_of(work, struct zlg7290, work);

unsigned char val = 0;

size_t len;

unsigned char status = 0;

zlg7290_hw_read(ctr_zlg7290, 1, &len, &status);

if(status & 0x1) {

val = 1;

zlg7290_hw_read(ctr_zlg7290, 1, &len, &val);

if (val == 0) {

val = 3;

zlg7290_hw_read(ctr_zlg7290, 1, &len, &val);

if (val == 0 || val == 0xFF)

goto out;

}

if (val > 56) {

switch (val) {

case 0xFE: val = 57; break;

case 0xFD: val = 58; break;

case 0xFB: val = 59; break;

case 0xF7: val = 60; break;

case 0xEF: val = 61; break;

case 0xDF: val = 62; break;

case 0xBF: val = 63; break;

case 0x7F: val = 64; break;

}

}

input_report_key(ctr_zlg7290->key, key_value[val], 1);

input_report_key(ctr_zlg7290->key, key_value[val], 0);

input_sync(ctr_zlg7290->key);

}

out:

return;

}

input_report_key,提交鍵值到上層,input_sync提交同步事件。類似的函數還有如下:

input_report_rel(struct input_dev *dev, unsigned int code, int value)

input_report_abs(struct input_dev *dev, unsigned int code, int value);

input_report_ff_status(struct input_dev *dev, unsigned int code, int value);

input_report_switch(struct input_dev *dev, unsigned int code, int value);

到此這個鍵盤的驅動就完成了。

2.3. 測試

測試程序如下:

#include

#include

#include

#include

#include

#include

int main(int argc, const char *argv[])

{

struct input_event ev;

int fd = open("/dev/input/event1", O_RDWR);

if (fd < 0) {

perror("open");

exit(1);

}

while(1) {

read(fd, &ev, sizeof(ev));

switch(ev.type)

{

case EV_KEY:

printf("user:key_val = %d %d\n", ev.code, ev.value);

break;

default:

break;

}

}

return 0;

}

執(zhí)行程序后終端會根據不同的按鍵打印出如下內容:

user:key_val = 1 1

user:key_val = 1 0

user:key_val = 2 1

user:key_val = 2 0

user:key_val = 3 1

user:key_val = 3 0

……

user:key_val = 64 1

user:key_val = 64 0

上一篇:Linux下編寫zlg7290驅動(2)--鍵盤驅動編寫

下一篇:Android智能小車視頻圖像解碼解析

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 人妻系列综合第一页 | 日韩午夜精品免费理论片 | 国产九九99久久99大香伊 | 精品国产AV一区二区三区 | 亚洲AV高清在线观看一区二区 | 免费A级毛片无码无遮挡 | 狂猛欧美激情性XXXX大豆行情 | 日本免费一区二区三区四区五区 | 亚洲av线av无码av岛国片 | 日本少妇XXX做受 | 欧美日韩精品一区二区三区在线 | 快播看片毛网站 | 香港特级三A毛片免费观看 国产超碰97人人做人人爱 | 老头把我添高潮了A片故视频 | 精品国产国产综合精品 | 暖暖视频免费高清日本 | 脱了老师的裙子猛然进入 | 色屁屁WWW影院免费观看 | 日本三级吃奶头添泬无码 | 小少妇ASS浓PICS | 日日碰狠狠添天天爽五月婷 | 狠狠做五月深爱婷婷伊人 | 亚洲爆乳AAA无码专区 | 国产无人区卡一卡二卡乱码 | 国产路线1国产路线2022 | 自拍偷在线精品自拍偷 | 亚洲VA在线VA天堂XXXX中文 | 十八禁真人啪啪免费网站 | 最新国产精品视频 | 伊人中文字幕无码专区 | 日本欧美视频在线观看 | 国产超碰无码最新上传 | 亚洲VA999成人A片在线观看 | 日本一区二区免费视频 | 黑人巨茎精品欧美一区二区 | 中文字幕无码乱人伦在线 | 亚洲欧美日韩精品久久 | 佐山爱一区二区中文字幕 | 手机在线观看一区 | 精品黑人一区二区三区 | 欧美最猛黑人XXXX黑人猛交 |