目前日期文章:201501 (6)

瀏覽方式: 標題列表 簡短摘要

根據下列網站,練習了一下 the user level input subsystem

http://thiemonge.org/getting-started-with-uinput

 

以下為source code,其效果為 ubtune 桌面上的 Terminal會秀出 "ddddd"

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <fcntl.h>

#include <errno.h>

#include <linux/input.h>

#include <linux/uinput.h>

 

 

int main(void)

{

int fd;

int ret;

struct uinput_user_dev uidev;

struct input_event ev;

int i;

 

// open /dev/uinput device

fd=open("/dev/uinput",O_WRONLY | O_NONBLOCK);

if(fd<0){

printf("open uinput fail \r\n");

exit(EXIT_FAILURE);

}

printf("open uinput successfully \r\n");

 

//

ret=ioctl(fd,UI_SET_EVBIT,EV_SYN);

if(ret<0){

printf("ioctl EV_SYN fail \r\n");

exit(EXIT_FAILURE);

}

 

//

ret=ioctl(fd,UI_SET_EVBIT,EV_KEY);

if(ret<0){

printf("ioctl EV_KEY fail \r\n");

exit(EXIT_FAILURE);

}

 

ret=ioctl(fd,UI_SET_KEYBIT,KEY_D);

if(ret<0){

printf("ioctl KEY_D fail \r\n");

exit(EXIT_FAILURE);

}else{

printf("ioctl KEY_D ok \r\n");

}

 

 

memset(&uidev, 0, sizeof(uidev));

 

snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "yps-sample");

uidev.id.bustype = BUS_USB;

uidev.id.vendor = 0x1234;

uidev.id.product = 0xfedc;

uidev.id.version = 1;

 

ret = write(fd, &uidev, sizeof(uidev));

if(ret<0){

printf("write uidev fail \r\n");

exit(EXIT_FAILURE);

}else{

printf("write uidev ok \r\n");

}

 

ret = ioctl(fd, UI_DEV_CREATE);

if(ret<0){

printf("UI_DEV_CREATE fail \r\n");

exit(EXIT_FAILURE);

}else{

printf("UI_DEV_CREATE ok \r\n");

}

sleep(2); // must wait UI_DEV_CREATE ready

 

for(i = 0; i <5; i++) { // sleep 1 s than loop

printf("i=%d \r\n",i);

 

// key press

memset(&ev, 0, sizeof(ev));

ev.type = EV_KEY;

ev.code = KEY_D;

ev.value = 1;

ret = write(fd, &ev, sizeof(ev));

if(ret<0){

printf("KEY_D press fail \r\n");

exit(EXIT_FAILURE);

}else{

printf("KEY_D press ok \r\n");

}

 

 

memset(&ev, 0, sizeof(ev));

ev.type = EV_SYN;

ev.code = SYN_REPORT;

ev.value = 0;

 

ret = write(fd, &ev, sizeof(ev));

if(ret<0){

printf("KEY_D sync \r\n");

exit(EXIT_FAILURE);

}else{

printf("KEY_D sync ok \r\n");

}

usleep(15000);

 

 

// key release

memset(&ev, 0, sizeof(ev));

ev.type = EV_KEY;

ev.code = KEY_D;

ev.value = 0;

 

ret = write(fd, &ev, sizeof(ev));

if(ret<0){

printf("KEY_D release fail \r\n");

exit(EXIT_FAILURE);

}else{

printf("KEY_D release ok \r\n");

}

 

 

memset(&ev, 0, sizeof(ev));

ev.type = EV_SYN;

ev.code = SYN_REPORT;

ev.value = 0;

 

ret = write(fd, &ev, sizeof(ev));

if(ret<0){

printf("EV_SYN SYN_REPORT fail \r\n");

exit(EXIT_FAILURE);

}else{

printf("EV_SYN SYN_REPORT ok \r\n");

}

 

usleep(15000);

 

 

 

}

 

printf("loop end \r\n");

sleep(1);

ret = ioctl(fd, UI_DEV_DESTROY);

if(ret<0){

printf("UI_DEV_DESTROY fail \r\n");

exit(EXIT_FAILURE);

}else{

printf("UI_DEV_DESTROY ok \r\n");

}

 

close(fd);

 

return;

}

文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

99元的小米LED燈到底有多亮呢?
今天特地來做個測試,首先在電腦房將電燈全部關掉
將電腦房正個電燈燈都關掉後,整個亮度如下:

DSC00464_tn  

接下來將小米LED接在小米10400行動電源上,將小米LED燈角度分別為朝下、朝前各拍一張照片

當小米LED燈朝下的時,可以照亮一塊60x60的磁磚,看來用來烤肉應該不錯!

DSC00466_tn

 

朝前的亮度更是不得了,可以照亮前方正面牆,看來用來露營也不錯!

DSC00467_tn

 

測試結論,小米LED加上小米10400行動電源,根本就是LED緊急照明燈的替代方案!

 

 

 

文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

Android(4.4.2) Touch Driver Implement

要開發Android Touch driver,就軟體部分必須先了解以下幾點
.Linux Driver Architecture
.Linux Input Subsystem
.The User Level Input Subsystem

就硬體部分,必須了解Touch panel的運作原理
基本上Touch硬體的運作方式算是比較單純的,通常來說在Touch硬體介面來說都是走I2C或是SPI,其中又以I2C介面佔大宗。除了I2C之外,還會有Power pin用來提供電給touch panel,接著就是比較重要的 IRQ pin、RESET pin;當使用這觸摸到 Touch是,Touch硬體經過抖動他的IRQ pin讓HOST端知道Touch被觸摸了,接著HOST touch driver就必須經由 ISR 經由I2C介面去跟Touch module讀取x,y座標值等資料,並回報給OS讓OS知道座標相關資訊,進而移動滑鼠。

硬體工作原理說完了,接著來說說軟體部分

.Linux Driver Architecture
有關Linux Driver Architecture部分,這是屬於比較基本的linux driver架構,市面上很多書籍或是網站都可以找到相關資料,讀者可以自己嘗試去寫一隻簡單的 character device driver,嘗試秀出一些訊息玩玩看,基本上可以將 dirver compile出來並順利insmod,應該就沒有甚麼問題了。

.Linux Input Subsystem
至於input subsystem部分,我在網路上找的一個非常好的文章,讀者可以看看,並照著做做看
http://www.linuxjournal.com/article/6396
但因為linuxjournal這篇文章是在linux kernel還是在 2.5左右時寫的,如果你的linux kernel 已經是3.0左右的版本,有一些code的部分就必須修改,我把修改的 code放在 https://github.com/Ypsclub/register 有需要的人可以參考看看

基本上如果你讀完http://www.linuxjournal.com/article/6396 文章,你將會知道:

.Driver先跟input core註冊,input core透過 handler與 user space溝通。
.input.h中 input_event資料結構中time,type,code,value意義跟用法。
.在driver,input core, handler之間的互動是透過 events方式,這讓user space可以透過 event handlers方式來與硬體互動。
.input core exports有用的 /proc 檔案系統介面可用來看目前有哪些裝置與handler已經active, /proc/bus/input/devices
.當touch driver成功載起後,在/dev/input目錄下將會有與 /proc/bus/input/devices 中 handler相對應的device node出現,比如 mouse 0,event2。
.學會如何回報座標給OS,並讓鍵盤自動輸入字母與座標自動移動
.用 init_input_dev()跟input core註冊device.
.在device driver裡利用input_event送 events到 input_core。
.呼叫input_sync通知 event handler,裝置有資料要傳輸。

 

---待續---


.The User Level Input Subsystem
可以參考 http://thiemonge.org/getting-started-with-uinput 網站,裡面有詳細敘述如何寫一個user level input subsystem程式,

 

---待續---

文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

一直都沒有時間翻一翻花盆池,這次一翻,不得了...

2015-01-04 17.48.517  

蝦卵這麼多,到時候過年搞不好可以擺一攤了

 

文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(4) 人氣()

DSC00021

DSC00023

DSC00035

DSC00045

DSC00047

DSC00050

 

DSC00055

DSC00078

DSC00092

DSC00094

DSC00111

DSC00127

DSC00133

DSC00148

DSC00153

DSC00162

 

 

文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

The Linux USB Input Subsystem 練習

請參考以下網站 -The Linux USB Input Subsystem, Part I
http://www.linuxjournal.com/article/6396
但由於網站上的linux kernel是 2.5的,如果你的 kernel是3.2以上(用uname -rv指令觀看),有些部分需要修改
網站上提到的Listing 1. event-dev-struct.txt,應該是 input.h位於
kernle/include/linux/input.h
Listing 2. register.c 內容針對 kernel 3.2以上要修改為以下內容

Listing 3. aaaabbbb.c 內容針對 kernel 3.2以上要修改為以下內容

Listing 4. squares.c 內容針對 kernel 3.2以上要修改為以下內容

 https://github.com/Ypsclub/register

文章標籤

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()