Linux驅動開發_輸入子系統、觸摸屏坐標上報

      網友投稿 851 2022-05-29

      任務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);

      Linux驅動開發_輸入子系統、觸摸屏坐標上報

      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小時內刪除侵權內容。

      上一篇:C語言基礎部分-文件操作
      下一篇:如何成長為一位優秀的技術人?優秀的程序員成長的技術路線都在這呢!
      相關文章
      久久水蜜桃亚洲AV无码精品 | www国产亚洲精品久久久| 亚洲的天堂av无码| 无码乱人伦一区二区亚洲一 | 久久精品国产亚洲av麻豆色欲| 亚洲精品无码久久久久去q| 亚洲精品国产高清嫩草影院| 国产亚洲精彩视频| 精品亚洲成a人在线观看| 欧洲亚洲综合一区二区三区| 国产精品手机在线亚洲| 成a人片亚洲日本久久| 国产精品亚洲片在线花蝴蝶| 亚洲日韩国产AV无码无码精品| 亚洲女女女同性video| 亚洲youwu永久无码精品| 亚洲AV无码一区二区三区网址| 老子影院午夜伦不卡亚洲| 亚洲精品国精品久久99热| 成人午夜亚洲精品无码网站| 亚洲另类激情综合偷自拍图| 亚洲AV无码乱码在线观看富二代| 亚洲福利在线观看| 亚洲综合在线成人一区| 亚洲日本国产综合高清| 亚洲成a人片在线不卡一二三区| 少妇亚洲免费精品| 在线亚洲精品自拍| 亚洲AV一宅男色影视| 91天堂素人精品系列全集亚洲| 亚洲欧洲综合在线| 亚洲中文无码永久免费| 亚洲av无码偷拍在线观看| 深夜国产福利99亚洲视频| 亚洲日韩av无码| 久久亚洲精品无码VA大香大香| 亚洲伊人久久大香线蕉影院| 亚洲一卡2卡3卡4卡5卡6卡| 亚洲狠狠色丁香婷婷综合| 亚洲精品国产自在久久 | 国产亚洲国产bv网站在线|