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 tank@tcl.com
  {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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值