1. 程式人生 > >Linux核心學習實踐之GPIO面板按鍵

Linux核心學習實踐之GPIO面板按鍵

說明:本分析基於AM6C平臺Linux3.0.8核心,其他核心版本僅供參考。

一、platform設備註冊的按鍵對映

common/customer/boards/board-m6tv-h32.c

static struct adc_key adc_kp_key[] = {
  {KEY_UP,    "vol+",           CHAN_0, 821,  60},//k3  //change by [email protected]
  {KEY_LEFT,     "vol-",           CHAN_0, 648,  60},//k4
  {KEY_UP,       "ch+",            CHAN_0, 464,  60},//k5
  {KEY_DOWN,     "ch-",            CHAN_0, 247,  60},//k6
  {KEY_ENTER,    "power",          CHAN_0, 28,    60},//k7
}
/*
struct adc_key{
  int code;	/* input key code */
  unsigned char *name;
  int chan;
  int value;	/* voltage/3.3v * 1023 */
  int tolerance;
  int gpio_code; 
};
*/
static struct adc_kp_platform_data adc_kp_pdata = {
  .key = &adc_kp_key[0],
  .key_num = ARRAY_SIZE(adc_kp_key),
};
static struct platform_device adc_kp_device = {
  .name = "m1-adckp",
  .id = 0,
  .num_resources = 0,
  .resource = NULL,
  .dev = {
    .platform_data = &adc_kp_pdata,
  }
};
platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
static struct platform_device  *platform_devs[] = {
  ......
  &adc_kp_device,
  ......
}

二、驅動

static struct platform_driver kp_driver = {
  .probe      = kp_probe,
  .remove     = kp_remove,
  .suspend    = NULL,
  .resume     = NULL,
  .driver     = {
    .name   = "m1-adckp",
  },
};
static int __devinit kp_init(void)
{
  printk(KERN_INFO "ADC Keypad Driver init.\n");
  return platform_driver_register(&kp_driver);
}
module_init(kp_init);
//////////////////////////////
static int __devinit kp_probe(struct platform_device *pdev)
{
  struct adc_kp_platform_data *pdata = pdev->dev.platform_data;
  kp = kzalloc(sizeof(struct kp), GFP_KERNEL);
  platform_set_drvdata(pdev, kp);
  kp->input = input_dev;
  kp->cur_keycode = 0;
  kp->tmp_code = 0;
  kp->count = 0;
//註冊工作佇列update_work_func
  INIT_WORK(&(kp->work_update), update_work_func);
//註冊時鐘中斷kp_timer_sr;該時鐘中斷處理程式的底半部為上處工作佇列。
//該底半部由工作佇列排程,因此、執行與程序上下文
  setup_timer(&kp->timer, kp_timer_sr, (unsigned int)kp);
/*
void kp_timer_sr(unsigned long data)
{
  struct kp *kp_data=(struct kp *)data;
  schedule_work(&(kp_data->work_update));
  mod_timer(&kp_data->timer,jiffies+msecs_to_jiffies(10));
}
*/
  mod_timer(&kp->timer, jiffies+msecs_to_jiffies(100));
////////////////////////////
  kp->key = pdata->key;
  kp->key_num = pdata->key_num;
  adckp_set_keypad(kp);
////////////////////////////
}

相關推薦

Linux核心學習實踐GPIO面板按鍵

說明:本分析基於AM6C平臺Linux3.0.8核心,其他核心版本僅供參考。 一、platform設備註冊的按鍵對映 common/customer/boards/board-m6tv-h32.c

Linux 核心裝置驅動GPIO驅動GPIO sysfs支援

需要核心配置CONFIG_GPIO_SYSFS int gpiochip_sysfs_register(struct gpio_device *gdev) {  struct device *dev;  struct device *parent;  struct gpi

Linux 核心裝置驅動GPIO驅動GPIO 管腳新增

在配置CONFIG_OF_GPIO下作用: int of_gpiochip_add(struct gpio_chip *chip) {  int status; if ((!chip->of_node) && (chip->parent))

[基礎篇]ESP8266-NonOS學習筆記(四)GPIO操作(按鍵、LED、中斷、定時器)

  本篇文章我們再回到基礎篇,難道你還以為我會講UDP?啊哈哈哈,UDP肯定是會講的,但是應用場景不是很多,我們放到後面再講,不過也是簡單一講,畢竟熟悉UDP協議的人來說,都知道UDP一種不可靠的傳輸協議,可以這樣形容“我(Client)只管發,你(Server)愛收不收”,所以在一些實際應用場景

linux核心學習網路篇——IP和TCP結構體原始碼

今天只是看一下IP協議的結構體和TCP的結構體所控制的欄位。 首先看一下IP的欄位,就是傳說中ip協議中的包頭欄位。 struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4

我的Linux核心學習

現在回首看看,接觸Linux已經很長時間了。 在大三的時候開始學習Java, 但是一直學Java的話, 感覺有點膩, 就嘗試找點其他東西來學習。 所以當時就選擇學習了Linux。 至於為什麼要學習Linux, 有以下三個原因。  一是我比較喜歡開源的東西, 當時學習Jav

linux核心學習程序和執行緒

Linux程序、執行緒問題 2010年8月15日,今天研究的是Linux的程序管理,昨天是記憶體定址,感慨頗深啊,《深入理解Linux核心》這本書真是浪得虛名,根本沒有說到問題的本質,一些概念的由來、定義、區別以及聯絡,技術的原理,執行過程,整體結構,各部分銜接等等問題統統

Linux核心學習網路裝置

字元裝置、塊裝置、網路裝置是linux中對裝置的三種分類。字元裝置、塊裝置在/dev下是有裝置節點的,而塊裝置是沒有的。對塊裝置的操作是通過一種叫socket的API進行的,這些操作包括了收包(讀)、發包(寫)、設定IP地址等等(IOCTL)。 • 網路裝置的註冊 分配net_device空間,該資料型別表

Linux內核實踐工作隊列

測試數據 daemon 定義 ifd 不同 name auth 過程 上下 工作隊列(work queue)是另外一種將工作推後執行的形式,它和tasklet有所不同。工作隊列可以把工作推後,交由一個內核線程去執行,也就是說,這個下半部分可以在進程上下文中執行。這樣,通過

linux 核心模組程式設計LED驅動程式(六)

我使用的是tiny6410的核心板,板子如下,淘寶可以買到 為了不與板子上的任何驅動發生IO衝突,我使用CON1那一排沒用到的IO口,引腳如下   LED1 LED2 LED3 LED4

linux 核心模組程式設計核心符號匯出(五)

/proc/kallsyms 記錄了核心中所有匯出的符號的名字與地址 我們需要編譯2個核心模組,然後其中一個核心模組去呼叫另一個核心模組中的函式 hello.c程式碼如下 #include <linux/module.h> #include <linux/in

linux 核心模組程式設計模組引數(四)

通過巨集module_param指定模組引數,模組引數用於在載入模組時傳遞給模組。 module_param(name, type, perm) name是模組引數的名字 type是這個引數的型別,常見值:bool、int、charp(字串型) perm是模組

linux 核心模組程式設計編譯多個原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

linux 核心模組程式設計hello word(二)

我們的目的是要編譯個hello.ko的檔案,然後安裝到核心中。 先來看下需要的程式碼,hello.c檔案如下 #include <linux/module.h> #include <linux/init.h> static int hello_init(vo

linux 核心模組程式設計環境搭建(一)

這裡介紹些關於Tiny6410開發板核心的編譯,為後期驅動開發做前期的準備。 開發環境:64位的Ubuntu 14.01虛擬機器 目標機:友善之臂Tiny6410開發板 核心:linux-2.6.38-20110325.tar.gz 核心原始碼下載地址 htt

體驗為王的年代,從視訊優化到QoE,機器學習實踐

內容來源:2018 年 09 月 07 日,上海交通大學教授宋利在“RTC 2018實時網際網路大會”上進行的《機器學習在QoE中的應用實踐》演講分享。IT 大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。 閱讀字數:3112 | 8分鐘閱讀 獲取嘉賓演講視訊及PPT,請點選:t.cn/EwQ9od6

Zynq-Linux移植學習筆記27UIO機制響應外部中斷實現【轉】

轉自:https://blog.csdn.net/zhaoxinfan/article/details/80285150 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/jj12345jj198999/article/details/802851501、&n

linux 核心學習過程(1)-硬體特性和核心設計之間的聯絡

該貼用來作為自己學習linux核心的記錄和筆記,很多東西都是自己理解後整理的內容,各位看官若覺得有問題的地方,可以留言或自行查閱。 linux核心在設計的過程中很多都是依據硬體晶片特性來設計,晶片在設計的過程中很多時候需要保持相容性,這樣就留下了很多令人費解的概念,比如分段和分頁機制,

linux核心學習資料連結

1. 核心學習方法,編譯、除錯等常見問題 1.1 關於編譯升級核心到2.6.0的一些問題 作者:ommm         http://linux.chinaunix.net/bbs/thread-281831-1-5.html 1.2 VMWare

Linux核心學習書籍

轉自: https://blog.csdn.net/21aspnet/article/details/6585602 關於核心學習我建議不要上來就讀核心而是先了解核心的構成和特性,然後通過思考發現疑問這時再去讀核心原始碼。即先了解概貌在讀區域性細節。而且核心分成好多部分,不要只是按照順序去讀,應