www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]對(duì)于輸入類設(shè)備如鍵盤、鼠標(biāo)、觸摸屏之類的Linux驅(qū)動(dòng),內(nèi)核提供input子系統(tǒng),使得這類設(shè)備的處理變得非常便捷??傮w上來(lái)講,input子系統(tǒng)由三部分組成: 事件驅(qū)動(dòng)《—

對(duì)于輸入類設(shè)備如鍵盤、鼠標(biāo)、觸摸屏之類的Linux驅(qū)動(dòng),內(nèi)核提供input子系統(tǒng),使得這類設(shè)備的處理變得非常便捷??傮w上來(lái)講,input子系統(tǒng)由三部分組成: 事件驅(qū)動(dòng)《——》input核心《——》設(shè)備驅(qū)動(dòng)。

其中事件驅(qū)動(dòng)負(fù)責(zé)與用戶程序打交道,諸如設(shè)備節(jié)點(diǎn)/dev之類的,都由他負(fù)責(zé),我們?cè)趯戲?qū)動(dòng)時(shí)就不用實(shí)現(xiàn)這個(gè)了;設(shè)備驅(qū)動(dòng)負(fù)責(zé)與硬件設(shè)備打交道,這里的交互很簡(jiǎn)單,只需要讀取相關(guān)硬件的數(shù)據(jù),然后拋給input核心就可以了;

舉個(gè)例子,以按鍵key為例,定義了設(shè)備設(shè)備號(hào)、按鍵值,配置管腳和中斷方式,然后申請(qǐng)中斷。在中斷服務(wù)函數(shù)中,讀取對(duì)應(yīng)管腳值,用 input_report函數(shù)發(fā)送給input核心,并用input_sync通知發(fā)送結(jié)束即可。另外,在模塊初始化時(shí),定義一個(gè)input_dev的結(jié)構(gòu)體,這個(gè)input_dev是input子系統(tǒng)設(shè)備驅(qū)動(dòng)端的核心數(shù)據(jù)結(jié)構(gòu),由于輸入設(shè)備多種多樣,就是通過(guò)這個(gè)結(jié)構(gòu)體告訴核心你的輸入設(shè)備類型。

其中的兩個(gè)重要成員,這些宏具體在linux/input.h中定義。

一個(gè)是,evbit,代表事件類型的指示位,常用的如

EV_SYN 0x00 同步事件

EV_KEY 0x01 按鍵事件

EV_REL 0x02 相對(duì)坐標(biāo)

EV_ABS 0x03 絕對(duì)坐標(biāo)

EV_MSC 0x04 其它

EV_LED 0x11 LED

EV_SND 0x12 聲音

EV_REP 0x14 Repeat

EV_FF 0x15 力反饋

EV_PWR 電源

EV_FF_STATUS 狀態(tài)

另一個(gè)是keybit,代表鍵值代碼

其他的還有

relbit 相對(duì)定位

absbit 絕對(duì)定位

mscbit Mouse Systems Corporation,大意是一些廠商使用了5字節(jié)的串口鼠標(biāo)協(xié)議,但微軟使用了一種三字節(jié)協(xié)議,于是廠商造串口鼠標(biāo)時(shí),讓設(shè)備有兩種工作模式,一種是MSC模式,一種是微軟的模式。

ledbit 鍵盤指示燈事件的指示位

sndbit 鍵盤發(fā)出聲音的指示位

ffbit force feedback,強(qiáng)制反饋設(shè)備

swbit switch,設(shè)備切換時(shí)產(chǎn)生的事件

下面就分別給出驅(qū)動(dòng)代碼和測(cè)試程序,以供參考。

驅(qū)動(dòng)代碼:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

// 定義key對(duì)應(yīng)的GPIO

#define GPF0 (S3C2410_GPF(0))

#define GPF1 (S3C2410_GPF(1))

#define GPF2 (S3C2410_GPF(2))

#define GPF4 (S3C2410_GPF(4))

#define KEY_NUM 4

struct input_dev *key_dev;

static struct key_info

{

int irq_no;

int pin;

int pin_setting;

int key_no;

char *name;

}key_info_tab[KEY_NUM]=

{

{IRQ_EINT0,GPF0,S3C2410_GPF0_EINT0,1,"key_1"},

{IRQ_EINT1,GPF1,S3C2410_GPF1_EINT1,2,"key_2"},

{IRQ_EINT2,GPF2,S3C2410_GPF2_EINT2,3,"key_3"},

{IRQ_EINT4,GPF4,S3C2410_GPF4_EINT4,4,"key_4"},

};

// 中斷處理程序

static irqreturn_t hq_eint_key(int irq,void *dev_id)

{

if(irq==17)

{

input_report_key(key_dev,KEY_1,s3c2410_gpio_getpin(GPF1));

}

else if(irq==48)

{

input_report_key(key_dev,KEY_4,s3c2410_gpio_getpin(GPF4));

}

else if(irq==18)

{

input_report_key(key_dev,KEY_2,s3c2410_gpio_getpin(GPF2));

}

else if(irq==16)

{

input_report_key(key_dev,KEY_0,s3c2410_gpio_getpin(GPF0));

}

input_sync(key_dev);input_sync(key_dev);

return IRQ_HANDLED;

}

// 打開(kāi)設(shè)備

static int hq_key_open(struct input_dev *dev)

{

int i;

int err=0;

for(i=0;i

set_irq_type(key_info_tab.irq_no,IRQF_TRIGGER_RISING);

err=request_irq(key_info_tab.irq_no,hq_eint_key,IRQF_SAMPLE_RANDOM,key_info_tab.name,(void *)(&key_info_tab));

if(err)

{

return -1;

}

return 0;

}

// 關(guān)閉設(shè)備

static void hq_key_release(struct input_dev *dev)

{

int i;

for(i=0;i

disable_irq_nosync(key_info_tab.irq_no);

free_irq(key_info_tab.irq_no,(void *)(&key_info_tab));

}

}

//模塊初始化

static int __init hq_key_init(void)

{

int err;

key_dev=input_allocate_device();

if(!key_dev){

return -ENOMEM;

}

set_bit(EV_KEY,key_dev->evbit);

set_bit(KEY_1,key_dev->keybit);

set_bit(KEY_2,key_dev->keybit);

set_bit(KEY_3,key_dev->keybit);

set_bit(KEY_4,key_dev->keybit);

key_dev->name="input_key_demo";

key_dev->dev.init_name="input_key";

key_dev->open=hq_key_open;

key_dev->close=hq_key_release;

err=input_register_device(key_dev);

if(err){

return err;

}

return 0;

}

// 模塊卸載

static void __exit hq_key_exit(void)

{

input_unregister_device(key_dev);

}

MODULE_AUTHOR;

MODULE_LICENSE("Dual BSD/GPL");

module_init(hq_key_init);

module_exit(hq_key_exit);[!--empirenews.page--]

測(cè)試程序:

#include

#include

#include

#include

#include

int main(void )

{

int fd;

int key_value,i=0,count;

struct input_event ev_key;

fd=open("/dev/input/event0",0666);

if(fd<0){

perror("open device");

exit(1);

}

while(1){

count=read(fd,&ev_key,sizeof(struct input_event));

for(i=0;i<(int)count/sizeof(struct input_event);i++)

{

if(EV_KEY==ev_key.type)

{

int num=ev_key.code%10-1;

printf("type:%d,code:%d ,value:%d\n key%d pressed!\n",ev_key.type,ev_key.code,ev_key.value,num);

}

if(EV_SYN==ev_key.type)

printf("syn event\n");

}

}

close(fd);

return 0;

}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在Linux內(nèi)核的廣闊世界中,INPUT子系統(tǒng)框架是處理輸入設(shè)備(如鍵盤、鼠標(biāo)、觸摸屏等)的核心機(jī)制。這一框架不僅簡(jiǎn)化了設(shè)備驅(qū)動(dòng)程序的編寫,還提供了一個(gè)統(tǒng)一的接口來(lái)處理各種輸入事件,使得用戶空間的應(yīng)用程序能夠高效地響應(yīng)用...

關(guān)鍵字: Linux驅(qū)動(dòng) INPUT子系統(tǒng)

一直覺(jué)得C語(yǔ)言較其他語(yǔ)言最偉大的地方就是C語(yǔ)言中的指針,有些人認(rèn)為指針很簡(jiǎn)單,而有些人認(rèn)為指針很難,當(dāng)然這里的對(duì)簡(jiǎn)單和難并不是等價(jià)于對(duì)指針的理解程度。為此在這里對(duì)C語(yǔ)言中的指針進(jìn)行全面的總結(jié),從底層的內(nèi)存分析,徹底讓讀者...

關(guān)鍵字: 微信 C語(yǔ)言 UNSIGNED INCLUDE

1.單線程/進(jìn)程在TCP通信過(guò)程中,服務(wù)器端啟動(dòng)之后可以同時(shí)和多個(gè)客戶端建立連接,并進(jìn)行網(wǎng)絡(luò)通信,但是在介紹TCP通信流程的時(shí)候,提供的服務(wù)器代碼卻不能完成這樣的需求,先簡(jiǎn)單的看一下之前的服務(wù)器代碼的處理思路,再來(lái)分析代...

關(guān)鍵字: ADDR INCLUDE 代碼 TCP

摘要:給出了基于物聯(lián)網(wǎng)技術(shù)設(shè)計(jì)的一種智能家居系統(tǒng)。該系統(tǒng)通過(guò)ZigBee技術(shù)將各種安防設(shè)備和家用電器組建成無(wú)線通信網(wǎng)絡(luò),以實(shí)現(xiàn)無(wú)線數(shù)據(jù)采集和命令控制;同時(shí)使用ARM9高性能處理器S3C2410作為嵌入式網(wǎng)關(guān)和網(wǎng)絡(luò)服務(wù)器,...

關(guān)鍵字: Zigbee S3C2410 GPRS 物聯(lián)網(wǎng) 智能家居

、 引言 在日常代碼測(cè)試或運(yùn)行中,打印日志檢測(cè)代碼運(yùn)行狀態(tài)必不可少。先舉三個(gè)例子: 在物聯(lián)網(wǎng)系統(tǒng)中設(shè)備什么時(shí)候上線,可以將上線的信息寫入數(shù)據(jù)庫(kù),也可以將該設(shè)備上線的記錄打印到日志中,以該設(shè)備的id為文件名,查找日志也比較...

關(guān)鍵字: CURRENT INCLUDE BUF PEN

為什么有時(shí)候?qū)懭胛募膬?nèi)容卻沒(méi)有?沒(méi)什么printf打印在終端的內(nèi)容看不到?這一切背后有著怎樣早為人知的秘密? 今天來(lái)說(shuō)說(shuō)緩沖的事。 也許你已經(jīng)聽(tīng)說(shuō)過(guò)三種緩沖模式,但是今天要講的不止這些。 緩沖 為了減少使用read和w...

關(guān)鍵字: BSP AN BUF INCLUDE

導(dǎo)讀:本文介紹的一種S3C2410路由器的整體結(jié)構(gòu)及工作原理,后詳細(xì)地介紹了其i/o和UART及存儲(chǔ)介質(zhì)三部分功能的具體實(shí)現(xiàn),達(dá)到設(shè)計(jì)S3C2410路由器的目的.在ARM技術(shù)不斷發(fā)展成熟

關(guān)鍵字: 路由器 S3C2410 端口 GP

1 引言SD卡( Secure DigitalMemory Card)是一種基于Flash的新一代存儲(chǔ)器,它著重?cái)?shù)據(jù)存儲(chǔ)的安全、容量和性能,是許多便攜式電子產(chǎn)品如數(shù)碼相機(jī)、手提電話, PDA 等理想的

關(guān)鍵字: S3C2410 SD存儲(chǔ) SD卡 控器

對(duì)于一個(gè)顯示設(shè)備,數(shù)據(jù)的更新率正比于畫面的像素?cái)?shù)和色彩深度的乘積。在嵌入式Linux系統(tǒng)中,受處理器資源配置和運(yùn)算能力的制約,當(dāng)使用大分辨率顯示時(shí)(如在一些屏幕尺寸較

關(guān)鍵字: 調(diào)色板 S3C2410 嵌入式LINUX RGB

1、在jni目錄下新目錄prebuilt,在此目錄下新文件Androidusc.mk(名字隨便取),將第三方庫(kù).so復(fù)制到此目錄2、打開(kāi)Androidusc.mk添加內(nèi)容,例如第三方庫(kù)是libScreenPop.so:

關(guān)鍵字: Android LOCAL INCLUDE SCREEN
關(guān)閉