新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式Linux设备驱动开发之:按键驱动程序实例

嵌入式Linux设备驱动开发之:按键驱动程序实例

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.amcfsurvey.com/article/257107.htm

下面是矩阵按键数组的定义,数组元素的信息(一个按键信息)按照0行0列,0行1列,…,3行2列,3行3列的顺序逐行排列。

staticst_key_info_matrixkey_info_matrix[MAX_COLUMN][MAX_ROW]=

{

{{10,IRQ_EINT0,S3C2410_GPF0,S3C2410_GPE11},/*0行0列*/

{11,IRQ_EINT0,S3C2410_GPF0,S3C2410_GPG6},

{12,IRQ_EINT0,S3C2410_GPF0,S3C2410_GPE13},

{16,IRQ_EINT0,S3C2410_GPF0,S3C2410_GPG2}},

{{7,IRQ_EINT2,S3C2410_GPF2,S3C2410_GPE11},/*1行0列*/

{8,IRQ_EINT2,S3C2410_GPF2,S3C2410_GPG6},

{9,IRQ_EINT2,S3C2410_GPF2,S3C2410_GPE13},

{15,IRQ_EINT2,S3C2410_GPF2,S3C2410_GPG2}},

{{4,IRQ_EINT11,S3C2410_GPG3,S3C2410_GPE11},/*2行0列*/

{5,IRQ_EINT11,S3C2410_GPG3,S3C2410_GPG6},

{6,IRQ_EINT11,S3C2410_GPG3,S3C2410_GPE13},

{14,IRQ_EINT11,S3C2410_GPG3,S3C2410_GPG2}},

{{1,IRQ_EINT19,S3C2410_GPG11,S3C2410_GPE11},/*3行0列*/

{2,IRQ_EINT19,S3C2410_GPG11,S3C2410_GPG6},

{3,IRQ_EINT19,S3C2410_GPG11,S3C2410_GPE13},

{13,IRQ_EINT19,S3C2410_GPG11,S3C2410_GPG2}},

};

下面是与按键相关的端口的初始化函数。这些函数已经在简单的GPIO字符程序里被使用过。此外,set_irq_type()函数用于设定中断线的类型,在本实例中通过该函数将4个中断线的类型配置为下降沿触发式。

staticvoidinit_gpio(void)

{

s3c2410_gpio_cfgpin(S3C2410_GPE11,S3C2410_GPE11_OUTP);/*GPE11*/

s3c2410_gpio_setpin(S3C2410_GPE11,0);

s3c2410_gpio_cfgpin(S3C2410_GPE13,S3C2410_GPE13_OUTP);/*GPE13*/

s3c2410_gpio_setpin(S3C2410_GPE13,0);

s3c2410_gpio_cfgpin(S3C2410_GPG2,S3C2410_GPG2_OUTP);/*GPG2*/

s3c2410_gpio_setpin(S3C2410_GPG2,0);

s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPG6_OUTP);/*GPG6*/

s3c2410_gpio_setpin(S3C2410_GPG6,0);

s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_EINT0);/*GPF0*/

s3c2410_gpio_cfgpin(S3C2410_GPF2,S3C2410_GPF2_EINT2);/*GPF2*/

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_EINT11);/*GPG3*/

s3c2410_gpio_cfgpin(S3C2410_GPG11,S3C2410_GPG11_EINT19);/*GPG11*/

set_irq_type(IRQ_EINT0,IRQT_FALLING);

set_irq_type(IRQ_EINT2,IRQT_FALLING);

set_irq_type(IRQ_EINT11,IRQT_FALLING);

set_irq_type(IRQ_EINT19,IRQT_FALLING);

}

下面讲解按键驱动的主要接口,以下为驱动模块的入口和卸载函数。

/*初始化并添加structcdev结构到系统之中*/

staticvoidbutton_setup_cdev(structcdev*dev,

intminor,structfile_operations*fops)

{

interr;

intdevno=MKDEV(button_major,minor);

cdev_init(dev,fops);/*初始化结构体structcdev*/

dev->owner=THIS_MODULE;

dev->ops=fops;/*关联到设备的file_operations结构*/

err=cdev_add(dev,devno,1);/*将structcdev结构添加到系统之中*/

if(err)

{

printk(KERN_INFOError%daddingbutton%dn,err,minor);

}

}

……

/*驱动初始化*/

staticintbutton_init(void)

{

intret;

/*将主设备号和次设备号定义到一个dev_t数据类型的结构体之中*/

dev_tdev=MKDEV(button_major,0);

if(button_major)

{/*静态注册一个设备,设备号先前指定好,并设定设备名,用cat/proc/devices来查看*/

ret=register_chrdev_region(dev,1,BUTTONS_DEVICE_NAME);

}

else

{/*由系统动态分配主设备号*/

ret=alloc_chrdev_region(dev,0,1,BUTTONS_DEVICE_NAME);

button_major=MAJOR(dev);/*获得主设备号*/

}

if(ret0)

{

printk(KERN_WARNINGButton:unabletogetmajor%dn,button_major);

returnret;

}

/*初始化和添加结构体structcdev到系统之中*/

button_setup_cdev(button_dev,0,button_fops);

printk(Buttondriverinitialized.n);

return0;

}

/*驱动卸载*/

staticvoid__exitbutton_exit(void)

{

cdev_del(button_dev);/*删除结构体structcdev*/

/*卸载所占有的资源*/

unregister_chrdev_region(MKDEV(button_major,0),1);

printk(Buttondriveruninstalledn);

}

module_init(button_init);/*初始化程序的入口*/

module_exit(button_exit);/*卸载设备驱动程序的入口*/

MODULE_AUTHOR(David);

MODULE_LICENSE(DualBSD/GPL);

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程


蜂鸣器相关文章:蜂鸣器原理


评论


相关推荐

技术专区

关闭