任務1: 輸入子系統
按鍵設備、觸摸屏設備、三軸加速計設備、鼠標設備、標準鍵盤設備……。
輸入子系統: 統一形態各異的輸入設備。
輸入子系統使用步驟
1. ?定義某一個結構體或者動態分配某一個結構體
2. ?根據結構體成員,進行初始化賦值
3. ?注冊輸入子系統
4. ?當按鍵按下時,再根據輸入子系統核心的層的標準函數進行按鍵值上報。
5. ?驅動卸載時,再將輸入子系統注銷掉。
應用讀取的輸入子系統標準結構體:
輸入子系統上報(重定向系統標準輸入):
[root@tiny4412 code]#exec 0
上報觸摸屏標準坐標
觸摸屏上報的值有哪些? X坐標值、Y坐標值、壓力值(代表觸摸屏按下或者松開)。
絕對坐標不只是觸摸屏: 觸摸屏驅動上報的時候,需要增加一些標志信息。
Tslib庫運用
編譯的步驟:
1. ?解壓…….
2. ?生成配置文件: [root@wbyq tslib-master]# ./autogen.sh
3. ?生成Makefile:
[root@wbyq tslib-master]# ./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=$PWD/tslib
4. ?編譯并安裝
[root@wbyq tslib-master]# make && make install
5. ?并將編譯好的文件拷貝到開發板對應目錄下
6. ?修改etc/ts.conf文件 ,將第2行注釋去掉,刪除多余的空格(頂格)
7. ?拷貝ts插件目錄到開發板上
8. ?設置tslib使用的環境變量
安裝rpm后綴的安裝包:
[root@wbyq Packages]# rpm -ivh <包名稱>.rpm
獲取系統環境變量的函數
#include
char *getenv(const char *name);
參數: const char *name :環境的名稱。
返回值: 獲取到環境變量里的字符串數據。
#include
#include
int main()
{
char *p=getenv("PATH");
printf("p=%s\n",p);

return 0;
}
1. ?按鍵輸入子系統方式上報編寫一次
2. ?觸摸屏也是用輸入子系統方式編寫一次
3. ?移植tslib庫。
4. ?繼續做: 數碼相冊。
動態庫處理函數
#include
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
用法示例:
handle=dlopen("lib123.so", int flag);
void (abc*)(int,int);
abc=dlsym(handle,"abc");
abc(12,45);
int main()
{
abc(12,45);
}
gcc 456.c -L/work -l123
觸摸屏的驅動上報:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct i2c_client *touch_client=NULL; static struct input_dev *ft5x06_touch_dev=NULL; /*工作處理函數*/ static void tiny4412_work_func(struct work_struct *work) { /*讀取觸摸屏的坐標值*/ u8 buff[7]; u32 x,y; i2c_smbus_read_i2c_block_data(touch_client,0,7,buff);/*讀取第一個點*/ x=(buff[3]&0xF)<<8|buff[4]; y=(buff[5]&0xF)<<8|buff[6]; if(buff[2]&0xF) /*判斷是否按下*/ { input_report_abs(ft5x06_touch_dev,ABS_PRESSURE,1); input_report_key(ft5x06_touch_dev,BTN_TOUCH,1); printk("x=%d,y=%d,ABS_PRESSURE=%d\n",x,y,1); } else { input_report_abs(ft5x06_touch_dev,ABS_PRESSURE,0); input_report_key(ft5x06_touch_dev,BTN_TOUCH,0); printk("x=%d,y=%d,ABS_PRESSURE=%d\n",x,y,0); } input_report_abs(ft5x06_touch_dev,ABS_X,x); input_report_abs(ft5x06_touch_dev,ABS_Y,y); /*將輸入的信息同步給事件層*/ input_sync(ft5x06_touch_dev); } /*靜態聲明工作隊列*/ static DECLARE_WORK(touch_wq,tiny4412_work_func); /*觸摸屏的中斷服務函數*/ static irqreturn_t tiny4412_touch_handler(int irq, void *dev) { schedule_work(&touch_wq); /*將工作加入到一個工作隊列里去*/ return IRQ_HANDLED; } static int touch_probe(struct i2c_client *client, const struct i2c_device_id *id) { u8 touch_id; printk("觸摸屏驅動端匹配成功:0x%X\n",client->addr); touch_client=client; /*IIC子系統標準的讀函數*/ i2c_smbus_read_i2c_block_data(client,0xA3,1,&touch_id); /*讀取廠家ID*/ printk("廠家ID=%d\n",touch_id); /*動態分配一個輸入子系統結構體*/ ft5x06_touch_dev=input_allocate_device(); /*設置輸入子系統的功能(能力)*/ input_set_capability(ft5x06_touch_dev,EV_ABS,ABS_X); input_set_capability(ft5x06_touch_dev,EV_ABS,ABS_Y); input_set_capability(ft5x06_touch_dev,EV_ABS,ABS_PRESSURE); input_set_capability(ft5x06_touch_dev,EV_KEY,BTN_TOUCH); /*代表當前輸入子系統上報的是觸摸屏坐標*/ /*設置絕對坐標參數*/ input_set_abs_params(ft5x06_touch_dev, ABS_X, 0,800-1, 0, 0); input_set_abs_params(ft5x06_touch_dev, ABS_Y, 0,1280-1, 0, 0); input_set_abs_params(ft5x06_touch_dev, ABS_PRESSURE,0,1,0,0); /*注冊輸入子系統設備*/ input_register_device(ft5x06_touch_dev); /*注冊中斷*/ printk("client->irq中斷號:%d (430)\n",client->irq); int err=request_irq(client->irq,tiny4412_touch_handler,IRQ_TYPE_EDGE_BOTH,client->name,NULL); printk("中斷注冊狀態:%d (0表示成功)\n",err); return 0; } static int touch_remove(struct i2c_client *client) { printk("觸摸屏驅動端卸載成功!\n"); /*釋放中斷號*/ free_irq(client->irq,NULL); /*注銷輸入子系統設備*/ input_unregister_device(ft5x06_touch_dev); /*注銷動態分配的結構體*/ input_free_device(ft5x06_touch_dev); return 0; } static struct i2c_device_id touch_id[]= { {"tiny4412_ft5x06",0}, {} }; static struct i2c_driver touch_driver= { .probe=touch_probe, .remove=touch_remove, .driver= { .name="touch_drv", }, .id_table=touch_id }; static int __init tiny4412_touch_init(void) { /*1. 注冊IIC子系統驅動端*/ i2c_add_driver(&touch_driver); return 0; } static void __exit tiny4412_touch_exit(void) { /*2. 注銷IIC子系統驅動端*/ i2c_del_driver(&touch_driver); } module_init(tiny4412_touch_init); module_exit(tiny4412_touch_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("tiny4412 wbyq");
Linux
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。