精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux下被遺忘的gpio_keys按鍵驅動

系統(tǒng) Linux
我們新項目硬件設計上使用gpio口做按鍵,所以我就需要搞定這個驅動,本來想自己寫一個gpio口的按鍵驅動,然后看了下內核下面的代碼,已經有現成的了。

 [[406543]]

我們新項目硬件設計上使用gpio口做按鍵,所以我就需要搞定這個驅動,本來想自己寫一個gpio口的按鍵驅動,然后看了下內核下面的代碼,已經有現成的了。Linux內核下游很多很多的現成驅動,只要你想得到的,基本都是有現成的,當然了,不包括一些非正常的需求性問題,學會在Linux下找驅動,看驅動和內核代碼,我覺得是一件享受和快樂的事情。

不過我還是在使用這個驅動上遇到了問題。

1. 先說ADC 按鍵

之前的文章有寫過adc按鍵的實現,無非就是為了省點GPIO口。

RK 利用SARADC 來做多個按鍵

2. GPIO 按鍵硬件原理圖

3. 驅動代碼

  1. kernel-4.4/drivers/input/keyboard/gpio_keys.c 

完整代碼可查看 

  1. https://gitee.com/weiqifa/gpio_key/blob/master/gpio_keys.c 

驅動代碼流程,從probe處開始

剛開始的時候,我連dts文件都不會寫,因為之前沒有接觸過這個驅動。然后看了gpio_keys_get_devtree_pdata函數,之后又看了內核代碼下其他項目其他平臺的dts文件,才知道怎么寫這個驅動的dts文件。

實話說,這個驅動完成了很多我們需要的功能,比如防抖,比如中斷,比如按鍵label等等。

3.1 gpio_keys_get_devtree_pdata 函數解析dts文件

這個文件解析的dts 有兩種方式,一種是直接傳入irq的,一種是只傳入gpio口的。

我們的這個項目,就只傳入了gpio口。

3.2 gpio_keys_setup_key 函數

這個函數用來設置gpio口的中斷的,直接看代碼會比較清楚。

下面這個函數,我還沒有想清楚它的作用,看了回調函數里面的實現,是為了把開啟的工作隊列停止掉。但是我加了打印并沒有打印,我猜測是為了防止誤觸發(fā),就是按鍵按下的時間非常短的時候,才會調用這個。 

  1. /**  
  2.  * devm_add_action() - add a custom action to list of managed resources  
  3.  * @dev: Device that owns the action  
  4.  * @action: Function that should be called  
  5.  * @data: Pointer to data passed to @action implementation  
  6.  *  
  7.  * This adds a custom action to the list of managed resources so that  
  8.  * it gets executed as part of standard resource unwinding.  
  9.  */  
  10. int devm_add_action(struct device *dev, void (*action)(void *), void *data)  
  11.  
  12.  struct action_devres *devres;  
  13.  devres = devres_alloc(devm_action_release,  
  14.          sizeof(struct action_devres), GFP_KERNEL);  
  15.  if (!devres)  
  16.   return -ENOMEM; 
  17.  devres->datadata = data;  
  18.  devres->actionaction = action;  
  19.  devres_add(dev, devres);  
  20.  return 0;  

3.3 驅動修改

驅動修改的代碼如下 

  1. --- a/kernel-4.4/drivers/input/keyboard/gpio_keys.c  
  2. +++ b/kernel-4.4/drivers/input/keyboard/gpio_keys.c  
  3. @@ -32,6 +32,11 @@  
  4.  #include <linux/of_irq.h>  
  5.  #include <linux/spinlock.h>  
  6.  
  7. +#define LOG_TAG "[BUTTON]: %s() line: %d "  
  8. +#define PRINTK_T(fmt, args...)  printk(KERN_INFO LOG_TAG fmt, __FUNCTION__, __LINE__,  ##args)  
  9.  
  10.  
  11.  struct gpio_button_data {  
  12.         const struct gpio_keys_button *button;  
  13.         struct input_dev *input;  
  14. @@ -462,9 +467,8 @@ static int gpio_keys_setup_key(struct platform_device *pdev,  
  15.         spin_lock_init(&bdata->lock);  
  16.         if (gpio_is_valid(button->gpio)) {  
  17.  
  18. -               error = devm_gpio_request_one(&pdev->dev, button->gpio,  
  19. -                                             GPIOF_IN, desc);  
  20. +               PRINTK_T("gpio:%d\n",button->gpio);  
  21. +               error = devm_gpio_request(&pdev->dev, button->gpio,desc);  
  22.                 if (error < 0) {  
  23.                         dev_err(dev, "Failed to request GPIO %d, error %d\n",  
  24.                                 button->gpio, error);  
  25. @@ -483,7 +487,9 @@ static int gpio_keys_setup_key(struct platform_device *pdev,  
  26.                 if (button->irq) {  
  27.                         bdata->irq = button->irq;  
  28.                 } else {  
  29. +                       gpio_direction_input(button->gpio);  
  30.                         irq = gpio_to_irq(button->gpio);  
  31. +                       PRINTK_T("===weiqifa=== irq :%d\n",irq);  
  32.                         if (irq < 0) {  
  33.                                 error = irq 
  34.                                 dev_err(dev,  
  35. @@ -540,8 +546,10 @@ static int gpio_keys_setup_key(struct platform_device *pdev,  
  36.         if (!button->can_disable)  
  37.                 irqflags |= IRQF_SHARED;  
  38. -       error = devm_request_any_context_irq(&pdev->dev, bdata->irq,  
  39. -                                            isr, irqflags, desc, bdata);  
  40. +       PRINTK_T("===weiqifa=== devm_request_threaded_irq()\n");  
  41. +       error = devm_request_threaded_irq(&pdev->dev, bdata->irq,NULL,  
  42. +                                            isr, irqflags| IRQF_ONESHOT, desc, bdata);  
  43.         if (error < 0) {  
  44.                 dev_err(dev, "Unable to claim irq %d; error %d\n",  
  45.                         bdata->irq, error);  
  46. @@ -709,6 +717,8 @@ static int gpio_keys_probe(struct platform_device *pdev)  
  47.         int i, error;  
  48.         int wakeup = 0  
  49. +       PRINTK_T("start.\n"); 
  50.  
  51.         if (!pdata) {  
  52.                 pdata = gpio_keys_get_devtree_pdata(dev);  
  53.                 if (IS_ERR(pdata))  
  54. @@ -779,6 +789,8 @@ static int gpio_keys_probe(struct platform_device *pdev)  
  55.         device_init_wakeup(&pdev->dev, wakeup);  
  56. +       PRINTK_T("end.\n"); 
  57.  
  58.         return 0;  
  59.  err_remove_group: 

可以確定的是,如果不修改的話,肯定是會出錯的。

你要知道,這個驅動是在2005年就完成編寫了,中間經過了多少次的系統(tǒng)升級,而且很多廠商主推的還是ADC按鍵驅動,GPIO口驅動默認情況下是會被拋棄的,廠商釋放的SDK根本就不會記得修改這個驅動代碼,所以別以為你的手機運行正常里面就沒有bug,bug無處不在,只是我們有了重啟大法而已。

4. dts 代碼 

  1. gpio-keys {  
  2.    compatible = "gpio-keys" 
  3.    #address-cells = <1> 
  4.    #size-cells = <0> 
  5.    autorepeat; 
  6.     //pinctrl-names = "default" 
  7.    //pinctrl-0 = <&pwrbtn> 
  8.    button@0 {  
  9.      gpios = <&pio 49 IRQ_TYPE_EDGE_BOTH> 
  10.      linux,code = <KEY_F13> 
  11.      label = "GPIO F13 Power" 
  12.      linux,input-type = <1> 
  13.      gpio-key,wakeup = <1> 
  14.      debounce-interval = <100> 
  15.    };  
  16.    button@1 {  
  17.      gpios = <&pio 48 IRQ_TYPE_EDGE_BOTH> 
  18.      linux,code = <KEY_F14> 
  19.      label = "GPIO F14 Power" 
  20.      linux,input-type = <1> 
  21.      gpio-key,wakeup = <1> 
  22.      debounce-interval = <100> 
  23.    };  
  24.    button@2 {  
  25.      gpios = <&pio 51 IRQ_TYPE_EDGE_BOTH> 
  26.      linux,code = <KEY_F15> 
  27.      label = "GPIO F15 Power" 
  28.      linux,input-type = <1> 
  29.      gpio-key,wakeup = <1> 
  30.      debounce-interval = <100> 
  31.    };  
  32.  }; 

5. 測試驅動

燒錄后按下按鍵,可以看到鍵值上報.

 

 

責任編輯:龐桂玉 來源: 良許Linux
相關推薦

2021-11-29 07:55:45

Linux GPIO Linux 系統(tǒng)

2022-04-22 11:16:35

Linux工具命令

2024-03-27 13:03:27

AI技術論壇

2009-08-12 09:02:52

Linux未來LinuxWindows

2009-09-03 09:08:08

Linuxroot密碼遺忘

2020-07-20 11:23:24

信息安全個人信息數據安全

2014-10-28 10:53:39

UNIX

2022-05-17 14:17:50

物理安全網絡攻擊網絡安全

2022-08-22 07:08:12

敏捷開發(fā)軟件

2017-11-21 09:10:54

Linux命令行技巧

2020-10-14 09:41:02

Hi3861GPIO點燈

2009-04-24 10:57:25

2011-01-06 16:29:08

linuxtasklet機制

2011-01-05 13:00:19

2021-03-05 11:52:50

LinuxSPI驅動詳解

2020-11-02 12:07:11

鴻蒙 GPIO

2012-06-27 09:43:59

Win RTWin NT

2023-07-10 09:52:51

機器谷歌

2020-04-09 11:03:29

ClouderaHadoopCDP

2022-10-17 11:44:53

C++COMvtable
點贊
收藏

51CTO技術棧公眾號

首页亚洲中字| 欧美人与牲禽动交com| 久久婷婷亚洲| 在线观看不卡av| 欧美一级视频在线| 成人福利片网站| 国产不卡视频在线观看| 国内成人精品一区| 亚洲精品国产精品国自| 国产999精品在线观看| 亚洲高清在线视频| 久久久久天天天天| 男人天堂视频网| 99国产**精品****| 亚洲精品一区二区三区99| 久草资源站在线观看| av资源在线观看免费高清| 精品一区二区三区在线观看国产| 亚洲精品午夜| 亚洲欧美日韩成人高清在线一区| 99精彩视频在线观看免费| 女人十八岁毛片| 999久久久免费精品国产| 欧美美女一区二区| 久久久久久久免费视频| 日av在线播放| 国产精品主播直播| 欧美综合第一页| 久久久精品成人| 久久电影在线| 欧美老肥妇做.爰bbww| 人妻夜夜添夜夜无码av| 91社区在线观看| kk眼镜猥琐国模调教系列一区二区| 国产成人av在线| 欧美黑人一级片| 蜜臀av免费一区二区三区 | 日本午夜精品一区二区| 国产色综合视频| 丝袜亚洲另类欧美综合| 美女精品视频一区| 国产精品无码一区二区三| 亚洲日本中文| 欧美a级一区| 久久综合九色欧美综合狠狠| 成人免费视频在线观看超级碰| 天天爽夜夜爽夜夜爽精品| 中文字幕人成人乱码| 在线视频精品一| 中文字幕在线播放视频| 视频二区欧美毛片免费观看| 欧美在线视频你懂得| 中文字幕一区二区三区四区五区人 | 亚洲欧洲色图| 欧美精品一区二区不卡| 亚洲制服在线观看| 国产原创一区| 在线观看视频一区| 欧美精品第三页| 竹内纱里奈兽皇系列在线观看 | 日本青青草视频| 欧美xxxxx视频| 亚洲欧美中文字幕在线一区| 国产吃瓜黑料一区二区| 国产麻豆一区二区三区| 欧美日韩国产a| 日韩在线不卡一区| 国产成人精品亚洲日本在线观看| 精品久久久久久久久久久久久久 | 亚洲高清无码久久| 2020最新国产精品| 日韩欧美在线一区二区三区| 992kp免费看片| 国产在线视频欧美一区| 3d动漫精品啪啪1区2区免费| 天美一区二区三区| 日韩高清二区| 欧美电视剧在线看免费| 性生交大片免费看l| 久久在线观看| 欧美一区二区视频在线观看2022| 日韩精品aaa| 天堂va欧美ⅴa亚洲va一国产| 日韩一区二区三免费高清| av在线免费观看不卡| 久久伊人精品| 亚洲第一综合天堂另类专| 欧美夫妇交换xxx| 最新亚洲精品| 亚洲美女精品成人在线视频| 先锋影音av在线| 成人日韩在线| 免费电影一区二区三区| 欧美一区二区三区四区五区| 亚洲欧美激情一区二区三区| 伊人精品综合| 日韩精品极品视频| 国产老熟女伦老熟妇露脸| 亚州精品视频| 色777狠狠综合秋免鲁丝| 日本中文字幕免费在线观看| 亚洲精选国产| 国产精品国内视频| 99这里有精品视频| 91亚洲国产成人精品一区二区三| 日韩av电影免费在线观看| 午夜视频在线免费观看| 伊人色综合久久天天人手人婷| 黄页网站在线观看视频| 午夜无码国产理论在线| 欧美剧在线免费观看网站 | 免费一级肉体全黄毛片| 99精品久久| 国产乱肥老妇国产一区二| av在线亚洲天堂| 久久蜜臀精品av| 亚洲一区二区免费视频软件合集 | 国产亚洲精品bt天堂精选| 色中文字幕在线观看| 高清在线视频不卡| 51午夜精品国产| 影音先锋人妻啪啪av资源网站| 免费欧美视频| 草民午夜欧美限制a级福利片| 日本网站在线免费观看| 国精产品一区一区三区mba桃花| 国产精品久久久久久久久久久久午夜片 | 三级毛片在线免费看| 国产精品久久久久久久久果冻传媒| 国产欧美日韩网站| 日韩avxxx| av片哪里在线观看| 色8久久精品久久久久久蜜| 日韩久久久久久久久久久| 影视先锋久久| 久久久久久国产精品| 在线观看毛片av| 91女人视频在线观看| 国产制服91一区二区三区制服| 亚洲www免费| 亚洲精品国产福利| 久久久久成人片免费观看蜜芽| 久热成人在线视频| 免费99视频| 色老头在线观看| 欧洲一区二区三区免费视频| 小毛片在线观看| 欧美激情第二页| 国产日产欧美a一级在线| 国产午夜在线观看| 黄色一区二区在线| 超碰人人cao| 天天综合精品| 国产精品日韩欧美大师| 你懂的在线看| 一本大道久久a久久综合| 女同性αv亚洲女同志| 日韩免费av| 国产精品毛片a∨一区二区三区|国 | 亚洲色图另类专区| www.久久久精品| 欧美日韩亚洲在线观看| 97视频在线观看亚洲| 亚洲黄色在线免费观看| 亚洲精品ww久久久久久p站| 亚洲一区二区福利视频| 日韩国产综合| 国产精品丝袜一区二区三区| a√资源在线| 欧美视频一二三区| 亚洲精品天堂网| 久久av中文字幕片| 小说区视频区图片区| 成人在线观看免费播放| 最近2019年手机中文字幕| 国产91av在线播放| 国产精品系列在线| 中文字幕在线观看日 | 91电影在线播放| 日韩欧美一区二区在线| 国产黄色网址在线观看| 久久精品日韩欧美| 亚洲精品久久区二区三区蜜桃臀| 成人福利一区二区| 色偷偷偷综合中文字幕;dd| 一级特黄aa大片| 亚洲精品国产精品乱码不99| 无套内谢丰满少妇中文字幕| 亚洲午夜极品| 女人一区二区三区| 一区在线影院| 久久精品人人爽| 亚洲女人18毛片水真多| 好吊成人免视频| 秋霞网一区二区三区| 极品美女销魂一区二区三区免费| 欧美性视频在线播放| 国产一区二区三区亚洲| 国产91色在线免费| 黄网站免费在线观看| 亚洲成人激情视频| 欧美亚洲另类小说| 国产欧美一二三区| 日本人妻一区二区三区| 久久午夜电影| 中国黄色录像片| 日韩有码中文字幕在线| 欧美亚洲视频一区二区| 日本三级在线播放完整版| 欧美人与z0zoxxxx视频| 麻豆视频在线免费看| 97久久精品人人做人人爽| 91福利国产成人精品播放| 欧美日韩天堂| 日本在线视频不卡| 国产精品4hu.www| 国模精品视频一区二区| 亚洲精品承认| 精品视频在线播放免| 国产在成人精品线拍偷自揄拍| 亚洲欧美日韩小说| 给我看免费高清在线观看| 国产精品一色哟哟哟| 成人免费无码av| 一区免费在线| 欧美aaa在线观看| 啪啪亚洲精品| 国产精品三区在线| 在线高清欧美| 国产精品第三页| 啦啦啦中文在线观看日本| 一区二区三区视频免费| 西西人体44www大胆无码| 中文字幕一区二区三区四区久久 | 亚洲人久久久| 日韩美女毛片| www.久久草| 农村妇女一区二区| 日产精品99久久久久久| av成人福利| 九九久久国产精品| 青青青青在线| 夜夜躁日日躁狠狠久久88av | 日本少妇一区| 91chinesevideo永久地址| 性欧美video高清bbw| 一区二区三区无码高清视频| 天堂在线资源库| 日韩免费观看高清完整版在线观看| 国产偷人爽久久久久久老妇app| 福利视频一区二区| 国产成人无码精品久久久久| 一区二区三区欧美| 日本黄色片免费观看| 国产精品国产三级国产三级人妇| 无码人妻精品一区二区三应用大全| 成人国产免费视频| 在线中文字日产幕| 国产成人aaa| 91精品人妻一区二区三区蜜桃2| 国产美女av一区二区三区| 国产精品无码av无码| 老司机午夜精品视频| 午夜肉伦伦影院| 午夜一级久久| 成年人视频在线免费| 毛片一区二区| 色婷婷综合久久久久中文字幕| 精品9999| 欧美一区二区三区爽大粗免费| 国产精品普通话对白| 夫妻免费无码v看片| 一区二区三区四区五区精品视频| 免费一级特黄毛片| 国产视频亚洲| 男人天堂1024| 日韩精品电影一区亚洲| 色免费在线视频| 国产乱码精品一区二区三区av| 日本在线不卡一区二区| 久久精品人人做人人综合| 香蕉成人在线视频| 亚洲成人黄色影院| 中文字幕日日夜夜| 欧美精品一区二区精品网| 成人影院免费观看| 色综合久久中文字幕综合网小说| 女人高潮被爽到呻吟在线观看| 亚洲一区在线观看网站| 亚洲国产一区二区精品视频| 成人影视亚洲图片在线| 福利视频免费在线观看| 日韩激情一二三区| 可以看的av网址| 国产亚洲综合在线| 麻豆亚洲av成人无码久久精品| 日本韩国欧美一区| 亚洲第一色视频| 中文字幕亚洲欧美一区二区三区| 暧暧视频在线免费观看| 91精品久久久久久久久青青| 欧美日韩一区二区三区四区不卡 | 亚洲一区在线观看免费| 91精品国产乱码久久久久久蜜臀 | 日本在线免费| 国产69精品久久久久久| 不卡一区视频| 欧美亚洲免费在线| 极品av少妇一区二区| 亚洲第一天堂久久| 久久久精品国产免大香伊 | 日本在线免费网| 日本一区二区在线播放| 激情亚洲另类图片区小说区| 免费观看黄色的网站| 日韩电影在线观看网站| 亚洲最大的黄色网| 一区二区三区四区乱视频| 中文字幕有码视频| 亚洲欧美国产精品va在线观看| 黄色在线观看视频网站| 成人免费自拍视频| 手机在线一区二区三区| 亚洲激情在线观看视频| 久久久久青草大香线综合精品| 日韩人妻无码一区二区三区99| 日韩视频一区二区三区在线播放| avtt亚洲| 国产欧美精品一区二区三区介绍| 激情五月综合| 亚洲精品一二三四五区| 久久综合久久综合久久综合| 国产在线视频二区| 精品国产一区二区国模嫣然| 2024最新电影免费在线观看| 国产在线观看精品一区二区三区| 日韩一级毛片| 天美星空大象mv在线观看视频| 国产亚洲精品7777| 免费一级a毛片| 国产亚洲精品美女久久久| 精品日韩视频| 亚洲午夜精品一区二区| 久久精品理论片| 永久免费看片直接| 欧美人动与zoxxxx乱| 黄色网页在线看| 91九色偷拍| 好吊日精品视频| 性久久久久久久久久久| 午夜久久久久久久久| 性感美女一级片| 免费国产自久久久久三四区久久| 亚洲国产欧美不卡在线观看| 青青草97国产精品免费观看无弹窗版| 受虐m奴xxx在线观看| 91成人看片片| 天堂аⅴ在线地址8| 成人黄色在线免费| 欧美私人啪啪vps| 北岛玲一区二区| 欧洲在线/亚洲| www免费视频观看在线| 鬼打鬼之黄金道士1992林正英| 亚洲香蕉网站| 亚洲乱码国产乱码精品精大量| 一本大道久久a久久综合婷婷| av在线播放网站| 亚洲a级在线播放观看| 一区福利视频| 免费一级做a爰片久久毛片潮| 欧美日产国产精品| 麻豆福利在线观看| 日本最新一区二区三区视频观看| 久久国产精品无码网站| 精品一区在线视频| 亚洲欧美在线第一页| 综合久草视频| 精品国产一二三四区| 国产精品国产a级| 人妻妺妺窝人体色www聚色窝| 国产精品吊钟奶在线| 欧美福利电影在线观看| 欧美做受喷浆在线观看| 欧美精品 国产精品| 国产精品vvv| 国产福利片一区二区| 99久免费精品视频在线观看| www.久久网| 欧美激情奇米色| 国产探花一区| 伊人久久久久久久久| 在线视频一区二区免费| 久久av色综合| 亚洲激情一区二区三区| 成人免费电影视频| 一区二区久久精品66国产精品 | 久久成人国产精品入口| 伊人久久五月天| 精品国产导航|