一个相当详细的MINI2440按键驱动详解
mini2440_buttons_open(struct inode *inode,struct file *file);
/*mini2440_buttons_close()函数的申明*/
/*release调用的具体函数*/
/*设备软件环境的拆卸*/
/*具体就是中断的释放工作*/
/*因为中断资源,也是系统宝贵的资源,所以不用的时候,要释放*/
static int mini2440_buttons_close(struct inode *inode,struct file *file);
/*mini2440_buttons_read()函数的申明*/
/*read调用的具体函数*/
/*由它读取键盘输入的结果*/
/*实质上就是读取key_values数组的值*/
/*它完成了键盘作为输入设备的核心功能*/
/*数组是否可读,要根据标志位ev_press来判断*/
/*如果数组可读,则读取数据到用户buffer中*/
/*如果数组不可读,则进程进入等待队列,等待到数组可读为止*/
/*等待队列机制,是中断管理中常用到的机制*/
/*因为有些进程经常需要等待某一事件的发生*/
static int mini2440_buttons_read(struct file *filp,char __user *buff,size_t count,loff_t *offp);
/*注意__user,指的是用户空间*/
/*即要把键盘的输入结果读取到用户空间去*/
/*mini2440_buttons_poll()函数的申明*/
/*poll调用的具体函数*/
/*poll实质上是select的调用函数*/
/*如果有按键数据,则select会立刻返回*/
/*如果没有按键数据,则等待*/
/*实质上这是键盘等待输入的机制*/
static unsigned int mini2440_buttons_poll(struct file *file,struct poll_table_struct *wait);
/*file_operations结构体*/
/*驱动函数的设置*/
/*分别将前面的驱动函数设置进来*/
static struct file_operations mini2440_buttons_fops =
{
.owner = THIS_MODULE,
.open = mini2440_buttons_open, /*open()*/
.release = mini2440_buttons_close, /*release()*/
.read = mini2440_buttons_read, /*read()*/
.poll = mini2440_buttons_poll /*poll()*/
};
/*mini2440_buttons_init()函数的申明*/
/*module_init调用的具体函数*/
/*模块创建时的初始化函数*/
/*主要做的工作是注册设备和创建设备*/
/*而具体的硬件初始化工作,它可以不做*/
/*而把它留给fops里的函数来做*/
static int __init mini2440_buttons_init(void);
/*mini2440_buttons_exit()函数的申明*/
/*模块卸载时的扫尾工作*/
/*主要是设备的卸载工作*/
static void __exit mini2440_buttons_exit(void);
/*模块创建时的入口点*/
module_init(mini2440_buttons_init);
/*模块卸载时的入口点*/
module_exit(mini2440_buttons_exit);
/*驱动程序的一些信息*/
MODULE_AUTHOR("http://www.arm9.net"); /*驱动程序的作者*/
MODULE_DESCRIPTION("S3C2410/S3C2440 BUTTON Driver"); /*描述信息*/
MODULE_LICENSE("GPL"); /*遵循的协议*/
/********************************************************************/
/*********************下面是前面申明函数的实现***********************/
/********************************************************************/
/**********************mini2440_buttons_init()***********************/
static int __init mini2440_buttons_init(void)
{
int ret; /*设备注册的返回值*/
/*注册设备驱动程序*/
/*设备号,设备名,和驱动函数*/
ret = register_chrdev(BUTTON_MAJOR,DEVICE_NAME,&mini2440_buttons_fops);
/*对注册失败的处理*/
if(ret < 0)
{
printk(DEVICE_NAME " cant register major number\n");
return ret;
}
/*创建设备*/
/*devfs_mk_cdev()函数是内核态的设备创建函数*/
/*而mknod是用户态的设备创建函数*/
devfs_mk_cdev(MKDEV(BUTTON_MAJOR,0),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,DEVICE_NAME);
printk(DEVICE_NAME " initialized\n");
return 0;
}
/******************mini2440_buttons_exit()****************************/
static void __exit mini2440_buttons_exit(void)
{
/*移除设备*/
devfs_remove(DEVICE_NAME);
/*注消设备驱动*/
unregister_chrdev(BUTTON_MAJOR,DEVICE_NAME);
}
/*****************mini2440_buttons_open()******************************/
static int mini2440_buttons_open(struct inode *inode,struct file *file)
{
int i; /*循环变量,因为有6个按钮*/
int err; /*中断注册函数的返回值*/
/*对每个按钮分别处理,用for循环来做*/
/*具体地是要联结寄存器和相应的引脚*/
/*联结中断号和相应的中断服务程序*/
/*这一步类似于前面所说的驱动的注册*/
/*我们可以成功称作中断的注册*/
for(i = 0;i < sizeof(button_irqs)/sizeof(button_irqs[0]);i++)
{
/*寄存器与中断引脚的联结*/
MINI2440按键驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)