S3c6410 linux內核移植(6)---添加按鍵驅動

以下爲ut-s3c6410開發板的鍵盤驅動,如果是其他板要做相應的改動。包括arch/arm/machs-3c6410/mach-smdk6410.cstatic struct gpio_keys_button smdk6410_buttons[]結構體和drivers/input/keyboard/gpio_keys.c文件下的int s3c_gpio_keys[]結構體。

1、 添加添加 platform 信息

arch/arm/machs-3c6410/mach-smdk6410.c添加 platform 信息

static struct gpio_keys_button smdk6410_buttons[] = {

   {

        .gpio = S3C64XX_GPN(0),

        .code = 158,

        .desc = "Down",

        .active_low = 1,

.wakeup = 0,

    },

    {

        .gpio = S3C64XX_GPN(1),

        .code = KEY_ENTER,

        .desc = "Enter",

        .active_low = 1,

        .wakeup = 0,

    },

    {

        .gpio = S3C64XX_GPN(2),

        .code = KEY_HOME,

        .desc = "Home",

        .active_low = 1,

.wakeup = 0,

    },

    {

        .gpio = S3C64XX_GPN(3),

        .code = KEY_POWER,

        .desc = "Power",

        .active_low = 1,

        .wakeup = 0,

    },

    {

        .gpio = S3C64XX_GPN(4),

        .code = KEY_TAB,

        .desc = "Tab",

        .active_low = 1,

.wakeup = 0,

    },

    {

        .gpio = S3C64XX_GPN(5),

        .code = 139,

        .desc = "Menu",

        .active_low = 1,

.wakeup = 0,

     },

};

static struct gpio_keys_platform_data smdk6410_button_data = {

.buttons = smdk6410_buttons,

.nbuttons = ARRAY_SIZE(smdk6410_buttons),

};

static struct platform_device smdk6410_device_button = {

.name = "gpio-keys",

.id = 1,

.dev = {

.platform_data = &smdk6410_button_data,

},

};  

並將“&ldd6410_device_button,”語句填入 struct platform_device *ldd6410_devices[]數組,作爲該數組的一個成員。

如果要修改按鍵對應的GPIO和鍵值,只需要簡單的修改ldd6410_buttons[]數組中的內容。

2、 修改代碼drivers/input/keyboard/gpio_keys.c

添加結構體:

int s3c_gpio_keys[]=

{

IRQ_EINT(0),

IRQ_EINT(1),   

IRQ_EINT(2),

IRQ_EINT(3),

IRQ_EINT(4),

IRQ_EINT(5),

};

修改函數static int __devinit gpio_keys_probe(struct platform_device *pdev)爲:

static int __devinit gpio_keys_probe(struct platform_device *pdev)

{

……

#if 0

irq = gpio_to_irq(button->gpio);

if (irq < 0) {

error = irq;

pr_err("gpio-keys: Unable to get irq number"

" for GPIO %d, error %d\n",

button->gpio, error);

gpio_free(button->gpio);

goto fail2;

}

#endif

irq = s3c_gpio_keys[i];

……

}

修改函數static irqreturn_t gpio_keys_isr(int irq, void *dev_id)爲:

static irqreturn_t gpio_keys_isr(int irq, void *dev_id)

{

struct gpio_button_data *bdata = dev_id;

struct gpio_keys_button *button = bdata->button;

//BUG_ON(irq != gpio_to_irq(button->gpio));

if (button->debounce_interval)

mod_timer(&bdata->timer,

jiffies + msecs_to_jiffies(button->debounce_interval));

else

gpio_keys_report_event(bdata);

return IRQ_HANDLED;

}

編譯內核時選擇:

Device Drivers -> Input device support -> [*] Keyboards -> <*> GPIO Buttons

3、 添加數碼相框的關機按鍵驅動

arch/arm/machs-3c6410/mach-smdk6410.c文件修改

static struct gpio_keys_button smdk6410_buttons[] = {

{

{

         .gpio = S3C64XX_GPN(15),

         .code = KEY_POWER,

         .desc = "Power",

         .active_low = 1,

         .wakeup = 0,

     },

};

    drivers/input/keyboard/gpio_keys.c文件修改:

int s3c_gpio_keys[]=

{

IRQ_EINT(15),

};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章